diff --git a/heat/engine/resource.py b/heat/engine/resource.py index b97d5ce96d5..5d9e723e6b1 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -429,6 +429,13 @@ def handle_update(self): raise NotImplementedError("Update not implemented for Resource %s" % type(self)) + def metadata_update(self, metadata): + ''' + No-op for resources which don't explicitly override this method + ''' + logger.warning("Resource %s does not implement metadata update" % + self.name) + class GenericResource(Resource): properties_schema = {} diff --git a/heat/engine/resources/wait_condition.py b/heat/engine/resources/wait_condition.py index 0bf139eadae..100ef5e060e 100644 --- a/heat/engine/resources/wait_condition.py +++ b/heat/engine/resources/wait_condition.py @@ -113,6 +113,12 @@ def FnGetRefId(self): else: return unicode(self.name) + def metadata_update(self, metadata): + ''' + Update the resource metadata + ''' + self.metadata = metadata + WAIT_STATUSES = ( WAITING, diff --git a/heat/engine/service.py b/heat/engine/service.py index 2d80c602d0c..166f7a98e47 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -439,7 +439,7 @@ def metadata_update(self, context, stack_identity, raise AttributeError("Resource not found %s" % resource_name) resource = stack[resource_name] - resource.metadata = metadata + resource.metadata_update(metadata) return resource.metadata diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index 17a35629c52..5037aada3f3 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -660,10 +660,13 @@ def test_stack_resources_list_nonexist_stack(self): def test_metadata(self): test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'} + pre_update_meta = self.stack['WebServer'].metadata result = self.man.metadata_update(self.ctx, dict(self.stack_identity), 'WebServer', test_metadata) - self.assertEqual(result, test_metadata) + # metadata_update is a no-op for all resources except + # WaitConditionHandle so we don't expect this to have changed + self.assertEqual(result, pre_update_meta) def test_metadata_err_stack(self): test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'} diff --git a/heat/tests/test_waitcondition.py b/heat/tests/test_waitcondition.py index c23d96ca796..e74791874f2 100644 --- a/heat/tests/test_waitcondition.py +++ b/heat/tests/test_waitcondition.py @@ -178,10 +178,6 @@ def create_stack(self, stack_name='test_stack2', params={}): uuid.uuid4().AndReturn('STACKABCD1234') self.m.ReplayAll() stack.store() - return stack - - def test_handle(self): - stack = self.create_stack() # Stub waitcondition status so all goes CREATE_COMPLETE self.m.StubOutWithMock(wc.WaitCondition, '_get_status_reason') @@ -199,6 +195,11 @@ def test_handle(self): self.m.StubOutWithMock(wc.WaitConditionHandle, 'identifier') wc.WaitConditionHandle.identifier().MultipleTimes().AndReturn(id) + return stack + + def test_handle(self): + stack = self.create_stack() + # Stub time to a fixed value so we can get an expected signature t = time.gmtime(1354196977) self.m.StubOutWithMock(time, 'gmtime') @@ -229,3 +230,19 @@ def test_handle(self): stack.delete() self.m.VerifyAll() + + def test_metadata_update(self): + stack = self.create_stack() + self.m.ReplayAll() + stack.create() + + resource = stack.resources['WaitHandle'] + self.assertEqual(resource.state, 'CREATE_COMPLETE') + + test_metadata = {'foo': 'bar', 'baz': 'quux', 'blarg': 'wibble'} + resource.metadata_update(test_metadata) + self.assertEqual(resource.metadata, test_metadata) + + stack.delete() + + self.m.VerifyAll()