Fix volume retype with AZ
This patch fixes volume type retyping when multiple availability zones are in place. This ensures that the request_spec to the scheduler has the availability zone in the right place for the AvailabilityZoneFilter to be able to see it and use it for filtering. Change-Id: I3f6cca6eb87ac4727b06b167b5aa12da07ba8fb5 Closes-Bug: #1883928
This commit is contained in:
parent
0ca496fc48
commit
8a7c5e32f0
@ -47,6 +47,10 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
"fake_vol_type",
|
"fake_vol_type",
|
||||||
{},
|
{},
|
||||||
description="fake_type")
|
description="fake_type")
|
||||||
|
volume_types.create(self.context,
|
||||||
|
"fake_vol_type2",
|
||||||
|
{},
|
||||||
|
description="fake_type2")
|
||||||
volume_types.create(self.context,
|
volume_types.create(self.context,
|
||||||
"multiattach-type",
|
"multiattach-type",
|
||||||
{'multiattach': "<is> True"},
|
{'multiattach': "<is> True"},
|
||||||
@ -58,6 +62,9 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
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.fake_vol_type2 = objects.VolumeType.get_by_name_or_id(
|
||||||
|
self.context,
|
||||||
|
'fake_vol_type2')
|
||||||
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')
|
||||||
@ -70,9 +77,47 @@ class VolumeRetypeTestCase(base.BaseVolumeTestCase):
|
|||||||
return self.multiattach_type
|
return self.multiattach_type
|
||||||
elif identifier == 'multiattach-type2':
|
elif identifier == 'multiattach-type2':
|
||||||
return self.multiattach_type2
|
return self.multiattach_type2
|
||||||
|
elif identifier == 'fake_vol_type2':
|
||||||
|
return self.fake_vol_type2
|
||||||
else:
|
else:
|
||||||
return self.default_vol_type
|
return self.default_vol_type
|
||||||
|
|
||||||
|
@mock.patch('cinder.scheduler.rpcapi.SchedulerAPI.retype')
|
||||||
|
@mock.patch('cinder.context.RequestContext.authorize')
|
||||||
|
@mock.patch.object(volume_types, 'get_by_name_or_id')
|
||||||
|
def test_retype_has_az(self, _mock_get_types, mock_authorize, mock_rpc):
|
||||||
|
"""Verify retype has az in request spec."""
|
||||||
|
_mock_get_types.side_effect = self.fake_get_vtype
|
||||||
|
|
||||||
|
vol = tests_utils.create_volume(
|
||||||
|
self.context,
|
||||||
|
volume_type_id=self.default_vol_type.id,
|
||||||
|
status='available',
|
||||||
|
availability_zone='nova')
|
||||||
|
|
||||||
|
self.volume_api.retype(self.user_context,
|
||||||
|
vol,
|
||||||
|
'fake_vol_type2')
|
||||||
|
|
||||||
|
mock_authorize.assert_called_once_with(
|
||||||
|
vol_action_policies.RETYPE_POLICY, target_obj=mock.ANY)
|
||||||
|
|
||||||
|
fake_spec = {
|
||||||
|
'volume_properties': mock.ANY,
|
||||||
|
'volume_id': mock.ANY,
|
||||||
|
'volume_type': mock.ANY,
|
||||||
|
'migration_policy': mock.ANY,
|
||||||
|
'quota_reservations': mock.ANY,
|
||||||
|
'old_reservations': mock.ANY,
|
||||||
|
'availability_zones': ['nova'],
|
||||||
|
}
|
||||||
|
|
||||||
|
mock_rpc.assert_called_once_with(
|
||||||
|
self.user_context, mock.ANY,
|
||||||
|
request_spec=fake_spec,
|
||||||
|
filter_properties=mock.ANY
|
||||||
|
)
|
||||||
|
|
||||||
@mock.patch('cinder.context.RequestContext.authorize')
|
@mock.patch('cinder.context.RequestContext.authorize')
|
||||||
def test_non_multi_to_multi_retype(self, mock_authorize):
|
def test_non_multi_to_multi_retype(self, mock_authorize):
|
||||||
"""Test going from non-multiattach type to multiattach"""
|
"""Test going from non-multiattach type to multiattach"""
|
||||||
|
@ -1747,6 +1747,8 @@ class API(base.Base):
|
|||||||
new_type)
|
new_type)
|
||||||
if type_azs is not None:
|
if type_azs is not None:
|
||||||
request_spec['availability_zones'] = type_azs
|
request_spec['availability_zones'] = type_azs
|
||||||
|
else:
|
||||||
|
request_spec['availability_zones'] = [volume.availability_zone]
|
||||||
|
|
||||||
self.scheduler_rpcapi.retype(context, volume,
|
self.scheduler_rpcapi.retype(context, volume,
|
||||||
request_spec=request_spec,
|
request_spec=request_spec,
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Fixed a problem with volume retype not honoring the existing volume's
|
||||||
|
Availability Zone if one isn't specified.
|
Loading…
x
Reference in New Issue
Block a user