]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix migration set_length_of_description_field_metering
authorAnn Kamyshnikova <akamyshnikova@mirantis.com>
Tue, 22 Jul 2014 15:04:00 +0000 (19:04 +0400)
committerAnn Kamyshnikova <akamyshnikova@mirantis.com>
Tue, 19 Aug 2014 07:51:23 +0000 (11:51 +0400)
If PostgreSQL version is less than 9.1.13 migration
set_length_of_description_field_metering fails as there is no
special 'create if not exist' expression. This change add special
function for this case.

Closes-bug: #1348138

Change-Id: Ibe4f370fe400072abd281bd2313261790335eae2

neutron/db/migration/__init__.py
neutron/db/migration/alembic_migrations/versions/33c3db036fe4_set_length_of_description_field_metering.py

index 6b367233bac8f614aa6b5f867edf6b889a3e1c68..2f8fae257a182303474807b773dc9277115437b1 100644 (file)
@@ -51,3 +51,18 @@ def alter_enum(table, column, enum_type, nullable):
     else:
         op.alter_column(table, column, type_=enum_type,
                         existing_nullable=nullable)
+
+
+def create_table_if_not_exist_psql(table_name, values):
+    if op.get_bind().engine.dialect.server_version_info < (9, 1, 0):
+        op.execute("CREATE LANGUAGE plpgsql")
+    op.execute("CREATE OR REPLACE FUNCTION execute(TEXT) RETURNS VOID AS $$"
+               "BEGIN EXECUTE $1; END;"
+               "$$ LANGUAGE plpgsql STRICT;")
+    op.execute("CREATE OR REPLACE FUNCTION table_exist(TEXT) RETURNS bool as "
+               "$$ SELECT exists(select 1 from pg_class where relname=$1);"
+               "$$ language sql STRICT;")
+    op.execute("SELECT execute($$CREATE TABLE %(name)s %(columns)s $$) "
+               "WHERE NOT table_exist(%(name)r);" %
+               {'name': table_name,
+                'columns': values})
\ No newline at end of file
index 0882aa7f4f55c91e26e667834686a1b11e010792..28dd886d738496313ab1f4b84a0a60681fea70ed 100644 (file)
@@ -41,11 +41,19 @@ def upgrade(active_plugins=None, options=None):
     if not migration.should_run(active_plugins, migration_for_plugins):
         return
 
-    op.execute("CREATE TABLE IF NOT EXISTS meteringlabels( "
-               "tenant_id VARCHAR(255) NULL, "
-               "id VARCHAR(36) PRIMARY KEY NOT NULL, "
-               "name VARCHAR(255) NULL, "
-               "description VARCHAR(255) NULL)")
+    if op.get_bind().engine.dialect.name == 'postgresql':
+        migration.create_table_if_not_exist_psql(
+            'meteringlabels',
+            "(tenant_id VARCHAR(255) NULL, "
+            "id VARCHAR(36) PRIMARY KEY NOT NULL, "
+            "name VARCHAR(255) NULL, "
+            "description VARCHAR(255) NULL)")
+    else:
+        op.execute("CREATE TABLE IF NOT EXISTS meteringlabels( "
+                   "tenant_id VARCHAR(255) NULL, "
+                   "id VARCHAR(36) PRIMARY KEY NOT NULL, "
+                   "name VARCHAR(255) NULL, "
+                   "description VARCHAR(255) NULL)")
 
     op.alter_column('meteringlabels', 'description', type_=sa.String(1024),
                     existing_nullable=True)