summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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()