diff options
| author | Devin Carlen <devin.carlen@gmail.com> | 2010-09-28 15:15:05 -0700 |
|---|---|---|
| committer | Devin Carlen <devin.carlen@gmail.com> | 2010-09-28 15:15:05 -0700 |
| commit | 60cd2a9e292eb5a8a0bc45605d79d0a511525342 (patch) | |
| tree | 5c8eb1718d3792e34a59d9ffd914b9cd5a2087bc /nova | |
| parent | 7ebf1e292b4840e0da4190d2aaf3fa8fc5439846 (diff) | |
| download | nova-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.py | 35 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/models.py | 4 |
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: |
