]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : implement metadata_update per-resource
authorSteven Hardy <shardy@redhat.com>
Fri, 11 Jan 2013 11:08:34 +0000 (11:08 +0000)
committerSteven Hardy <shardy@redhat.com>
Mon, 14 Jan 2013 17:24:29 +0000 (17:24 +0000)
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 <shardy@redhat.com>
heat/engine/resource.py
heat/engine/resources/wait_condition.py
heat/engine/service.py
heat/tests/test_engine_service.py
heat/tests/test_waitcondition.py

index b97d5ce96d5da42352a181e0dfc26ab5ebffaae5..5d9e723e6b1d7e2a73ee0d4660ce755382aac312 100644 (file)
@@ -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 = {}
index 0bf139eadaedc19dbcff50bb113a582fa8ff16f1..100ef5e060e2c6fac6b5f80788f1eb9f40cdb60f 100644 (file)
@@ -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,
index 2d80c602d0cc83826b713cd37bfa30f2d63500fa..166f7a98e47693a04dc371fd1654c099ccfea99b 100644 (file)
@@ -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
 
index 17a35629c52b107e10a03d2356f075e4d41f8564..5037aada3f370f98caaf69f30f271e1d925409cf 100644 (file)
@@ -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'}
index c23d96ca7968157c985ad4e5c3292a92636ead85..e74791874f2d7f46dafa69c7b38cc3afd47bdd85 100644 (file)
@@ -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()