summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Hall <brad@nicira.com>2011-10-02 08:20:50 -0700
committerBrad Hall <brad@nicira.com>2011-11-04 15:00:21 -0700
commitc32258c77d365534ac7b70bccbadb60a6ea4be1e (patch)
treed2deb9761d90cd3558d534e9df87f94c8c6640b2
parent2826e862d73d1b2cbe80da3385075cd6c33f511d (diff)
downloadnova-c32258c77d365534ac7b70bccbadb60a6ea4be1e.tar.gz
nova-c32258c77d365534ac7b70bccbadb60a6ea4be1e.tar.xz
nova-c32258c77d365534ac7b70bccbadb60a6ea4be1e.zip
Change network delete to delete by uuid or cidr
With melange it will be possible to have overlapping cidrs so it would be better to specify the uuid of the network to delete. Change-Id: I6781225d587952cbab3387cd40164d8ac77c58d6
-rwxr-xr-xbin/nova-manage20
-rw-r--r--nova/network/manager.py11
-rw-r--r--nova/network/quantum/manager.py23
-rw-r--r--nova/network/quantum/nova_ipam_lib.py3
-rw-r--r--nova/tests/test_nova_manage.py13
-rw-r--r--nova/tests/test_quantum.py6
6 files changed, 62 insertions, 14 deletions
diff --git a/bin/nova-manage b/bin/nova-manage
index f6b86360e..c6ec155e4 100755
--- a/bin/nova-manage
+++ b/bin/nova-manage
@@ -858,14 +858,26 @@ class NetworkCommands(object):
network.cidr,
network.cidr_v6)
- @args('--network', dest="fixed_range", metavar='<x.x.x.x/yy>',
+ @args('--fixed_range', dest="fixed_range", metavar='<x.x.x.x/yy>',
help='Network to delete')
- def delete(self, fixed_range):
+ @args('--uuid', dest='uuid', metavar='<uuid>',
+ help='UUID of network to delete')
+ def delete(self, fixed_range=None, uuid=None):
"""Deletes a network"""
- # delete the network
+ if fixed_range is None and uuid is None:
+ raise Exception("Please specify either fixed_range or uuid")
+
net_manager = utils.import_object(FLAGS.network_manager)
- net_manager.delete_network(context.get_admin_context(), fixed_range)
+ if "QuantumManager" in FLAGS.network_manager:
+ if uuid is None:
+ raise Exception("UUID is required to delete Quantum Networks")
+ if fixed_range:
+ raise Exception("Deleting by fixed_range is not supported " \
+ "with the QuantumManager")
+ # delete the network
+ net_manager.delete_network(context.get_admin_context(),
+ fixed_range, uuid)
@args('--network', dest="fixed_range", metavar='<x.x.x.x/yy>',
help='Network to modify')
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 921d25645..8bd0dbdd0 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -987,9 +987,14 @@ class NetworkManager(manager.SchedulerDependentManager):
self._create_fixed_ips(context, network['id'])
return networks
- def delete_network(self, context, fixed_range, require_disassociated=True):
-
- network = db.network_get_by_cidr(context, fixed_range)
+ def delete_network(self, context, fixed_range, uuid,
+ require_disassociated=True):
+
+ # Prefer uuid but we'll also take cidr for backwards compatibility
+ if uuid:
+ network = db.network_get_by_uuid(context.elevated(), uuid)
+ elif fixed_range:
+ network = db.network_get_by_cidr(context.elevated(), fixed_range)
if require_disassociated and network.project_id is not None:
raise ValueError(_('Network must be disassociated from project %s'
diff --git a/nova/network/quantum/manager.py b/nova/network/quantum/manager.py
index 404578474..16428b92b 100644
--- a/nova/network/quantum/manager.py
+++ b/nova/network/quantum/manager.py
@@ -100,15 +100,28 @@ class QuantumManager(manager.FlatManager):
self.ipam.create_subnet(context, label, ipam_tenant_id, quantum_net_id,
priority, cidr, gateway_v6, cidr_v6, dns1, dns2)
- def delete_network(self, context, fixed_range):
- """Lookup network by IPv4 cidr, delete both the IPAM
+ def delete_network(self, context, fixed_range, uuid):
+ """Lookup network by uuid, delete both the IPAM
subnet and the corresponding Quantum network.
+
+ The fixed_range parameter is kept here for interface compatibility
+ but is not used.
"""
+ quantum_net_id = uuid
project_id = context.project_id
- quantum_net_id = self.ipam.get_network_id_by_cidr(
- context, fixed_range, project_id)
+ # TODO(bgh): The project_id isn't getting populated here for some
+ # reason.. I'm not sure if it's an invalid assumption or just a bug.
+ # In order to get the right quantum_net_id we'll have to query all the
+ # project_ids for now.
+ if project_id is None:
+ projects = db.project_get_all(context)
+ for p in projects:
+ if self.q_conn.network_exists(p['id'], uuid):
+ project_id = p['id']
+ break
+ LOG.debug("Deleting network for tenant: %s" % project_id)
self.ipam.delete_subnets_by_net_id(context, quantum_net_id,
- project_id)
+ project_id)
q_tenant_id = project_id or FLAGS.quantum_default_tenant_id
self.q_conn.delete_network(q_tenant_id, quantum_net_id)
diff --git a/nova/network/quantum/nova_ipam_lib.py b/nova/network/quantum/nova_ipam_lib.py
index 21dee8f6a..867777af3 100644
--- a/nova/network/quantum/nova_ipam_lib.py
+++ b/nova/network/quantum/nova_ipam_lib.py
@@ -93,7 +93,8 @@ class QuantumNovaIPAMLib(object):
if not network:
raise Exception(_("No network with net_id = %s" % net_id))
manager.FlatManager.delete_network(self.net_manager,
- admin_context, network['cidr'],
+ admin_context, None,
+ network['uuid'],
require_disassociated=False)
def get_project_and_global_net_ids(self, context, project_id):
diff --git a/nova/tests/test_nova_manage.py b/nova/tests/test_nova_manage.py
index 520bfbea1..b0a76f392 100644
--- a/nova/tests/test_nova_manage.py
+++ b/nova/tests/test_nova_manage.py
@@ -202,6 +202,19 @@ class NetworkCommandsTestCase(test.TestCase):
self.stubs.Set(db, 'network_delete_safe', fake_network_delete_safe)
self.commands.delete(fixed_range=self.fake_net['cidr'])
+ def test_delete_by_cidr(self):
+ self.fake_net = self.net
+ self.fake_net['project_id'] = None
+ self.fake_net['host'] = None
+ self.stubs.Set(db, 'network_get_by_cidr',
+ self.fake_network_get_by_cidr)
+
+ def fake_network_delete_safe(context, network_id):
+ self.assertTrue(context.to_dict()['is_admin'])
+ self.assertEqual(network_id, self.fake_net['id'])
+ self.stubs.Set(db, 'network_delete_safe', fake_network_delete_safe)
+ self.commands.delete(fixed_range=self.fake_net['cidr'])
+
def _test_modify_base(self, update_value, project, host, dis_project=None,
dis_host=None):
self.fake_net = self.net
diff --git a/nova/tests/test_quantum.py b/nova/tests/test_quantum.py
index 1a199131d..fdfc99d49 100644
--- a/nova/tests/test_quantum.py
+++ b/nova/tests/test_quantum.py
@@ -196,7 +196,11 @@ class QuantumTestCaseBase(object):
def _delete_nets(self):
for n in networks:
ctx = context.RequestContext('user1', n['project_id'])
- self.net_man.delete_network(ctx, n['cidr'])
+ db_nets = db.network_get_all(ctx.elevated())
+ for x in db_nets:
+ if x['label'] == n['label']:
+ n['uuid'] = x['uuid']
+ self.net_man.delete_network(ctx, None, n['uuid'])
def test_allocate_and_deallocate_instance_static(self):
self._create_nets()