From 51a60d3084d0f736fef6dc3b42e4001c62dfdbd1 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Wed, 4 May 2016 11:03:47 -0700 Subject: [PATCH] Add keypairs to instance_extra This adds a keypairs deferred-load column to instance_extra where we can store the keypairs for a given instance instead of referring to them by name. This is needed for the cell/api split. Related to blueprint cells-keypairs-api-db Change-Id: I5a3bf86e2fba21feacf6b59f6a96a0927f044e66 --- .../versions/332_keypair_in_extra.py | 28 +++++++++++++++++++ nova/db/sqlalchemy/models.py | 1 + nova/tests/unit/db/test_migrations.py | 3 ++ 3 files changed, 32 insertions(+) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/332_keypair_in_extra.py diff --git a/nova/db/sqlalchemy/migrate_repo/versions/332_keypair_in_extra.py b/nova/db/sqlalchemy/migrate_repo/versions/332_keypair_in_extra.py new file mode 100644 index 000000000000..c7fc08d90885 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/332_keypair_in_extra.py @@ -0,0 +1,28 @@ +# 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 Column +from sqlalchemy import MetaData +from sqlalchemy import Table +from sqlalchemy import Text + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + for prefix in ('', 'shadow_'): + table = Table(prefix + 'instance_extra', meta, autoload=True) + new_column = Column('keypairs', Text, nullable=True) + if not hasattr(table.c, 'keypairs'): + table.create_column(new_column) diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index bce606ada70b..cf8d7b7da662 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -376,6 +376,7 @@ class InstanceExtra(BASE, NovaBase, models.SoftDeleteMixin): flavor = orm.deferred(Column(Text)) vcpu_model = orm.deferred(Column(Text)) migration_context = orm.deferred(Column(Text)) + keypairs = orm.deferred(Column(Text)) instance = orm.relationship(Instance, backref=orm.backref('extra', uselist=False), diff --git a/nova/tests/unit/db/test_migrations.py b/nova/tests/unit/db/test_migrations.py index 4b323682d009..eccc48f265e8 100644 --- a/nova/tests/unit/db/test_migrations.py +++ b/nova/tests/unit/db/test_migrations.py @@ -895,6 +895,9 @@ class NovaMigrationsCheckers(test_migrations.ModelsMigrationsSync, self.assertColumnExists(engine, 'virtual_interfaces', 'tag') self.assertColumnExists(engine, 'block_device_mapping', 'tag') + def _check_332(self, engine, data): + self.assertColumnExists(engine, 'instance_extra', 'keypairs') + class TestNovaMigrationsSQLite(NovaMigrationsCheckers, test_base.DbTestCase,