XtremIO: reduce number of backend calls
Improve terminate connection
- use improved rest capabilities introduces in XMS 4.2 to query all
initiators in 1 call.
- create a new client for XMS 4.2 and above
- add unittests for client factory, old get initiators igs,
and fix code to handle the optimized code
Change-Id: Ic2b38e92f4c427cf2791fb07e871e173961478d2
Implements: blueprint xtremio-unmap-query-improvments
(cherry picked from commit 6301446230
)
This commit is contained in:
parent
81ccd589b7
commit
99e79ab858
|
@ -37,9 +37,10 @@ typ2id = {'volumes': 'vol-id',
|
||||||
'consistency-group-volumes': 'cg-vol-id',
|
'consistency-group-volumes': 'cg-vol-id',
|
||||||
}
|
}
|
||||||
|
|
||||||
xms_init = {'xms': {1: {'version': '4.0.0'}},
|
xms_init = {'xms': {1: {'version': '4.2.0',
|
||||||
|
'sw-version': '4.2.0-30'}},
|
||||||
'clusters': {1: {'name': 'brick1',
|
'clusters': {1: {'name': 'brick1',
|
||||||
'sys-sw-version': "4.0.0-devel_ba23ee5381eeab73",
|
'sys-sw-version': "4.2.0-devel_ba23ee5381eeab73",
|
||||||
'ud-ssd-space': '8146708710',
|
'ud-ssd-space': '8146708710',
|
||||||
'ud-ssd-space-in-use': '708710',
|
'ud-ssd-space-in-use': '708710',
|
||||||
'vol-size': '29884416',
|
'vol-size': '29884416',
|
||||||
|
@ -249,16 +250,16 @@ class CommonData(object):
|
||||||
}
|
}
|
||||||
|
|
||||||
test_volume = fake_volume_obj(context,
|
test_volume = fake_volume_obj(context,
|
||||||
name = 'vol1',
|
name='vol1',
|
||||||
size = 1,
|
size=1,
|
||||||
volume_name = 'vol1',
|
volume_name='vol1',
|
||||||
id = '192eb39b-6c2f-420c-bae3-3cfd117f0001',
|
id='192eb39b-6c2f-420c-bae3-3cfd117f0001',
|
||||||
provider_auth = None,
|
provider_auth=None,
|
||||||
project_id = 'project',
|
project_id='project',
|
||||||
display_name = 'vol1',
|
display_name='vol1',
|
||||||
display_description = 'test volume',
|
display_description='test volume',
|
||||||
volume_type_id = None,
|
volume_type_id=None,
|
||||||
consistencygroup_id =
|
consistencygroup_id=
|
||||||
'192eb39b-6c2f-420c-bae3-3cfd117f0345',
|
'192eb39b-6c2f-420c-bae3-3cfd117f0345',
|
||||||
)
|
)
|
||||||
test_snapshot = D()
|
test_snapshot = D()
|
||||||
|
@ -328,7 +329,9 @@ class BaseXtremIODriverTestCase(test.TestCase):
|
||||||
xtremio_volumes_per_glance_cache = 100,
|
xtremio_volumes_per_glance_cache = 100,
|
||||||
driver_ssl_cert_verify = True,
|
driver_ssl_cert_verify = True,
|
||||||
driver_ssl_cert_path =
|
driver_ssl_cert_path =
|
||||||
'/test/path/root_ca.crt')
|
'/test/path/root_ca.crt',
|
||||||
|
xtremio_array_busy_retry_count=5,
|
||||||
|
xtremio_array_busy_retry_interval=5)
|
||||||
|
|
||||||
def safe_get(key):
|
def safe_get(key):
|
||||||
return getattr(self.config, key)
|
return getattr(self.config, key)
|
||||||
|
@ -339,9 +342,9 @@ class BaseXtremIODriverTestCase(test.TestCase):
|
||||||
clean_xms_data()
|
clean_xms_data()
|
||||||
|
|
||||||
self.driver = xtremio.XtremIOISCSIDriver(configuration=self.config)
|
self.driver = xtremio.XtremIOISCSIDriver(configuration=self.config)
|
||||||
self.driver.client = xtremio.XtremIOClient4(self.config,
|
self.driver.client = xtremio.XtremIOClient42(self.config,
|
||||||
self.config
|
self.config
|
||||||
.xtremio_cluster_name)
|
.xtremio_cluster_name)
|
||||||
self.data = CommonData()
|
self.data = CommonData()
|
||||||
|
|
||||||
|
|
||||||
|
@ -351,6 +354,8 @@ class XtremIODriverISCSITestCase(BaseXtremIODriverTestCase):
|
||||||
def test_check_for_setup_error(self, req):
|
def test_check_for_setup_error(self, req):
|
||||||
req.side_effect = xms_request
|
req.side_effect = xms_request
|
||||||
self.driver.check_for_setup_error()
|
self.driver.check_for_setup_error()
|
||||||
|
self.assertEqual(self.driver.client.__class__.__name__,
|
||||||
|
'XtremIOClient42')
|
||||||
|
|
||||||
def test_fail_check_for_setup_error(self, req):
|
def test_fail_check_for_setup_error(self, req):
|
||||||
req.side_effect = xms_request
|
req.side_effect = xms_request
|
||||||
|
@ -359,6 +364,13 @@ class XtremIODriverISCSITestCase(BaseXtremIODriverTestCase):
|
||||||
self.driver.check_for_setup_error)
|
self.driver.check_for_setup_error)
|
||||||
xms_data['clusters'] = clusters
|
xms_data['clusters'] = clusters
|
||||||
|
|
||||||
|
def test_check_for_setup_error_ver4(self, req):
|
||||||
|
req.side_effect = xms_request
|
||||||
|
xms_data['xms'][1]['sw-version'] = '4.0.10-34.hotfix1'
|
||||||
|
self.driver.check_for_setup_error()
|
||||||
|
self.assertEqual(self.driver.client.__class__.__name__,
|
||||||
|
'XtremIOClient4')
|
||||||
|
|
||||||
def test_fail_check_for_array_version(self, req):
|
def test_fail_check_for_array_version(self, req):
|
||||||
req.side_effect = xms_request
|
req.side_effect = xms_request
|
||||||
cluster = xms_data['clusters'][1]
|
cluster = xms_data['clusters'][1]
|
||||||
|
@ -1301,6 +1313,22 @@ class XtremIODriverFCTestCase(BaseXtremIODriverTestCase):
|
||||||
self.assertEqual(1, map_data['data']['target_lun'])
|
self.assertEqual(1, map_data['data']['target_lun'])
|
||||||
self.assertEqual(1, len(xms_data['initiator-groups']))
|
self.assertEqual(1, len(xms_data['initiator-groups']))
|
||||||
|
|
||||||
|
def test_get_initiator_igs_ver4(self, req):
|
||||||
|
req.side_effect = xms_request
|
||||||
|
wwpn1 = '11:22:33:44:55:66:77:88'
|
||||||
|
wwpn2 = '11:22:33:44:55:66:77:89'
|
||||||
|
port_addresses = [wwpn1, wwpn2]
|
||||||
|
ig_id = ['', 'my_ig', 1]
|
||||||
|
self.driver.client = xtremio.XtremIOClient4(self.config,
|
||||||
|
self.config
|
||||||
|
.xtremio_cluster_name)
|
||||||
|
|
||||||
|
def get_fake_initiator(wwpn):
|
||||||
|
return {'port-address': wwpn, 'ig-id': ig_id}
|
||||||
|
with mock.patch.object(self.driver.client, 'get_initiator',
|
||||||
|
side_effect=get_fake_initiator):
|
||||||
|
self.driver.client.get_initiators_igs(port_addresses)
|
||||||
|
|
||||||
def test_get_free_lun(self, req):
|
def test_get_free_lun(self, req):
|
||||||
def lm_response(*args, **kwargs):
|
def lm_response(*args, **kwargs):
|
||||||
return {'lun-maps': [{'lun': 1}]}
|
return {'lun-maps': [{'lun': 1}]}
|
||||||
|
|
|
@ -208,6 +208,14 @@ class XtremIOClient(object):
|
||||||
def add_vol_to_cg(self, vol_id, cg_id):
|
def add_vol_to_cg(self, vol_id, cg_id):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def get_initiators_igs(self, port_addresses):
|
||||||
|
ig_indexes = set()
|
||||||
|
for port_address in port_addresses:
|
||||||
|
initiator = self.get_initiator(port_address)
|
||||||
|
ig_indexes.add(initiator['ig-id'][XTREMIO_OID_INDEX])
|
||||||
|
|
||||||
|
return list(ig_indexes)
|
||||||
|
|
||||||
|
|
||||||
class XtremIOClient3(XtremIOClient):
|
class XtremIOClient3(XtremIOClient):
|
||||||
def __init__(self, configuration, cluster_id):
|
def __init__(self, configuration, cluster_id):
|
||||||
|
@ -356,10 +364,21 @@ class XtremIOClient4(XtremIOClient):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class XtremIOClient42(XtremIOClient4):
|
||||||
|
def get_initiators_igs(self, port_addresses):
|
||||||
|
init_filter = ','.join('port-address:eq:{}'.format(port_address) for
|
||||||
|
port_address in port_addresses)
|
||||||
|
initiators = self.req('initiators',
|
||||||
|
data={'filter': init_filter,
|
||||||
|
'full': 1, 'prop': 'ig-id'})['initiators']
|
||||||
|
return list(set(ig_id['ig-id'][XTREMIO_OID_INDEX]
|
||||||
|
for ig_id in initiators))
|
||||||
|
|
||||||
|
|
||||||
class XtremIOVolumeDriver(san.SanDriver):
|
class XtremIOVolumeDriver(san.SanDriver):
|
||||||
"""Executes commands relating to Volumes."""
|
"""Executes commands relating to Volumes."""
|
||||||
|
|
||||||
VERSION = '1.0.8'
|
VERSION = '1.0.9'
|
||||||
|
|
||||||
# ThirdPartySystems wiki
|
# ThirdPartySystems wiki
|
||||||
CI_WIKI_NAME = "EMC_XIO_CI"
|
CI_WIKI_NAME = "EMC_XIO_CI"
|
||||||
|
@ -403,9 +422,23 @@ class XtremIOVolumeDriver(san.SanDriver):
|
||||||
LOG.error(msg)
|
LOG.error(msg)
|
||||||
raise exception.VolumeBackendAPIException(data=msg)
|
raise exception.VolumeBackendAPIException(data=msg)
|
||||||
else:
|
else:
|
||||||
LOG.info(_LI('XtremIO SW version %s'), version_text)
|
LOG.info(_LI('XtremIO Cluster version %s'), version_text)
|
||||||
|
client_ver = '3'
|
||||||
if ver[0] >= 4:
|
if ver[0] >= 4:
|
||||||
self.client = XtremIOClient4(self.configuration, self.cluster_id)
|
# get XMS version
|
||||||
|
xms = self.client.req('xms', idx=1)['content']
|
||||||
|
xms_version = tuple([int(i) for i in
|
||||||
|
xms['sw-version'].split('-')[0].split('.')])
|
||||||
|
LOG.info(_LI('XtremIO XMS version %s'), xms_version)
|
||||||
|
if xms_version >= (4, 2):
|
||||||
|
self.client = XtremIOClient42(self.configuration,
|
||||||
|
self.cluster_id)
|
||||||
|
client_ver = '4.2'
|
||||||
|
else:
|
||||||
|
self.client = XtremIOClient4(self.configuration,
|
||||||
|
self.cluster_id)
|
||||||
|
client_ver = '4'
|
||||||
|
LOG.info(_LI('Using XtremIO Client %s'), client_ver)
|
||||||
|
|
||||||
def create_volume(self, volume):
|
def create_volume(self, volume):
|
||||||
"""Creates a volume."""
|
"""Creates a volume."""
|
||||||
|
@ -632,13 +665,14 @@ class XtremIOVolumeDriver(san.SanDriver):
|
||||||
|
|
||||||
def terminate_connection(self, volume, connector, **kwargs):
|
def terminate_connection(self, volume, connector, **kwargs):
|
||||||
"""Disallow connection from connector"""
|
"""Disallow connection from connector"""
|
||||||
tg = self.client.req('target-groups', name='Default')['content']
|
tg_index = '1'
|
||||||
vol = self.client.req('volumes', name=volume['id'])['content']
|
vol = self.client.req('volumes', name=volume['id'],
|
||||||
|
data={'prop': 'index'})['content']
|
||||||
|
|
||||||
for ig_idx in self._get_ig_indexes_from_initiators(connector):
|
for ig_idx in self._get_ig_indexes_from_initiators(connector):
|
||||||
lm_name = '%s_%s_%s' % (six.text_type(vol['index']),
|
lm_name = '%s_%s_%s' % (six.text_type(vol['index']),
|
||||||
six.text_type(ig_idx),
|
six.text_type(ig_idx),
|
||||||
six.text_type(tg['index']))
|
tg_index)
|
||||||
LOG.debug('Removing lun map %s.', lm_name)
|
LOG.debug('Removing lun map %s.', lm_name)
|
||||||
try:
|
try:
|
||||||
self.client.req('lun-maps', 'DELETE', name=lm_name)
|
self.client.req('lun-maps', 'DELETE', name=lm_name)
|
||||||
|
@ -670,14 +704,7 @@ class XtremIOVolumeDriver(san.SanDriver):
|
||||||
|
|
||||||
def _get_ig_indexes_from_initiators(self, connector):
|
def _get_ig_indexes_from_initiators(self, connector):
|
||||||
initiator_names = self._get_initiator_names(connector)
|
initiator_names = self._get_initiator_names(connector)
|
||||||
ig_indexes = set()
|
return self.client.get_initiators_igs(initiator_names)
|
||||||
|
|
||||||
for initiator_name in initiator_names:
|
|
||||||
initiator = self.client.get_initiator(initiator_name)
|
|
||||||
|
|
||||||
ig_indexes.add(initiator['ig-id'][XTREMIO_OID_INDEX])
|
|
||||||
|
|
||||||
return list(ig_indexes)
|
|
||||||
|
|
||||||
def _get_initiator_names(self, connector):
|
def _get_initiator_names(self, connector):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
Loading…
Reference in New Issue