]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Switch to UUID for the Stack primary key.
authorSteve Baker <sbaker@redhat.com>
Fri, 9 Nov 2012 02:45:06 +0000 (15:45 +1300)
committerSteve Baker <sbaker@redhat.com>
Fri, 9 Nov 2012 02:45:06 +0000 (15:45 +1300)
For the migrate upgrade, existing integer keys remain and any subsequent stack
will be assigned a uuid.

For a migrate downgrade, it should work fine if there have been no stacks added
since ugrade. Added stacks will have their IDs 'truncated' back to an integer
which will require some manual fixup after downgrade.

Change-Id: Ib882bece911fcbc96fffab16a9f0e5ce3cb55fed

heat/db/sqlalchemy/migrate_repo/versions/012_stack_id_uuid.py [new file with mode: 0644]
heat/db/sqlalchemy/models.py

diff --git a/heat/db/sqlalchemy/migrate_repo/versions/012_stack_id_uuid.py b/heat/db/sqlalchemy/migrate_repo/versions/012_stack_id_uuid.py
new file mode 100644 (file)
index 0000000..b406e4b
--- /dev/null
@@ -0,0 +1,94 @@
+from sqlalchemy import *
+from migrate import *
+from heat.common import utils
+
+
+def upgrade(migrate_engine):
+    meta = MetaData(bind=migrate_engine)
+
+    stack = Table('stack', meta, autoload=True)
+    event = Table('event', meta, autoload=True)
+    resource = Table('resource', meta, autoload=True)
+
+    dialect = migrate_engine.url.get_dialect().name
+
+    if not dialect.startswith('sqlite'):
+        fkeys = list(event.c.stack_id.foreign_keys)
+        if fkeys:
+            fkey_name = fkeys[0].constraint.name
+            ForeignKeyConstraint(columns=[event.c.stack_id],
+                    refcolumns=[stack.c.id],
+                    name=fkey_name).drop()
+
+        fkeys = list(resource.c.stack_id.foreign_keys)
+        if fkeys:
+            fkey_name = fkeys[0].constraint.name
+            ForeignKeyConstraint(columns=[resource.c.stack_id],
+                                 refcolumns=[stack.c.id],
+                                 name=fkey_name).drop()
+
+    stack.c.id.alter(String(36), primary_key=True,
+        default=utils.generate_uuid)
+    event.c.stack_id.alter(String(36), nullable=False)
+    resource.c.stack_id.alter(String(36), nullable=False)
+
+    fkeys = list(event.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[event.c.stack_id],
+                refcolumns=[stack.c.id],
+                name=fkey_name).create()
+
+    fkeys = list(resource.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[resource.c.stack_id],
+                             refcolumns=[stack.c.id],
+                             name=fkey_name).create()
+
+
+def downgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
+
+    dialect = migrate_engine.url.get_dialect().name
+
+    if dialect.startswith('sqlite'):
+        return
+
+    stack = Table('stack', meta, autoload=True)
+    event = Table('event', meta, autoload=True)
+    resource = Table('resource', meta, autoload=True)
+
+    fkeys = list(event.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[event.c.stack_id],
+                refcolumns=[stack.c.id],
+                name=fkey_name).drop()
+
+    fkeys = list(resource.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[resource.c.stack_id],
+                             refcolumns=[stack.c.id],
+                             name=fkey_name).drop()
+
+    stack.c.id.alter(Integer, primary_key=True,
+        default=utils.generate_uuid)
+    event.c.stack_id.alter(Integer, nullable=False)
+    resource.c.stack_id.alter(Integer, nullable=False)
+
+    fkeys = list(event.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[event.c.stack_id],
+                refcolumns=[stack.c.id],
+                name=fkey_name).create()
+
+    fkeys = list(resource.c.stack_id.foreign_keys)
+    if fkeys:
+        fkey_name = fkeys[0].constraint.name
+        ForeignKeyConstraint(columns=[resource.c.stack_id],
+                             refcolumns=[stack.c.id],
+                             name=fkey_name).create()
index 4e70bdf4879a28454f2771b58a579f2c18bd273e..03abeafec3e5433e2fbdee5b2072281db3a20fb6 100644 (file)
@@ -22,6 +22,7 @@ from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.schema import ForeignKeyConstraint
 from sqlalchemy import types as types
 from json import dumps, loads
+from heat.common import utils
 from heat.openstack.common import timeutils
 from heat.db.sqlalchemy.session import get_session
 from sqlalchemy.orm.session import Session
@@ -144,7 +145,8 @@ class Stack(BASE, HeatBase):
 
     __tablename__ = 'stack'
 
-    id = Column(Integer, primary_key=True)
+    id = Column(String, primary_key=True,
+        default=utils.generate_uuid)
     name = Column(String)
     raw_template_id = Column(Integer, ForeignKey('raw_template.id'),
                             nullable=False)
@@ -189,7 +191,7 @@ class Event(BASE, HeatBase):
     __tablename__ = 'event'
 
     id = Column(Integer, primary_key=True)
-    stack_id = Column(Integer, ForeignKey('stack.id'),
+    stack_id = Column(String, ForeignKey('stack.id'),
                         nullable=False)
     stack = relationship(Stack,
         backref=backref('events'))
@@ -215,7 +217,7 @@ class Resource(BASE, HeatBase):
     # odd name as "metadata" is reserved
     rsrc_metadata = Column('rsrc_metadata', Json)
 
-    stack_id = Column(Integer, ForeignKey('stack.id'),
+    stack_id = Column(String, ForeignKey('stack.id'),
                                  nullable=False)
     stack = relationship(Stack, backref=backref('resources'))