]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Implement check_active for quantum net, port, router
authorSteve Baker <sbaker@redhat.com>
Tue, 7 May 2013 04:00:55 +0000 (16:00 +1200)
committerSteve Baker <sbaker@redhat.com>
Sun, 19 May 2013 22:12:53 +0000 (10:12 +1200)
These quantum resources go through a BUILD status before becoming
ACTIVE (or DOWN).

This could explain the issues seen in
Bug: #1176661

Change-Id: I659774cd402b71be102376b31e2d78bf225d37a6

heat/engine/resources/quantum/net.py
heat/engine/resources/quantum/port.py
heat/engine/resources/quantum/quantum.py
heat/engine/resources/quantum/router.py
heat/tests/test_quantum.py

index 585ed22780aeb0ae17d1def33b1f2e6424dbaab0..2fa9dc5f6b3d1413b6b9978d75b12443039bb739 100644 (file)
@@ -37,6 +37,14 @@ class Net(quantum.QuantumResource):
         net = self.quantum().create_network({'network': props})['network']
         self.resource_id_set(net['id'])
 
+    def _show_resource(self):
+        return self.quantum().show_network(
+            self.resource_id)['network']
+
+    def check_create_complete(self, *args):
+        attributes = self._show_resource()
+        return self.is_built(attributes)
+
     def handle_delete(self):
         from quantumclient.common.exceptions import QuantumClientException
 
@@ -48,8 +56,7 @@ class Net(quantum.QuantumResource):
                 raise ex
 
     def FnGetAtt(self, key):
-        attributes = self.quantum().show_network(
-            self.resource_id)['network']
+        attributes = self._show_resource()
         return self.handle_get_attributes(self.name, key, attributes)
 
 
index c09a072b6b07251db5af9e6b4ba8a303f345d528..1ae7271189fb51d1a70f37099e2ccea1c2bb1d46 100644 (file)
@@ -50,6 +50,14 @@ class Port(quantum.QuantumResource):
         port = self.quantum().create_port({'port': props})['port']
         self.resource_id_set(port['id'])
 
+    def _show_resource(self):
+        return self.quantum().show_port(
+            self.resource_id)['port']
+
+    def check_create_complete(self, *args):
+        attributes = self._show_resource()
+        return self.is_built(attributes)
+
     def handle_delete(self):
         from quantumclient.common.exceptions import QuantumClientException
 
@@ -61,8 +69,7 @@ class Port(quantum.QuantumResource):
                 raise ex
 
     def FnGetAtt(self, key):
-        attributes = self.quantum().show_port(
-            self.resource_id)['port']
+        attributes = self._show_resource()
         return self.handle_get_attributes(self.name, key, attributes)
 
 
index 72d775f08fe1f40ffba7ce1bdb921963cd51e1c7..d42dd0ecca486081770f20c11bdb3de90ecabd0f 100644 (file)
@@ -87,5 +87,16 @@ class QuantumResource(resource.Resource):
     def handle_update(self, json_snippet):
         return self.UPDATE_REPLACE
 
+    @staticmethod
+    def is_built(attributes):
+        if attributes['status'] == 'BUILD':
+            return False
+        if attributes['status'] in ('ACTIVE', 'DOWN'):
+            return True
+        else:
+            raise exception.Error('%s resource[%s] status[%s]' %
+                                  ('quantum reported unexpected',
+                                   attributes['name'], attributes['status']))
+
     def FnGetRefId(self):
         return unicode(self.resource_id)
index 1f7f820a506157592824934110e08cf94e8aadbb..af7048177cee5d2ef0540db932f04f52ffa5278f 100644 (file)
@@ -41,6 +41,14 @@ class Router(quantum.QuantumResource):
         router = self.quantum().create_router({'router': props})['router']
         self.resource_id_set(router['id'])
 
+    def _show_resource(self):
+        return self.quantum().show_router(
+            self.resource_id)['router']
+
+    def check_create_complete(self, *args):
+        attributes = self._show_resource()
+        return self.is_built(attributes)
+
     def handle_delete(self):
         client = self.quantum()
         try:
@@ -50,8 +58,7 @@ class Router(quantum.QuantumResource):
                 raise ex
 
     def FnGetAtt(self, key):
-        attributes = self.quantum().show_router(
-            self.resource_id)['router']
+        attributes = self._show_resource()
         return self.handle_get_attributes(self.name, key, attributes)
 
 
index f8a22c1293b3aa2d1a617091c04dc6da5b454c76..ecc65dc676aceff0605a4f404196d6b3abe5539d 100644 (file)
@@ -158,6 +158,24 @@ class QuantumTest(HeatTestCase):
                           'router:external': True,
                           'admin_state_up': False}, props)
 
+    def test_is_built(self):
+        self.assertTrue(qr.is_built({
+            'name': 'the_net',
+            'status': 'ACTIVE'
+        }))
+        self.assertTrue(qr.is_built({
+            'name': 'the_net',
+            'status': 'DOWN'
+        }))
+        self.assertFalse(qr.is_built({
+            'name': 'the_net',
+            'status': 'BUILD'
+        }))
+        self.assertRaises(exception.Error, qr.is_built, {
+            'name': 'the_net',
+            'status': 'FROBULATING'
+        })
+
 
 @skipIf(quantumclient is None, 'quantumclient unavailable')
 class QuantumNetTest(HeatTestCase):
@@ -188,6 +206,18 @@ class QuantumNetTest(HeatTestCase):
             "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
         }})
 
+        quantumclient.Client.show_network(
+            'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
+        ).AndReturn({"network": {
+            "status": "BUILD",
+            "subnets": [],
+            "name": "name",
+            "admin_state_up": False,
+            "shared": False,
+            "tenant_id": "c1210485b2424d48804aad5d39c61b8f",
+            "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
+        }})
+
         quantumclient.Client.show_network(
             'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
         ).MultipleTimes().AndReturn({"network": {
@@ -386,7 +416,13 @@ class QuantumFloatingIPTest(HeatTestCase):
             'name': u'test_stack.port_floating',
             'admin_state_up': True}}
         ).AndReturn({'port': {
-            "status": "ACTIVE",
+            "status": "BUILD",
+            "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
+        }})
+        quantumclient.Client.show_port(
+            'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
+        ).AndReturn({'port': {
+            "status": "BUILD",
             "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
         }})
         quantumclient.Client.show_port(
@@ -440,11 +476,16 @@ class QuantumFloatingIPTest(HeatTestCase):
             ],
             'name': u'test_stack.port_floating',
             'admin_state_up': True}}
+        ).AndReturn({'port': {
+            "status": "BUILD",
+            "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
+        }})
+        quantumclient.Client.show_port(
+            'fc68ea2c-b60b-4b4f-bd82-94ec81110766'
         ).AndReturn({'port': {
             "status": "ACTIVE",
             "id": "fc68ea2c-b60b-4b4f-bd82-94ec81110766"
         }})
-
         quantumclient.Client.update_floatingip(
             'fc68ea2c-b60b-4b4f-bd82-94ec81110766',
             {