Fix 3PAR drivers attempt to locate existing host

This patch fixes the current 3PAR drivers around attempting to locate
3PAR host that might already have volumes attached. The FC driver is
using the correct REST based queryHost but is not specifying the
parameters wwns=wwns when calling it. This was accidentally merged
during the removal on the local file locks.

The iSCSI driver was actually calling a SSH based findHost command
instead of the REST based queryHost based on iqns. The SSH based
command was failing with a session key error after a long idle time
between attaches.
Closes-Bug: 1398206

Change-Id: I5e0b1e5382c65176a74441bd4fe40d066317de48
This commit is contained in:
Kurt Martin
2014-12-01 16:13:18 -08:00
parent 68c79f8945
commit 1e83a22507
3 changed files with 39 additions and 17 deletions

View File

@@ -2684,7 +2684,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume(self.VOLUME_3PAR_NAME),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost(self.FAKE_HOST),
mock.ANY,
mock.call.queryHost(wwns=['123456789012345',
'123456789054321']),
mock.call.getHost(self.FAKE_HOST),
mock.call.getPorts(),
mock.call.createVLUN(
@@ -3049,7 +3050,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost(self.FAKE_HOST),
mock.call.queryHost(['123456789012345', '123456789054321']),
mock.call.queryHost(wwns=['123456789012345',
'123456789054321']),
mock.call.createHost(
self.FAKE_HOST,
FCWwns=['123456789012345', '123456789054321'],
@@ -3091,7 +3093,8 @@ class TestHP3PARFCDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost('fakehost'),
mock.call.queryHost(['123456789012345', '123456789054321']),
mock.call.queryHost(wwns=['123456789012345',
'123456789054321']),
mock.call.getHost('fakehost.foo')]
mock_client.assert_has_calls(expected)
@@ -3258,7 +3261,11 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock_client.getHost.side_effect = [
hpexceptions.HTTPNotFound('fake'),
{'name': self.FAKE_HOST}]
mock_client.findHost.return_value = self.FAKE_HOST
mock_client.queryHost.return_value = {
'members': [{
'name': self.FAKE_HOST
}]
}
mock_client.getHostVLUNs.return_value = [
{'active': True,
'volumeName': self.VOLUME_3PAR_NAME,
@@ -3281,7 +3288,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume(self.VOLUME_3PAR_NAME),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost(self.FAKE_HOST),
mock.call.findHost(iqn='iqn.1993-08.org.debian:01:222'),
mock.call.queryHost(iqns=['iqn.1993-08.org.debian:01:222']),
mock.call.getHost(self.FAKE_HOST),
mock.call.createVLUN(
self.VOLUME_3PAR_NAME,
@@ -3356,7 +3363,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock_client.getHost.side_effect = [
hpexceptions.HTTPNotFound('fake'),
{'name': self.FAKE_HOST}]
mock_client.findHost.return_value = None
mock_client.queryHost.return_value = None
mock_client.getVLUN.return_value = {'lun': self.TARGET_LUN}
with mock.patch.object(hpcommon.HP3PARCommon, '_create_client')\
@@ -3369,7 +3376,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost(self.FAKE_HOST),
mock.call.findHost(iqn='iqn.1993-08.org.debian:01:222'),
mock.call.queryHost(iqns=['iqn.1993-08.org.debian:01:222']),
mock.call.createHost(
self.FAKE_HOST,
optional={'domain': None, 'persona': 2},
@@ -3394,7 +3401,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock_client.getHost.side_effect = [
hpexceptions.HTTPNotFound('fake'),
{'name': self.FAKE_HOST}]
mock_client.findHost.return_value = None
mock_client.queryHost.return_value = None
mock_client.getVLUN.return_value = {'lun': self.TARGET_LUN}
expected_mod_request = {
@@ -3428,7 +3435,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolumeMetaData(
'osv-0DM4qZEVSKON-DXN-NwVpw', CHAP_PASS_KEY),
mock.call.getHost(self.FAKE_HOST),
mock.call.findHost(iqn='iqn.1993-08.org.debian:01:222'),
mock.call.queryHost(iqns=['iqn.1993-08.org.debian:01:222']),
mock.call.createHost(
self.FAKE_HOST,
optional={'domain': None, 'persona': 2},
@@ -3454,7 +3461,11 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock_client.getHost.side_effect = [
hpexceptions.HTTPNotFound('Host not found.'),
{'name': 'fakehost.foo'}]
mock_client.findHost.return_value = 'fakehost.foo'
mock_client.queryHost.return_value = {
'members': [{
'name': 'fakehost.foo'
}]
}
with mock.patch.object(hpcommon.HP3PARCommon, '_create_client')\
as mock_create_client:
@@ -3467,7 +3478,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolume('osv-0DM4qZEVSKON-DXN-NwVpw'),
mock.call.getCPG(HP3PAR_CPG),
mock.call.getHost(self.FAKE_HOST),
mock.call.findHost(iqn='iqn.1993-08.org.debian:01:222'),
mock.call.queryHost(iqns=['iqn.1993-08.org.debian:01:222']),
mock.call.getHost('fakehost.foo')]
mock_client.assert_has_calls(expected)
@@ -3488,7 +3499,11 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock_client.getHost.side_effect = [
hpexceptions.HTTPNotFound('Host not found.'),
{'name': 'fakehost.foo'}]
mock_client.findHost.return_value = 'fakehost.foo'
mock_client.queryHost.return_value = {
'members': [{
'name': 'fakehost.foo'
}]
}
def get_side_effect(*args):
data = {'value': None}
@@ -3522,7 +3537,7 @@ class TestHP3PARISCSIDriver(HP3PARBaseDriver, test.TestCase):
mock.call.getVolumeMetaData(
'osv-0DM4qZEVSKON-DXN-NwVpw', CHAP_PASS_KEY),
mock.call.getHost(self.FAKE_HOST),
mock.call.findHost(iqn='iqn.1993-08.org.debian:01:222'),
mock.call.queryHost(iqns=['iqn.1993-08.org.debian:01:222']),
mock.call.modifyHost(
'fakehost.foo',
expected_mod_request),

View File

@@ -74,10 +74,11 @@ class HP3PARFCDriver(cinder.volume.driver.FibreChannelDriver):
2.0.9 - Add support for pools with model update
2.0.10 - Migrate without losing type settings bug #1356608
2.0.11 - Removing locks bug #1381190
2.0.12 - Fix queryHost call to specify wwns bug #1398206
"""
VERSION = "2.0.11"
VERSION = "2.0.12"
def __init__(self, *args, **kwargs):
super(HP3PARFCDriver, self).__init__(*args, **kwargs)
@@ -319,7 +320,7 @@ class HP3PARFCDriver(cinder.volume.driver.FibreChannelDriver):
"""
# first search for an existing host
host_found = None
hosts = common.client.queryHost(wwns)
hosts = common.client.queryHost(wwns=wwns)
LOG.warn(_LW("Found HOSTS %s") % pprint.pformat(hosts))
if hosts and hosts['members']:

View File

@@ -76,10 +76,11 @@ class HP3PARISCSIDriver(cinder.volume.driver.ISCSIDriver):
2.0.7 - Add support for pools with model update
2.0.8 - Migrate without losing type settings bug #1356608
2.0.9 - Removing locks bug #1381190
2.0.10 - Add call to queryHost instead SSH based findHost #1398206
"""
VERSION = "2.0.9"
VERSION = "2.0.10"
def __init__(self, *args, **kwargs):
super(HP3PARISCSIDriver, self).__init__(*args, **kwargs)
@@ -352,7 +353,12 @@ class HP3PARISCSIDriver(cinder.volume.driver.ISCSIDriver):
used by 3PAR.
"""
# first search for an existing host
host_found = common.client.findHost(iqn=iscsi_iqn)
host_found = None
hosts = common.client.queryHost(iqns=[iscsi_iqn])
if hosts and hosts['members']:
host_found = hosts['members'][0]['name']
if host_found is not None:
common.hosts_naming_dict[hostname] = host_found
return host_found