diff options
| -rwxr-xr-x | bin/nova-manage | 20 | ||||
| -rw-r--r-- | nova/network/manager.py | 11 | ||||
| -rw-r--r-- | nova/network/quantum/manager.py | 23 | ||||
| -rw-r--r-- | nova/network/quantum/nova_ipam_lib.py | 3 | ||||
| -rw-r--r-- | nova/tests/test_nova_manage.py | 13 | ||||
| -rw-r--r-- | nova/tests/test_quantum.py | 6 |
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() |
