diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-02-17 22:49:46 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-02-17 22:49:46 +0000 |
| commit | 55bc3d927739f98a002c4590b196aa6780fa8fbf (patch) | |
| tree | 970dbbd6fccb841ac658e6ab93d5edaa8e75f589 | |
| parent | b528c4a1c9cc38223fa8dee3b3b063359f4fba18 (diff) | |
| parent | 1dcf149bb3567f84c87c7eb2d6cf539a3b713727 (diff) | |
| download | nova-55bc3d927739f98a002c4590b196aa6780fa8fbf.tar.gz nova-55bc3d927739f98a002c4590b196aa6780fa8fbf.tar.xz nova-55bc3d927739f98a002c4590b196aa6780fa8fbf.zip | |
Merge "Pulls the main components out of deallocate."
| -rw-r--r-- | nova/network/quantum/manager.py | 106 | ||||
| -rw-r--r-- | nova/tests/test_quantum.py | 29 |
2 files changed, 84 insertions, 51 deletions
diff --git a/nova/network/quantum/manager.py b/nova/network/quantum/manager.py index 1bff7c7ac..f623bd549 100644 --- a/nova/network/quantum/manager.py +++ b/nova/network/quantum/manager.py @@ -500,55 +500,63 @@ class QuantumManager(manager.FloatingIP, manager.FlatManager): admin_context = context.elevated() vifs = db.virtual_interface_get_by_instance(admin_context, instance_id) - for vif_ref in vifs: - interface_id = vif_ref['uuid'] - q_tenant_id = project_id - - network_ref = db.network_get(admin_context, vif_ref['network_id']) - net_id = network_ref['uuid'] - - # port deallocate block - try: - port_id = None - port_id = self.q_conn.get_port_by_attachment(q_tenant_id, - net_id, interface_id) - if not port_id: - q_tenant_id = FLAGS.quantum_default_tenant_id - port_id = self.q_conn.get_port_by_attachment( - q_tenant_id, net_id, interface_id) - - if not port_id: - LOG.error("Unable to find port with attachment: %s" % - (interface_id)) - else: - self.q_conn.detach_and_delete_port(q_tenant_id, - net_id, port_id) - except: - # except anything so the rest of deallocate can succeed - msg = _('port deallocation failed for instance: ' - '|%(instance_id)s|, port_id: |%(port_id)s|') - LOG.critical(msg % locals()) - - # ipam deallocation block - try: - ipam_tenant_id = self.ipam.get_tenant_id_by_net_id(context, - net_id, vif_ref['uuid'], project_id) - - self.ipam.deallocate_ips_by_vif(context, ipam_tenant_id, - net_id, vif_ref) - - db.virtual_interface_delete(admin_context, vif_ref['id']) - # If DHCP is enabled on this network then we need to update the - # leases and restart the server. - if FLAGS.quantum_use_dhcp: - self.update_dhcp(context, ipam_tenant_id, network_ref, - vif_ref, project_id) - except: - # except anything so the rest of deallocate can succeed - vif_uuid = vif_ref['uuid'] - msg = _('ipam deallocation failed for instance: ' - '|%(instance_id)s|, vif_uuid: |%(vif_uuid)s|') - LOG.critical(msg % locals()) + + for vif in vifs: + network = db.network_get(admin_context, vif['network_id']) + + self.deallocate_port(vif['uuid'], network['uuid'], project_id, + instance_id) + + ipam_tenant_id = self.deallocate_ip_address(context, + network['uuid'], project_id, vif, instance_id) + + if FLAGS.quantum_use_dhcp: + self.update_dhcp(context, ipam_tenant_id, network, + vif, project_id) + + db.virtual_interface_delete(admin_context, vif['id']) + + def deallocate_port(self, interface_id, net_id, q_tenant_id, instance_id): + try: + port_id = self.q_conn.get_port_by_attachment(q_tenant_id, + net_id, interface_id) + if not port_id: + q_tenant_id = FLAGS.quantum_default_tenant_id + port_id = self.q_conn.get_port_by_attachment( + q_tenant_id, net_id, interface_id) + + if not port_id: + LOG.error("Unable to find port with attachment: %s" % + (interface_id)) + else: + self.q_conn.detach_and_delete_port(q_tenant_id, + net_id, port_id) + except Exception: + # except anything so the rest of deallocate can succeed + + msg = _('port deallocation failed for instance: ' + '|%(instance_id)s|, port_id: |%(port_id)s|') + LOG.critical(msg % locals()) + + def deallocate_ip_address(self, context, net_id, + project_id, vif_ref, instance_id): + ipam_tenant_id = None + try: + ipam_tenant_id = self.ipam.get_tenant_id_by_net_id(context, + net_id, + vif_ref['uuid'], + project_id) + + self.ipam.deallocate_ips_by_vif(context, ipam_tenant_id, + net_id, vif_ref) + + except Exception: + # except anything so the rest of deallocate can succeed + vif_uuid = vif_ref['uuid'] + msg = _('ipam deallocation failed for instance: ' + '|%(instance_id)s|, vif_uuid: |%(vif_uuid)s|') + LOG.critical(msg % locals()) + return ipam_tenant_id # TODO(bgh): At some point we should consider merging enable_dhcp() and # update_dhcp() diff --git a/nova/tests/test_quantum.py b/nova/tests/test_quantum.py index 7a2dc07d2..2bda2e303 100644 --- a/nova/tests/test_quantum.py +++ b/nova/tests/test_quantum.py @@ -25,11 +25,12 @@ from nova import log as logging from nova.network.quantum import client as quantum_client from nova.network.quantum import fake_client from nova.network.quantum import manager as quantum_manager -from nova.network.quantum import melange_connection from nova.network.quantum import quantum_connection +from nova.network.quantum import melange_connection +from nova.network.quantum import melange_ipam_lib + from nova import test from nova import utils -from nova.network import manager LOG = logging.getLogger(__name__) FLAGS = flags.FLAGS @@ -219,6 +220,30 @@ class QuantumNovaTestCase(test.TestCase): n['uuid'] = nwks[0]['uuid'] +class QuantumDeallocationTestCase(QuantumNovaTestCase): + def test_deallocate_port(self): + quantum = self.mox.CreateMock(quantum_connection\ + .QuantumClientConnection) + quantum.get_port_by_attachment('q_tenant_id', 'net_id', + 'interface_id').AndReturn('port_id') + quantum.detach_and_delete_port('q_tenant_id', 'net_id', 'port_id') + self.net_man.q_conn = quantum + + self.mox.ReplayAll() + + self.net_man.deallocate_port('interface_id', 'net_id', 'q_tenant_id', + 'instance_id') + + def test_deallocate_ip_address(self): + ipam = self.mox.CreateMock(melange_ipam_lib.QuantumMelangeIPAMLib) + ipam.get_tenant_id_by_net_id('context', 'net_id', {'uuid': 1}, + 'project_id').AndReturn('ipam_tenant_id') + self.net_man.ipam = ipam + self.mox.ReplayAll() + self.net_man.deallocate_ip_address('context', 'net_id', 'project_id', + {'uuid': 1}, 'instance_id') + + class QuantumManagerTestCase(QuantumNovaTestCase): def test_create_and_delete_nets(self): self._create_nets() |
