From: Guillaume Abrioux Date: Wed, 6 Jan 2021 13:07:38 +0000 (+0100) Subject: library: refact ceph_dashboard_user X-Git-Tag: v5.0.4~26 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fa5fbe69602b55088a33ffb60773e3ec950918ab;p=ceph-ansible.git library: refact ceph_dashboard_user refact this module due to recent changes in ceph pacific. The password must be passed with `-i` option. Signed-off-by: Guillaume Abrioux (cherry picked from commit 2725db3e9f42472fdf63c81e5b0236bc6449cf4b) --- diff --git a/library/ceph_dashboard_user.py b/library/ceph_dashboard_user.py index db4a26740..95b486ddb 100644 --- a/library/ceph_dashboard_user.py +++ b/library/ceph_dashboard_user.py @@ -107,20 +107,23 @@ import stat # noqa E402 import time # noqa E402 -def container_exec(binary, container_image): +def container_exec(binary, container_image, interactive=False): ''' Build the docker CLI to run a command inside a container ''' container_binary = os.getenv('CEPH_CONTAINER_BINARY') - command_exec = [container_binary, - 'run', - '--rm', - '--net=host', - '-v', '/etc/ceph:/etc/ceph:z', - '-v', '/var/lib/ceph/:/var/lib/ceph/:z', - '-v', '/var/log/ceph/:/var/log/ceph/:z', - '--entrypoint=' + binary, container_image] + command_exec = [container_binary, 'run'] + + if interactive: + command_exec.extend(['--interactive']) + + command_exec.extend(['--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + binary, container_image]) return command_exec @@ -137,24 +140,24 @@ def is_containerized(): return container_image -def pre_generate_ceph_cmd(container_image=None): +def pre_generate_ceph_cmd(container_image=None, interactive=False): ''' Generate ceph prefix comaand ''' if container_image: - cmd = container_exec('ceph', container_image) + cmd = container_exec('ceph', container_image, interactive=interactive) else: cmd = ['ceph'] return cmd -def generate_ceph_cmd(cluster, args, container_image=None): +def generate_ceph_cmd(cluster, args, container_image=None, interactive=False): ''' Generate 'ceph' command line to execute ''' - cmd = pre_generate_ceph_cmd(container_image=container_image) + cmd = pre_generate_ceph_cmd(container_image=container_image, interactive=interactive) base_cmd = [ '--cluster', @@ -167,12 +170,12 @@ def generate_ceph_cmd(cluster, args, container_image=None): return cmd -def exec_commands(module, cmd): +def exec_commands(module, cmd, stdin=None): ''' Execute command(s) ''' - rc, out, err = module.run_command(cmd) + rc, out, err = module.run_command(cmd, data=stdin) return rc, cmd, out, err @@ -184,11 +187,10 @@ def create_user(module, container_image=None): cluster = module.params.get('cluster') name = module.params.get('name') - password = module.params.get('password') - args = ['ac-user-create', name, password] + args = ['ac-user-create', '-i', '-', name] - cmd = generate_ceph_cmd(cluster=cluster, args=args, container_image=container_image) + cmd = generate_ceph_cmd(cluster=cluster, args=args, container_image=container_image, interactive=True) return cmd @@ -218,11 +220,10 @@ def set_password(module, container_image=None): cluster = module.params.get('cluster') name = module.params.get('name') - password = module.params.get('password') - args = ['ac-user-set-password', name, password] + args = ['ac-user-set-password', '-i', '-', name] - cmd = generate_ceph_cmd(cluster=cluster, args=args, container_image=container_image) + cmd = generate_ceph_cmd(cluster=cluster, args=args, container_image=container_image, interactive=True) return cmd @@ -296,6 +297,7 @@ def run_module(): name = module.params.get('name') state = module.params.get('state') roles = module.params.get('roles') + password = module.params.get('password') if module.check_mode: module.exit_json( @@ -323,9 +325,9 @@ def run_module(): if user['roles'] != roles: rc, cmd, out, err = exec_commands(module, set_roles(module, container_image=container_image)) changed = True - rc, cmd, out, err = exec_commands(module, set_password(module, container_image=container_image)) + rc, cmd, out, err = exec_commands(module, set_password(module, container_image=container_image), stdin=password) else: - rc, cmd, out, err = exec_commands(module, create_user(module, container_image=container_image)) + rc, cmd, out, err = exec_commands(module, create_user(module, container_image=container_image), stdin=password) rc, cmd, out, err = exec_commands(module, set_roles(module, container_image=container_image)) changed = True diff --git a/tests/library/test_ceph_dashboard_user.py b/tests/library/test_ceph_dashboard_user.py index 50f770444..b8d15101e 100644 --- a/tests/library/test_ceph_dashboard_user.py +++ b/tests/library/test_ceph_dashboard_user.py @@ -1,39 +1,42 @@ import os -import sys from mock.mock import patch, MagicMock import pytest -sys.path.append('./library') -import ceph_dashboard_user # noqa: E402 +import ceph_dashboard_user -fake_binary = 'ceph' -fake_cluster = 'ceph' fake_container_binary = 'podman' fake_container_image = 'docker.io/ceph/daemon:latest' -fake_container_cmd = [ - fake_container_binary, - 'run', - '--rm', - '--net=host', - '-v', '/etc/ceph:/etc/ceph:z', - '-v', '/var/lib/ceph/:/var/lib/ceph/:z', - '-v', '/var/log/ceph/:/var/log/ceph/:z', - '--entrypoint=' + fake_binary, - fake_container_image -] -fake_user = 'foo' -fake_password = 'bar' -fake_roles = ['read-only', 'block-manager'] -fake_params = {'cluster': fake_cluster, - 'name': fake_user, - 'password': fake_password, - 'roles': fake_roles} class TestCephDashboardUserModule(object): + def setup_method(self): + self.fake_params = [] + self.fake_binary = 'ceph' + self.fake_cluster = 'ceph' + self.fake_name = 'foo' + self.fake_user = 'foo' + self.fake_password = 'bar' + self.fake_module = MagicMock() + self.fake_module.params = self.fake_params + self.fake_roles = ['read-only', 'block-manager'] + self.fake_params = {'cluster': self.fake_cluster, + 'name': self.fake_user, + 'password': self.fake_password, + 'roles': self.fake_roles} @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) def test_container_exec(self): - cmd = ceph_dashboard_user.container_exec(fake_binary, fake_container_image) + fake_container_cmd = [ + fake_container_binary, + 'run', + '--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + self.fake_binary, + fake_container_image + ] + cmd = ceph_dashboard_user.container_exec(self.fake_binary, fake_container_image) assert cmd == fake_container_cmd def test_not_is_containerized(self): @@ -47,9 +50,19 @@ class TestCephDashboardUserModule(object): @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) def test_pre_generate_ceph_cmd(self, image): if image: - expected_cmd = fake_container_cmd + expected_cmd = [ + fake_container_binary, + 'run', + '--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + self.fake_binary, + image + ] else: - expected_cmd = [fake_binary] + expected_cmd = [self.fake_binary] assert ceph_dashboard_user.pre_generate_ceph_cmd(image) == expected_cmd @@ -57,77 +70,128 @@ class TestCephDashboardUserModule(object): @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) def test_generate_ceph_cmd(self, image): if image: - expected_cmd = fake_container_cmd + expected_cmd = [ + fake_container_binary, + 'run', + '--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + self.fake_binary, + image + ] else: - expected_cmd = [fake_binary] + expected_cmd = [self.fake_binary] expected_cmd.extend([ '--cluster', - fake_cluster, + self.fake_cluster, 'dashboard' ]) - assert ceph_dashboard_user.generate_ceph_cmd(fake_cluster, [], image) == expected_cmd + assert ceph_dashboard_user.generate_ceph_cmd(self.fake_cluster, [], image) == expected_cmd def test_create_user(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params + expected_cmd = [ + self.fake_binary, + '--cluster', self.fake_cluster, + 'dashboard', 'ac-user-create', + '-i', '-', + self.fake_user + ] + + assert ceph_dashboard_user.create_user(self.fake_module) == expected_cmd + + @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) + @patch.dict(os.environ, {'CEPH_CONTAINER_IMAGE': fake_container_image}) + def test_create_user_container(self): + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, - '--cluster', fake_cluster, + fake_container_binary, + 'run', + '--interactive', + '--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + self.fake_binary, + fake_container_image, + '--cluster', self.fake_cluster, 'dashboard', 'ac-user-create', - fake_user, - fake_password + '-i', '-', + self.fake_user ] - assert ceph_dashboard_user.create_user(fake_module) == expected_cmd + assert ceph_dashboard_user.create_user(self.fake_module, container_image=fake_container_image) == expected_cmd def test_set_roles(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, - '--cluster', fake_cluster, + self.fake_binary, + '--cluster', self.fake_cluster, 'dashboard', 'ac-user-set-roles', - fake_user + self.fake_user ] - expected_cmd.extend(fake_roles) + expected_cmd.extend(self.fake_roles) - assert ceph_dashboard_user.set_roles(fake_module) == expected_cmd + assert ceph_dashboard_user.set_roles(self.fake_module) == expected_cmd def test_set_password(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params + expected_cmd = [ + self.fake_binary, + '--cluster', self.fake_cluster, + 'dashboard', 'ac-user-set-password', + '-i', '-', + self.fake_user + ] + + assert ceph_dashboard_user.set_password(self.fake_module) == expected_cmd + + @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) + @patch.dict(os.environ, {'CEPH_CONTAINER_IMAGE': fake_container_image}) + def test_set_password_container(self): + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, - '--cluster', fake_cluster, + fake_container_binary, + 'run', + '--interactive', + '--rm', + '--net=host', + '-v', '/etc/ceph:/etc/ceph:z', + '-v', '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=' + self.fake_binary, + fake_container_image, + '--cluster', self.fake_cluster, 'dashboard', 'ac-user-set-password', - fake_user, - fake_password + '-i', '-', + self.fake_user ] - assert ceph_dashboard_user.set_password(fake_module) == expected_cmd + assert ceph_dashboard_user.set_password(self.fake_module, container_image=fake_container_image) == expected_cmd def test_get_user(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, - '--cluster', fake_cluster, + self.fake_binary, + '--cluster', self.fake_cluster, 'dashboard', 'ac-user-show', - fake_user, + self.fake_user, '--format=json' ] - assert ceph_dashboard_user.get_user(fake_module) == expected_cmd + assert ceph_dashboard_user.get_user(self.fake_module) == expected_cmd def test_remove_user(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, - '--cluster', fake_cluster, + self.fake_binary, + '--cluster', self.fake_cluster, 'dashboard', 'ac-user-delete', - fake_user + self.fake_user ] - assert ceph_dashboard_user.remove_user(fake_module) == expected_cmd + assert ceph_dashboard_user.remove_user(self.fake_module) == expected_cmd