summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorEric Day <eday@oddments.org>2010-12-09 13:59:50 -0800
committerEric Day <eday@oddments.org>2010-12-09 13:59:50 -0800
commit77d7e022fd5f2c8709a6784cc83429494d126a3b (patch)
tree8324cfdbd4ebcb97a89ed23374fad7ed886680fe /nova/db
parentc5b1fd0424cec19be44751b6f4f2aeec13752733 (diff)
Converted the instance table to use a uuid instead of a auto_increment ID and a random internal_id. I had to use a String(32) column with hex and not a String(16) with bytes because SQLAlchemy doesn't like non-unicode strings going in for String types. We could try another type, but I didn't want a primary_key on blob types.
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/api.py8
-rw-r--r--nova/db/sqlalchemy/api.py32
-rw-r--r--nova/db/sqlalchemy/models.py23
3 files changed, 25 insertions, 38 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index 8f9dc2443..e607ac938 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -304,9 +304,9 @@ def instance_get_floating_address(context, instance_id):
return IMPL.instance_get_floating_address(context, instance_id)
-def instance_get_by_internal_id(context, internal_id):
- """Get an instance by internal id."""
- return IMPL.instance_get_by_internal_id(context, internal_id)
+def instance_get_by_id(context, instance_id):
+ """Get an instance by id."""
+ return IMPL.instance_get_by_id(context, instance_id)
def instance_is_vpn(context, instance_id):
@@ -658,7 +658,7 @@ def security_group_get_all(context):
def security_group_get(context, security_group_id):
- """Get security group by its internal id."""
+ """Get security group by its id."""
return IMPL.security_group_get(context, security_group_id)
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 55036d1d1..0505b77a6 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -19,7 +19,7 @@
Implementation of SQLAlchemy backend.
"""
-import random
+import uuid
import warnings
from nova import db
@@ -525,28 +525,18 @@ def fixed_ip_update(context, address, values):
###################
-#TODO(gundlach): instance_create and volume_create are nearly identical
-#and should be refactored. I expect there are other copy-and-paste
-#functions between the two of them as well.
@require_context
def instance_create(context, values):
"""Create a new Instance record in the database.
context - request context object
values - dict containing column values.
- 'internal_id' is auto-generated and should not be specified.
"""
instance_ref = models.Instance()
instance_ref.update(values)
session = get_session()
with session.begin():
- while instance_ref.internal_id == None:
- # Instances have integer internal ids.
- internal_id = random.randint(0, 2 ** 31 - 1)
- if not instance_internal_id_exists(context, internal_id,
- session=session):
- instance_ref.internal_id = internal_id
instance_ref.save(session=session)
return instance_ref
@@ -652,38 +642,32 @@ def instance_get_all_by_reservation(context, reservation_id):
@require_context
-def instance_get_by_internal_id(context, internal_id):
+def instance_get_by_id(context, instance_id):
session = get_session()
+ if type(instance_id) is int:
+ instance_id = uuid.UUID(int=instance_id).hex
+
if is_admin_context(context):
result = session.query(models.Instance).\
options(joinedload('security_groups')).\
- filter_by(internal_id=internal_id).\
+ filter_by(id=instance_id).\
filter_by(deleted=can_read_deleted(context)).\
first()
elif is_user_context(context):
result = session.query(models.Instance).\
options(joinedload('security_groups')).\
filter_by(project_id=context.project_id).\
- filter_by(internal_id=internal_id).\
+ filter_by(id=instance_id).\
filter_by(deleted=False).\
first()
if not result:
- raise exception.NotFound('Instance %s not found' % (internal_id))
+ raise exception.NotFound('Instance %s not found' % (instance_id))
return result
@require_context
-def instance_internal_id_exists(context, internal_id, session=None):
- if not session:
- session = get_session()
- return session.query(exists().\
- where(models.Instance.internal_id == internal_id)).\
- one()[0]
-
-
-@require_context
def instance_get_fixed_address(context, instance_id):
session = get_session()
with session.begin():
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index fe0a9a921..a0b6fff89 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -20,6 +20,7 @@ SQLAlchemy models for nova data.
"""
import datetime
+import uuid
from sqlalchemy.orm import relationship, backref, object_mapper
from sqlalchemy import Column, Integer, String, schema
@@ -39,6 +40,10 @@ FLAGS = flags.FLAGS
BASE = declarative_base()
+def make_uuid():
+ return uuid.uuid1().hex
+
+
class NovaBase(object):
"""Base class for Nova Models."""
__table_args__ = {'mysql_engine': 'InnoDB'}
@@ -154,11 +159,13 @@ class Service(BASE, NovaBase):
class Instance(BASE, NovaBase):
"""Represents a guest vm."""
__tablename__ = 'instances'
- id = Column(Integer, primary_key=True)
- internal_id = Column(Integer, unique=True)
+ id = Column(String(32), primary_key=True, default=make_uuid)
- admin_pass = Column(String(255))
+ @property
+ def name(self):
+ return "instance-%s" % self.id
+ admin_pass = Column(String(255))
user_id = Column(String(255))
project_id = Column(String(255))
@@ -170,10 +177,6 @@ class Instance(BASE, NovaBase):
def project(self):
return auth.manager.AuthManager().get_project(self.project_id)
- @property
- def name(self):
- return "instance-%d" % self.internal_id
-
image_id = Column(String(255))
kernel_id = Column(String(255))
ramdisk_id = Column(String(255))
@@ -238,7 +241,7 @@ class Volume(BASE, NovaBase):
host = Column(String(255)) # , ForeignKey('hosts.id'))
size = Column(Integer)
availability_zone = Column(String(255)) # TODO(vish): foreign key?
- instance_id = Column(Integer, ForeignKey('instances.id'), nullable=True)
+ instance_id = Column(String(32), ForeignKey('instances.id'), nullable=True)
instance = relationship(Instance,
backref=backref('volumes'),
foreign_keys=instance_id,
@@ -311,7 +314,7 @@ class SecurityGroupInstanceAssociation(BASE, NovaBase):
__tablename__ = 'security_group_instance_association'
id = Column(Integer, primary_key=True)
security_group_id = Column(Integer, ForeignKey('security_groups.id'))
- instance_id = Column(Integer, ForeignKey('instances.id'))
+ instance_id = Column(String(32), ForeignKey('instances.id'))
class SecurityGroup(BASE, NovaBase):
@@ -431,7 +434,7 @@ class FixedIp(BASE, NovaBase):
address = Column(String(255))
network_id = Column(Integer, ForeignKey('networks.id'), nullable=True)
network = relationship(Network, backref=backref('fixed_ips'))
- instance_id = Column(Integer, ForeignKey('instances.id'), nullable=True)
+ instance_id = Column(String(32), ForeignKey('instances.id'), nullable=True)
instance = relationship(Instance,
backref=backref('fixed_ip', uselist=False),
foreign_keys=instance_id,