From 5d86e2f2ece51a79102aee2af9a3f306c929aaea Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Tue, 7 May 2013 16:00:55 +1200 Subject: [PATCH] Implement check_active for quantum net, port, router 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 | 11 ++++-- heat/engine/resources/quantum/port.py | 11 ++++-- heat/engine/resources/quantum/quantum.py | 11 ++++++ heat/engine/resources/quantum/router.py | 11 ++++-- heat/tests/test_quantum.py | 45 ++++++++++++++++++++++-- 5 files changed, 81 insertions(+), 8 deletions(-) diff --git a/heat/engine/resources/quantum/net.py b/heat/engine/resources/quantum/net.py index 585ed227..2fa9dc5f 100644 --- a/heat/engine/resources/quantum/net.py +++ b/heat/engine/resources/quantum/net.py @@ -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) diff --git a/heat/engine/resources/quantum/port.py b/heat/engine/resources/quantum/port.py index c09a072b..1ae72711 100644 --- a/heat/engine/resources/quantum/port.py +++ b/heat/engine/resources/quantum/port.py @@ -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) diff --git a/heat/engine/resources/quantum/quantum.py b/heat/engine/resources/quantum/quantum.py index 72d775f0..d42dd0ec 100644 --- a/heat/engine/resources/quantum/quantum.py +++ b/heat/engine/resources/quantum/quantum.py @@ -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) diff --git a/heat/engine/resources/quantum/router.py b/heat/engine/resources/quantum/router.py index 1f7f820a..af704817 100644 --- a/heat/engine/resources/quantum/router.py +++ b/heat/engine/resources/quantum/router.py @@ -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) diff --git a/heat/tests/test_quantum.py b/heat/tests/test_quantum.py index f8a22c12..ecc65dc6 100644 --- a/heat/tests/test_quantum.py +++ b/heat/tests/test_quantum.py @@ -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', { -- 2.45.2