From: Guillaume Abrioux Date: Wed, 6 Jan 2021 13:07:38 +0000 (+0100) Subject: library: refact ceph_dashboard_user X-Git-Tag: v6.0.0alpha5~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2725db3e9f42472fdf63c81e5b0236bc6449cf4b;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 --- diff --git a/library/ceph_dashboard_user.py b/library/ceph_dashboard_user.py index e63e6c133..3d68ec643 100644 --- a/library/ceph_dashboard_user.py +++ b/library/ceph_dashboard_user.py @@ -119,11 +119,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(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) + cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image, interactive=True) return cmd @@ -153,11 +152,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(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) + cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image, interactive=True) return cmd @@ -214,6 +212,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( @@ -241,9 +240,9 @@ def run_module(): if user['roles'] != roles: rc, cmd, out, err = exec_command(module, set_roles(module, container_image=container_image)) changed = True - rc, cmd, out, err = exec_command(module, set_password(module, container_image=container_image)) + rc, cmd, out, err = exec_command(module, set_password(module, container_image=container_image), stdin=password) else: - rc, cmd, out, err = exec_command(module, create_user(module, container_image=container_image)) + rc, cmd, out, err = exec_command(module, create_user(module, container_image=container_image), stdin=password) rc, cmd, out, err = exec_command(module, set_roles(module, container_image=container_image)) changed = True diff --git a/module_utils/ca_common.py b/module_utils/ca_common.py index 0a7da58bc..0a70a661c 100644 --- a/module_utils/ca_common.py +++ b/module_utils/ca_common.py @@ -2,7 +2,7 @@ import os import datetime -def generate_ceph_cmd(sub_cmd, args, user_key=None, cluster='ceph', user='client.admin', container_image=None): +def generate_ceph_cmd(sub_cmd, args, user_key=None, cluster='ceph', user='client.admin', container_image=None, interactive=False): ''' Generate 'ceph' command line to execute ''' @@ -10,7 +10,7 @@ def generate_ceph_cmd(sub_cmd, args, user_key=None, cluster='ceph', user='client if not user_key: user_key = '/etc/ceph/{}.{}.keyring'.format(cluster, user) - cmd = pre_generate_ceph_cmd(container_image=container_image) + cmd = pre_generate_ceph_cmd(container_image=container_image, interactive=interactive) base_cmd = [ '-n', @@ -26,20 +26,23 @@ def generate_ceph_cmd(sub_cmd, args, user_key=None, cluster='ceph', user='client return cmd -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 @@ -56,24 +59,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 exec_command(module, cmd): +def exec_command(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 diff --git a/tests/library/test_ceph_dashboard_user.py b/tests/library/test_ceph_dashboard_user.py index dd4d0f72d..817748332 100644 --- a/tests/library/test_ceph_dashboard_user.py +++ b/tests/library/test_ceph_dashboard_user.py @@ -1,102 +1,146 @@ -from mock.mock import MagicMock +from mock.mock import MagicMock, patch +import os 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} def test_create_user(self): - fake_module = MagicMock() - fake_module.params = fake_params + self.fake_module.params = self.fake_params expected_cmd = [ - fake_binary, + self.fake_binary, '-n', 'client.admin', '-k', '/etc/ceph/ceph.client.admin.keyring', - '--cluster', fake_cluster, + '--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) == 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): + fake_container_cmd = [ + 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 + ] + self.fake_module.params = self.fake_params + expected_cmd = fake_container_cmd + [ + '-n', 'client.admin', + '-k', '/etc/ceph/ceph.client.admin.keyring', + '--cluster', self.fake_cluster, + 'dashboard', 'ac-user-create', + '-i', '-', + self.fake_user + ] + + 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, + self.fake_binary, '-n', 'client.admin', '-k', '/etc/ceph/ceph.client.admin.keyring', - '--cluster', fake_cluster, + '--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 = [ - fake_binary, + self.fake_binary, + '-n', 'client.admin', + '-k', '/etc/ceph/ceph.client.admin.keyring', + '--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): + fake_container_cmd = [ + 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 + ] + self.fake_module.params = self.fake_params + expected_cmd = fake_container_cmd + [ '-n', 'client.admin', '-k', '/etc/ceph/ceph.client.admin.keyring', - '--cluster', fake_cluster, + '--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, + self.fake_binary, '-n', 'client.admin', '-k', '/etc/ceph/ceph.client.admin.keyring', - '--cluster', fake_cluster, + '--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, + self.fake_binary, '-n', 'client.admin', '-k', '/etc/ceph/ceph.client.admin.keyring', - '--cluster', fake_cluster, + '--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