From fed9412f1317cc7d53ab509cab1c498d1c62cecb Mon Sep 17 00:00:00 2001 From: liuke2 Date: Thu, 2 Jun 2016 11:35:07 +0800 Subject: [PATCH] Huawei: Support reporting disk type of pool Adding support for reporting disk type of pool in huawei manila driver. When creating share we can specify the disk type of the pool we want to use ssd/sas/nl_sas/mix, manila driver will report the disk type of the pools. Implements: blueprint huawei-pool-disktype-support Change-Id: I1f694e8c93f79851f838d226830d9ab5344cf35a --- doc/source/devref/huawei_nas_driver.rst | 10 +++ manila/share/drivers/huawei/huawei_nas.py | 1 + manila/share/drivers/huawei/v3/connection.py | 20 ++++++ manila/share/drivers/huawei/v3/helper.py | 3 + .../share/drivers/huawei/test_huawei_nas.py | 65 ++++++++++++++++++- ...ool-disktype-support-0a52ba5d44da55f9.yaml | 5 ++ 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/huawei-pool-disktype-support-0a52ba5d44da55f9.yaml diff --git a/doc/source/devref/huawei_nas_driver.rst b/doc/source/devref/huawei_nas_driver.rst index e6500ce30c..124123396a 100644 --- a/doc/source/devref/huawei_nas_driver.rst +++ b/doc/source/devref/huawei_nas_driver.rst @@ -157,6 +157,11 @@ extra-spec. This ensures that the share will be created on a backend that supports the requested driver_handles_share_servers (share networks) capability. For the Huawei driver, this must be set to False. +To create a share on a backend with a specific type of disks, include the +`huawei_disk_type` extra-spec in the share type. Valid values for this +extra-spec are 'ssd', 'sas', 'nl_sas' or 'mix'. This share will be created +on a backend with a matching disk type. + Another common manila extra-spec used to determine where a share is created is `share_backend_name`. When this extra-spec is defined in the share type, the share will be created on a backend with a matching share_backend_name. @@ -215,6 +220,8 @@ type uses one or more of the following extra-specs: * huawei_sectorsize:sectorsize=4 +- huawei_disk_type='ssd' or 'sas' or 'nl_sas' or 'mix' + `thin_provisioning` will be reported as [True, False] for Huawei backends. `dedupe` will be reported as [True, False] for Huawei backends. @@ -235,6 +242,9 @@ specification. `huawei_sectorsize` will be reported as [True, False] for Huawei backends. +`huawei_disk_type` will be reported as "ssd", "sas", "nl_sas" or "mix" for +Huawei backends. + Restrictions ------------ diff --git a/manila/share/drivers/huawei/huawei_nas.py b/manila/share/drivers/huawei/huawei_nas.py index 383659c493..1649df381a 100644 --- a/manila/share/drivers/huawei/huawei_nas.py +++ b/manila/share/drivers/huawei/huawei_nas.py @@ -57,6 +57,7 @@ class HuaweiNasDriver(driver.ShareDriver): Add QoS support. Add create share from snapshot. 1.3 - Add manage snapshot. + Support reporting disk type of pool. """ def __init__(self, *args, **kwargs): diff --git a/manila/share/drivers/huawei/v3/connection.py b/manila/share/drivers/huawei/v3/connection.py index e1c6c8964b..ce90b13266 100644 --- a/manila/share/drivers/huawei/v3/connection.py +++ b/manila/share/drivers/huawei/v3/connection.py @@ -282,6 +282,7 @@ class V3StorageConnection(driver.HuaweiBase): for pool_name in pool_name_list: pool_name = pool_name.strip().strip('\n') capacity = self._get_capacity(pool_name, all_pool_info) + disk_type = self._get_disk_type(pool_name, all_pool_info) if capacity: pool = dict( pool_name=pool_name, @@ -302,6 +303,9 @@ class V3StorageConnection(driver.HuaweiBase): huawei_smartpartition=[True, False], huawei_sectorsize=[True, False], ) + if disk_type: + pool['huawei_disk_type'] = disk_type + stats_dict["pools"].append(pool) if not stats_dict["pools"]: @@ -605,6 +609,22 @@ class V3StorageConnection(driver.HuaweiBase): return poolinfo + def _get_disk_type(self, pool_name, result): + """Get disk type of the pool.""" + pool_info = self.helper._find_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 _init_filesys_para(self, share, poolinfo, extra_specs): """Init basic filesystem parameters.""" name = share['name'] diff --git a/manila/share/drivers/huawei/v3/helper.py b/manila/share/drivers/huawei/v3/helper.py index 7ffd4bbe85..38d79635c8 100644 --- a/manila/share/drivers/huawei/v3/helper.py +++ b/manila/share/drivers/huawei/v3/helper.py @@ -345,6 +345,9 @@ class RestHelper(object): poolinfo['CAPACITY'] = item['USERFREECAPACITY'] poolinfo['TOTALCAPACITY'] = item['USERTOTALCAPACITY'] poolinfo['CONSUMEDCAPACITY'] = item['USERCONSUMEDCAPACITY'] + poolinfo['TIER0CAPACITY'] = item['TIER0CAPACITY'] + poolinfo['TIER1CAPACITY'] = item['TIER1CAPACITY'] + poolinfo['TIER2CAPACITY'] = item['TIER2CAPACITY'] break return poolinfo diff --git a/manila/tests/share/drivers/huawei/test_huawei_nas.py b/manila/tests/share/drivers/huawei/test_huawei_nas.py index 4d2d437d88..e9a0a88dd3 100644 --- a/manila/tests/share/drivers/huawei/test_huawei_nas.py +++ b/manila/tests/share/drivers/huawei/test_huawei_nas.py @@ -361,13 +361,19 @@ class FakeHuaweiNasHelper(helper.RestHelper): "NAME":"OpenStack_Pool", "USERTOTALCAPACITY":"4194304", "USAGETYPE":"2", - "USERCONSUMEDCAPACITY":"2097152"}, + "USERCONSUMEDCAPACITY":"2097152", + "TIER0CAPACITY":"100", + "TIER1CAPACITY":"0", + "TIER2CAPACITY":"0"}, {"USERFREECAPACITY":"2097152", "ID":"2", "NAME":"OpenStack_Pool_Thick", "USERTOTALCAPACITY":"4194304", "USAGETYPE":"2", - "USERCONSUMEDCAPACITY":"2097152"}]}""" + "USERCONSUMEDCAPACITY":"2097152", + "TIER0CAPACITY":"100", + "TIER1CAPACITY":"0", + "TIER2CAPACITY":"0"}]}""" if url == "/filesystem": request_data = jsonutils.loads(data) @@ -2303,10 +2309,65 @@ class HuaweiShareDriverTestCase(test.TestCase): huawei_smartcache=[True, False], huawei_smartpartition=[True, False], huawei_sectorsize=[True, False], + huawei_disk_type='ssd' ) expected["pools"].append(pool) self.assertEqual(expected, self.driver._stats) + @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_share_stats_disk_type(self, disk_type_value): + self.driver.plugin.helper.login() + storage_pool_info = {"error": {"code": 0}, + "data": [{"USERFREECAPACITY": "2097152", + "ID": "1", + "NAME": "OpenStack_Pool", + "USERTOTALCAPACITY": "4194304", + "USAGETYPE": "2", + "USERCONSUMEDCAPACITY": "2097152"}]} + storage_pool_info['data'][0]['TIER0CAPACITY'] = ( + disk_type_value['TIER0CAPACITY']) + storage_pool_info['data'][0]['TIER1CAPACITY'] = ( + disk_type_value['TIER1CAPACITY']) + storage_pool_info['data'][0]['TIER2CAPACITY'] = ( + disk_type_value['TIER2CAPACITY']) + self.mock_object(self.driver.plugin.helper, '_find_all_pool_info', + mock.Mock(return_value=storage_pool_info)) + self.driver._update_share_stats() + + if disk_type_value['disktype']: + self.assertEqual( + disk_type_value['disktype'], + self.driver._stats['pools'][0]['huawei_disk_type']) + else: + self.assertIsNone( + self.driver._stats['pools'][0].get('huawei_disk_type')) + + def test_get_disk_type_pool_info_none(self): + self.driver.plugin.helper.login() + self.mock_object(self.driver.plugin.helper, '_find_pool_info', + mock.Mock(return_value=None)) + self.assertRaises(exception.InvalidInput, + self.driver._update_share_stats) + def test_allow_access_proto_fail(self): self.driver.plugin.helper.login() self.assertRaises(exception.InvalidInput, diff --git a/releasenotes/notes/huawei-pool-disktype-support-0a52ba5d44da55f9.yaml b/releasenotes/notes/huawei-pool-disktype-support-0a52ba5d44da55f9.yaml new file mode 100644 index 0000000000..999c4549ee --- /dev/null +++ b/releasenotes/notes/huawei-pool-disktype-support-0a52ba5d44da55f9.yaml @@ -0,0 +1,5 @@ +--- +features: + - Add support for reporting pool disk type in Huawei driver. + `huawei_disk_type` extra-spec in the share type. Valid values + for this extra-spec are 'ssd', 'sas', 'nl_sas' or 'mix'.