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:
Feilong Wang 2020-02-24 17:59:17 +13:00
parent c61170e4e8
commit 50d72b8c0b
3 changed files with 31 additions and 1 deletions

View File

@ -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(

View File

@ -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={}
)

View File

@ -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.