From ee086460db947ea0dcd2cb27fd2aecf738b47c20 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Wed, 26 Oct 2016 06:23:42 -0400 Subject: [PATCH] Make build_requests.instance MediumText The build_requests.instance column is a serialized instance object, and the instances.user_data column is MediumText, so the build_requests.instance column itself needs to be at least MediumText in size for MySQL. Conflicts: nova/tests/functional/db/api/test_migrations.py NOTE(mriedem): The conflict is due to not having the 026 API DB migration test in newton. Change-Id: I7d65df37c02750593037744543ad15e5bc64e913 Closes-Bug: #1635446 (cherry picked from commit fd7b3d64c70eeae34dcf38a847180c60fddfed5c) --- .../021_build_requests_instance_mediumtext.py | 24 +++++++++++++++++++ nova/db/sqlalchemy/api_models.py | 2 +- .../functional/db/api/test_migrations.py | 18 ++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 nova/db/sqlalchemy/api_migrations/migrate_repo/versions/021_build_requests_instance_mediumtext.py diff --git a/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/021_build_requests_instance_mediumtext.py b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/021_build_requests_instance_mediumtext.py new file mode 100644 index 00000000000..bee4aedd2ce --- /dev/null +++ b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/021_build_requests_instance_mediumtext.py @@ -0,0 +1,24 @@ +# 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 +from sqlalchemy import Table + +from nova.db.sqlalchemy import api_models + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + build_requests = Table('build_requests', meta, autoload=True) + build_requests.c.instance.alter(type=api_models.MediumText()) diff --git a/nova/db/sqlalchemy/api_models.py b/nova/db/sqlalchemy/api_models.py index d5dd7ecfce0..27a7842d14d 100644 --- a/nova/db/sqlalchemy/api_models.py +++ b/nova/db/sqlalchemy/api_models.py @@ -240,7 +240,7 @@ class BuildRequest(API_BASE): id = Column(Integer, primary_key=True) instance_uuid = Column(String(36)) project_id = Column(String(255), nullable=False) - instance = Column(Text) + instance = Column(MediumText()) block_device_mappings = Column(MediumText()) # TODO(alaski): Drop these from the db in Ocata # columns_to_drop = ['request_spec_id', 'user_id', 'display_name', diff --git a/nova/tests/functional/db/api/test_migrations.py b/nova/tests/functional/db/api/test_migrations.py index 968f1f2f42a..f8fac838c54 100644 --- a/nova/tests/functional/db/api/test_migrations.py +++ b/nova/tests/functional/db/api/test_migrations.py @@ -462,6 +462,24 @@ def _check_020(self, engine, data): build_requests.c.id == 2020).execute().first() self.assertEqual('fake_BDM', fake_build_req.block_device_mappings) + def _pre_upgrade_021(self, engine): + build_requests = db_utils.get_table(engine, 'build_requests') + fake_build_req = {'id': 2021, + 'project_id': 'fake_proj_id', + 'instance': '{"uuid": "foo", "name": "bar"}'} + build_requests.insert().execute(fake_build_req) + + def _check_021(self, engine, data): + build_requests = db_utils.get_table(engine, 'build_requests') + if engine.name == 'mysql': + self.assertIsInstance(build_requests.c.block_device_mappings.type, + sqlalchemy.dialects.mysql.MEDIUMTEXT) + + fake_build_req = build_requests.select( + build_requests.c.id == 2021).execute().first() + self.assertEqual('{"uuid": "foo", "name": "bar"}', + fake_build_req.instance) + class TestNovaAPIMigrationsWalkSQLite(NovaAPIMigrationsWalk, test_base.DbTestCase,