diff --git a/cinder/tests/unit/test_huawei_drivers.py b/cinder/tests/unit/test_huawei_drivers.py index 3f85f0fe330..aedca306241 100644 --- a/cinder/tests/unit/test_huawei_drivers.py +++ b/cinder/tests/unit/test_huawei_drivers.py @@ -307,7 +307,10 @@ FAKE_STORAGE_POOL_RESPONSE = """ "USERFREECAPACITY": "985661440", "ID": "0", "NAME": "OpenStack_Pool", - "USERTOTALCAPACITY": "985661440" + "USERTOTALCAPACITY": "985661440", + "TIER0CAPACITY": "100", + "TIER1CAPACITY": "0", + "TIER2CAPACITY": "0" }] } """ @@ -2433,7 +2436,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase): def test_get_volume_status(self): data = self.driver.get_volume_stats() - self.assertEqual('2.0.8', data['driver_version']) + self.assertEqual(self.driver.VERSION, data['driver_version']) @mock.patch.object(rest_client.RestClient, 'get_lun_info', return_value={"CAPACITY": 6291456}) @@ -2556,20 +2559,31 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase): "ID": "0", "USERFREECAPACITY": "36", "USERTOTALCAPACITY": "48", - "USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE}, + "USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE, + "TIER0CAPACITY": "48", + "TIER1CAPACITY": "0", + "TIER2CAPACITY": "0"}, {"NAME": "test002", "ID": "1", "USERFREECAPACITY": "37", "USERTOTALCAPACITY": "49", - "USAGETYPE": constants.FILE_SYSTEM_POOL_TYPE}, + "USAGETYPE": constants.FILE_SYSTEM_POOL_TYPE, + "TIER0CAPACITY": "0", + "TIER1CAPACITY": "49", + "TIER2CAPACITY": "0"}, {"NAME": "test003", "ID": "0", "USERFREECAPACITY": "36", "DATASPACE": "35", "USERTOTALCAPACITY": "48", - "USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE}] + "USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE, + "TIER0CAPACITY": "0", + "TIER1CAPACITY": "0", + "TIER2CAPACITY": "48"}] pool_name = 'test001' - test_info = {'CAPACITY': '36', 'ID': '0', 'TOTALCAPACITY': '48'} + test_info = {'CAPACITY': '36', 'ID': '0', 'TOTALCAPACITY': '48', + 'TIER0CAPACITY': '48', 'TIER1CAPACITY': '0', + 'TIER2CAPACITY': '0'} pool_info = self.driver.client.get_pool_info(pool_name, pools) self.assertEqual(test_info, pool_info) @@ -2584,7 +2598,9 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase): self.assertEqual(test_info, pool_info) pool_name = 'test003' - test_info = {'CAPACITY': '35', 'ID': '0', 'TOTALCAPACITY': '48'} + test_info = {'CAPACITY': '35', 'ID': '0', 'TOTALCAPACITY': '48', + 'TIER0CAPACITY': '0', 'TIER1CAPACITY': '0', + 'TIER2CAPACITY': '48'} pool_info = self.driver.client.get_pool_info(pool_name, pools) self.assertEqual(test_info, pool_info) @@ -3806,7 +3822,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase): 'get_remote_device_by_wwn', mock.Mock(return_value=remote_device_info)) data = self.driver.get_volume_stats() - self.assertEqual('2.0.8', data['driver_version']) + self.assertEqual(self.driver.VERSION, data['driver_version']) self.assertTrue(data['pools'][0]['replication_enabled']) self.assertListEqual(['sync', 'async'], data['pools'][0]['replication_type']) @@ -3823,9 +3839,60 @@ class HuaweiFCDriverTestCase(HuaweiTestBase): 'try_get_remote_wwn', mock.Mock(return_value={})) data = self.driver.get_volume_stats() - self.assertEqual('2.0.8', data['driver_version']) + self.assertEqual(self.driver.VERSION, data['driver_version']) self.assertNotIn('replication_enabled', data['pools'][0]) + @ddt.data({'TIER0CAPACITY': '100', + 'TIER1CAPACITY': '0', + 'TIER2CAPACITY': '0', + 'disktype': 'ssd'}, + {'TIER0CAPACITY': '0', + 'TIER1CAPACITY': '100', + 'TIER2CAPACITY': '0', + 'disktype': 'sas'}, + {'TIER0CAPACITY': '0', + 'TIER1CAPACITY': '0', + 'TIER2CAPACITY': '100', + 'disktype': 'nl_sas'}, + {'TIER0CAPACITY': '100', + 'TIER1CAPACITY': '100', + 'TIER2CAPACITY': '100', + 'disktype': 'mix'}, + {'TIER0CAPACITY': '0', + 'TIER1CAPACITY': '0', + 'TIER2CAPACITY': '0', + 'disktype': ''}) + def test_get_volume_disk_type(self, disk_type_value): + response_dict = json.loads(FAKE_STORAGE_POOL_RESPONSE) + storage_pool_sas = copy.deepcopy(response_dict) + storage_pool_sas['data'][0]['TIER0CAPACITY'] = ( + disk_type_value['TIER0CAPACITY']) + storage_pool_sas['data'][0]['TIER1CAPACITY'] = ( + disk_type_value['TIER1CAPACITY']) + storage_pool_sas['data'][0]['TIER2CAPACITY'] = ( + disk_type_value['TIER2CAPACITY']) + driver = FakeISCSIStorage(configuration=self.configuration) + driver.do_setup() + driver.replica = None + + self.mock_object(rest_client.RestClient, 'get_all_pools', + mock.Mock(return_value=storage_pool_sas['data'])) + data = driver.get_volume_stats() + if disk_type_value['disktype']: + self.assertEqual(disk_type_value['disktype'], + data['pools'][0]['disk_type']) + else: + self.assertIsNone(data['pools'][0].get('disk_type')) + + def test_get_disk_type_pool_info_none(self): + driver = FakeISCSIStorage(configuration=self.configuration) + driver.do_setup() + driver.replica = None + self.mock_object(rest_client.RestClient, 'get_pool_info', + mock.Mock(return_value=None)) + data = driver.get_volume_stats() + self.assertIsNone(data['pools'][0].get('disk_type')) + def test_extend_volume(self): self.driver.extend_volume(self.volume, 3) diff --git a/cinder/volume/drivers/huawei/huawei_driver.py b/cinder/volume/drivers/huawei/huawei_driver.py index 595df666578..8648822cd8a 100644 --- a/cinder/volume/drivers/huawei/huawei_driver.py +++ b/cinder/volume/drivers/huawei/huawei_driver.py @@ -1830,9 +1830,10 @@ class HuaweiISCSIDriver(HuaweiBaseDriver, driver.ISCSIDriver): Consistency group support Cgsnapshot support 2.0.8 - Backup snapshot optimal path support + 2.0.9 - Support reporting disk type of pool """ - VERSION = "2.0.8" + VERSION = "2.0.9" def __init__(self, *args, **kwargs): super(HuaweiISCSIDriver, self).__init__(*args, **kwargs) @@ -2029,9 +2030,10 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver): Consistency group support Cgsnapshot support 2.0.8 - Backup snapshot optimal path support + 2.0.9 - Support reporting disk type of pool """ - VERSION = "2.0.8" + VERSION = "2.0.9" def __init__(self, *args, **kwargs): super(HuaweiFCDriver, self).__init__(*args, **kwargs) diff --git a/cinder/volume/drivers/huawei/rest_client.py b/cinder/volume/drivers/huawei/rest_client.py index ffd94f12906..4386e5ddd4c 100644 --- a/cinder/volume/drivers/huawei/rest_client.py +++ b/cinder/volume/drivers/huawei/rest_client.py @@ -250,6 +250,9 @@ class RestClient(object): info['ID'] = pool['ID'] info['CAPACITY'] = pool.get('DATASPACE', pool['USERFREECAPACITY']) info['TOTALCAPACITY'] = pool['USERTOTALCAPACITY'] + info['TIER0CAPACITY'] = pool['TIER0CAPACITY'] + info['TIER1CAPACITY'] = pool['TIER1CAPACITY'] + info['TIER2CAPACITY'] = pool['TIER2CAPACITY'] return info @@ -1021,6 +1024,22 @@ class RestClient(object): return pool_capacity + def _get_disk_type(self, pool_name, result): + """Get disk type of the pool.""" + pool_info = self.get_pool_info(pool_name, result) + if not pool_info: + return None + + pool_disk = [] + for i, x in enumerate(['ssd', 'sas', 'nl_sas']): + if pool_info['TIER%dCAPACITY' % i] != '0': + pool_disk.append(x) + + if len(pool_disk) > 1: + pool_disk = ['mix'] + + return pool_disk[0] if pool_disk else None + def get_luncopy_info(self, luncopy_id): """Get LUNcopy information.""" url = "/LUNCOPY?range=[0-1023]" @@ -1158,6 +1177,7 @@ class RestClient(object): result = self.get_all_pools() for pool_name in self.storage_pools: capacity = self._get_capacity(pool_name, result) + disk_type = self._get_disk_type(pool_name, result) pool = {} pool.update(dict( location_info=self.device_id, @@ -1177,6 +1197,9 @@ class RestClient(object): hypermetro=True, consistencygroup_support=True, )) + if disk_type: + pool['disk_type'] = disk_type + data['pools'].append(pool) return data diff --git a/releasenotes/notes/huawei-pool-disktype-support-7c1f64639b42a48a.yaml b/releasenotes/notes/huawei-pool-disktype-support-7c1f64639b42a48a.yaml new file mode 100644 index 00000000000..137a779d3a8 --- /dev/null +++ b/releasenotes/notes/huawei-pool-disktype-support-7c1f64639b42a48a.yaml @@ -0,0 +1,4 @@ +--- +features: + - Add support for reporting pool disk type in Huawei + driver.