]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
library: refact ceph_dashboard_user
authorGuillaume Abrioux <gabrioux@redhat.com>
Wed, 6 Jan 2021 13:07:38 +0000 (14:07 +0100)
committerDimitri Savineau <savineau.dimitri@gmail.com>
Thu, 7 Jan 2021 22:09:46 +0000 (17:09 -0500)
refact this module due to recent changes in ceph pacific.
The password must be passed with `-i` option.

Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
library/ceph_dashboard_user.py
module_utils/ca_common.py
tests/library/test_ceph_dashboard_user.py

index e63e6c13379178bd356f647e1351253f3e4ab14d..3d68ec643e757a2bd1f1ded064a3ac9d2ba4aec7 100644 (file)
@@ -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
 
index 0a7da58bcec27653573f5c149ff1dccb216522e0..0a70a661cf574708179fb23d3c8e27de928862b9 100644 (file)
@@ -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
 
index dd4d0f72dc7b2c229cf9ca742985d5c3318dbdee..817748332d47fc20a6d83ce03f4faf750e0972c1 100644 (file)
-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