From 792462cad150e179189a3564844fae40be1ae653 Mon Sep 17 00:00:00 2001 From: raghavendrat Date: Tue, 19 Nov 2024 09:47:41 +0000 Subject: [PATCH] HPE 3par: Update the calculation of free_capacity In get_volume_stats response, below 3 values are returned, along with some other values. total_capacity, provisioned_capacity and free_capacity. All these 3 values were calculated independently; and in some cases, the sum of provisioned_capacity (PC) and free_capacity (FC) was not equal to total_capacity (TC). Ideally PC + FC should be equal to TC. After checking wsapi guide and executing those calls we found that, total_capacity and provisioned_capacity are calculated correctly. Thus, free_capacity is now calculated as below: free_capacity = total_capacity - provisioned_capacity Change-Id: I89e36219f9e3adfaf626f25cd06e7a46d3fe813c --- .../unit/volume/drivers/hpe/test_hpe3par.py | 102 ++++++++---------- cinder/volume/drivers/hpe/hpe_3par_common.py | 16 ++- ...culate-free-capacity-926b60b70bba18b7.yaml | 6 ++ 3 files changed, 58 insertions(+), 66 deletions(-) create mode 100644 releasenotes/notes/hpe-3par-calculate-free-capacity-926b60b70bba18b7.yaml diff --git a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py index 565a6636f10..12c724c423f 100644 --- a/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py +++ b/cinder/tests/unit/volume/drivers/hpe/test_hpe3par.py @@ -8174,7 +8174,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } stat_capabilities = { THROUGHPUT: 0, @@ -8201,9 +8201,9 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): self.assertFalse(stats['pools'][0]['QoS_support']) self.assertEqual(86.0, stats['pools'][0]['provisioned_capacity_gb']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual('up', stats['pools'][0]['backend_state']) self.assertEqual(GOODNESS_FUNCTION, @@ -8241,9 +8241,9 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): self.assertFalse(stats['pools'][0]['QoS_support']) self.assertEqual(86.0, stats['pools'][0]['provisioned_capacity_gb']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -8263,7 +8263,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): stats['pools'][0][AVG_BUSY_PERC]) cpg2 = self.cpgs[0].copy() - cpg2.update({'SDGrowth': {'limitMiB': 8192}}) + cpg2.update({'SDGrowth': {'limitMiB': 204800}}) mock_client.getCPG.return_value = cpg2 stats = self.driver.get_volume_stats(True) @@ -8272,22 +8272,16 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): self.assertTrue(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['thick_provisioning_support']) self.assertFalse(stats['pools'][0]['QoS_support']) - total_capacity_gb = 8192 * const + total_capacity_gb = 200 * 1024 * const self.assertEqual(total_capacity_gb, stats['pools'][0]['total_capacity_gb']) - free_capacity_gb = int( - (8192 - (self.cpgs[0]['UsrUsage']['usedMiB'] + - self.cpgs[0]['SDUsage']['usedMiB'])) * const) + free_capacity_gb = 114 self.assertEqual(free_capacity_gb, stats['pools'][0]['free_capacity_gb']) - provisioned_capacity_gb = int( - (self.cpgs[0]['UsrUsage']['totalMiB'] + - self.cpgs[0]['SAUsage']['totalMiB'] + - self.cpgs[0]['SDUsage']['totalMiB']) * const) + provisioned_capacity_gb = 86 self.assertEqual(provisioned_capacity_gb, stats['pools'][0]['provisioned_capacity_gb']) - cap_util = (float(total_capacity_gb - free_capacity_gb) / - float(total_capacity_gb)) * 100 + cap_util = 43.0 self.assertEqual(cap_util, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) @@ -8336,7 +8330,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -8349,9 +8343,9 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): self.assertEqual('12345', stats['array_id']) self.assertFalse(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['QoS_support']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -8392,7 +8386,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -8403,9 +8397,9 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): stats = self.driver.get_volume_stats(True) self.assertEqual('FC', stats['storage_protocol']) self.assertEqual('12345', stats['array_id']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -8452,7 +8446,7 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -8464,9 +8458,9 @@ class TestHPE3PARFCDriver(HPE3PARBaseDriver): self.assertEqual('12345', stats['array_id']) self.assertTrue(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['QoS_support']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -9614,7 +9608,7 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } stat_capabilities = { THROUGHPUT: 0, @@ -9636,11 +9630,11 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): self.assertEqual('12345', stats['array_id']) self.assertTrue(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['thick_provisioning_support']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) self.assertEqual(86.0, stats['pools'][0]['provisioned_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -9671,7 +9665,7 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): mock_client.assert_has_calls(expected) cpg2 = self.cpgs[0].copy() - cpg2.update({'SDGrowth': {'limitMiB': 8192}}) + cpg2.update({'SDGrowth': {'limitMiB': 204800}}) mock_client.getCPG.return_value = cpg2 stats = self.driver.get_volume_stats(True) @@ -9679,22 +9673,16 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): self.assertEqual('12345', stats['array_id']) self.assertTrue(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['thick_provisioning_support']) - total_capacity_gb = 8192 * const + total_capacity_gb = 200 * 1024 * const self.assertEqual(total_capacity_gb, stats['pools'][0]['total_capacity_gb']) - free_capacity_gb = int( - (8192 - (self.cpgs[0]['UsrUsage']['usedMiB'] + - self.cpgs[0]['SDUsage']['usedMiB'])) * const) + free_capacity_gb = 114 self.assertEqual(free_capacity_gb, stats['pools'][0]['free_capacity_gb']) - cap_util = (float(total_capacity_gb - free_capacity_gb) / - float(total_capacity_gb)) * 100 + cap_util = 43.0 self.assertEqual(cap_util, stats['pools'][0]['capacity_utilization']) - provisioned_capacity_gb = int( - (self.cpgs[0]['UsrUsage']['totalMiB'] + - self.cpgs[0]['SAUsage']['totalMiB'] + - self.cpgs[0]['SDUsage']['totalMiB']) * const) + provisioned_capacity_gb = 86 self.assertEqual(provisioned_capacity_gb, stats['pools'][0]['provisioned_capacity_gb']) self.assertEqual(3, stats['pools'][0]['total_volumes']) @@ -9734,7 +9722,7 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -9745,9 +9733,9 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): stats = self.driver.get_volume_stats(True) self.assertEqual('iSCSI', stats['storage_protocol']) self.assertEqual('12345', stats['array_id']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -9788,7 +9776,7 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -9799,9 +9787,9 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): stats = self.driver.get_volume_stats(True) self.assertEqual('iSCSI', stats['storage_protocol']) self.assertEqual('12345', stats['array_id']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) @@ -9848,7 +9836,7 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): mock_client.getCPGAvailableSpace.return_value = { "capacityEfficiency": {u'compaction': 594.4}, "rawFreeMiB": 1024.0 * 6, - "usableFreeMiB": 1024.0 * 3 + "usableFreeMiB": 1024.0 * 79 } with mock.patch.object(hpecommon.HPE3PARCommon, @@ -9860,9 +9848,9 @@ class TestHPE3PARISCSIDriver(HPE3PARBaseDriver): self.assertEqual('12345', stats['array_id']) self.assertTrue(stats['pools'][0]['thin_provisioning_support']) self.assertTrue(stats['pools'][0]['QoS_support']) - self.assertEqual(24.0, stats['pools'][0]['total_capacity_gb']) - self.assertEqual(3.0, stats['pools'][0]['free_capacity_gb']) - self.assertEqual(87.5, stats['pools'][0]['capacity_utilization']) + self.assertEqual(100.0, stats['pools'][0]['total_capacity_gb']) + self.assertEqual(14.0, stats['pools'][0]['free_capacity_gb']) + self.assertEqual(86.0, stats['pools'][0]['capacity_utilization']) self.assertEqual(3, stats['pools'][0]['total_volumes']) self.assertEqual(GOODNESS_FUNCTION, stats['pools'][0]['goodness_function']) diff --git a/cinder/volume/drivers/hpe/hpe_3par_common.py b/cinder/volume/drivers/hpe/hpe_3par_common.py index a5eb365af8f..f3dba71f234 100644 --- a/cinder/volume/drivers/hpe/hpe_3par_common.py +++ b/cinder/volume/drivers/hpe/hpe_3par_common.py @@ -312,11 +312,12 @@ class HPE3PARCommon(object): 4.0.22 - Fixed clone of replicated volume. Bug #2021941 4.0.23 - Fixed login/logout while accessing wsapi. Bug #2068795 4.0.24 - Fixed retype volume - thin to deco. Bug #2080927 + 4.0.25 - Update the calculation of free_capacity """ - VERSION = "4.0.24" + VERSION = "4.0.25" stats = {} @@ -1749,8 +1750,6 @@ class HPE3PARCommon(object): # cpg usable free space cpg_avail_space = ( self.client.getCPGAvailableSpace(cpg_name)) - free_capacity = int( - cpg_avail_space['usableFreeMiB'] * const) # total_capacity is the best we can do for a limitless cpg total_capacity = int( (cpg['SDUsage']['usedMiB'] + @@ -1758,16 +1757,15 @@ class HPE3PARCommon(object): cpg_avail_space['usableFreeMiB']) * const) else: total_capacity = int(cpg['SDGrowth']['limitMiB'] * const) - free_capacity = int((cpg['SDGrowth']['limitMiB'] - - (cpg['UsrUsage']['usedMiB'] + - cpg['SDUsage']['usedMiB'])) * const) - capacity_utilization = ( - (float(total_capacity - free_capacity) / - float(total_capacity)) * 100) + provisioned_capacity = int((cpg['UsrUsage']['totalMiB'] + cpg['SAUsage']['totalMiB'] + cpg['SDUsage']['totalMiB']) * const) + free_capacity = total_capacity - provisioned_capacity + capacity_utilization = ( + (float(total_capacity - free_capacity) / + float(total_capacity)) * 100) except hpeexceptions.HTTPNotFound: err = (_("CPG (%s) doesn't exist on array") diff --git a/releasenotes/notes/hpe-3par-calculate-free-capacity-926b60b70bba18b7.yaml b/releasenotes/notes/hpe-3par-calculate-free-capacity-926b60b70bba18b7.yaml new file mode 100644 index 00000000000..0efae7e0d8e --- /dev/null +++ b/releasenotes/notes/hpe-3par-calculate-free-capacity-926b60b70bba18b7.yaml @@ -0,0 +1,6 @@ +--- +other: + - | + HPE 3PAR driver: In get_volume_stats response, updated the + logic to calculate free_capacity +