summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorMichael Still <mikal@stillhq.com>2012-07-27 11:43:37 +1000
committerMichael Still <mikal@stillhq.com>2012-07-31 08:21:14 +1000
commit0d9d2487e2ca921ab54b1ecbe359c32ce8fb0c48 (patch)
treead2f2c94c5f8b4a0b9ecf69445df3b080a712378 /nova/db
parentd56b5fc3ad6dbfc56e0729174925fb146cef87fa (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.py22
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_downgrade.sql71
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/114_sqlite_upgrade.sql71
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/114_vifs_uses_uuid.py108
-rw-r--r--nova/db/sqlalchemy/models.py2
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))