diff options
| author | Michael Still <mikal@stillhq.com> | 2012-07-27 11:43:37 +1000 |
|---|---|---|
| committer | Michael Still <mikal@stillhq.com> | 2012-07-31 08:21:14 +1000 |
| commit | 0d9d2487e2ca921ab54b1ecbe359c32ce8fb0c48 (patch) | |
| tree | ad2f2c94c5f8b4a0b9ecf69445df3b080a712378 /nova/db | |
| parent | d56b5fc3ad6dbfc56e0729174925fb146cef87fa (diff) | |
Convert virtual_interfaces to using instance_uuid.
This review converts virtual_interfaces from tracking their
instances with instance_id to using instance_uuid.
This should be the last review for blueprint finish-uuid-conversion.
Change-Id: I303bba009fa37c72394369c8338e6e759f794cd0
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 22 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_downgrade.sql | 71 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_upgrade.sql | 71 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/migrate_repo/versions/114_vifs_uses_uuid.py | 108 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/models.py | 2 |
5 files changed, 262 insertions, 12 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 8d64874bc..a9b1ecf2c 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1288,24 +1288,24 @@ def virtual_interface_get_by_uuid(context, vif_uuid): @require_context -@require_instance_exists -def virtual_interface_get_by_instance(context, instance_id): +@require_instance_exists_using_uuid +def virtual_interface_get_by_instance(context, instance_uuid): """Gets all virtual interfaces for instance. - :param instance_id: = id of the instance to retrieve vifs for + :param instance_uuid: = uuid of the instance to retrieve vifs for """ vif_refs = _virtual_interface_query(context).\ - filter_by(instance_id=instance_id).\ + filter_by(instance_uuid=instance_uuid).\ all() return vif_refs @require_context -def virtual_interface_get_by_instance_and_network(context, instance_id, - network_id): +def virtual_interface_get_by_instance_and_network(context, instance_uuid, + network_id): """Gets virtual interface for instance that's associated with network.""" vif_ref = _virtual_interface_query(context).\ - filter_by(instance_id=instance_id).\ + filter_by(instance_uuid=instance_uuid).\ filter_by(network_id=network_id).\ first() return vif_ref @@ -1324,13 +1324,13 @@ def virtual_interface_delete(context, vif_id): @require_context -def virtual_interface_delete_by_instance(context, instance_id): +def virtual_interface_delete_by_instance(context, instance_uuid): """Delete virtual interface records that are associated with the instance given by instance_id. - :param instance_id: = id of instance + :param instance_uuid: = uuid of instance """ - vif_refs = virtual_interface_get_by_instance(context, instance_id) + vif_refs = virtual_interface_get_by_instance(context, instance_uuid) for vif_ref in vif_refs: virtual_interface_delete(context, vif_ref['id']) @@ -1566,7 +1566,7 @@ def instance_get_all_by_filters(context, filters, sort_key, sort_dir): # Filters for exact matches that we can do along with the SQL query... # For other filters that don't match this, we will do regexp matching exact_match_filter_names = ['project_id', 'user_id', 'image_ref', - 'vm_state', 'instance_type_id', 'uuid'] + 'vm_state', 'instance_type_id', 'uuid'] # Filter the query query_prefix = exact_filter(query_prefix, models.Instance, diff --git a/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_downgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_downgrade.sql new file mode 100644 index 000000000..bb210025a --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_downgrade.sql @@ -0,0 +1,71 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + instance_uuid VARCHAR(36), + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + NULL, + instance_uuid, + uuid + FROM virtual_interfaces; + + UPDATE virtual_interfaces_backup + SET instance_id= + (SELECT id + FROM instances + WHERE virtual_interfaces_backup.instance_uuid = instances.uuid + ); + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id VARCHAR(36) NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(instance_id) REFERENCES instances (id) + ); + + CREATE INDEX virtual_interfaces_instance_id ON + virtual_interfaces(instance_id); + CREATE INDEX virtual_interfaces_network_id ON + virtual_interfaces(network_id); + + INSERT INTO virtual_interfaces + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT;
\ No newline at end of file diff --git a/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_upgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_upgrade.sql new file mode 100644 index 000000000..5ee98d5c1 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_upgrade.sql @@ -0,0 +1,71 @@ +BEGIN TRANSACTION; + CREATE TEMPORARY TABLE virtual_interfaces_backup ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_id INTEGER, + instance_uuid VARCHAR(36), + uuid VARCHAR(36), + PRIMARY KEY (id) + ); + + INSERT INTO virtual_interfaces_backup + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_id, + NULL, + uuid + FROM virtual_interfaces; + + UPDATE virtual_interfaces_backup + SET instance_uuid= + (SELECT uuid + FROM instances + WHERE virtual_interfaces_backup.instance_id = instances.id + ); + + DROP TABLE virtual_interfaces; + + CREATE TABLE virtual_interfaces ( + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME, + deleted BOOLEAN, + id INTEGER NOT NULL, + address VARCHAR(255), + network_id INTEGER, + instance_uuid VARCHAR(36) NOT NULL, + uuid VARCHAR(36), + PRIMARY KEY (id), + FOREIGN KEY(instance_uuid) REFERENCES instances (uuid) + ); + + CREATE INDEX virtual_interfaces_instance_uuid ON + virtual_interfaces(instance_uuid); + CREATE INDEX virtual_interfaces_network_id ON + virtual_interfaces(network_id); + + INSERT INTO virtual_interfaces + SELECT created_at, + updated_at, + deleted_at, + deleted, + id, + address, + network_id, + instance_uuid, + uuid + FROM virtual_interfaces_backup; + + DROP TABLE virtual_interfaces_backup; + +COMMIT; diff --git a/nova/db/sqlalchemy/migrate_repo/versions/114_vifs_uses_uuid.py b/nova/db/sqlalchemy/migrate_repo/versions/114_vifs_uses_uuid.py new file mode 100644 index 000000000..8f7ad1a15 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/114_vifs_uses_uuid.py @@ -0,0 +1,108 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack LLC. +# Copyright 2012 Michael Still and Canonical Inc +# 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 migrate import ForeignKeyConstraint +from sqlalchemy import MetaData, String, Table +from sqlalchemy import select, Column, ForeignKey, Integer + +from nova.openstack.common import log as logging + + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + uuid_column = Column('instance_uuid', String(36)) + uuid_column.create(virtual_interfaces) + + try: + virtual_interfaces.update().values( + instance_uuid=select( + [instances.c.uuid], + instances.c.id == virtual_interfaces.c.instance_id) + ).execute() + except Exception: + uuid_column.drop() + raise + + fkeys = list(virtual_interfaces.c.instance_id.foreign_keys) + if fkeys: + try: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint( + columns=[virtual_interfaces.c.instance_id], + refcolumns=[instances.c.id], + name=fkey_name).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + virtual_interfaces.c.instance_id.drop() + + try: + ForeignKeyConstraint( + columns=[virtual_interfaces.c.instance_uuid], + refcolumns=[instances.c.uuid]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be created")) + raise + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + virtual_interfaces = Table('virtual_interfaces', meta, autoload=True) + instances = Table('instances', meta, autoload=True) + id_column = Column('instance_id', Integer, ForeignKey('instances.id')) + id_column.create(virtual_interfaces) + + fkeys = list(virtual_interfaces.c.instance_uuid.foreign_keys) + if fkeys: + try: + fkey_name = fkeys[0].constraint.name + ForeignKeyConstraint( + columns=[virtual_interfaces.c.instance_uuid], + refcolumns=[instances.c.uuid], + name=fkey_name).drop() + except Exception: + LOG.error(_("foreign key constraint couldn't be removed")) + raise + + try: + virtual_interfaces.update().values( + instance_id=select( + [instances.c.id], + instances.c.uuid == virtual_interfaces.c.instance_uuid) + ).execute() + except Exception: + id_column.drop() + raise + + virtual_interfaces.c.instance_uuid.drop() + + try: + ForeignKeyConstraint( + columns=[virtual_interfaces.c.instance_id], + refcolumns=[instances.c.id]).create() + except Exception: + LOG.error(_("foreign key constraint couldn't be created")) + raise diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 98e56cd09..7d4435a7a 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -703,7 +703,7 @@ class VirtualInterface(BASE, NovaBase): id = Column(Integer, primary_key=True) address = Column(String(255), unique=True) network_id = Column(Integer, nullable=False) - instance_id = Column(Integer, nullable=False) + instance_uuid = Column(String(36), nullable=False) uuid = Column(String(36)) |
