Fix wrong capacity in pool_stat for DellEMC manila drivers.

DellEMC manila drivers have bugs in returning capacity in pool_stat.
The current powermax/vnx manila return size in MB and unity manila
returns size in bytes.

Change-Id: I1a2c28548d02eee6632313a41a5c4d8ab6ad9532
Closes-bug: #1890372
Closes-bug: #1890375
Closes-bug: #1890376
(cherry picked from commit 53f756d065)
(cherry picked from commit ba00d1b9ab)
(cherry picked from commit a6e3474d31)
(cherry picked from commit 184f2a6817)
(cherry picked from commit 2f1bfb6ae9)
This commit is contained in:
Sam Wan 2020-08-05 04:06:08 -04:00
parent 826cbfa7ce
commit b0d1ac3a96
9 changed files with 69 additions and 19 deletions

View File

@ -20,6 +20,7 @@ from oslo_log import log
from oslo_utils import fnmatch from oslo_utils import fnmatch
from oslo_utils import netutils from oslo_utils import netutils
from oslo_utils import timeutils from oslo_utils import timeutils
from oslo_utils import units
import ssl import ssl
CONF = cfg.CONF CONF = cfg.CONF
@ -179,3 +180,11 @@ def export_unc_path(ip_addr):
if netutils.is_valid_ipv6(ip_addr): if netutils.is_valid_ipv6(ip_addr):
ip_addr = ip_addr.replace(':', '-') + unc_suffix ip_addr = ip_addr.replace(':', '-') + unc_suffix
return ip_addr return ip_addr
def bytes_to_gb(size):
return round(float(size) / units.Gi, 2)
def mb_to_gb(size):
return bytes_to_gb(size * units.Mi)

View File

