diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-04-10 00:18:57 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-04-10 00:18:57 +0000 |
| commit | 384b758166ed72fc16da7c5ad18eedc044bbc633 (patch) | |
| tree | ca4cafabbd7357c949b4b3c5036bdf8cb803afd3 | |
| parent | 24effa38bdfb846ab52ff6654503c3e65bd613d3 (diff) | |
| parent | 761e4e0cbe12b9d196f8e63146dce9513718ece1 (diff) | |
| download | nova-384b758166ed72fc16da7c5ad18eedc044bbc633.tar.gz nova-384b758166ed72fc16da7c5ad18eedc044bbc633.tar.xz nova-384b758166ed72fc16da7c5ad18eedc044bbc633.zip | |
Merge "Delete fixed_ips when network is deleted"
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 13 | ||||
| -rw-r--r-- | nova/exception.py | 4 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 19 |
3 files changed, 36 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 2ce42e1cc..0f1aaa80b 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1907,8 +1907,21 @@ def network_create_safe(context, values): def network_delete_safe(context, network_id): session = get_session() with session.begin(): + result = session.query(models.FixedIp).\ + filter_by(network_id=network_id).\ + filter_by(deleted=False).\ + filter_by(allocated=True).\ + all() + if result: + raise exception.NetworkInUse(network_id=network_id) network_ref = network_get(context, network_id=network_id, session=session) + session.query(models.FixedIp).\ + filter_by(network_id=network_id).\ + filter_by(deleted=False).\ + update({'deleted': True, + 'updated_at': literal_column('updated_at'), + 'deleted_at': utils.utcnow()}) session.delete(network_ref) diff --git a/nova/exception.py b/nova/exception.py index 75320c2be..abddc6cc7 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -525,6 +525,10 @@ class StorageRepositoryNotFound(NotFound): message = _("Cannot find SR to read/write VDI.") +class NetworkInUse(NovaException): + message = _("Network %(network_id)s is still in use.") + + class NetworkNotCreated(NovaException): message = _("%(req)s is required to create a network.") diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index fcf4938c7..d54fcda81 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -136,6 +136,25 @@ class DbApiTestCase(test.TestCase): db_network = db.network_get(ctxt, network.id) self.assertEqual(network.uuid, db_network.uuid) + def test_network_delete_safe(self): + ctxt = context.get_admin_context() + values = {'host': 'localhost', 'project_id': 'project1'} + network = db.network_create_safe(ctxt, values) + db_network = db.network_get(ctxt, network.id) + values = {'network_id': network['id'], 'address': 'fake1'} + address1 = db.fixed_ip_create(ctxt, values) + values = {'network_id': network['id'], + 'address': 'fake2', + 'allocated': True} + address2 = db.fixed_ip_create(ctxt, values) + self.assertRaises(exception.NetworkInUse, + db.network_delete_safe, ctxt, network['id']) + db.fixed_ip_update(ctxt, address2, {'allocated': False}) + network = db.network_delete_safe(ctxt, network['id']) + ctxt = ctxt.elevated(read_deleted='yes') + fixed_ip = db.fixed_ip_get_by_address(ctxt, address1) + self.assertTrue(fixed_ip['deleted']) + def test_network_create_with_duplicate_vlan(self): ctxt = context.get_admin_context() values1 = {'host': 'localhost', 'project_id': 'project1', 'vlan': 1} |
