Exemplo n.º 1
0
    def test_set_and_get_config_params(self):
        """
        Test the set_config_params functionality by validation through the get_config_params functionality
            - Verify default configuration for newly created vDisk
            - Attempt to set disallowed values
            - Attempt to sync and async mode without specifying DTL target
            - Set SCO size
        """
        structure = Helper.build_service_structure({
            'vpools': [1],
            'storagerouters': [1],
            'storagedrivers':
            [(1, 1, 1)],  # (<id>, <vpool_id>, <storagerouter_id>)
            'mds_services': [(1, 1)]
        }  # (<id>, <storagedriver_id>)
                                                   )
        storagedrivers = structure['storagedrivers']

        # Create vDisk and validate default configuration
        vdisk_1 = VDisk(
            VDiskController.create_new(
                volume_name='vdisk_1',
                volume_size=1024**3,
                storagedriver_guid=storagedrivers[1].guid))
        configuration = VDiskController.get_config_params(
            vdisk_guid=vdisk_1.guid)
        expected_keys = {
            'sco_size', 'dtl_mode', 'write_buffer', 'dtl_target',
            'metadata_cache_size'
        }
        self.assertEqual(
            first=expected_keys,
            second=set(configuration.keys()),
            msg=
            'Keys returned by get_config_params do not match the expected keys'
        )
        tlog_multiplier = vdisk_1.storagedriver_client.get_tlog_multiplier(
            vdisk_1.volume_id)
        default_sco_size = vdisk_1.storagedriver_client.get_sco_multiplier(
            vdisk_1.volume_id) / 1024 * 4
        non_disposable_sco_factor = vdisk_1.storagedriver_client.get_sco_cache_max_non_disposable_factor(
            vdisk_1.volume_id)
        cache_capacity = 4096  # Based on 1GiB size and "metadata_page_capacity" of 64 (6 bits)
        default_values = {
            'sco_size':
            default_sco_size,
            'dtl_mode':
            StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
            'dtl_target': [],
            'write_buffer':
            int(tlog_multiplier * default_sco_size *
                non_disposable_sco_factor),
            'metadata_cache_size':
            StorageDriverClient.METADATA_CACHE_PAGE_SIZE * cache_capacity
        }
        for key, value in default_values.iteritems():
            self.assertEqual(
                first=configuration[key],
                second=value,
                msg=
                'Value for "{0}" does not match expected default value: {1} vs {2}'
                .format(key, configuration[key], value))

        # Attempt to set incorrect values
        new_config_params = {
            'dtl_mode': StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
            'sco_size': 4,
            'dtl_target': [],
            'write_buffer': 128
        }
        for key, values in {
                'dtl_mode': ['unknown', StorageDriverClient.VOLDRV_DTL_ASYNC],
                'sco_size':
                list(set(range(257)).difference({4, 8, 16, 32, 64, 128})) +
            [-1],
                'dtl_target': ['', {}, (), 0],
                'write_buffer': [-1] + range(128) + range(10241, 10300),
                'metadata_cache_size': [-1] + range(256 * 24)
        }.iteritems():
            for value in values:
                config_params = copy.deepcopy(new_config_params)
                config_params[key] = value
                with self.assertRaises(RuntimeError):
                    VDiskController.set_config_params(
                        vdisk_guid=vdisk_1.guid,
                        new_config_params=config_params)

        # Attempt to set DTL mode sync or async without specifying a target
        for dtl_mode in [
                StorageDriverClient.FRAMEWORK_DTL_SYNC,
                StorageDriverClient.FRAMEWORK_DTL_ASYNC
        ]:
            config_params = copy.deepcopy(new_config_params)
            config_params['dtl_mode'] = dtl_mode
            with self.assertRaises(ValueError):
                VDiskController.set_config_params(
                    vdisk_guid=vdisk_1.guid, new_config_params=config_params)

        # Set SCO size
        set_config = copy.deepcopy(new_config_params)
        set_config['sco_size'] = 32
        VDiskController.set_config_params(vdisk_guid=vdisk_1.guid,
                                          new_config_params=set_config)
        get_config = VDiskController.get_config_params(vdisk_guid=vdisk_1.guid)
        for key in set_config.iterkeys():
            self.assertEqual(
                first=set_config[key],
                second=get_config[key],
                msg=
                'Actual value for key "{0}" differs from expected. Expected: {1}  -  Actual: {2}'
                .format(key, set_config[key], get_config[key]))
    def test_set_and_get_config_params(self):
        """
        Test the set_config_params functionality by validation through the get_config_params functionality
            - Verify default configuration for newly created vDisk
            - Attempt to set disallowed values
            - Attempt to sync and async mode without specifying DTL target
            - Set SCO size
        """
        structure = Helper.build_service_structure(
            {'vpools': [1],
             'storagerouters': [1],
             'storagedrivers': [(1, 1, 1)],  # (<id>, <vpool_id>, <storagerouter_id>)
             'mds_services': [(1, 1)]}  # (<id>, <storagedriver_id>)
        )
        storagedrivers = structure['storagedrivers']

        # Create vDisk and validate default configuration
        vdisk_1 = VDisk(VDiskController.create_new(volume_name='vdisk_1', volume_size=1024 ** 3, storagedriver_guid=storagedrivers[1].guid))
        configuration = VDiskController.get_config_params(vdisk_guid=vdisk_1.guid)
        expected_keys = {'sco_size', 'dtl_mode', 'write_buffer', 'dtl_target', 'metadata_cache_size'}
        self.assertEqual(first=expected_keys,
                         second=set(configuration.keys()),
                         msg='Keys returned by get_config_params do not match the expected keys')
        tlog_multiplier = vdisk_1.storagedriver_client.get_tlog_multiplier(vdisk_1.volume_id)
        default_sco_size = vdisk_1.storagedriver_client.get_sco_multiplier(vdisk_1.volume_id) / 1024 * 4
        non_disposable_sco_factor = vdisk_1.storagedriver_client.get_sco_cache_max_non_disposable_factor(vdisk_1.volume_id)
        cache_capacity = 4096  # Based on 1GiB size and "metadata_page_capacity" of 64 (6 bits)
        default_values = {'sco_size': default_sco_size,
                          'dtl_mode': StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
                          'dtl_target': [],
                          'write_buffer': int(tlog_multiplier * default_sco_size * non_disposable_sco_factor),
                          'metadata_cache_size': StorageDriverClient.METADATA_CACHE_PAGE_SIZE * cache_capacity}
        for key, value in default_values.iteritems():
            self.assertEqual(first=configuration[key],
                             second=value,
                             msg='Value for "{0}" does not match expected default value: {1} vs {2}'.format(key, configuration[key], value))

        # Attempt to set incorrect values
        new_config_params = {'dtl_mode': StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
                             'sco_size': 4,
                             'dtl_target': [],
                             'write_buffer': 128}
        for key, values in {'dtl_mode': ['unknown', StorageDriverClient.VOLDRV_DTL_ASYNC],
                            'sco_size': list(set(range(257)).difference({4, 8, 16, 32, 64, 128})) + [-1],
                            'dtl_target': ['', {}, (), 0],
                            'write_buffer': [-1] + range(128) + range(10241, 10300),
                            'metadata_cache_size': [-1] + range(256 * 24)}.iteritems():
            for value in values:
                config_params = copy.deepcopy(new_config_params)
                config_params[key] = value
                with self.assertRaises(RuntimeError):
                    VDiskController.set_config_params(vdisk_guid=vdisk_1.guid, new_config_params=config_params)

        # Attempt to set DTL mode sync or async without specifying a target
        for dtl_mode in [StorageDriverClient.FRAMEWORK_DTL_SYNC, StorageDriverClient.FRAMEWORK_DTL_ASYNC]:
            config_params = copy.deepcopy(new_config_params)
            config_params['dtl_mode'] = dtl_mode
            with self.assertRaises(ValueError):
                VDiskController.set_config_params(vdisk_guid=vdisk_1.guid, new_config_params=config_params)

        # Set SCO size
        set_config = copy.deepcopy(new_config_params)
        set_config['sco_size'] = 32
        VDiskController.set_config_params(vdisk_guid=vdisk_1.guid, new_config_params=set_config)
        get_config = VDiskController.get_config_params(vdisk_guid=vdisk_1.guid)
        for key in set_config.iterkeys():
            self.assertEqual(first=set_config[key],
                             second=get_config[key],
                             msg='Actual value for key "{0}" differs from expected. Expected: {1}  -  Actual: {2}'.format(key, set_config[key], get_config[key]))
    def test_set_and_get_config_params(self):
        """
        Test the set_config_params functionality by validation through the get_config_params functionality
            - Verify default configuration for newly created vDisk
            - Attempt to set disallowed values
            - Attempt to sync and async mode without specifying DTL target
            - Set SCO size
        """
        structure = DalHelper.build_dal_structure({
            'vpools': [1],
            'storagerouters': [1],
            'storagedrivers':
            [(1, 1, 1)],  # (<id>, <vpool_id>, <storagerouter_id>)
            'mds_services': [(1, 1)]
        }  # (<id>, <storagedriver_id>)
                                                  )
        storagedrivers = structure['storagedrivers']

        # Create vDisk and validate default configuration
        vdisk_1 = VDisk(
            VDiskController.create_new(
                volume_name='vdisk_1',
                volume_size=1024**3,
                storagedriver_guid=storagedrivers[1].guid))
        configuration = VDiskController.get_config_params(
            vdisk_guid=vdisk_1.guid)
        expected_keys = {
            'sco_size', 'dtl_mode', 'write_buffer', 'dtl_target',
            'pagecache_ratio', 'cache_quota'
        }
        self.assertEqual(
            first=expected_keys,
            second=set(configuration.keys()),
            msg=
            'Keys returned by get_config_params do not match the expected keys'
        )
        tlog_multiplier = vdisk_1.storagedriver_client.get_tlog_multiplier(
            vdisk_1.volume_id)
        default_sco_size = vdisk_1.storagedriver_client.get_sco_multiplier(
            vdisk_1.volume_id) / 1024 * 4
        non_disposable_sco_factor = vdisk_1.storagedriver_client.get_sco_cache_max_non_disposable_factor(
            vdisk_1.volume_id)
        default_values = {
            'sco_size':
            default_sco_size,
            'dtl_mode':
            StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
            'dtl_target': [],
            'cache_quota': {
                'fragment': None,
                'block': None
            },
            'write_buffer':
            int(tlog_multiplier * default_sco_size *
                non_disposable_sco_factor),
            'pagecache_ratio':
            1.0
        }
        for key, value in default_values.iteritems():
            self.assertEqual(
                first=configuration[key],
                second=value,
                msg=
                'Value for "{0}" does not match expected default value: {1} vs {2}'
                .format(key, configuration[key], value))

        # Attempt to set incorrect values
        new_config_params = {
            'dtl_mode': StorageDriverClient.FRAMEWORK_DTL_NO_SYNC,
            'sco_size': 4,
            'dtl_target': [],
            'cache_quota': {
                'fragment': 5 * 1024**3,
                'block': 1024**3
            },
            'write_buffer': 128
        }
        for key, values in {
                'dtl_mode': ['unknown', StorageDriverClient.VOLDRV_DTL_ASYNC],
                'sco_size':
                list(set(range(257)).difference({4, 8, 16, 32, 64, 128})) +
            [-1],
                'dtl_target': [{}, (), 0],
                'cache_quota': [{
                    'fragment': -1
                }, {
                    'fragment': 1 * 1024.0**3 - 1
                }, {
                    'fragment': 1024**4 + 1
                }, {
                    'block': -1
                }, {
                    'block': 0.1 * 1024.0**3 - 1
                }, {
                    'block': 1024.0**4 + 1
                }],
                'write_buffer': [-1] + range(128) + range(10241, 10300),
                'pagecache_ratio': [-0.1, 0, 1.1]
        }.iteritems():
            for value in values:
                config_params = copy.deepcopy(new_config_params)
                config_params[key] = value
                with self.assertRaises(RuntimeError):
                    VDiskController.set_config_params(
                        vdisk_guid=vdisk_1.guid,
                        new_config_params=config_params)

        # Set SCO size
        set_config = copy.deepcopy(new_config_params)
        set_config['sco_size'] = 32
        VDiskController.set_config_params(vdisk_guid=vdisk_1.guid,
                                          new_config_params=set_config)
        get_config = VDiskController.get_config_params(vdisk_guid=vdisk_1.guid)
        for key in set_config.iterkeys():
            self.assertEqual(
                first=set_config[key],
                second=get_config[key],
                msg=
                'Actual value for key "{0}" differs from expected. Expected: {1}  -  Actual: {2}'
                .format(key, set_config[key], get_config[key]))

        # Verify cache_quota
        vdisk_1.discard()
        self.assertEqual(first={
            'fragment': 5 * 1024.0**3,
            'block': 1024.0**3
        },
                         second=vdisk_1.cache_quota)

        # Restore default cache_quota again
        new_config_params['cache_quota'] = None
        VDiskController.set_config_params(vdisk_guid=vdisk_1.guid,
                                          new_config_params=new_config_params)
        vdisk_1.discard()
        self.assertIsNone(vdisk_1.cache_quota)

        # Set pagecache_ratio
        capacity = vdisk_1.storagedriver_client.get_metadata_cache_capacity(
            str(vdisk_1.volume_id))
        self.assertEqual(capacity,
                         8192)  # 1GiB volume has by default 8192 pages cached
        set_config = copy.deepcopy(new_config_params)
        set_config['pagecache_ratio'] = 0.5
        VDiskController.set_config_params(vdisk_guid=vdisk_1.guid,
                                          new_config_params=set_config)
        get_config = VDiskController.get_config_params(vdisk_guid=vdisk_1.guid)
        self.assertEqual(get_config['pagecache_ratio'], 0.5)
        capacity = vdisk_1.storagedriver_client.get_metadata_cache_capacity(
            str(vdisk_1.volume_id))
        self.assertEqual(capacity, 4096)

        # Small volumes and pagecache_ratio
        vdisk_small = VDisk(
            VDiskController.create_new(
                volume_name='vdisk_small',
                volume_size=1024 * 8,
                storagedriver_guid=storagedrivers[1].guid))
        capacity = vdisk_small.storagedriver_client.get_metadata_cache_capacity(
            str(vdisk_small.volume_id))
        self.assertEqual(capacity, 1)