summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorMichael Still <mikal@stillhq.com>2012-06-07 11:16:23 +1000
committerMichael Still <mikal@stillhq.com>2012-06-07 15:26:03 +1000
commitfe5706cb973e1cddecdeed9580fc9d9bbdc848fd (patch)
tree688ad9fa7cb5817fc5b66385a408eb54dfcc91f6 /nova/db
parent7b7febb02b37420c759eab59b07c7e3e2de9bab1 (diff)
downloadnova-fe5706cb973e1cddecdeed9580fc9d9bbdc848fd.tar.gz
nova-fe5706cb973e1cddecdeed9580fc9d9bbdc848fd.tar.xz
nova-fe5706cb973e1cddecdeed9580fc9d9bbdc848fd.zip
Convert consoles to use instance uuid.
Continued work on blueprint finish-uuid-conversion. Change-Id: I4032419d66e9bbb17b770d8974a92a136bf9c5d2
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/api.py12
-rw-r--r--nova/db/sqlalchemy/api.py20
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/102_consoles_uses_uuid.py80
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_downgrade.sql72
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_upgrade.sql72
-rw-r--r--nova/db/sqlalchemy/models.py2
6 files changed, 241 insertions, 17 deletions
diff --git a/nova/db/api.py b/nova/db/api.py
index 93f2b060b..a5adfbc75 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -1505,19 +1505,19 @@ def console_delete(context, console_id):
return IMPL.console_delete(context, console_id)
-def console_get_by_pool_instance(context, pool_id, instance_id):
+def console_get_by_pool_instance(context, pool_id, instance_uuid):
"""Get console entry for a given instance and pool."""
- return IMPL.console_get_by_pool_instance(context, pool_id, instance_id)
+ return IMPL.console_get_by_pool_instance(context, pool_id, instance_uuid)
-def console_get_all_by_instance(context, instance_id):
+def console_get_all_by_instance(context, instance_uuid):
"""Get consoles for a given instance."""
- return IMPL.console_get_all_by_instance(context, instance_id)
+ return IMPL.console_get_all_by_instance(context, instance_uuid)
-def console_get(context, console_id, instance_id=None):
+def console_get(context, console_id, instance_uuid=None):
"""Get a specific console (possibly on a given instance)."""
- return IMPL.console_get(context, console_id, instance_id)
+ return IMPL.console_get(context, console_id, instance_uuid)
##################
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index f7a6b59a6..ec6606908 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -3894,40 +3894,40 @@ def console_delete(context, console_id):
delete()
-def console_get_by_pool_instance(context, pool_id, instance_id):
+def console_get_by_pool_instance(context, pool_id, instance_uuid):
result = model_query(context, models.Console, read_deleted="yes").\
filter_by(pool_id=pool_id).\
- filter_by(instance_id=instance_id).\
+ filter_by(instance_uuid=instance_uuid).\
options(joinedload('pool')).\
first()
if not result:
raise exception.ConsoleNotFoundInPoolForInstance(
- pool_id=pool_id, instance_id=instance_id)
+ pool_id=pool_id, instance_uuid=instance_uuid)
return result
-def console_get_all_by_instance(context, instance_id):
+def console_get_all_by_instance(context, instance_uuid):
return model_query(context, models.Console, read_deleted="yes").\
- filter_by(instance_id=instance_id).\
+ filter_by(instance_uuid=instance_uuid).\
all()
-def console_get(context, console_id, instance_id=None):
+def console_get(context, console_id, instance_uuid=None):
query = model_query(context, models.Console, read_deleted="yes").\
filter_by(id=console_id).\
options(joinedload('pool'))
- if instance_id is not None:
- query = query.filter_by(instance_id=instance_id)
+ if instance_uuid is not None:
+ query = query.filter_by(instance_uuid=instance_uuid)
result = query.first()
if not result:
- if instance_id:
+ if instance_uuid:
raise exception.ConsoleNotFoundForInstance(
- console_id=console_id, instance_id=instance_id)
+ console_id=console_id, instance_uuid=instance_uuid)
else:
raise exception.ConsoleNotFound(console_id=console_id)
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/102_consoles_uses_uuid.py b/nova/db/sqlalchemy/migrate_repo/versions/102_consoles_uses_uuid.py
new file mode 100644
index 000000000..1f0989c8f
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/102_consoles_uses_uuid.py
@@ -0,0 +1,80 @@
+# 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 sqlalchemy import select, Column, ForeignKey, Integer
+from sqlalchemy import MetaData, String, Table
+from migrate import ForeignKeyConstraint
+
+from nova import log as logging
+
+
+LOG = logging.getLogger(__name__)
+
+
+def upgrade(migrate_engine):
+ meta = MetaData()
+ meta.bind = migrate_engine
+ consoles = Table('consoles', meta, autoload=True)
+ instances = Table('instances', meta, autoload=True)
+ uuid_column = Column('instance_uuid', String(36))
+ uuid_column.create(consoles)
+
+ try:
+ consoles.update().values(
+ instance_uuid=select(
+ [instances.c.uuid],
+ instances.c.id == consoles.c.instance_id)
+ ).execute()
+ except Exception:
+ uuid_column.drop()
+ raise
+
+ fkeys = list(consoles.c.instance_id.foreign_keys)
+ if fkeys:
+ try:
+ fkey_name = fkeys[0].constraint.name
+ ForeignKeyConstraint(
+ columns=[consoles.c.instance_id],
+ refcolumns=[instances.c.id],
+ name=fkey_name).drop()
+ except Exception:
+ LOG.error(_("foreign key constraint couldn't be removed"))
+ raise
+
+ consoles.c.instance_id.drop()
+
+
+def downgrade(migrate_engine):
+ meta = MetaData()
+ meta.bind = migrate_engine
+ consoles = Table('consoles', meta, autoload=True)
+ instances = Table('instances', meta, autoload=True)
+ id_column = Column('instance_id', Integer, ForeignKey('instances.id'))
+ id_column.create(consoles)
+
+ try:
+ consoles.update().values(
+ instance_id=select(
+ [instances.c.id],
+ instances.c.uuid == consoles.c.instance_uuid)
+ ).execute()
+ except Exception:
+ id_column.drop()
+ raise
+
+ consoles.c.instance_uuid.drop()
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_downgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_downgrade.sql
new file mode 100644
index 000000000..8a0b4938e
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_downgrade.sql
@@ -0,0 +1,72 @@
+BEGIN TRANSACTION;
+ CREATE TEMPORARY TABLE consoles_backup (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted BOOLEAN,
+ id INTEGER NOT NULL,
+ instance_name VARCHAR(255),
+ instance_id INTEGER NOT NULL,
+ instance_uuid VARCHAR(36),
+ password VARCHAR(255),
+ port INTEGER,
+ pool_id INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ INSERT INTO consoles_backup
+ SELECT created_at,
+ updated_at,
+ deleted_at,
+ deleted,
+ id,
+ instance_name,
+ NULL,
+ instance_uuid,
+ password,
+ port,
+ pool_id
+ FROM consoles;
+
+ UPDATE consoles_backup
+ SET instance_uuid=
+ (SELECT id
+ FROM instances
+ WHERE consoles_backup.instance_uuid = instances.uuid
+ );
+
+ DROP TABLE consoles;
+
+ CREATE TABLE consoles (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted BOOLEAN,
+ id INTEGER NOT NULL,
+ instance_name VARCHAR(255),
+ instance_id INTEGER NOT NULL,
+ password VARCHAR(255),
+ port INTEGER,
+ pool_id INTEGER,
+ PRIMARY KEY (id),
+ FOREIGN KEY(instance_id) REFERENCES instances (id)
+ );
+
+ CREATE INDEX consoles_pool_id ON consoles(pool_id);
+
+ INSERT INTO consoles
+ SELECT created_at,
+ updated_at,
+ deleted_at,
+ deleted,
+ id,
+ instance_name,
+ instance_id,
+ password,
+ port,
+ pool_id
+ FROM consoles_backup;
+
+ DROP TABLE consoles_backup;
+
+COMMIT; \ No newline at end of file
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_upgrade.sql b/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_upgrade.sql
new file mode 100644
index 000000000..3e2db86a9
--- /dev/null
+++ b/nova/db/sqlalchemy/migrate_repo/versions/102_sqlite_upgrade.sql
@@ -0,0 +1,72 @@
+BEGIN TRANSACTION;
+ CREATE TEMPORARY TABLE consoles_backup (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted BOOLEAN,
+ id INTEGER NOT NULL,
+ instance_name VARCHAR(255),
+ instance_id INTEGER NOT NULL,
+ instance_uuid VARCHAR(36),
+ password VARCHAR(255),
+ port INTEGER,
+ pool_id INTEGER,
+ PRIMARY KEY (id)
+ );
+
+ INSERT INTO consoles_backup
+ SELECT created_at,
+ updated_at,
+ deleted_at,
+ deleted,
+ id,
+ instance_name,
+ instance_id,
+ NULL,
+ password,
+ port,
+ pool_id
+ FROM consoles;
+
+ UPDATE consoles_backup
+ SET instance_uuid=
+ (SELECT uuid
+ FROM instances
+ WHERE consoles_backup.instance_id = instances.id
+ );
+
+ DROP TABLE consoles;
+
+ CREATE TABLE consoles (
+ created_at DATETIME,
+ updated_at DATETIME,
+ deleted_at DATETIME,
+ deleted BOOLEAN,
+ id INTEGER NOT NULL,
+ instance_name VARCHAR(255),
+ instance_uuid VARCHAR(36),
+ password VARCHAR(255),
+ port INTEGER,
+ pool_id INTEGER,
+ PRIMARY KEY (id),
+ FOREIGN KEY(instance_uuid) REFERENCES instances (uuid)
+ );
+
+ CREATE INDEX consoles_pool_id ON consoles(pool_id);
+
+ INSERT INTO consoles
+ SELECT created_at,
+ updated_at,
+ deleted_at,
+ deleted,
+ id,
+ instance_name,
+ instance_uuid,
+ password,
+ port,
+ pool_id
+ FROM consoles_backup;
+
+ DROP TABLE consoles_backup;
+
+COMMIT;
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index 2576b237c..0a3f07b9a 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -846,7 +846,7 @@ class Console(BASE, NovaBase):
__tablename__ = 'consoles'
id = Column(Integer, primary_key=True)
instance_name = Column(String(255))
- instance_id = Column(Integer)
+ instance_uuid = Column(String(36))
password = Column(String(255))
port = Column(Integer, nullable=True)
pool_id = Column(Integer, ForeignKey('console_pools.id'))