From: Steven Hardy Date: Fri, 11 Jan 2013 11:08:34 +0000 (+0000) Subject: heat engine : implement metadata_update per-resource X-Git-Tag: 2014.1~1014 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=25f20dc848bbf9b1508039a48bebddcf62696512;p=openstack-build%2Fheat-build.git heat engine : implement metadata_update per-resource Abstract updates to resource metadata so they are implemented per-resource, with a generic implementation which is a no-op, since currently the only resource which needs metadata update via the RPC API is WaitConditionHandle. This allows resource-specific metadata validation and update logic to be more easily added. ref bug 1097813 Change-Id: I094e74b6cd8cb2436f05beed9629fc3c3a34e622 Signed-off-by: Steven Hardy --- diff --git a/heat/engine/resource.py b/heat/engine/resource.py index b97d5ce9..5d9e723e 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -429,6 +429,13 @@ class Resource(object): 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 0bf139ea..100ef5e0 100644 --- a/heat/engine/resources/wait_condition.py +++ b/heat/engine/resources/wait_condition.py @@ -113,6 +113,12 @@ class WaitConditionHandle(resource.Resource): 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 2d80c602..166f7a98 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -439,7 +439,7 @@ class EngineService(service.Service): 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 17a35629..5037aada 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -660,10 +660,13 @@ class stackServiceTest(unittest.TestCase): 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 c23d96ca..e7479187 100644 --- a/heat/tests/test_waitcondition.py +++ b/heat/tests/test_waitcondition.py @@ -178,10 +178,6 @@ class WaitConditionHandleTest(unittest.TestCase): 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 @@ class WaitConditionHandleTest(unittest.TestCase): 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 @@ class WaitConditionHandleTest(unittest.TestCase): 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()