Support handling empty string for volume AZ
When building a complex stack, instance and volume are both necessary. But the support of AZ in Nova and Cinder are slightly different which is causing troubles to build the Heat template. Without setting, the property availability_zone of volume always got "", an empty string, instead of None. As a result, Cinder will return 400 BadRequest error. This patch will turn the empty string into None, to make sure Cinder can correctly handle the scenario when availability_zone of volume is not set. Task: 38853 Story: 2007330 Change-Id: Ib5bddf12ca63849a030d1d579d0a2e853e8b848a
This commit is contained in:
parent
c61170e4e8
commit
50d72b8c0b
@ -280,7 +280,8 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
|
|||||||
def _create_arguments(self):
|
def _create_arguments(self):
|
||||||
arguments = {
|
arguments = {
|
||||||
'size': self.properties[self.SIZE],
|
'size': self.properties[self.SIZE],
|
||||||
'availability_zone': self.properties[self.AVAILABILITY_ZONE],
|
'availability_zone': (self.properties[self.AVAILABILITY_ZONE] or
|
||||||
|
None),
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduler_hints = self._scheduler_hints(
|
scheduler_hints = self._scheduler_hints(
|
||||||
|
@ -1349,3 +1349,26 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
|
|||||||
prg_attach = mock.MagicMock(called=False, srv_id='InstanceInActive')
|
prg_attach = mock.MagicMock(called=False, srv_id='InstanceInActive')
|
||||||
self.assertEqual(False, rsrc._attach_volume_to_complete(prg_attach))
|
self.assertEqual(False, rsrc._attach_volume_to_complete(prg_attach))
|
||||||
self.assertEqual('vol-123', prg_attach.called)
|
self.assertEqual('vol-123', prg_attach.called)
|
||||||
|
|
||||||
|
def test_empty_string_az(self):
|
||||||
|
fv = vt_base.FakeVolume('creating')
|
||||||
|
self.stack_name = 'test_cvolume_default_stack'
|
||||||
|
|
||||||
|
vol_name = utils.PhysName(self.stack_name, 'volume')
|
||||||
|
self.cinder_fc.volumes.create.return_value = fv
|
||||||
|
fv_ready = vt_base.FakeVolume('available', id=fv.id)
|
||||||
|
self.cinder_fc.volumes.get.side_effect = [fv, fv_ready]
|
||||||
|
|
||||||
|
self.t['resources']['volume']['properties'] = {
|
||||||
|
'size': '1',
|
||||||
|
'availability_zone': "",
|
||||||
|
}
|
||||||
|
stack = utils.parse_stack(self.t, stack_name=self.stack_name)
|
||||||
|
self.create_volume(self.t, stack, 'volume')
|
||||||
|
|
||||||
|
self.cinder_fc.volumes.create.assert_called_once_with(
|
||||||
|
size=1, availability_zone=None,
|
||||||
|
description=None,
|
||||||
|
name=vol_name,
|
||||||
|
metadata={}
|
||||||
|
)
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Empty string passing in for volume availability_zone can be correctly
|
||||||
|
handled now. For this case, it's same as no AZ set, so the default AZ in
|
||||||
|
cinder.conf will be used.
|
Loading…
Reference in New Issue
Block a user