@ -369,10 +369,12 @@ class UnityStorageConnection(driver.StorageConnection):
pool_stat = { pool_stat = {
'pool_name': pool.name, 'pool_name': pool.name,
'thin_provisioning': True, 'thin_provisioning': True,
'total_capacity_gb': total_size, 'total_capacity_gb': enas_utils.bytes_to_gb(total_size),
'free_capacity_gb': total_size - used_size, 'free_capacity_gb':
'allocated_capacity_gb': used_size, enas_utils.bytes_to_gb(total_size - used_size),
'provisioned_capacity_gb': float(pool.size_subscribed), 'allocated_capacity_gb': enas_utils.bytes_to_gb(used_size),
'provisioned_capacity_gb':
enas_utils.bytes_to_gb(pool.size_subscribed),
'qos': False, 'qos': False,
'reserved_percentage': self.reserved_percentage, 'reserved_percentage': self.reserved_percentage,
'max_over_subscription_ratio': 'max_over_subscription_ratio':

View File

@ -615,8 +615,9 @@ class VMAXStorageConnection(driver.StorageConnection):
pool_stat = { pool_stat = {
'pool_name': pool['name'], 'pool_name': pool['name'],
'total_capacity_gb': total_size, 'total_capacity_gb': enas_utils.mb_to_gb(total_size),
'free_capacity_gb': total_size - used_size, 'free_capacity_gb':
enas_utils.mb_to_gb(total_size - used_size),
'qos': False, 'qos': False,
'reserved_percentage': self.reserved_percentage, 'reserved_percentage': self.reserved_percentage,
'snapshot_support': True, 'snapshot_support': True,

View File

@ -624,8 +624,9 @@ class VNXStorageConnection(driver.StorageConnection):
pool_stat = dict( pool_stat = dict(
pool_name=pool['name'], pool_name=pool['name'],
total_capacity_gb=total_size, total_capacity_gb=enas_utils.mb_to_gb(total_size),
free_capacity_gb=total_size - used_size, free_capacity_gb=enas_utils.mb_to_gb(
total_size - used_size),
qos=False, qos=False,
reserved_percentage=self.reserved_percentage, reserved_percentage=self.reserved_percentage,
) )

View File

@ -139,3 +139,19 @@ class ExportUncPathTestCase(test.TestCase):
@ddt.unpack @ddt.unpack
def test_invalid_ipv6_addr(self, ip_addr): def test_invalid_ipv6_addr(self, ip_addr):
self.assertEqual(ip_addr, utils.export_unc_path(ip_addr)) self.assertEqual(ip_addr, utils.export_unc_path(ip_addr))
@ddt.ddt
class SizeToGbTestCase(test.TestCase):
@ddt.data({'size_in_bytes': 1073741824, 'size_in_gb': 1.0},
{'size_in_bytes': 5610301030, 'size_in_gb': 5.22})
@ddt.unpack
def test_bytes_to_gb(self, size_in_bytes, size_in_gb):
self.assertEqual(size_in_gb, utils.bytes_to_gb(size_in_bytes))
@ddt.data({'size_in_mb': 1024, 'size_in_gb': 1.0},
{'size_in_mb': 5346, 'size_in_gb': 5.22})
@ddt.unpack
def test_mb_to_gb(self, size_in_mb, size_in_gb):
self.assertEqual(size_in_gb, utils.mb_to_gb(size_in_mb))

View File

@ -16,14 +16,15 @@
import copy import copy
import ddt import ddt
import mock import mock
from oslo_utils import units
import six import six
from manila import exception from manila import exception
from manila.share.drivers.dell_emc.common.enas import utils as enas_utils
from manila import test from manila import test
from manila.tests.share.drivers.dell_emc.plugins.unity import fake_exceptions from manila.tests.share.drivers.dell_emc.plugins.unity import fake_exceptions
from manila.tests.share.drivers.dell_emc.plugins.unity import res_mock from manila.tests.share.drivers.dell_emc.plugins.unity import res_mock
from manila.tests.share.drivers.dell_emc.plugins.unity import utils from manila.tests.share.drivers.dell_emc.plugins.unity import utils
from oslo_utils import units
@ddt.ddt @ddt.ddt
@ -260,14 +261,18 @@ class TestConnection(test.TestCase):
self.assertEqual(5, len(stat_dict)) self.assertEqual(5, len(stat_dict))
pool = stat_dict['pools'][0] pool = stat_dict['pools'][0]
self.assertEqual('pool_1', pool['pool_name']) self.assertEqual('pool_1', pool['pool_name'])
self.assertEqual(500000.0, pool['total_capacity_gb']) self.assertEqual(
enas_utils.bytes_to_gb(500000.0), pool['total_capacity_gb'])
self.assertEqual(False, pool['qos']) self.assertEqual(False, pool['qos'])
self.assertEqual(30000.0, pool['provisioned_capacity_gb']) self.assertEqual(
enas_utils.bytes_to_gb(30000.0), pool['provisioned_capacity_gb'])
self.assertEqual(20, pool['max_over_subscription_ratio']) self.assertEqual(20, pool['max_over_subscription_ratio'])
self.assertEqual(10000.0, pool['allocated_capacity_gb']) self.assertEqual(
enas_utils.bytes_to_gb(10000.0), pool['allocated_capacity_gb'])
self.assertEqual(0, pool['reserved_percentage']) self.assertEqual(0, pool['reserved_percentage'])
self.assertTrue(pool['thin_provisioning']) self.assertTrue(pool['thin_provisioning'])
self.assertEqual(490000.0, pool['free_capacity_gb']) self.assertEqual(
enas_utils.bytes_to_gb(490000.0), pool['free_capacity_gb'])
@res_mock.patch_connection @res_mock.patch_connection
def test_update_share_stats__nonexistent_pools(self, connection): def test_update_share_stats__nonexistent_pools(self, connection):

View File

@ -21,6 +21,7 @@ from oslo_log import log
from manila import exception from manila import exception
from manila.share.drivers.dell_emc.common.enas import connector from manila.share.drivers.dell_emc.common.enas import connector
from manila.share.drivers.dell_emc.common.enas import utils as enas_utils
from manila.share.drivers.dell_emc.plugins.vnx import connection from manila.share.drivers.dell_emc.plugins.vnx import connection
from manila.share.drivers.dell_emc.plugins.vnx import object_manager from manila.share.drivers.dell_emc.plugins.vnx import object_manager
from manila import test from manila import test
@ -1460,12 +1461,14 @@ class StorageConnectionTestCase(test.TestCase):
for pool in fakes.STATS['pools']: for pool in fakes.STATS['pools']:
if pool['pool_name'] == fakes.FakeData.pool_name: if pool['pool_name'] == fakes.FakeData.pool_name:
self.assertEqual(fakes.FakeData.pool_total_size, self.assertEqual(
pool['total_capacity_gb']) enas_utils.mb_to_gb(fakes.FakeData.pool_total_size),
pool['total_capacity_gb'])
free_size = (fakes.FakeData.pool_total_size - free_size = (fakes.FakeData.pool_total_size -
fakes.FakeData.pool_used_size) fakes.FakeData.pool_used_size)
self.assertEqual(free_size, pool['free_capacity_gb']) self.assertEqual(enas_utils.mb_to_gb(free_size),
pool['free_capacity_gb'])
def test_update_share_stats_without_matched_config_pools(self): def test_update_share_stats_without_matched_config_pools(self):
self.connection.pools = set('fake_pool') self.connection.pools = set('fake_pool')

View File

@ -21,6 +21,7 @@ from oslo_log import log
from manila import exception from manila import exception
from manila.share.drivers.dell_emc.common.enas import connector from manila.share.drivers.dell_emc.common.enas import connector
from manila.share.drivers.dell_emc.common.enas import utils as enas_utils
from manila.share.drivers.dell_emc.plugins.vnx import connection from manila.share.drivers.dell_emc.plugins.vnx import connection
from manila.share.drivers.dell_emc.plugins.vnx import object_manager from manila.share.drivers.dell_emc.plugins.vnx import object_manager
from manila import test from manila import test
@ -2212,12 +2213,14 @@ class StorageConnectionTestCase(test.TestCase):
for pool in fakes.STATS['pools']: for pool in fakes.STATS['pools']:
if pool['pool_name'] == fakes.FakeData.pool_name: if pool['pool_name'] == fakes.FakeData.pool_name:
self.assertEqual(fakes.FakeData.pool_total_size, self.assertEqual(
pool['total_capacity_gb']) enas_utils.mb_to_gb(fakes.FakeData.pool_total_size),
pool['total_capacity_gb'])
free_size = (fakes.FakeData.pool_total_size - free_size = (fakes.FakeData.pool_total_size -
fakes.FakeData.pool_used_size) fakes.FakeData.pool_used_size)
self.assertEqual(free_size, pool['free_capacity_gb']) self.assertEqual(
enas_utils.mb_to_gb(free_size), pool['free_capacity_gb'])
def test_update_share_stats_without_matched_config_pools(self): def test_update_share_stats_without_matched_config_pools(self):
self.connection.pools = set('fake_pool') self.connection.pools = set('fake_pool')

View File

@ -0,0 +1,10 @@
---
fixes:
- |
Dell EMC Manila Driver: Fixes wrong capacity in pool_stat.
`bug 1890372 <https://bugs.launchpad.net/manila/+bug/1890372>`_
powermax manila return size in MB,
`bug 1890375 <https://bugs.launchpad.net/manila/+bug/1890375>`_
vnx manila return size in MB,
`bug 1890376 <https://bugs.launchpad.net/manila/+bug/1890376>`_
unity manila return size in bytes.