]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph_pool: add tests
authorGuillaume Abrioux <gabrioux@redhat.com>
Tue, 12 May 2020 12:39:20 +0000 (14:39 +0200)
committerGuillaume Abrioux <gabrioux@redhat.com>
Sat, 16 May 2020 05:31:57 +0000 (07:31 +0200)
Add unit tests for ceph_pool module

Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
tests/library/test_ceph_pool.py [new file with mode: 0644]

diff --git a/tests/library/test_ceph_pool.py b/tests/library/test_ceph_pool.py
new file mode 100644 (file)
index 0000000..c012d89
--- /dev/null
@@ -0,0 +1,509 @@
+import json
+import os
+import sys
+sys.path.append('./library')
+import ceph_pool
+from mock.mock import patch, Mock, MagicMock
+
+
+fake_user = 'client.admin'
+fake_user_key = '/etc/ceph/ceph.client.admin.keyring'
+fake_pool_name = 'foo'
+fake_cluster_name = 'ceph'
+fake_container_image_name = 'docker.io/ceph/daemon:latest-luminous'
+
+
+@patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': 'podman'})
+class TestCephPoolModule(object):
+    def setup_method(self):
+        self.fake_running_pool_details = {
+            'pool_id': 39,
+            'pool_name': 'foo2',
+            'create_time': '2020-05-12T12:32:03.696673+0000',
+            'flags': 32769,
+            'flags_names': 'hashpspool,creating',
+            'type': 1,
+            'size': 2,
+            'min_size': 1,
+            'crush_rule': 0,
+            'object_hash': 2,
+            'pg_autoscale_mode': 'on',
+            'pg_num': 32,
+            'pg_placement_num': 32,
+            'pg_placement_num_target': 32,
+            'pg_num_target': 32,
+            'pg_num_pending': 32,
+            'last_pg_merge_meta': {
+                'source_pgid': '0.0',
+                'ready_epoch': 0,
+                'last_epoch_started': 0,
+                'last_epoch_clean': 0,
+                'source_version': "0'0",
+                'target_version': "0'0"
+            },
+            'last_change': '109',
+            'last_force_op_resend': '0',
+            'last_force_op_resend_prenautilus': '0',
+            'last_force_op_resend_preluminous': '0',
+            'auid': 0,
+            'snap_mode': 'selfmanaged',
+            'snap_seq': 0,
+            'snap_epoch': 0,
+            'pool_snaps': [],
+            'removed_snaps': '[]',
+            'quota_max_bytes': 0,
+            'quota_max_objects': 0,
+            'tiers': [],
+            'tier_of': -1,
+            'read_tier': -1,
+            'write_tier': -1,
+            'cache_mode': 'none',
+            'target_max_bytes': 0,
+            'target_max_objects': 0,
+            'cache_target_dirty_ratio_micro': 400000,
+            'cache_target_dirty_high_ratio_micro': 600000,
+            'cache_target_full_ratio_micro': 800000,
+            'cache_min_flush_age': 0,
+            'cache_min_evict_age': 0,
+            'erasure_code_profile': '',
+            'hit_set_params': {
+                'type': 'none'
+            },
+            'hit_set_period': 0,
+            'hit_set_count': 0,
+            'use_gmt_hitset': True,
+            'min_read_recency_for_promote': 0,
+            'min_write_recency_for_promote': 0,
+            'hit_set_grade_decay_rate': 0,
+            'hit_set_search_last_n': 0,
+            'grade_table': [],
+            'stripe_width': 0,
+            'expected_num_objects': 0,
+            'fast_read': False,
+            'options': {},
+            'application_metadata': {
+                'rbd': {}
+            },
+            'application': 'rbd'
+            }
+        self.fake_user_pool_config = {
+            'pool_name': {
+                'value': 'foo2'
+            },
+            'pg_num': {
+                'value': '32',
+                'cli_set_opt': 'pg_num'
+            },
+            'pgp_num': {
+                'value': '0',
+                'cli_set_opt': 'pgp_num'
+            },
+            'pg_autoscale_mode': {
+                'value': 'on',
+                'cli_set_opt': 'pg_autoscale_mode'
+            },
+            'target_size_ratio': {
+                'value': None,
+                'cli_set_opt': 'target_size_ratio'
+            },
+            'application': {
+                'value': 'rbd'
+            },
+            'type': {
+                'value': 'replicated'
+            },
+            'erasure_profile': {
+                'value': 'default'
+            },
+            'crush_rule': {
+                'value': 'replicated_rule',
+                'cli_set_opt': 'crush_rule'
+            },
+            'expected_num_objects': {
+                'value': '0'
+            },
+            'size': {
+                'value': '2',
+                'cli_set_opt': 'size'
+            },
+            'min_size': {
+                'value': '0',
+                'cli_set_opt': 'min_size'
+            },
+            'pg_placement_num': {
+                'value': '32',
+                'cli_set_opt': 'pgp_num'
+            }}
+
+
+    def test_check_pool_exist(self):
+        expected_command_list = [
+            'podman',
+            '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=ceph',
+            fake_container_image_name,
+            '-n',
+            fake_user,
+            '-k',
+            fake_user_key,
+            '--cluster',
+            'ceph',
+            'osd',
+            'pool',
+            'stats',
+            self.fake_user_pool_config['pool_name']['value'],
+            '-f',
+            'json'
+            ]
+
+        cmd = ceph_pool.check_pool_exist(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], fake_user, fake_user_key, output_format='json', container_image=fake_container_image_name)
+        assert cmd == expected_command_list
+
+    def test_get_default_running_config(self):
+        params = ['osd_pool_default_size', 'osd_pool_default_min_size', 'osd_pool_default_pg_num', 'osd_pool_default_pgp_num']
+
+        expected_command_list = []
+        cmd_list = []
+
+        for param in params:
+            expected_command_list.append([
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'config',
+                'get',
+                'mon.*',
+                param
+            ])
+            cmd_list.append(ceph_pool.generate_get_config_cmd(param, fake_cluster_name, fake_user, fake_user_key, container_image=fake_container_image_name))
+        assert cmd_list == expected_command_list
+
+
+    def test_get_application_pool(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'application',
+                'get',
+                self.fake_user_pool_config['pool_name']['value'],
+                '-f',
+                'json'
+        ]
+
+        cmd = ceph_pool.get_application_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], fake_user, fake_user_key, 'json', container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+    def test_enable_application_pool(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'application',
+                'enable',
+                self.fake_user_pool_config['pool_name']['value'],
+                'rbd'
+        ]
+
+        cmd = ceph_pool.enable_application_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], 'rbd', fake_user, fake_user_key, container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+    def test_disable_application_pool(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'application',
+                'disable',
+                self.fake_user_pool_config['pool_name']['value'],
+                'rbd',
+                '--yes-i-really-mean-it'
+        ]
+
+        cmd = ceph_pool.disable_application_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], 'rbd', fake_user, fake_user_key, container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+
+    def test_compare_pool_config_no_diff(self):
+        delta = ceph_pool.compare_pool_config(self.fake_user_pool_config, self.fake_running_pool_details)
+
+        assert delta == {}
+        
+    def test_compare_pool_config_std_diff(self):
+        self.fake_user_pool_config['size']['value'] = '3'
+        delta = ceph_pool.compare_pool_config(self.fake_user_pool_config, self.fake_running_pool_details)
+
+        assert delta == {'size': {'cli_set_opt': 'size', 'value': '3'}}
+
+    def test_compare_pool_config_target_size_ratio_diff(self):
+        self.fake_user_pool_config['target_size_ratio']['value'] = '0.5'
+        delta = ceph_pool.compare_pool_config(self.fake_user_pool_config, self.fake_running_pool_details)
+
+        assert delta == {'target_size_ratio': {'cli_set_opt': 'target_size_ratio', 'value': '0.5'}}
+
+    def test_compare_pool_config_application_diff(self):
+        self.fake_user_pool_config['application']['value'] = 'foo'
+        delta = ceph_pool.compare_pool_config(self.fake_user_pool_config, self.fake_running_pool_details)
+
+        assert delta == {'application': {'new_application': 'foo', 'old_application': 'rbd', 'value': 'foo'}}
+
+
+    def test_list_pools_details(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'ls',
+                'detail',
+                '-f',
+                'json'
+        ]
+
+        cmd = ceph_pool.list_pools(fake_cluster_name, fake_user, fake_user_key, True, 'json', container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+    def test_list_pools_nodetails(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'ls',
+                '-f',
+                'json'
+        ]
+
+        cmd = ceph_pool.list_pools(fake_cluster_name, fake_user, fake_user_key, False, 'json', container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+
+    def test_create_replicated_pool(self):
+        self.fake_user_pool_config['type']['value'] = 'replicated'
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'create',
+                self.fake_user_pool_config['pool_name']['value'],
+                '--pg_num',
+                self.fake_user_pool_config['pg_num']['value'],
+                '--pgp_num',
+                self.fake_user_pool_config['pgp_num']['value'],
+                self.fake_user_pool_config['type']['value'],
+                self.fake_user_pool_config['crush_rule']['value'],
+                '--expected_num_objects',
+                self.fake_user_pool_config['expected_num_objects']['value'],
+                '--size',
+                self.fake_user_pool_config['size']['value'],
+                '--autoscale-mode',
+                self.fake_user_pool_config['pg_autoscale_mode']['value']
+        ]
+
+        cmd = ceph_pool.create_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], fake_user, fake_user_key, self.fake_user_pool_config, container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+    def test_create_erasure_pool(self):
+        self.fake_user_pool_config['type']['value'] = 'erasure'
+        self.fake_user_pool_config['erasure_profile']['value'] = 'erasure-default'
+        self.fake_user_pool_config['crush_rule']['value'] = 'erasure_rule'
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'create',
+                self.fake_user_pool_config['pool_name']['value'],
+                '--pg_num',
+                self.fake_user_pool_config['pg_num']['value'],
+                '--pgp_num',
+                self.fake_user_pool_config['pgp_num']['value'],
+                self.fake_user_pool_config['type']['value'],
+                self.fake_user_pool_config['erasure_profile']['value'],
+                self.fake_user_pool_config['crush_rule']['value'],
+                '--expected_num_objects',
+                self.fake_user_pool_config['expected_num_objects']['value'],
+                '--autoscale-mode',
+                self.fake_user_pool_config['pg_autoscale_mode']['value']
+        ]
+
+        cmd = ceph_pool.create_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], fake_user, fake_user_key, self.fake_user_pool_config, container_image=fake_container_image_name)
+
+        assert cmd == expected_command
+
+    def test_remove_pool(self):
+        expected_command = [
+                'podman',
+                '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=ceph',
+                fake_container_image_name,
+                '-n',
+                'client.admin',
+                '-k',
+                '/etc/ceph/ceph.client.admin.keyring',
+                '--cluster',
+                'ceph',
+                'osd',
+                'pool',
+                'rm',
+                self.fake_user_pool_config['pool_name']['value'],
+                self.fake_user_pool_config['pool_name']['value'],
+                '--yes-i-really-really-mean-it'
+        ]
+
+        cmd = ceph_pool.remove_pool(fake_cluster_name, self.fake_user_pool_config['pool_name']['value'], fake_user, fake_user_key, container_image=fake_container_image_name)
+
+        assert cmd == expected_command
\ No newline at end of file