create consistency group mishandles types

In the xiv portion of the ibm_storage driver, create_consistencygroup
fails when it receives a Group object instead of a ConsistencyGroup
object. Need to handle both objects, and handle multiple group ids.

Change-Id: I21783db166515f80d83ef0d152d0795f8ca0297d
Closes-bug: 1658782
This commit is contained in:
Alon Marx 2017-01-24 09:56:08 +02:00
parent 9a2d156a9d
commit 1df882d700
2 changed files with 28 additions and 12 deletions
cinder
tests/unit/volume/drivers/ibm
volume/drivers/ibm/ibm_storage

@ -19,6 +19,8 @@ from xml.etree import ElementTree
from cinder import context
from cinder import exception
from cinder.objects import consistencygroup
from cinder.objects import fields
from cinder.tests.unit.volume.drivers.ibm import fake_pyxcli
import cinder.volume.drivers.ibm.ibm_storage as storage
from cinder.volume.drivers.ibm.ibm_storage import cryptish
@ -50,7 +52,7 @@ TEST_CLONED_VOLUME = {
TEST_CONS_GROUP = {
'name': 'WTF32',
'id': 'WTF32',
'volume_type_id': 'WTF32',
'volume_type_ids': ['WTF32'],
}
TEST_CG_SNAPSHOT = {
'id': 'WTF',
@ -132,6 +134,10 @@ class XIVProxyTest(unittest.TestCase):
"""Tests the main Proxy driver"""
test_cg = consistencygroup.ConsistencyGroup(
context=None, name='WTF32', id='WTF32', volume_type_id='WTF32',
status=fields.ConsistencyGroupStatus.AVAILABLE)
def setUp(self):
"""import at setup to ensure module patchers are in place"""
@ -1113,7 +1119,7 @@ class XIVProxyTest(unittest.TestCase):
p.ibm_storage_cli = mock.MagicMock()
model_update = p.create_consistencygroup({}, TEST_CONS_GROUP)
model_update = p.create_consistencygroup({}, self.test_cg)
p.ibm_storage_cli.cmd.cg_create.assert_called_once_with(
cg='cg_WTF32',
@ -1203,7 +1209,7 @@ class XIVProxyTest(unittest.TestCase):
p.ibm_storage_cli.cmd.create_volume_from_snapshot.return_value = []
model_update, vols_model_update = p.create_consistencygroup_from_src(
{}, TEST_CONS_GROUP, [TEST_VOLUME],
{}, self.test_cg, [TEST_VOLUME],
TEST_CG_SNAPSHOT, [TEST_SNAPSHOT], None, None)
p.ibm_storage_cli.cmd.cg_create.assert_called_once_with(
@ -1230,7 +1236,7 @@ class XIVProxyTest(unittest.TestCase):
p.ibm_storage_cli.cmd.create_volume_from_snapshot.return_value = []
model_update, vols_model_update = p.create_consistencygroup_from_src(
{}, TEST_CONS_GROUP, [TEST_VOLUME],
{}, self.test_cg, [TEST_VOLUME],
None, None, TEST_CONS_GROUP, [TEST_CLONED_VOLUME])
p.ibm_storage_cli.cmd.cg_create.assert_called_once_with(

@ -1634,16 +1634,26 @@ class XIVProxy(proxy.IBMStorageProxy):
cgname = self._cg_name_from_group(group)
LOG.info(_LI("Creating consistency group %(name)s."),
{'name': cgname})
specs = self._get_extra_specs(
group['volume_type_id'].replace(",", ""))
replication_info = self._get_replication_info(specs)
if replication_info.get('enabled'):
# An unsupported illegal configuration
msg = _("Unable to create consistency group: "
"Replication of consistency group is not supported")
if isinstance(group, objects.Group):
volume_type_ids = group.volume_type_ids
elif isinstance(group, objects.ConsistencyGroup):
volume_type_ids = [group.volume_type_id]
else:
msg = (_("Consistency group %(group)s has no volume_type_ids") %
{'group': cgname})
LOG.error(msg)
raise self.meta['exception'].VolumeBackendAPIException(data=msg)
for volume_type_id in volume_type_ids:
specs = self._get_extra_specs(volume_type_id)
replication_info = self._get_replication_info(specs)
if replication_info.get('enabled'):
# An unsupported illegal configuration
msg = _("Unable to create consistency group: "
"Replication of consistency group is not supported")
LOG.error(msg)
raise self.meta['exception'].VolumeBackendAPIException(
data=msg)
# call XCLI
try: