summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@yahoo.com>2010-09-13 01:58:40 -0700
committerVishvananda Ishaya <vishvananda@yahoo.com>2010-09-13 01:58:40 -0700
commit970654239267fc702f767bbaff3e22207576d0cd (patch)
tree0108590d03f938a4a4fc3890ad54d750d559548e
parent626622b8982888e50c40193839c6fe9a4a0158c9 (diff)
downloadnova-970654239267fc702f767bbaff3e22207576d0cd.tar.gz
nova-970654239267fc702f767bbaff3e22207576d0cd.tar.xz
nova-970654239267fc702f767bbaff3e22207576d0cd.zip
multiple network controllers will not create duplicate indexes
-rw-r--r--nova/db/api.py9
-rw-r--r--nova/db/sqlalchemy/api.py8
-rw-r--r--nova/db/sqlalchemy/models.py2
-rw-r--r--nova/network/manager.py2
4 files changed, 14 insertions, 7 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index 9f6ff99c3..a775dc301 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -365,9 +365,12 @@ def network_index_count(context):
return IMPL.network_index_count(context)
-def network_index_create(context, values):
- """Create a network index from the values dict"""
- return IMPL.network_index_create(context, values)
+def network_index_create_safe(context, values):
+ """Create a network index from the values dict
+
+ The index is not returned. If the create violates the unique
+ constraints because the index already exists, no exception is raised."""
+ return IMPL.network_index_create_safe(context, values)
def network_set_cidr(context, network_id, cidr):
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index d612fe669..35585b1b0 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -25,6 +25,7 @@ from nova import flags
from nova.db.sqlalchemy import models
from nova.db.sqlalchemy.session import get_session
from sqlalchemy import or_
+from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import joinedload_all
from sqlalchemy.sql import func
@@ -567,11 +568,14 @@ def network_index_count(_context):
return models.NetworkIndex.count()
-def network_index_create(_context, values):
+def network_index_create_safe(_context, values):
network_index_ref = models.NetworkIndex()
for (key, value) in values.iteritems():
network_index_ref[key] = value
- network_index_ref.save()
+ try:
+ network_index_ref.save()
+ except IntegrityError:
+ pass
def network_set_host(_context, network_id, host_id):
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index 41013f41b..6ff0decb5 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -355,7 +355,7 @@ class NetworkIndex(BASE, NovaBase):
"""
__tablename__ = 'network_indexes'
id = Column(Integer, primary_key=True)
- index = Column(Integer)
+ index = Column(Integer, unique=True)
network_id = Column(Integer, ForeignKey('networks.id'), nullable=True)
network = relationship(Network, backref=backref('network_index',
uselist=False))
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 191c1d364..570d5f8d8 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -343,7 +343,7 @@ class VlanManager(NetworkManager):
This could use a manage command instead of keying off of a flag"""
if not self.db.network_index_count(context):
for index in range(FLAGS.num_networks):
- self.db.network_index_create(context, {'index': index})
+ self.db.network_index_create_safe(context, {'index': index})
def _on_set_network_host(self, context, network_id):
"""Called when this host becomes the host for a project"""