diff options
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.""" |