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
This commit is contained in:
raghavendrat 2024-11-19 09:47:41 +00:00
parent 962fe29e77
commit 792462cad1
3 changed files with 58 additions and 66 deletions

View File

@ -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'])

View File

@ -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")

View File

@ -0,0 +1,6 @@
---
other:
- |
HPE 3PAR driver: In get_volume_stats response, updated the
logic to calculate free_capacity