]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Put pre-created resources in state INIT COMPLETE.
authorSteve Baker <sbaker@redhat.com>
Wed, 10 Jul 2013 03:05:53 +0000 (15:05 +1200)
committerSteve Baker <sbaker@redhat.com>
Wed, 17 Jul 2013 22:51:30 +0000 (10:51 +1200)
Defines an INIT action, and make the resourse state
INIT COMPLETE before they are first created.

Calls to list resources will now include resource that have
not been created yet. This change allows resource topologies
to be displayed throughout the creation of the stack.

Implements blueprint build-heat-graph

Change-Id: I1d98ac21d44ff05183db38d49cbb3599e2812511

heat/engine/resource.py
heat/engine/service.py
heat/tests/test_resource.py

index 9a90f6e6cb5146dbdc6e4ca8722f7bcd88574f59..72735348c4b4469c0b1010da176aedd994728bfc 100644 (file)
@@ -114,8 +114,8 @@ class Metadata(object):
 
 
 class Resource(object):
-    ACTIONS = (CREATE, DELETE, UPDATE, ROLLBACK, SUSPEND, RESUME
-               ) = ('CREATE', 'DELETE', 'UPDATE', 'ROLLBACK',
+    ACTIONS = (INIT, CREATE, DELETE, UPDATE, ROLLBACK, SUSPEND, RESUME
+               ) = ('INIT', 'CREATE', 'DELETE', 'UPDATE', 'ROLLBACK',
                     'SUSPEND', 'RESUME')
 
     STATUSES = (IN_PROGRESS, FAILED, COMPLETE
@@ -182,8 +182,8 @@ class Resource(object):
             self.data = resource.data
         else:
             self.resource_id = None
-            self.action = None
-            self.status = None
+            self.action = self.INIT
+            self.status = self.COMPLETE
             self.status_reason = ''
             self.id = None
             self.data = []
@@ -381,7 +381,10 @@ class Resource(object):
         Create the resource. Subclasses should provide a handle_create() method
         to customise creation.
         '''
-        assert None in (self.action, self.status), 'invalid state for create'
+        if (self.action, self.status) != (self.INIT, self.COMPLETE):
+            exc = exception.Error('State %s invalid for create'
+                                  % str(self.state))
+            raise exception.ResourceFailure(exc)
 
         logger.info('creating %s' % str(self))
 
@@ -495,7 +498,7 @@ class Resource(object):
         if (self.action, self.status) == (self.DELETE, self.COMPLETE):
             return
         # No need to delete if the resource has never been created
-        if self.action is None:
+        if self.action == self.INIT:
             return
 
         initial_state = self.state
index e1de9a600fd8e5972a8ec0b63331953179d7f0f3..193eed3fa11674d95266e6b598e79a81776a2ebe 100644 (file)
@@ -482,8 +482,7 @@ class EngineService(service.Service):
             name_match = lambda r: True
 
         return [api.format_stack_resource(resource)
-                for resource in stack
-                if resource.id is not None and name_match(resource)]
+                for resource in stack if name_match(resource)]
 
     @request_context
     def list_stack_resources(self, cnxt, stack_identity):
@@ -492,7 +491,7 @@ class EngineService(service.Service):
         stack = parser.Stack.load(cnxt, stack=s)
 
         return [api.format_stack_resource(resource, detail=False)
-                for resource in stack if resource.id is not None]
+                for resource in stack]
 
     @request_context
     def stack_suspend(self, cnxt, stack_identity):
index 3b270b64dcab940e074eb63e65f45596bb8257c1..d5ac74c0b8b43aaa526471e47e0620b3cf44834e 100644 (file)
@@ -58,7 +58,7 @@ class ResourceTest(HeatTestCase):
     def test_state_defaults(self):
         tmpl = {'Type': 'Foo'}
         res = generic_rsrc.GenericResource('test_res_def', tmpl, self.stack)
-        self.assertEqual(res.state, (None, None))
+        self.assertEqual(res.state, (res.INIT, res.COMPLETE))
         self.assertEqual(res.status_reason, '')
 
     def test_state_set(self):