summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-02-15 17:13:07 +0000
committerGerrit Code Review <review@openstack.org>2012-02-15 17:13:07 +0000
commitab548e2e39daafb93ebcb4549a8dfe75c5b5ea94 (patch)
treedbaad5b34326ee0c36baf19fb9760b3d6aa0608d /nova
parent3c7a362763a6c6ba44570b61a1cc45d9a0f3abe4 (diff)
parente88a2a616b6d3eda01ae739e542bec54ff82922f (diff)
downloadnova-ab548e2e39daafb93ebcb4549a8dfe75c5b5ea94.tar.gz
nova-ab548e2e39daafb93ebcb4549a8dfe75c5b5ea94.tar.xz
nova-ab548e2e39daafb93ebcb4549a8dfe75c5b5ea94.zip
Merge "Prevent Duplicate VLAN IDs"
Diffstat (limited to 'nova')
-rw-r--r--nova/db/sqlalchemy/api.py7
-rw-r--r--nova/exception.py4
-rw-r--r--nova/tests/test_db_api.py8
3 files changed, 19 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index ed9286eff..1f4f2f88c 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1984,9 +1984,16 @@ def network_count_reserved_ips(context, network_id):
@require_admin_context
def network_create_safe(context, values):
+ if values.get('vlan'):
+ if model_query(context, models.Network, read_deleted="no")\
+ .filter_by(vlan=values['vlan'])\
+ .first():
+ raise exception.DuplicateVlan(vlan=values['vlan'])
+
network_ref = models.Network()
network_ref['uuid'] = str(utils.gen_uuid())
network_ref.update(values)
+
try:
network_ref.save()
return network_ref
diff --git a/nova/exception.py b/nova/exception.py
index 9bb39b2f4..979703072 100644
--- a/nova/exception.py
+++ b/nova/exception.py
@@ -984,3 +984,7 @@ class SolidFireAPIStatusException(SolidFireAPIException):
class SolidFireAPIDataException(SolidFireAPIException):
message = _("Error in SolidFire API response: data=%(data)s")
+
+
+class DuplicateVlan(Duplicate):
+ message = _("Detected existing vlan with id %(vlan)")
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 121120dbf..3353ea737 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -146,6 +146,14 @@ class DbApiTestCase(test.TestCase):
db_network = db.network_get(ctxt, network.id)
self.assertEqual(network.uuid, db_network.uuid)
+ def test_network_create_with_duplicate_vlan(self):
+ ctxt = context.get_admin_context()
+ values1 = {'host': 'localhost', 'project_id': 'project1', 'vlan': 1}
+ values2 = {'host': 'something', 'project_id': 'project1', 'vlan': 1}
+ db.network_create_safe(ctxt, values1)
+ self.assertRaises(exception.DuplicateVlan,
+ db.network_create_safe, ctxt, values2)
+
def test_instance_update_with_instance_id(self):
""" test instance_update() works when an instance id is passed """
ctxt = context.get_admin_context()