Updated violin driver check for volume objects
Fixed bug where both vmem 6000 drivers were trying to export luns as snapshots when using the base volume driver's copy_volume_data() function. Bug was observed during recent CI runs. Change-Id: I254102f4d3f8a80bf7801b677e7fe6199bc723a2 Closes-Bug: 1517240
This commit is contained in:
parent
3f9e80986a
commit
19f3fa013f
@ -21,8 +21,9 @@ import mock
|
|||||||
from oslo_utils import units
|
from oslo_utils import units
|
||||||
|
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder.db.sqlalchemy import models
|
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
|
from cinder.objects import snapshot as csnap
|
||||||
|
from cinder.objects import volume as cvol
|
||||||
from cinder import test
|
from cinder import test
|
||||||
from cinder.tests.unit import fake_vmem_client as vmemclient
|
from cinder.tests.unit import fake_vmem_client as vmemclient
|
||||||
from cinder.volume import configuration as conf
|
from cinder.volume import configuration as conf
|
||||||
@ -210,7 +211,7 @@ class V6000FCPDriverTestCase(test.TestCase):
|
|||||||
igroup = None
|
igroup = None
|
||||||
target_wwns = self.driver.gateway_fc_wwns
|
target_wwns = self.driver.gateway_fc_wwns
|
||||||
init_targ_map = {}
|
init_targ_map = {}
|
||||||
volume = mock.Mock(spec=models.Volume)
|
volume = mock.Mock(spec=cvol.Volume)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._export_lun = mock.Mock(return_value=lun_id)
|
self.driver._export_lun = mock.Mock(return_value=lun_id)
|
||||||
@ -234,7 +235,7 @@ class V6000FCPDriverTestCase(test.TestCase):
|
|||||||
igroup = None
|
igroup = None
|
||||||
target_wwns = self.driver.gateway_fc_wwns
|
target_wwns = self.driver.gateway_fc_wwns
|
||||||
init_targ_map = {}
|
init_targ_map = {}
|
||||||
snapshot = mock.Mock(spec=models.Snapshot)
|
snapshot = mock.Mock(spec=csnap.Snapshot)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._export_snapshot = mock.Mock(return_value=lun_id)
|
self.driver._export_snapshot = mock.Mock(return_value=lun_id)
|
||||||
@ -257,7 +258,7 @@ class V6000FCPDriverTestCase(test.TestCase):
|
|||||||
def test_terminate_connection(self):
|
def test_terminate_connection(self):
|
||||||
target_wwns = self.driver.gateway_fc_wwns
|
target_wwns = self.driver.gateway_fc_wwns
|
||||||
init_targ_map = {}
|
init_targ_map = {}
|
||||||
volume = mock.Mock(spec=models.Volume)
|
volume = mock.Mock(spec=cvol.Volume)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._unexport_lun = mock.Mock()
|
self.driver._unexport_lun = mock.Mock()
|
||||||
@ -281,7 +282,7 @@ class V6000FCPDriverTestCase(test.TestCase):
|
|||||||
def test_terminate_connection_snapshot_object(self):
|
def test_terminate_connection_snapshot_object(self):
|
||||||
target_wwns = self.driver.gateway_fc_wwns
|
target_wwns = self.driver.gateway_fc_wwns
|
||||||
init_targ_map = {}
|
init_targ_map = {}
|
||||||
snapshot = mock.Mock(spec=models.Snapshot)
|
snapshot = mock.Mock(spec=csnap.Snapshot)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._unexport_snapshot = mock.Mock()
|
self.driver._unexport_snapshot = mock.Mock()
|
||||||
|
@ -21,8 +21,9 @@ import mock
|
|||||||
from oslo_utils import units
|
from oslo_utils import units
|
||||||
|
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder.db.sqlalchemy import models
|
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
|
from cinder.objects import snapshot as csnap
|
||||||
|
from cinder.objects import volume as cvol
|
||||||
from cinder import test
|
from cinder import test
|
||||||
from cinder.tests.unit import fake_vmem_client as vmemclient
|
from cinder.tests.unit import fake_vmem_client as vmemclient
|
||||||
from cinder.volume import configuration as conf
|
from cinder.volume import configuration as conf
|
||||||
@ -244,7 +245,7 @@ class V6000ISCSIDriverTestCase(test.TestCase):
|
|||||||
tgt = self.driver.array_info[0]
|
tgt = self.driver.array_info[0]
|
||||||
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
||||||
tgt['node'], target_name)
|
tgt['node'], target_name)
|
||||||
volume = mock.MagicMock(spec=models.Volume)
|
volume = mock.MagicMock(spec=cvol.Volume)
|
||||||
|
|
||||||
def getitem(name):
|
def getitem(name):
|
||||||
return VOLUME[name]
|
return VOLUME[name]
|
||||||
@ -273,7 +274,7 @@ class V6000ISCSIDriverTestCase(test.TestCase):
|
|||||||
tgt = self.driver.array_info[0]
|
tgt = self.driver.array_info[0]
|
||||||
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
||||||
tgt['node'], target_name)
|
tgt['node'], target_name)
|
||||||
snapshot = mock.MagicMock(spec=models.Snapshot)
|
snapshot = mock.MagicMock(spec=csnap.Snapshot)
|
||||||
|
|
||||||
def getitem(name):
|
def getitem(name):
|
||||||
return SNAPSHOT[name]
|
return SNAPSHOT[name]
|
||||||
@ -303,7 +304,7 @@ class V6000ISCSIDriverTestCase(test.TestCase):
|
|||||||
tgt = self.driver.array_info[0]
|
tgt = self.driver.array_info[0]
|
||||||
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
iqn = "%s%s:%s" % (self.conf.iscsi_target_prefix,
|
||||||
tgt['node'], target_name)
|
tgt['node'], target_name)
|
||||||
volume = mock.MagicMock(spec=models.Volume)
|
volume = mock.MagicMock(spec=cvol.Volume)
|
||||||
|
|
||||||
def getitem(name):
|
def getitem(name):
|
||||||
return VOLUME[name]
|
return VOLUME[name]
|
||||||
@ -332,7 +333,7 @@ class V6000ISCSIDriverTestCase(test.TestCase):
|
|||||||
self.assertEqual(volume['id'], props['data']['volume_id'])
|
self.assertEqual(volume['id'], props['data']['volume_id'])
|
||||||
|
|
||||||
def test_terminate_connection(self):
|
def test_terminate_connection(self):
|
||||||
volume = mock.MagicMock(spec=models.Volume)
|
volume = mock.MagicMock(spec=cvol.Volume)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._unexport_lun = mock.Mock()
|
self.driver._unexport_lun = mock.Mock()
|
||||||
@ -344,7 +345,7 @@ class V6000ISCSIDriverTestCase(test.TestCase):
|
|||||||
self.assertTrue(result is None)
|
self.assertTrue(result is None)
|
||||||
|
|
||||||
def test_terminate_connection_with_snapshot_object(self):
|
def test_terminate_connection_with_snapshot_object(self):
|
||||||
snapshot = mock.MagicMock(spec=models.Snapshot)
|
snapshot = mock.MagicMock(spec=csnap.Snapshot)
|
||||||
|
|
||||||
self.driver.common.vip = self.setup_mock_vshare()
|
self.driver.common.vip = self.setup_mock_vshare()
|
||||||
self.driver._unexport_snapshot = mock.Mock()
|
self.driver._unexport_snapshot = mock.Mock()
|
||||||
|
@ -40,7 +40,6 @@ from oslo_utils import units
|
|||||||
from six.moves import range
|
from six.moves import range
|
||||||
|
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder.db.sqlalchemy import models
|
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _, _LE, _LI, _LW
|
from cinder.i18n import _, _LE, _LI, _LW
|
||||||
from cinder import utils
|
from cinder import utils
|
||||||
@ -155,10 +154,11 @@ class V6000FCDriver(driver.FibreChannelDriver):
|
|||||||
igroup = self.common._get_igroup(volume, connector)
|
igroup = self.common._get_igroup(volume, connector)
|
||||||
self._add_igroup_member(connector, igroup)
|
self._add_igroup_member(connector, igroup)
|
||||||
|
|
||||||
if isinstance(volume, models.Volume):
|
if hasattr(volume, 'volume_id'):
|
||||||
lun_id = self._export_lun(volume, connector, igroup)
|
|
||||||
else:
|
|
||||||
lun_id = self._export_snapshot(volume, connector, igroup)
|
lun_id = self._export_snapshot(volume, connector, igroup)
|
||||||
|
else:
|
||||||
|
lun_id = self._export_lun(volume, connector, igroup)
|
||||||
|
|
||||||
self.common.vip.basic.save_config()
|
self.common.vip.basic.save_config()
|
||||||
|
|
||||||
target_wwns, init_targ_map = self._build_initiator_target_map(
|
target_wwns, init_targ_map = self._build_initiator_target_map(
|
||||||
@ -179,10 +179,10 @@ class V6000FCDriver(driver.FibreChannelDriver):
|
|||||||
def terminate_connection(self, volume, connector, force=False, **kwargs):
|
def terminate_connection(self, volume, connector, force=False, **kwargs):
|
||||||
"""Terminates the connection (target<-->initiator)."""
|
"""Terminates the connection (target<-->initiator)."""
|
||||||
|
|
||||||
if isinstance(volume, models.Volume):
|
if hasattr(volume, 'volume_id'):
|
||||||
self._unexport_lun(volume)
|
|
||||||
else:
|
|
||||||
self._unexport_snapshot(volume)
|
self._unexport_snapshot(volume)
|
||||||
|
else:
|
||||||
|
self._unexport_lun(volume)
|
||||||
|
|
||||||
self.common.vip.basic.save_config()
|
self.common.vip.basic.save_config()
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ from oslo_service import loopingcall
|
|||||||
from oslo_utils import units
|
from oslo_utils import units
|
||||||
|
|
||||||
from cinder import context
|
from cinder import context
|
||||||
from cinder.db.sqlalchemy import models
|
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder.i18n import _, _LE, _LI, _LW
|
from cinder.i18n import _, _LE, _LI, _LW
|
||||||
from cinder import utils
|
from cinder import utils
|
||||||
@ -183,10 +182,10 @@ class V6000ISCSIDriver(driver.ISCSIDriver):
|
|||||||
tgt = self._get_iscsi_target()
|
tgt = self._get_iscsi_target()
|
||||||
target_name = self.TARGET_GROUP_NAME
|
target_name = self.TARGET_GROUP_NAME
|
||||||
|
|
||||||
if isinstance(volume, models.Volume):
|
if hasattr(volume, 'volume_id'):
|
||||||
lun = self._export_lun(volume, connector, igroup)
|
|
||||||
else:
|
|
||||||
lun = self._export_snapshot(volume, connector, igroup)
|
lun = self._export_snapshot(volume, connector, igroup)
|
||||||
|
else:
|
||||||
|
lun = self._export_lun(volume, connector, igroup)
|
||||||
|
|
||||||
iqn = "%s%s:%s" % (self.configuration.iscsi_target_prefix,
|
iqn = "%s%s:%s" % (self.configuration.iscsi_target_prefix,
|
||||||
tgt['node'], target_name)
|
tgt['node'], target_name)
|
||||||
@ -207,10 +206,10 @@ class V6000ISCSIDriver(driver.ISCSIDriver):
|
|||||||
|
|
||||||
def terminate_connection(self, volume, connector, force=False, **kwargs):
|
def terminate_connection(self, volume, connector, force=False, **kwargs):
|
||||||
"""Terminates the connection (target<-->initiator)."""
|
"""Terminates the connection (target<-->initiator)."""
|
||||||
if isinstance(volume, models.Volume):
|
if hasattr(volume, 'volume_id'):
|
||||||
self._unexport_lun(volume)
|
|
||||||
else:
|
|
||||||
self._unexport_snapshot(volume)
|
self._unexport_snapshot(volume)
|
||||||
|
else:
|
||||||
|
self._unexport_lun(volume)
|
||||||
self.common.vip.basic.save_config()
|
self.common.vip.basic.save_config()
|
||||||
|
|
||||||
def get_volume_stats(self, refresh=False):
|
def get_volume_stats(self, refresh=False):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user