summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorDevin Carlen <devin.carlen@gmail.com>2010-09-28 15:15:05 -0700
committerDevin Carlen <devin.carlen@gmail.com>2010-09-28 15:15:05 -0700
commit60cd2a9e292eb5a8a0bc45605d79d0a511525342 (patch)
tree5c8eb1718d3792e34a59d9ffd914b9cd5a2087bc /nova
parent7ebf1e292b4840e0da4190d2aaf3fa8fc5439846 (diff)
downloadnova-60cd2a9e292eb5a8a0bc45605d79d0a511525342.tar.gz
nova-60cd2a9e292eb5a8a0bc45605d79d0a511525342.tar.xz
nova-60cd2a9e292eb5a8a0bc45605d79d0a511525342.zip
Added checks for uniqueness for ec2 id
Diffstat (limited to 'nova')
-rw-r--r--nova/db/sqlalchemy/api.py35
-rw-r--r--nova/db/sqlalchemy/models.py4
2 files changed, 29 insertions, 10 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index f9999caa3..7229e5b2c 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -27,7 +27,7 @@ from nova.db.sqlalchemy import models
from nova.db.sqlalchemy.session import get_session
from sqlalchemy import or_
from sqlalchemy.orm import joinedload_all
-from sqlalchemy.sql import func
+from sqlalchemy.sql import exists, func
FLAGS = flags.FLAGS
@@ -357,10 +357,15 @@ def instance_create(_context, values):
instance_ref = models.Instance()
for (key, value) in values.iteritems():
instance_ref[key] = value
- instance_ref.ec2_id = utils.generate_uid(instance_ref.__prefix__)
- instance_ref.save()
- return instance_ref
+ session = get_session()
+ with session.begin():
+ while instance_ref.ec2_id == None:
+ ec2_id = utils.generate_uid(instance_ref.__prefix__)
+ if not instance_ec2_id_exists(_context, ec2_id, session=session):
+ instance_ref.ec2_id = ec2_id
+ instance_ref.save(session=session)
+ return instance_ref
def instance_data_get_for_project(_context, project_id):
session = get_session()
@@ -422,6 +427,12 @@ def instance_get_by_ec2_id(context, ec2_id):
return instance_ref
+def instance_ec2_id_exists(context, ec2_id, session=None):
+ if not session:
+ session = get_session()
+ return session.query(exists().where(models.Instance.id==ec2_id)).one()[0]
+
+
def instance_get_fixed_address(_context, instance_id):
session = get_session()
with session.begin():
@@ -778,8 +789,14 @@ def volume_create(_context, values):
volume_ref = models.Volume()
for (key, value) in values.iteritems():
volume_ref[key] = value
- volume_ref.ec2_id = utils.generate_uid(volume_ref.__prefix__)
- volume_ref.save()
+
+ session = get_session()
+ with session.begin():
+ while volume_ref.ec2_id == None:
+ ec2_id = utils.generate_uid(volume_ref.__prefix__)
+ if not volume_ec2_id_exists(_context, ec2_id, session=session):
+ volume_ref.ec2_id = ec2_id
+ volume_ref.save(session=session)
return volume_ref
@@ -844,6 +861,12 @@ def volume_get_by_ec2_id(context, ec2_id):
return volume_ref
+def volume_ec2_id_exists(context, ec2_id, session=None):
+ if not session:
+ session = get_session()
+ return session.query(exists().where(models.Volume.id==ec2_id)).one()[0]
+
+
def volume_get_instance(_context, volume_id):
session = get_session()
with session.begin():
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index baf48d306..b898d8037 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -457,10 +457,6 @@ class FloatingIp(BASE, NovaBase):
project_id = Column(String(255))
host = Column(String(255)) # , ForeignKey('hosts.id'))
- @property
- def str_id(self):
- return self.address
-
@classmethod
def find_by_str(cls, str_id, session=None, deleted=False):
if not session: