summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/184_fix_159_migration_sync_shadow_table.py63
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_downgrade.sql78
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_upgrade.sql76
-rw-r--r--nova/tests/test_migrations.py7
4 files changed, 224 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/184_fix_159_migration_sync_shadow_table.py b/nova/db/sqlalchemy/migrate_repo/versions/184_fix_159_migration_sync_shadow_table.py
new file mode 100644
index 000000000..bafc50fb3
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/184_fix_159_migration_sync_shadow_table.py
@@ -0,0 +1,63 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 IBM Corp.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from sqlalchemy import MetaData, String, Table
+from sqlalchemy.dialects import postgresql
+
+TABLE_COLUMNS = [
+ # table name, column name
+ ('shadow_instances', 'access_ip_v4'),
+ ('shadow_instances', 'access_ip_v6'),
+ ('shadow_networks', 'gateway'),
+ ('shadow_networks', 'gateway_v6'),
+ ('shadow_networks', 'netmask'),
+ ('shadow_networks', 'netmask_v6'),
+ ('shadow_networks', 'broadcast'),
+ ('shadow_networks', 'dns1'),
+ ('shadow_networks', 'dns2'),
+ ('shadow_networks', 'vpn_public_address'),
+ ('shadow_networks', 'vpn_private_address'),
+ ('shadow_networks', 'dhcp_start'),
+ ('shadow_fixed_ips', 'address'),
+ ('shadow_floating_ips', 'address'),
+ ('shadow_console_pools', 'address')]
+
+
+def upgrade(migrate_engine):
+ dialect = migrate_engine.url.get_dialect()
+
+ # NOTE(maurosr): this just affects mysql; postgresql uses INET
+ # type and sqlite doesn't goes fine with alter tables, so it should be done
+ # manually. This way we'll be able to keep UCs like the one inserted on
+ # version 158 which would get lost cause sqlite is not migrated as mysql or
+ # pgsql, it copies the column and data instead of execute an alter table
+ # command.
+ if dialect is not postgresql.dialect:
+ meta = MetaData(bind=migrate_engine)
+ for table, column in TABLE_COLUMNS:
+ t = Table(table, meta, autoload=True)
+ getattr(t.c, column).alter(type=String(39))
+
+
+def downgrade(migrate_engine):
+ """Convert columns back to the larger String(43) defined in version 149."""
+ dialect = migrate_engine.url.get_dialect()
+ if dialect is not postgresql.dialect:
+ meta = MetaData(bind=migrate_engine)
+ for table, column in TABLE_COLUMNS:
+ t = Table(table, meta, autoload=True)
+ getattr(t.c, column).alter(type=String(43))
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_downgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_downgrade.sql
new file mode 100644
index 000000000..a8b24c3aa
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_downgrade.sql
@@ -0,0 +1,78 @@
+BEGIN TRANSACTION;
+ /* create networks_backup table with the fields like networks was before
+ the upgrade */
+ CREATE TABLE shadow_networks_backup(
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted INTEGER,
+ id INTEGER NOT NULL,
+ injected BOOLEAN,
+ cidr VARCHAR(43),
+ netmask VARCHAR(43),
+ bridge VARCHAR(255),
+ gateway VARCHAR(43),
+ broadcast VARCHAR(43),
+ dns1 VARCHAR(43),
+ vlan INTEGER,
+ vpn_public_address VARCHAR(43),
+ vpn_public_port INTEGER,
+ vpn_private_address VARCHAR(43),
+ dhcp_start VARCHAR(43),
+ project_id VARCHAR(255),
+ host VARCHAR(255),
+ cidr_v6 VARCHAR(43),
+ gateway_v6 VARCHAR(43),
+ label VARCHAR(255),
+ netmask_v6 VARCHAR(43),
+ bridge_interface VARCHAR(255),
+ multi_host BOOLEAN,
+ dns2 VARCHAR(43),
+ uuid VARCHAR(36),
+ priority INTEGER,
+ rxtx_base INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ /* copy data currently on networks to the backup table and drop networks
+ table */
+ INSERT INTO shadow_networks_backup SELECT * FROM shadow_networks;
+ DROP TABLE shadow_networks;
+
+ CREATE TABLE shadow_networks (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted INTEGER,
+ id INTEGER NOT NULL,
+ injected BOOLEAN,
+ cidr VARCHAR(43),
+ netmask VARCHAR(43),
+ bridge VARCHAR(255),
+ gateway VARCHAR(43),
+ broadcast VARCHAR(43),
+ dns1 VARCHAR(43),
+ vlan INTEGER,
+ vpn_public_address VARCHAR(43),
+ vpn_public_port INTEGER,
+ vpn_private_address VARCHAR(43),
+ dhcp_start VARCHAR(43),
+ project_id VARCHAR(255),
+ host VARCHAR(255),
+ cidr_v6 VARCHAR(43),
+ gateway_v6 VARCHAR(43),
+ label VARCHAR(255),
+ netmask_v6 VARCHAR(43),
+ bridge_interface VARCHAR(255),
+ multi_host BOOLEAN,
+ dns2 VARCHAR(43),
+ uuid VARCHAR(36),
+ priority INTEGER,
+ rxtx_base INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ /* Get data from backup table and drop it next */
+ INSERT INTO shadow_networks SELECT * FROM shadow_networks_backup;
+ DROP TABLE shadow_networks_backup;
+COMMIT;
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_upgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_upgrade.sql
new file mode 100644
index 000000000..cc5151bd7
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/184_sqlite_upgrade.sql
@@ -0,0 +1,76 @@
+BEGIN TRANSACTION;
+ /* Create a backup table with the new fields size */
+ CREATE TABLE shadow_networks_backup(
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted INTEGER,
+ id INTEGER NOT NULL,
+ injected BOOLEAN,
+ cidr VARCHAR(43),
+ netmask VARCHAR(39),
+ bridge VARCHAR(255),
+ gateway VARCHAR(39),
+ broadcast VARCHAR(39),
+ dns1 VARCHAR(39),
+ vlan INTEGER,
+ vpn_public_address VARCHAR(39),
+ vpn_public_port INTEGER,
+ vpn_private_address VARCHAR(39),
+ dhcp_start VARCHAR(39),
+ project_id VARCHAR(255),
+ host VARCHAR(255),
+ cidr_v6 VARCHAR(43),
+ gateway_v6 VARCHAR(39),
+ label VARCHAR(255),
+ netmask_v6 VARCHAR(39),
+ bridge_interface VARCHAR(255),
+ multi_host BOOLEAN,
+ dns2 VARCHAR(39),
+ uuid VARCHAR(36),
+ priority INTEGER,
+ rxtx_base INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ /* get data from networks and the drop it */
+ INSERT INTO shadow_networks_backup SELECT * FROM shadow_networks;
+ DROP TABLE shadow_networks;
+
+ CREATE TABLE shadow_networks (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted INTEGER,
+ id INTEGER NOT NULL,
+ injected BOOLEAN,
+ cidr VARCHAR(43),
+ netmask VARCHAR(39),
+ bridge VARCHAR(255),
+ gateway VARCHAR(39),
+ broadcast VARCHAR(39),
+ dns1 VARCHAR(39),
+ vlan INTEGER,
+ vpn_public_address VARCHAR(39),
+ vpn_public_port INTEGER,
+ vpn_private_address VARCHAR(39),
+ dhcp_start VARCHAR(39),
+ project_id VARCHAR(255),
+ host VARCHAR(255),
+ cidr_v6 VARCHAR(43),
+ gateway_v6 VARCHAR(39),
+ label VARCHAR(255),
+ netmask_v6 VARCHAR(39),
+ bridge_interface VARCHAR(255),
+ multi_host BOOLEAN,
+ dns2 VARCHAR(39),
+ uuid VARCHAR(36),
+ priority INTEGER,
+ rxtx_base INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ /* get data from networks_backup back and drop it */
+ INSERT INTO shadow_networks SELECT * FROM shadow_networks_backup;
+ DROP TABLE shadow_networks_backup;
+COMMIT;
diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py
index 0b7e361f4..00cfdbf6c 100644
--- a/nova/tests/test_migrations.py
+++ b/nova/tests/test_migrations.py
@@ -1408,6 +1408,13 @@ class TestNovaMigrations(BaseMigrationTestCase, CommonTestsMixIn):
table_name = 'security_group_default_rules'
self.assertTrue(db_utils.check_shadow_table(engine, table_name))
+ def _check_184(self, engine, data):
+ self.assertTrue(db_utils.check_shadow_table(engine, 'instances'))
+ self.assertTrue(db_utils.check_shadow_table(engine, 'networks'))
+ self.assertTrue(db_utils.check_shadow_table(engine, 'fixed_ips'))
+ self.assertTrue(db_utils.check_shadow_table(engine, 'floating_ips'))
+ self.assertTrue(db_utils.check_shadow_table(engine, 'console_pools'))
+
class TestBaremetalMigrations(BaseMigrationTestCase, CommonTestsMixIn):
"""Test sqlalchemy-migrate migrations."""