remove support for deprecated options in VxFlex OS driver
VxFlex OS driver drops support for options, which were marked as deprecated more than one release ago. Remove config options: sio_protection_domain_id sio_protection_domain_name sio_storage_pool_name sio_storage_pool_id Remove volume type options: sio:sp_name sio:sp_id sio:pd_name sio:pd_id sio:provisioning_type sio:iops_limit sio:bandwidth_limit Change-Id: I8df09848e6df0cd4ade7d96af8ccc3ba6783794b
This commit is contained in:
parent
0eaca453bc
commit
7fb9b430ee
|
@ -137,12 +137,6 @@ class TestVxFlexOSDriver(test.TestCase):
|
||||||
group=conf.SHARED_CONF_GROUP)
|
group=conf.SHARED_CONF_GROUP)
|
||||||
self.override_config('san_password', override='pass',
|
self.override_config('san_password', override='pass',
|
||||||
group=conf.SHARED_CONF_GROUP)
|
group=conf.SHARED_CONF_GROUP)
|
||||||
self.override_config('sio_storage_pool_id',
|
|
||||||
override=self.STORAGE_POOL_ID,
|
|
||||||
group=conf.SHARED_CONF_GROUP)
|
|
||||||
self.override_config('sio_protection_domain_id',
|
|
||||||
override=self.PROT_DOMAIN_ID,
|
|
||||||
group=conf.SHARED_CONF_GROUP)
|
|
||||||
self.override_config('vxflexos_storage_pools',
|
self.override_config('vxflexos_storage_pools',
|
||||||
override='PD1:SP1',
|
override='PD1:SP1',
|
||||||
group=conf.SHARED_CONF_GROUP)
|
group=conf.SHARED_CONF_GROUP)
|
||||||
|
|
|
@ -77,51 +77,6 @@ class TestCreateVolume(vxflexos.TestVxFlexOSDriver):
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def test_no_domain(self):
|
|
||||||
"""No protection domain name or ID provided."""
|
|
||||||
self.driver.configuration.sio_protection_domain_name = None
|
|
||||||
self.driver.configuration.sio_protection_domain_id = None
|
|
||||||
self.driver.storage_pools = None
|
|
||||||
self.volume.host = "host@backend"
|
|
||||||
self.assertRaises(exception.VolumeBackendAPIException,
|
|
||||||
self.test_create_volume)
|
|
||||||
|
|
||||||
def test_no_domain_id(self):
|
|
||||||
"""Only protection domain name provided."""
|
|
||||||
self.driver.protection_domain_id = None
|
|
||||||
self.driver.protection_domain_name = self.PROT_DOMAIN_NAME
|
|
||||||
self.driver.storage_pool_name = None
|
|
||||||
self.driver.storage_pool_id = self.STORAGE_POOL_ID
|
|
||||||
self.test_create_volume()
|
|
||||||
|
|
||||||
def test_no_domain_id_invalid_response(self):
|
|
||||||
self.set_https_response_mode(self.RESPONSE_MODE.Invalid)
|
|
||||||
self.assertRaises(exception.VolumeBackendAPIException,
|
|
||||||
self.test_no_domain_id)
|
|
||||||
|
|
||||||
def test_no_domain_id_badstatus_response(self):
|
|
||||||
self.set_https_response_mode(self.RESPONSE_MODE.BadStatus)
|
|
||||||
self.assertRaises(exception.VolumeBackendAPIException,
|
|
||||||
self.test_no_domain_id)
|
|
||||||
|
|
||||||
def test_no_storage_id(self):
|
|
||||||
"""Only protection domain name provided."""
|
|
||||||
self.driver.storage_pool_id = None
|
|
||||||
self.driver.storage_pool_name = self.STORAGE_POOL_NAME
|
|
||||||
self.driver.protection_domain_id = self.PROT_DOMAIN_ID
|
|
||||||
self.driver.protection_domain_name = None
|
|
||||||
self.test_create_volume()
|
|
||||||
|
|
||||||
def test_no_storage_id_invalid_response(self):
|
|
||||||
self.set_https_response_mode(self.RESPONSE_MODE.Invalid)
|
|
||||||
self.assertRaises(exception.VolumeBackendAPIException,
|
|
||||||
self.test_no_storage_id)
|
|
||||||
|
|
||||||
def test_no_storage_id_badstatus_response(self):
|
|
||||||
self.set_https_response_mode(self.RESPONSE_MODE.BadStatus)
|
|
||||||
self.assertRaises(exception.VolumeBackendAPIException,
|
|
||||||
self.test_no_storage_id)
|
|
||||||
|
|
||||||
def test_create_volume(self):
|
def test_create_volume(self):
|
||||||
"""Valid create volume parameters"""
|
"""Valid create volume parameters"""
|
||||||
self.driver.create_volume(self.volume)
|
self.driver.create_volume(self.volume)
|
||||||
|
|
|
@ -47,22 +47,6 @@ class TestInitializeConnection(vxflexos.TestVxFlexOSDriver):
|
||||||
self.assertIsNone(connection_properties['iopsLimit'])
|
self.assertIsNone(connection_properties['iopsLimit'])
|
||||||
self.assertIsNone(connection_properties['bandwidthLimit'])
|
self.assertIsNone(connection_properties['bandwidthLimit'])
|
||||||
|
|
||||||
def test_only_extraspecs(self):
|
|
||||||
qos = {}
|
|
||||||
extraspecs = {'sio:iops_limit': 2000, 'sio:bandwidth_limit': 4096}
|
|
||||||
connection_properties = (
|
|
||||||
self._initialize_connection(qos, extraspecs)['data'])
|
|
||||||
self.assertEqual(2000, int(connection_properties['iopsLimit']))
|
|
||||||
self.assertEqual(4096, int(connection_properties['bandwidthLimit']))
|
|
||||||
|
|
||||||
def test_qos_and_extraspecs(self):
|
|
||||||
qos = {'maxIOPS': 1000, 'maxBWS': 3072}
|
|
||||||
extraspecs = {'sio:iops_limit': 2000, 'sio:bandwidth_limit': 4000}
|
|
||||||
connection_properties = (
|
|
||||||
self._initialize_connection(qos, extraspecs)['data'])
|
|
||||||
self.assertEqual(1000, int(connection_properties['iopsLimit']))
|
|
||||||
self.assertEqual(3072, int(connection_properties['bandwidthLimit']))
|
|
||||||
|
|
||||||
def test_qos_scaling_and_max(self):
|
def test_qos_scaling_and_max(self):
|
||||||
qos = {'maxIOPS': 100, 'maxBWS': 2048, 'maxIOPSperGB': 10,
|
qos = {'maxIOPS': 100, 'maxBWS': 2048, 'maxIOPSperGB': 10,
|
||||||
'maxBWSperGB': 128}
|
'maxBWSperGB': 128}
|
||||||
|
@ -104,7 +88,7 @@ class TestInitializeConnection(vxflexos.TestVxFlexOSDriver):
|
||||||
def test_vol_id(self):
|
def test_vol_id(self):
|
||||||
extraspecs = qos = {}
|
extraspecs = qos = {}
|
||||||
connection_properties = (
|
connection_properties = (
|
||||||
self._initialize_connection(extraspecs, qos)['data'])
|
self._initialize_connection(qos, extraspecs)['data'])
|
||||||
self.assertEqual(fake.PROVIDER_ID,
|
self.assertEqual(fake.PROVIDER_ID,
|
||||||
connection_properties['scaleIO_volume_id'])
|
connection_properties['scaleIO_volume_id'])
|
||||||
|
|
||||||
|
|
|
@ -114,46 +114,20 @@ class TestMisc(vxflexos.TestVxFlexOSDriver):
|
||||||
def test_valid_configuration(self):
|
def test_valid_configuration(self):
|
||||||
self.driver.check_for_setup_error()
|
self.driver.check_for_setup_error()
|
||||||
|
|
||||||
def test_both_storage_pool(self):
|
|
||||||
"""Both storage name and ID provided.
|
|
||||||
|
|
||||||
INVALID
|
|
||||||
"""
|
|
||||||
self.driver.configuration.sio_storage_pool_id = self.STORAGE_POOL_ID
|
|
||||||
self.driver.configuration.sio_storage_pool_name = (
|
|
||||||
self.STORAGE_POOL_NAME
|
|
||||||
)
|
|
||||||
self.assertRaises(exception.InvalidInput,
|
|
||||||
self.driver.check_for_setup_error)
|
|
||||||
|
|
||||||
def test_no_storage_pool(self):
|
|
||||||
"""No storage name or ID provided.
|
|
||||||
|
|
||||||
VALID as storage_pools are defined
|
|
||||||
"""
|
|
||||||
self.driver.configuration.sio_storage_pool_name = None
|
|
||||||
self.driver.configuration.sio_storage_pool_id = None
|
|
||||||
self.driver.check_for_setup_error()
|
|
||||||
|
|
||||||
def test_both_domain(self):
|
|
||||||
"""Both domain and ID are provided
|
|
||||||
|
|
||||||
INVALID
|
|
||||||
"""
|
|
||||||
self.driver.configuration.sio_protection_domain_name = (
|
|
||||||
self.PROT_DOMAIN_NAME)
|
|
||||||
self.driver.configuration.sio_protection_domain_id = (
|
|
||||||
self.PROT_DOMAIN_ID)
|
|
||||||
self.assertRaises(exception.InvalidInput,
|
|
||||||
self.driver.check_for_setup_error)
|
|
||||||
|
|
||||||
def test_no_storage_pools(self):
|
def test_no_storage_pools(self):
|
||||||
"""No storage pools.
|
"""No storage pools.
|
||||||
|
|
||||||
VALID as domain and storage pool names are provided
|
INVALID Storage pools must be set
|
||||||
"""
|
"""
|
||||||
self.driver.storage_pools = None
|
self.driver.storage_pools = None
|
||||||
self.driver.check_for_setup_error()
|
self.assertRaises(exception.InvalidInput,
|
||||||
|
self.driver.check_for_setup_error)
|
||||||
|
|
||||||
|
def test_invalid_storage_pools(self):
|
||||||
|
"""Invalid storage pools data"""
|
||||||
|
self.driver.storage_pools = "test"
|
||||||
|
self.assertRaises(exception.InvalidInput,
|
||||||
|
self.driver.check_for_setup_error)
|
||||||
|
|
||||||
def test_volume_size_round_true(self):
|
def test_volume_size_round_true(self):
|
||||||
self.driver._check_volume_size(1)
|
self.driver._check_volume_size(1)
|
||||||
|
|
|
@ -59,14 +59,7 @@ CONF.register_opts(vxflexos_opts, group=configuration.SHARED_CONF_GROUP)
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
STORAGE_POOL_NAME = 'sio:sp_name'
|
|
||||||
STORAGE_POOL_ID = 'sio:sp_id'
|
|
||||||
PROTECTION_DOMAIN_NAME = 'sio:pd_name'
|
|
||||||
PROTECTION_DOMAIN_ID = 'sio:pd_id'
|
|
||||||
PROVISIONING_KEY = 'provisioning:type'
|
PROVISIONING_KEY = 'provisioning:type'
|
||||||
OLD_PROVISIONING_KEY = 'sio:provisioning_type'
|
|
||||||
IOPS_LIMIT_KEY = 'sio:iops_limit'
|
|
||||||
BANDWIDTH_LIMIT = 'sio:bandwidth_limit'
|
|
||||||
QOS_IOPS_LIMIT_KEY = 'maxIOPS'
|
QOS_IOPS_LIMIT_KEY = 'maxIOPS'
|
||||||
QOS_BANDWIDTH_LIMIT = 'maxBWS'
|
QOS_BANDWIDTH_LIMIT = 'maxBWS'
|
||||||
QOS_IOPS_PER_GB = 'maxIOPSperGB'
|
QOS_IOPS_PER_GB = 'maxIOPSperGB'
|
||||||
|
@ -140,8 +133,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
'port': self.server_port,
|
'port': self.server_port,
|
||||||
'user': self.server_username,
|
'user': self.server_username,
|
||||||
'verify_cert': self.verify_server_certificate})
|
'verify_cert': self.verify_server_certificate})
|
||||||
|
|
||||||
# starting in Pike, prefer the sio_storage_pools option
|
|
||||||
self.storage_pools = None
|
self.storage_pools = None
|
||||||
if self.configuration.vxflexos_storage_pools:
|
if self.configuration.vxflexos_storage_pools:
|
||||||
self.storage_pools = [
|
self.storage_pools = [
|
||||||
|
@ -150,15 +141,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
LOG.info("Storage pools names: %(pools)s.",
|
LOG.info("Storage pools names: %(pools)s.",
|
||||||
{'pools': self.storage_pools})
|
{'pools': self.storage_pools})
|
||||||
|
|
||||||
LOG.info("Storage pool name: %(pool)s, pool id: %(pool_id)s.",
|
|
||||||
{'pool': self.configuration.sio_storage_pool_name,
|
|
||||||
'pool_id': self.configuration.sio_storage_pool_id})
|
|
||||||
|
|
||||||
LOG.info("Protection domain name: %(domain)s, "
|
|
||||||
"domain id: %(domain_id)s.",
|
|
||||||
{'domain': self.configuration.sio_protection_domain_name,
|
|
||||||
'domain_id': self.configuration.sio_protection_domain_id})
|
|
||||||
|
|
||||||
self.provisioning_type = (
|
self.provisioning_type = (
|
||||||
'thin' if self.configuration.san_thin_provision else 'thick')
|
'thin' if self.configuration.san_thin_provision else 'thick')
|
||||||
LOG.info("Default provisioning type: %(provisioning_type)s.",
|
LOG.info("Default provisioning type: %(provisioning_type)s.",
|
||||||
|
@ -187,20 +169,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
return vxflexos_opts
|
return vxflexos_opts
|
||||||
|
|
||||||
def check_for_setup_error(self):
|
def check_for_setup_error(self):
|
||||||
# make sure both domain name and id are not specified
|
|
||||||
if (self.configuration.sio_protection_domain_name
|
|
||||||
and self.configuration.sio_protection_domain_id):
|
|
||||||
msg = _("Cannot specify both protection domain name "
|
|
||||||
"and protection domain id.")
|
|
||||||
raise exception.InvalidInput(reason=msg)
|
|
||||||
|
|
||||||
# make sure both storage pool and id are not specified
|
|
||||||
if (self.configuration.sio_storage_pool_name
|
|
||||||
and self.configuration.sio_storage_pool_id):
|
|
||||||
msg = _("Cannot specify both storage pool name and storage "
|
|
||||||
"pool id.")
|
|
||||||
raise exception.InvalidInput(reason=msg)
|
|
||||||
|
|
||||||
# make sure the REST gateway is specified
|
# make sure the REST gateway is specified
|
||||||
if not self.server_ip:
|
if not self.server_ip:
|
||||||
msg = _("REST server IP must be specified.")
|
msg = _("REST server IP must be specified.")
|
||||||
|
@ -246,8 +214,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
"removed in a future version"))
|
"removed in a future version"))
|
||||||
versionutils.report_deprecated_feature(LOG, msg)
|
versionutils.report_deprecated_feature(LOG, msg)
|
||||||
|
|
||||||
# we have enough information now to validate pools
|
|
||||||
self.storage_pools = self._build_storage_pool_list()
|
|
||||||
if not self.storage_pools:
|
if not self.storage_pools:
|
||||||
msg = (_("Must specify storage pools. Option: "
|
msg = (_("Must specify storage pools. Option: "
|
||||||
"vxflexos_storage_pools."))
|
"vxflexos_storage_pools."))
|
||||||
|
@ -281,41 +247,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
"and prevent this from occurring.",
|
"and prevent this from occurring.",
|
||||||
pool)
|
pool)
|
||||||
|
|
||||||
def _build_storage_pool_list(self):
|
|
||||||
"""Build storage pool list
|
|
||||||
|
|
||||||
This method determines the list of storage pools that
|
|
||||||
are requested, by concatenating a few config settings
|
|
||||||
"""
|
|
||||||
# start with the list of pools supplied in the configuration
|
|
||||||
pools = self.storage_pools
|
|
||||||
# append the domain:pool specified individually
|
|
||||||
if (self.configuration.sio_storage_pool_name is not None and
|
|
||||||
self.configuration.sio_protection_domain_name is not None):
|
|
||||||
extra_pool = "{}:{}".format(
|
|
||||||
self.configuration.sio_protection_domain_name,
|
|
||||||
self.configuration.sio_storage_pool_name)
|
|
||||||
LOG.info("Ensuring %s is in the list of configured pools.",
|
|
||||||
extra_pool)
|
|
||||||
if pools is None:
|
|
||||||
pools = []
|
|
||||||
if extra_pool not in pools:
|
|
||||||
pools.append(extra_pool)
|
|
||||||
# if specified, account for the storage_pool_id
|
|
||||||
if self.configuration.sio_storage_pool_id is not None:
|
|
||||||
# the user specified a storage pool id
|
|
||||||
# get the domain and pool names from SIO
|
|
||||||
extra_pool = self._get_storage_pool_name(
|
|
||||||
self.configuration.sio_storage_pool_id)
|
|
||||||
LOG.info("Ensuring %s is in the list of configured pools.",
|
|
||||||
extra_pool)
|
|
||||||
if pools is None:
|
|
||||||
pools = []
|
|
||||||
if extra_pool not in pools:
|
|
||||||
pools.append(extra_pool)
|
|
||||||
|
|
||||||
return pools
|
|
||||||
|
|
||||||
def _get_queryable_statistics(self, sio_type, sio_id):
|
def _get_queryable_statistics(self, sio_type, sio_id):
|
||||||
if self.statisticProperties is None:
|
if self.statisticProperties is None:
|
||||||
self.statisticProperties = [
|
self.statisticProperties = [
|
||||||
|
@ -350,48 +281,8 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
|
|
||||||
return self.statisticProperties
|
return self.statisticProperties
|
||||||
|
|
||||||
def _find_storage_pool_id_from_storage_type(self, storage_type):
|
|
||||||
# Default to what was configured in configuration file if not defined.
|
|
||||||
return storage_type.get(STORAGE_POOL_ID)
|
|
||||||
|
|
||||||
def _find_storage_pool_name_from_storage_type(self, storage_type):
|
|
||||||
pool_name = storage_type.get(STORAGE_POOL_NAME)
|
|
||||||
# using the extra spec of sio:sp_name is deprecated
|
|
||||||
if pool_name is not None:
|
|
||||||
LOG.warning("Using the volume type extra spec of "
|
|
||||||
"sio:sp_name is deprecated and will be removed "
|
|
||||||
"in a future version. The supported way to "
|
|
||||||
"specify this is by specifying an extra spec "
|
|
||||||
"of 'pool_name=protection_domain:storage_pool'")
|
|
||||||
return pool_name
|
|
||||||
|
|
||||||
def _find_protection_domain_id_from_storage_type(self, storage_type):
|
|
||||||
# Default to what was configured in configuration file if not defined.
|
|
||||||
return storage_type.get(PROTECTION_DOMAIN_ID)
|
|
||||||
|
|
||||||
def _find_protection_domain_name_from_storage_type(self, storage_type):
|
|
||||||
domain_name = storage_type.get(PROTECTION_DOMAIN_NAME)
|
|
||||||
# using the extra spec of sio:pd_name is deprecated
|
|
||||||
if domain_name is not None:
|
|
||||||
LOG.warning("Using the volume type extra spec of "
|
|
||||||
"sio:pd_name is deprecated and will be removed "
|
|
||||||
"in a future version. The supported way to "
|
|
||||||
"specify this is by specifying an extra spec "
|
|
||||||
"of 'pool_name=protection_domain:storage_pool'")
|
|
||||||
return domain_name
|
|
||||||
|
|
||||||
def _find_provisioning_type(self, storage_type):
|
def _find_provisioning_type(self, storage_type):
|
||||||
new_provisioning_type = storage_type.get(PROVISIONING_KEY)
|
provisioning_type = storage_type.get(PROVISIONING_KEY)
|
||||||
old_provisioning_type = storage_type.get(OLD_PROVISIONING_KEY)
|
|
||||||
if new_provisioning_type is None and old_provisioning_type is not None:
|
|
||||||
LOG.info("Using sio:provisioning_type for defining "
|
|
||||||
"thin or thick volume will be deprecated in the "
|
|
||||||
"Ocata release of OpenStack. Please use "
|
|
||||||
"provisioning:type configuration option.")
|
|
||||||
provisioning_type = old_provisioning_type
|
|
||||||
else:
|
|
||||||
provisioning_type = new_provisioning_type
|
|
||||||
|
|
||||||
if provisioning_type is not None:
|
if provisioning_type is not None:
|
||||||
if provisioning_type not in ('thick', 'thin'):
|
if provisioning_type not in ('thick', 'thin'):
|
||||||
msg = _("Illegal provisioning type. The supported "
|
msg = _("Illegal provisioning type. The supported "
|
||||||
|
@ -401,21 +292,6 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
else:
|
else:
|
||||||
return self.provisioning_type
|
return self.provisioning_type
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _find_limit(storage_type, qos_key, extraspecs_key):
|
|
||||||
qos_limit = (storage_type.get(qos_key)
|
|
||||||
if qos_key is not None else None)
|
|
||||||
extraspecs_limit = (storage_type.get(extraspecs_key)
|
|
||||||
if extraspecs_key is not None else None)
|
|
||||||
if extraspecs_limit is not None:
|
|
||||||
if qos_limit is not None:
|
|
||||||
LOG.warning("QoS specs are overriding extra_specs.")
|
|
||||||
else:
|
|
||||||
LOG.info("Using extra_specs for defining QoS specs "
|
|
||||||
"will be deprecated in the N release "
|
|
||||||
"of OpenStack. Please use QoS specs.")
|
|
||||||
return qos_limit if qos_limit is not None else extraspecs_limit
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _version_greater_than(ver1, ver2):
|
def _version_greater_than(ver1, ver2):
|
||||||
return version.LooseVersion(ver1) > version.LooseVersion(ver2)
|
return version.LooseVersion(ver1) > version.LooseVersion(ver2)
|
||||||
|
@ -481,65 +357,18 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
|
|
||||||
volname = self._id_to_base64(volume.id)
|
volname = self._id_to_base64(volume.id)
|
||||||
|
|
||||||
# the cinder scheduler will send us the pd:sp for the volume
|
pd_sp = volume_utils.extract_host(volume.host, 'pool')
|
||||||
requested_pd = None
|
protection_domain_name = pd_sp.split(':')[0]
|
||||||
requested_sp = None
|
storage_pool_name = pd_sp.split(':')[1]
|
||||||
try:
|
|
||||||
pd_sp = volume_utils.extract_host(volume.host, 'pool')
|
|
||||||
if pd_sp is not None:
|
|
||||||
requested_pd = pd_sp.split(':')[0]
|
|
||||||
requested_sp = pd_sp.split(':')[1]
|
|
||||||
except (KeyError, ValueError):
|
|
||||||
# we seem to have not gotten it so we'll figure out defaults
|
|
||||||
requested_pd = None
|
|
||||||
requested_sp = None
|
|
||||||
|
|
||||||
storage_type = self._get_volumetype_extraspecs(volume)
|
storage_type = self._get_volumetype_extraspecs(volume)
|
||||||
type_sp = self._find_storage_pool_name_from_storage_type(storage_type)
|
|
||||||
storage_pool_id = self._find_storage_pool_id_from_storage_type(
|
|
||||||
storage_type)
|
|
||||||
protection_domain_id = (
|
|
||||||
self._find_protection_domain_id_from_storage_type(storage_type))
|
|
||||||
type_pd = (
|
|
||||||
self._find_protection_domain_name_from_storage_type(storage_type))
|
|
||||||
provisioning_type = self._find_provisioning_type(storage_type)
|
provisioning_type = self._find_provisioning_type(storage_type)
|
||||||
|
|
||||||
if type_sp is not None:
|
|
||||||
# prefer the storage pool in the volume type
|
|
||||||
# this was undocumented so will likely not happen
|
|
||||||
storage_pool_name = type_sp
|
|
||||||
else:
|
|
||||||
storage_pool_name = requested_sp
|
|
||||||
if type_pd is not None:
|
|
||||||
# prefer the protection domain in the volume type
|
|
||||||
# this was undocumented so will likely not happen
|
|
||||||
protection_domain_name = type_pd
|
|
||||||
else:
|
|
||||||
protection_domain_name = requested_pd
|
|
||||||
|
|
||||||
# check if the requested pd:sp match the ones that will
|
|
||||||
# be used. If not, spit out a deprecation notice
|
|
||||||
# should never happen
|
|
||||||
if (protection_domain_name != requested_pd
|
|
||||||
or storage_pool_name != requested_sp):
|
|
||||||
LOG.warning(
|
|
||||||
"Creating volume in different protection domain or "
|
|
||||||
"storage pool than scheduler requested. "
|
|
||||||
"Requested: %(req_pd)s:%(req_sp)s, "
|
|
||||||
"Actual %(act_pd)s:%(act_sp)s.",
|
|
||||||
{'req_pd': requested_pd,
|
|
||||||
'req_sp': requested_sp,
|
|
||||||
'act_pd': protection_domain_name,
|
|
||||||
'act_sp': storage_pool_name})
|
|
||||||
|
|
||||||
LOG.info("Volume type: %(volume_type)s, "
|
LOG.info("Volume type: %(volume_type)s, "
|
||||||
"storage pool name: %(pool_name)s, "
|
"storage pool name: %(pool_name)s, "
|
||||||
"storage pool id: %(pool_id)s, protection domain id: "
|
"protection domain name: %(domain_name)s.",
|
||||||
"%(domain_id)s, protection domain name: %(domain_name)s.",
|
|
||||||
{'volume_type': storage_type,
|
{'volume_type': storage_type,
|
||||||
'pool_name': storage_pool_name,
|
'pool_name': storage_pool_name,
|
||||||
'pool_id': storage_pool_id,
|
|
||||||
'domain_id': protection_domain_id,
|
|
||||||
'domain_name': protection_domain_name})
|
'domain_name': protection_domain_name})
|
||||||
|
|
||||||
domain_id = self._get_protection_domain_id(protection_domain_name)
|
domain_id = self._get_protection_domain_id(protection_domain_name)
|
||||||
|
@ -930,15 +759,13 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
|
|
||||||
def _get_bandwidth_limit(self, size, storage_type):
|
def _get_bandwidth_limit(self, size, storage_type):
|
||||||
try:
|
try:
|
||||||
max_bandwidth = self._find_limit(storage_type, QOS_BANDWIDTH_LIMIT,
|
max_bandwidth = storage_type.get(QOS_BANDWIDTH_LIMIT)
|
||||||
BANDWIDTH_LIMIT)
|
|
||||||
if max_bandwidth is not None:
|
if max_bandwidth is not None:
|
||||||
max_bandwidth = (self._round_to_num_gran(int(max_bandwidth),
|
max_bandwidth = (self._round_to_num_gran(int(max_bandwidth),
|
||||||
units.Ki))
|
units.Ki))
|
||||||
max_bandwidth = six.text_type(max_bandwidth)
|
max_bandwidth = six.text_type(max_bandwidth)
|
||||||
LOG.info("max bandwidth is: %s", max_bandwidth)
|
LOG.info("max bandwidth is: %s", max_bandwidth)
|
||||||
bw_per_gb = self._find_limit(storage_type, QOS_BANDWIDTH_PER_GB,
|
bw_per_gb = storage_type.get(QOS_BANDWIDTH_PER_GB)
|
||||||
None)
|
|
||||||
LOG.info("bandwidth per gb is: %s", bw_per_gb)
|
LOG.info("bandwidth per gb is: %s", bw_per_gb)
|
||||||
if bw_per_gb is None:
|
if bw_per_gb is None:
|
||||||
return max_bandwidth
|
return max_bandwidth
|
||||||
|
@ -957,10 +784,9 @@ class VxFlexOSDriver(driver.VolumeDriver):
|
||||||
raise exception.InvalidInput(reason=msg)
|
raise exception.InvalidInput(reason=msg)
|
||||||
|
|
||||||
def _get_iops_limit(self, size, storage_type):
|
def _get_iops_limit(self, size, storage_type):
|
||||||
max_iops = self._find_limit(storage_type, QOS_IOPS_LIMIT_KEY,
|
max_iops = storage_type.get(QOS_IOPS_LIMIT_KEY)
|
||||||
IOPS_LIMIT_KEY)
|
|
||||||
LOG.info("max iops is: %s", max_iops)
|
LOG.info("max iops is: %s", max_iops)
|
||||||
iops_per_gb = self._find_limit(storage_type, QOS_IOPS_PER_GB, None)
|
iops_per_gb = storage_type.get(QOS_IOPS_PER_GB)
|
||||||
LOG.info("iops per gb is: %s", iops_per_gb)
|
LOG.info("iops per gb is: %s", iops_per_gb)
|
||||||
try:
|
try:
|
||||||
if iops_per_gb is None:
|
if iops_per_gb is None:
|
||||||
|
|
|
@ -26,10 +26,6 @@ SIO_SERVER_CERTIFICATE_PATH = "sio_server_certificate_path"
|
||||||
SIO_ROUND_VOLUME_CAPACITY = "sio_round_volume_capacity"
|
SIO_ROUND_VOLUME_CAPACITY = "sio_round_volume_capacity"
|
||||||
SIO_UNMAP_VOLUME_BEFORE_DELETION = "sio_unmap_volume_before_deletion"
|
SIO_UNMAP_VOLUME_BEFORE_DELETION = "sio_unmap_volume_before_deletion"
|
||||||
SIO_STORAGE_POOLS = "sio_storage_pools"
|
SIO_STORAGE_POOLS = "sio_storage_pools"
|
||||||
SIO_PROTECTION_DOMAIN_ID = "sio_protection_domain_id"
|
|
||||||
SIO_PROTECTION_DOMAIN_NAME = "sio_protection_domain_name"
|
|
||||||
SIO_STORAGE_POOL_NAME = "sio_storage_pool_name"
|
|
||||||
SIO_STORAGE_POOL_ID = "sio_storage_pool_id"
|
|
||||||
SIO_SERVER_API_VERSION = "sio_server_api_version"
|
SIO_SERVER_API_VERSION = "sio_server_api_version"
|
||||||
SIO_MAX_OVER_SUBSCRIPTION_RATIO = "sio_max_over_subscription_ratio"
|
SIO_MAX_OVER_SUBSCRIPTION_RATIO = "sio_max_over_subscription_ratio"
|
||||||
SIO_ALLOW_NON_PADDED_VOLUMES = "sio_allow_non_padded_volumes"
|
SIO_ALLOW_NON_PADDED_VOLUMES = "sio_allow_non_padded_volumes"
|
||||||
|
@ -80,34 +76,6 @@ deprecated_opts = [
|
||||||
deprecated_for_removal=True,
|
deprecated_for_removal=True,
|
||||||
deprecated_reason='Replaced by %s.' %
|
deprecated_reason='Replaced by %s.' %
|
||||||
VXFLEXOS_STORAGE_POOLS),
|
VXFLEXOS_STORAGE_POOLS),
|
||||||
cfg.StrOpt(SIO_PROTECTION_DOMAIN_ID,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_reason="Replaced by %s option" %
|
|
||||||
VXFLEXOS_STORAGE_POOLS,
|
|
||||||
deprecated_since="Pike",
|
|
||||||
help='Protection Domain ID. '
|
|
||||||
'Deprecated, use %s instead. ' % VXFLEXOS_STORAGE_POOLS),
|
|
||||||
cfg.StrOpt(SIO_PROTECTION_DOMAIN_NAME,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_reason="Replaced by %s option" %
|
|
||||||
VXFLEXOS_STORAGE_POOLS,
|
|
||||||
deprecated_since="Pike",
|
|
||||||
help='Protection Domain Name. '
|
|
||||||
'Deprecated, use %s instead. ' % VXFLEXOS_STORAGE_POOLS),
|
|
||||||
cfg.StrOpt(SIO_STORAGE_POOL_NAME,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_reason="Replaced by %s option" %
|
|
||||||
VXFLEXOS_STORAGE_POOLS,
|
|
||||||
deprecated_since="Pike",
|
|
||||||
help='Storage Pool name. '
|
|
||||||
'Deprecated, use %s instead. ' % VXFLEXOS_STORAGE_POOLS),
|
|
||||||
cfg.StrOpt(SIO_STORAGE_POOL_ID,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_reason="Replaced by %s option" %
|
|
||||||
VXFLEXOS_STORAGE_POOLS,
|
|
||||||
deprecated_since="Pike",
|
|
||||||
help='Storage Pool ID.'
|
|
||||||
'Deprecated, use %s instead. ' % VXFLEXOS_STORAGE_POOLS),
|
|
||||||
cfg.StrOpt(SIO_SERVER_API_VERSION,
|
cfg.StrOpt(SIO_SERVER_API_VERSION,
|
||||||
help='renamed to %s.' %
|
help='renamed to %s.' %
|
||||||
VXFLEXOS_SERVER_API_VERSION,
|
VXFLEXOS_SERVER_API_VERSION,
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
VxFlex OS (ScaleIO) driver drops support for options, which
|
||||||
|
were marked as deprecated in Pike release.
|
||||||
|
Remove config options: ``sio_protection_domain_id``,
|
||||||
|
``sio_protection_domain_name``,
|
||||||
|
``sio_storage_pool_name``,
|
||||||
|
``sio_storage_pool_id``.
|
||||||
|
Remove volume type options: ``sio:sp_name``,
|
||||||
|
``sio:sp_id``,
|
||||||
|
``sio:pd_name``,
|
||||||
|
``sio:pd_id``,
|
||||||
|
``sio:provisioning_type``,
|
||||||
|
``sio:iops_limit``,
|
||||||
|
``sio:bandwidth_limit``.
|
Loading…
Reference in New Issue