summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRabi Mishra <ramishra@redhat.com>2015-06-10 08:24:58 +0530
committerRabi Mishra <ramishra@redhat.com>2015-06-10 09:06:40 +0530
commit4d2b275358cd010c0ba19697d5e623a1edef3daf (patch)
tree477ca83be633d837a06ab21d0df35cad3a520071
parent90191ae1855e4a63373dba041141639fa3779f7e (diff)
downloadheat-4d2b275358cd010c0ba19697d5e623a1edef3daf.tar.gz
Fix block_device_mapping property validation when using get_attr
Change-Id: I6501395ab458b75ba7d27c8ce9643bd6d18cb203 Closes-Bug: #1463531
-rw-r--r--heat/engine/resources/openstack/nova/server.py4
-rw-r--r--heat/tests/test_server.py19
2 files changed, 21 insertions, 2 deletions
diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py
index 0abf120c7..d84724a0f 100644
--- a/heat/engine/resources/openstack/nova/server.py
+++ b/heat/engine/resources/openstack/nova/server.py
@@ -1183,11 +1183,11 @@ class Server(stack_user.StackUser):
volume_id = mapping.get(self.BLOCK_DEVICE_MAPPING_VOLUME_ID)
snapshot_id = mapping.get(self.BLOCK_DEVICE_MAPPING_SNAPSHOT_ID)
- if volume_id and snapshot_id:
+ if volume_id is not None and snapshot_id is not None:
raise exception.ResourcePropertyConflict(
self.BLOCK_DEVICE_MAPPING_VOLUME_ID,
self.BLOCK_DEVICE_MAPPING_SNAPSHOT_ID)
- if not volume_id and not snapshot_id:
+ if volume_id is None and snapshot_id is None:
msg = _('Either volume_id or snapshot_id must be specified for'
' device mapping %s') % device_name
raise exception.StackValidationFailed(message=msg)
diff --git a/heat/tests/test_server.py b/heat/tests/test_server.py
index df975ee69..624a3c1b7 100644
--- a/heat/tests/test_server.py
+++ b/heat/tests/test_server.py
@@ -2128,6 +2128,25 @@ class ServersTest(common.HeatTestCase):
self.m.VerifyAll()
+ def test_validate_block_device_mapping_with_empty_ref(self):
+ stack_name = 'val_blkdev2'
+ (tmpl, stack) = self._setup_test_stack(stack_name)
+ bdm = [{'device_name': 'vda', 'volume_id': '',
+ 'volume_size': '10'}]
+ wsp = tmpl.t['Resources']['WebServer']['Properties']
+ wsp['block_device_mapping'] = bdm
+ resource_defns = tmpl.resource_definitions(stack)
+ server = servers.Server('server_create_image_err',
+ resource_defns['WebServer'], stack)
+ self.m.StubOutWithMock(nova.NovaClientPlugin, '_create')
+ self.stub_VolumeConstraint_validate()
+ nova.NovaClientPlugin._create().AndReturn(self.fc)
+ self._mock_get_image_id_success('F17-x86_64-gold', 'image_id')
+ self.m.ReplayAll()
+
+ self.assertIsNone(server.validate())
+ self.m.VerifyAll()
+
def test_validate_without_image_or_bootable_volume(self):
stack_name = 'val_imgvol'
(tmpl, stack) = self._setup_test_stack(stack_name)