From 5addde6bd20443553ce6e72f354f05c390c309a6 Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Mon, 20 May 2013 11:53:53 +1200 Subject: [PATCH] Tests for Router, RouterInterface, RouterGateway. quantum package now has over 94% test coverage. Change-Id: I82b4635e4554e5b94eaac70bd1cc4b9249863dc9 --- heat/tests/test_quantum.py | 189 +++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/heat/tests/test_quantum.py b/heat/tests/test_quantum.py index 0115c24f..6fb9165d 100644 --- a/heat/tests/test_quantum.py +++ b/heat/tests/test_quantum.py @@ -23,6 +23,7 @@ from heat.engine.resources.quantum import net from heat.engine.resources.quantum import subnet from heat.engine.resources.quantum import floatingip from heat.engine.resources.quantum import port +from heat.engine.resources.quantum import router from heat.engine.resources.quantum.quantum import QuantumResource as qr from heat.openstack.common.importutils import try_import from heat.tests.common import HeatTestCase @@ -84,6 +85,13 @@ quantum_template = ''' "router_id": { "Ref" : "router" }, "subnet_id": { "Ref" : "subnet" } } + }, + "gateway": { + "Type": "OS::Quantum::RouterGateway", + "Properties": { + "router_id": { "Ref" : "router" }, + "network_id": { "Ref" : "network" } + } } } } @@ -381,6 +389,187 @@ class QuantumSubnetTest(HeatTestCase): self.m.VerifyAll() +@skipIf(quantumclient is None, 'quantumclient unavailable') +class QuantumRouterTest(HeatTestCase): + def setUp(self): + super(QuantumRouterTest, self).setUp() + self.m.StubOutWithMock(quantumclient.Client, 'create_router') + self.m.StubOutWithMock(quantumclient.Client, 'delete_router') + self.m.StubOutWithMock(quantumclient.Client, 'show_router') + self.m.StubOutWithMock(quantumclient.Client, 'add_interface_router') + self.m.StubOutWithMock(quantumclient.Client, 'remove_interface_router') + self.m.StubOutWithMock(quantumclient.Client, 'add_gateway_router') + self.m.StubOutWithMock(quantumclient.Client, 'remove_gateway_router') + setup_dummy_db() + + def create_router(self, t, stack, resource_name): + resource = router.Router('router', t['Resources'][resource_name], + stack) + scheduler.TaskRunner(resource.create)() + self.assertEqual(router.Router.CREATE_COMPLETE, resource.state) + return resource + + def create_router_interface(self, t, stack, resource_name, properties={}): + t['Resources'][resource_name]['Properties'] = properties + resource = router.RouterInterface( + 'router_interface', + t['Resources'][resource_name], + stack) + scheduler.TaskRunner(resource.create)() + self.assertEqual( + router.RouterInterface.CREATE_COMPLETE, resource.state) + return resource + + def create_gateway_router(self, t, stack, resource_name, properties={}): + t['Resources'][resource_name]['Properties'] = properties + resource = router.RouterGateway( + 'gateway', + t['Resources'][resource_name], + stack) + scheduler.TaskRunner(resource.create)() + self.assertEqual(router.RouterGateway.CREATE_COMPLETE, resource.state) + return resource + + def test_router(self): + quantumclient.Client.create_router({ + 'router': {'name': 'test_stack.router', 'admin_state_up': True} + }).AndReturn({ + "router": { + "status": "BUILD", + "external_gateway_info": None, + "name": "test_stack.router", + "admin_state_up": True, + "tenant_id": "3e21026f2dc94372b105808c0e721661", + "id": "3e46229d-8fce-4733-819a-b5fe630550f8" + } + }) + quantumclient.Client.show_router( + '3e46229d-8fce-4733-819a-b5fe630550f8').AndReturn({ + "router": { + "status": "BUILD", + "external_gateway_info": None, + "name": "test_stack.router", + "admin_state_up": True, + "tenant_id": "3e21026f2dc94372b105808c0e721661", + "routes": [], + "id": "3e46229d-8fce-4733-819a-b5fe630550f8" + } + }) + quantumclient.Client.show_router( + '3e46229d-8fce-4733-819a-b5fe630550f8').AndReturn({ + "router": { + "status": "ACTIVE", + "external_gateway_info": None, + "name": "test_stack.router", + "admin_state_up": True, + "tenant_id": "3e21026f2dc94372b105808c0e721661", + "routes": [], + "id": "3e46229d-8fce-4733-819a-b5fe630550f8" + } + }) + + quantumclient.Client.show_router( + '3e46229d-8fce-4733-819a-b5fe630550f8').AndRaise( + qe.QuantumClientException(status_code=404)) + quantumclient.Client.show_router( + '3e46229d-8fce-4733-819a-b5fe630550f8').MultipleTimes().AndReturn({ + "router": { + "status": "ACTIVE", + "external_gateway_info": None, + "name": "test_stack.router", + "admin_state_up": True, + "tenant_id": "3e21026f2dc94372b105808c0e721661", + "routes": [], + "id": "3e46229d-8fce-4733-819a-b5fe630550f8" + } + }) + + quantumclient.Client.delete_router( + '3e46229d-8fce-4733-819a-b5fe630550f8' + ).AndReturn(None) + quantumclient.Client.delete_router( + '3e46229d-8fce-4733-819a-b5fe630550f8' + ).AndRaise(qe.QuantumClientException(status_code=404)) + + self.m.ReplayAll() + t = template_format.parse(quantum_template) + stack = parse_stack(t) + resource = self.create_router(t, stack, 'router') + + resource.validate() + + ref_id = resource.FnGetRefId() + self.assertEqual('3e46229d-8fce-4733-819a-b5fe630550f8', ref_id) + self.assertEqual(None, + resource.FnGetAtt('tenant_id')) + self.assertEqual('3e21026f2dc94372b105808c0e721661', + resource.FnGetAtt('tenant_id')) + self.assertEqual('3e46229d-8fce-4733-819a-b5fe630550f8', + resource.FnGetAtt('id')) + + self.assertEqual(router.Router.UPDATE_REPLACE, + resource.handle_update({})) + + self.assertEqual(resource.delete(), None) + resource.state_set(resource.CREATE_COMPLETE, 'to delete again') + self.assertEqual(resource.delete(), None) + self.m.VerifyAll() + + def test_router_interface(self): + quantumclient.Client.add_interface_router( + '3e46229d-8fce-4733-819a-b5fe630550f8', + {'subnet_id': '91e47a57-7508-46fe-afc9-fc454e8580e1'} + ).AndReturn(None) + quantumclient.Client.remove_interface_router( + '3e46229d-8fce-4733-819a-b5fe630550f8', + {'subnet_id': '91e47a57-7508-46fe-afc9-fc454e8580e1'} + ).AndReturn(None) + quantumclient.Client.remove_interface_router( + '3e46229d-8fce-4733-819a-b5fe630550f8', + {'subnet_id': '91e47a57-7508-46fe-afc9-fc454e8580e1'} + ).AndRaise(qe.QuantumClientException(status_code=404)) + self.m.ReplayAll() + t = template_format.parse(quantum_template) + stack = parse_stack(t) + + resource = self.create_router_interface( + t, stack, 'router_interface', properties={ + 'router_id': '3e46229d-8fce-4733-819a-b5fe630550f8', + 'subnet_id': '91e47a57-7508-46fe-afc9-fc454e8580e1' + }) + + self.assertEqual(resource.delete(), None) + resource.state_set(resource.CREATE_COMPLETE, 'to delete again') + self.assertEqual(resource.delete(), None) + self.m.VerifyAll() + + def test_gateway_router(self): + quantumclient.Client.add_gateway_router( + '3e46229d-8fce-4733-819a-b5fe630550f8', + {'network_id': 'fc68ea2c-b60b-4b4f-bd82-94ec81110766'} + ).AndReturn(None) + quantumclient.Client.remove_gateway_router( + '3e46229d-8fce-4733-819a-b5fe630550f8' + ).AndReturn(None) + quantumclient.Client.remove_gateway_router( + '3e46229d-8fce-4733-819a-b5fe630550f8' + ).AndRaise(qe.QuantumClientException(status_code=404)) + self.m.ReplayAll() + t = template_format.parse(quantum_template) + stack = parse_stack(t) + + resource = self.create_gateway_router( + t, stack, 'gateway', properties={ + 'router_id': '3e46229d-8fce-4733-819a-b5fe630550f8', + 'network_id': 'fc68ea2c-b60b-4b4f-bd82-94ec81110766' + }) + + self.assertEqual(resource.delete(), None) + resource.state_set(resource.CREATE_COMPLETE, 'to delete again') + self.assertEqual(resource.delete(), None) + self.m.VerifyAll() + + @skipIf(quantumclient is None, 'quantumclient unavailable') class QuantumFloatingIPTest(HeatTestCase): @skipIf(net.clients.quantumclient is None, "Missing Quantum Client") -- 2.45.2