Fix multiattach set to false after retype
The return value of get_by_name_or_id in the volume_types module returns a dictionary. During the function call to _is_multiattach, the getattr() returns {}(default value) because a dictionary is passed instead of an object. After importing the cinder.objects.volume_type module, the current function call to get_by_name_or_id() returns an object hence getattr() will return the appropriate extra_specs instead of the default value({}). Closes-Bug: 1790840 Change-Id: I869bc0c9b18887da1ea83f855d255557f0f3cba0
This commit is contained in:
parent
8bd4ff7e6a
commit
7f85be4186
@ -21,6 +21,7 @@ from cinder.policies import volume_actions as vol_action_policies
|
|||||||
from cinder.policies import volumes as volume_policies
|
from cinder.policies import volumes as volume_policies
|
||||||
from cinder import quota
|
from cinder import quota
|
||||||
from cinder.tests.unit import fake_constants as fake
|
from cinder.tests.unit import fake_constants as fake
|
||||||
|
from cinder.tests.unit import utils as tests_utils
|
||||||
from cinder.tests.unit import volume as base
|
from cinder.tests.unit import volume as base
|
||||||
from cinder.volume import volume_types
|
from cinder.volume import volume_types
|
||||||
|
|
||||||
@ -40,10 +41,6 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
self.user_context = context.RequestContext(user_id=fake.USER_ID,
|
self.user_context = context.RequestContext(user_id=fake.USER_ID,
|
||||||
project_id=fake.PROJECT_ID)
|
project_id=fake.PROJECT_ID)
|
||||||
|
|
||||||
volume_types.create(self.context,
|
|
||||||
"old-type",
|
|
||||||
{},
|
|
||||||
description="test-multiattach")
|
|
||||||
volume_types.create(self.context,
|
volume_types.create(self.context,
|
||||||
"fake_vol_type",
|
"fake_vol_type",
|
||||||
{},
|
{},
|
||||||
@ -52,16 +49,25 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
"multiattach-type",
|
"multiattach-type",
|
||||||
{'multiattach': "<is> True"},
|
{'multiattach': "<is> True"},
|
||||||
description="test-multiattach")
|
description="test-multiattach")
|
||||||
|
volume_types.create(self.context,
|
||||||
|
"multiattach-type2",
|
||||||
|
{'multiattach': "<is> True"},
|
||||||
|
description="test-multiattach")
|
||||||
self.default_vol_type = objects.VolumeType.get_by_name_or_id(
|
self.default_vol_type = objects.VolumeType.get_by_name_or_id(
|
||||||
self.context,
|
self.context,
|
||||||
'fake_vol_type')
|
'fake_vol_type')
|
||||||
self.multiattach_type = objects.VolumeType.get_by_name_or_id(
|
self.multiattach_type = objects.VolumeType.get_by_name_or_id(
|
||||||
self.context,
|
self.context,
|
||||||
'multiattach-type')
|
'multiattach-type')
|
||||||
|
self.multiattach_type2 = objects.VolumeType.get_by_name_or_id(
|
||||||
|
self.context,
|
||||||
|
'multiattach-type2')
|
||||||
|
|
||||||
def fake_get_vtype(self, context, identifier):
|
def fake_get_vtype(self, context, identifier):
|
||||||
if identifier == "multiattach-type":
|
if identifier == "multiattach-type":
|
||||||
return self.multiattach_type
|
return self.multiattach_type
|
||||||
|
elif identifier == 'multiattach-type2':
|
||||||
|
return self.multiattach_type2
|
||||||
else:
|
else:
|
||||||
return self.default_vol_type
|
return self.default_vol_type
|
||||||
|
|
||||||
@ -97,7 +103,7 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
vol.save()
|
vol.save()
|
||||||
self.volume_api.retype(self.user_context,
|
self.volume_api.retype(self.user_context,
|
||||||
vol,
|
vol,
|
||||||
'fake_vol-type')
|
'fake_vol_type')
|
||||||
vol = objects.Volume.get_by_id(self.context, vol.id)
|
vol = objects.Volume.get_by_id(self.context, vol.id)
|
||||||
self.assertFalse(vol.multiattach)
|
self.assertFalse(vol.multiattach)
|
||||||
|
|
||||||
@ -120,3 +126,23 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
mock.call(vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY),
|
mock.call(vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY),
|
||||||
mock.call(vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY),
|
mock.call(vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@mock.patch('cinder.context.RequestContext.authorize')
|
||||||
|
def test_multiattach_to_multiattach_retype(self, mock_authorize):
|
||||||
|
# Test going from multiattach to multiattach
|
||||||
|
|
||||||
|
vol = tests_utils.create_volume(self.context,
|
||||||
|
multiattach=True,
|
||||||
|
volume_type_id=
|
||||||
|
self.multiattach_type.id)
|
||||||
|
|
||||||
|
self.assertTrue(vol.multiattach)
|
||||||
|
self.volume_api.retype(self.user_context,
|
||||||
|
vol,
|
||||||
|
'multiattach-type2')
|
||||||
|
vol.refresh()
|
||||||
|
self.assertTrue(vol.multiattach)
|
||||||
|
|
||||||
|
mock_authorize.assert_has_calls(
|
||||||
|
[mock.call(vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY)
|
||||||
|
])
|
||||||
|
@ -44,6 +44,7 @@ from cinder.message import message_field
|
|||||||
from cinder import objects
|
from cinder import objects
|
||||||
from cinder.objects import base as objects_base
|
from cinder.objects import base as objects_base
|
||||||
from cinder.objects import fields
|
from cinder.objects import fields
|
||||||
|
from cinder.objects import volume_type
|
||||||
from cinder.policies import attachments as attachment_policy
|
from cinder.policies import attachments as attachment_policy
|
||||||
from cinder.policies import services as svr_policy
|
from cinder.policies import services as svr_policy
|
||||||
from cinder.policies import snapshot_metadata as s_meta_policy
|
from cinder.policies import snapshot_metadata as s_meta_policy
|
||||||
@ -1603,7 +1604,8 @@ class API(base.Base):
|
|||||||
# Support specifying volume type by ID or name
|
# Support specifying volume type by ID or name
|
||||||
try:
|
try:
|
||||||
new_type = (
|
new_type = (
|
||||||
volume_types.get_by_name_or_id(context.elevated(), new_type))
|
volume_type.VolumeType.get_by_name_or_id(context.elevated(),
|
||||||
|
new_type))
|
||||||
except exception.InvalidVolumeType:
|
except exception.InvalidVolumeType:
|
||||||
msg = _('Invalid volume_type passed: %s.') % new_type
|
msg = _('Invalid volume_type passed: %s.') % new_type
|
||||||
LOG.error(msg)
|
LOG.error(msg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user