summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Lee <aaron.lee@rackspace.com>2012-02-15 17:45:31 -0600
committerAaron Lee <aaron.lee@rackspace.com>2012-02-17 13:07:01 -0600
commit1dcf149bb3567f84c87c7eb2d6cf539a3b713727 (patch)
tree1483d0e27685eb0c021aefdaee171e4cbb83aef4
parent00d2781b50031c01550192e3bbd8e43b491a17ee (diff)
downloadnova-1dcf149bb3567f84c87c7eb2d6cf539a3b713727.tar.gz
nova-1dcf149bb3567f84c87c7eb2d6cf539a3b713727.tar.xz
nova-1dcf149bb3567f84c87c7eb2d6cf539a3b713727.zip
Pulls the main components out of deallocate.
deallocate_for_instances is basically deallocate the port, then delete the vif. This separates them. update one: hacking within the lines update two: another hacking fix update three: rebase update four: rebase and detrailingslashify Change-Id: I01e06a9225d7825af5d404d5815f5084c7660799
-rw-r--r--nova/network/quantum/manager.py106
-rw-r--r--nova/tests/test_quantum.py29
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()