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:
parent
962fe29e77
commit
792462cad1
@ -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'])
|
||||
|
@ -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")
|
||||
|
@ -0,0 +1,6 @@
|
||||
---
|
||||
other:
|
||||
- |
|
||||
HPE 3PAR driver: In get_volume_stats response, updated the
|
||||
logic to calculate free_capacity
|
||||
|
Loading…
x
Reference in New Issue
Block a user