diff --git a/heat/db/sqlalchemy/migrate_repo/versions/038_software_config_json_config.py b/heat/db/sqlalchemy/migrate_repo/versions/038_software_config_json_config.py new file mode 100644 index 0000000000..07408b54b5 --- /dev/null +++ b/heat/db/sqlalchemy/migrate_repo/versions/038_software_config_json_config.py @@ -0,0 +1,34 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# 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 heat.db.sqlalchemy.types import LongText +from heat.db.sqlalchemy.types import Json + +import sqlalchemy + + +def upgrade(migrate_engine): + meta = sqlalchemy.MetaData(bind=migrate_engine) + software_config = sqlalchemy.Table('software_config', meta, autoload=True) + software_config.c.config.alter(type=Json) + software_config.c.io.drop() + + +def downgrade(migrate_engine): + meta = sqlalchemy.MetaData(bind=migrate_engine) + software_config = sqlalchemy.Table('software_config', meta, autoload=True) + software_config.c.config.alter(type=LongText) + + io = sqlalchemy.Column('io', Json) + io.create(software_config) diff --git a/heat/db/sqlalchemy/models.py b/heat/db/sqlalchemy/models.py index 100b5efd03..9273913cbf 100644 --- a/heat/db/sqlalchemy/models.py +++ b/heat/db/sqlalchemy/models.py @@ -26,7 +26,6 @@ from heat.openstack.common.db.sqlalchemy import models from heat.openstack.common.db.sqlalchemy import session from sqlalchemy.orm.session import Session from heat.db.sqlalchemy.types import Json -from heat.db.sqlalchemy.types import LongText BASE = declarative_base() get_session = session.get_session @@ -269,8 +268,7 @@ class SoftwareConfig(BASE, HeatBase): name = sqlalchemy.Column('name', sqlalchemy.String(255), nullable=True) group = sqlalchemy.Column('group', sqlalchemy.String(255)) - config = sqlalchemy.Column('config', LongText) - io = sqlalchemy.Column('io', Json) + config = sqlalchemy.Column('config', Json) tenant = sqlalchemy.Column( 'tenant', sqlalchemy.String(256), nullable=False) diff --git a/heat/engine/api.py b/heat/engine/api.py index 694dc37997..f36a919fa6 100644 --- a/heat/engine/api.py +++ b/heat/engine/api.py @@ -318,10 +318,10 @@ def format_software_config(sc): api.SOFTWARE_CONFIG_ID: sc.id, api.SOFTWARE_CONFIG_NAME: sc.name, api.SOFTWARE_CONFIG_GROUP: sc.group, - api.SOFTWARE_CONFIG_CONFIG: sc.config, - api.SOFTWARE_CONFIG_INPUTS: sc.io['inputs'], - api.SOFTWARE_CONFIG_OUTPUTS: sc.io['outputs'], - api.SOFTWARE_CONFIG_OPTIONS: sc.io['options'] + api.SOFTWARE_CONFIG_CONFIG: sc.config['config'], + api.SOFTWARE_CONFIG_INPUTS: sc.config['inputs'], + api.SOFTWARE_CONFIG_OUTPUTS: sc.config['outputs'], + api.SOFTWARE_CONFIG_OPTIONS: sc.config['options'] } return result diff --git a/heat/engine/service.py b/heat/engine/service.py index c8330349a8..efb8d674de 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -1080,14 +1080,15 @@ class EngineService(service.Service): @request_context def create_software_config(self, cnxt, group, name, config, inputs, outputs, options): + sc = db_api.software_config_create(cnxt, { 'group': group, 'name': name, - 'config': config, - 'io': { + 'config': { 'inputs': inputs, 'outputs': outputs, - 'options': options + 'options': options, + 'config': config }, 'tenant': cnxt.tenant_id}) return api.format_software_config(sc) diff --git a/heat/tests/db/test_migrations.py b/heat/tests/db/test_migrations.py index 24bfaa3a21..16f7ba38a3 100644 --- a/heat/tests/db/test_migrations.py +++ b/heat/tests/db/test_migrations.py @@ -234,3 +234,6 @@ class TestHeatMigrations(test_migrations.BaseMigrationTestCase, def _check_036(self, engine, data): self.assertColumnExists(engine, 'stack', 'stack_user_project_id') + + def _check_038(self, engine, data): + self.assertColumnNotExists(engine, 'software_config', 'io') diff --git a/heat/tests/test_engine_api_utils.py b/heat/tests/test_engine_api_utils.py index 4f16d6b112..39e121caeb 100644 --- a/heat/tests/test_engine_api_utils.py +++ b/heat/tests/test_engine_api_utils.py @@ -761,12 +761,12 @@ class FormatSoftwareConfigDeploymentTest(HeatTestCase): config = mock.Mock() config.name = 'config_mysql' config.group = 'Heat::Shell' - config.config = '#!/bin/bash\n' config.id = str(uuid.uuid4()) - config.io = { + config.config = { 'inputs': [{'name': 'bar'}], 'outputs': [{'name': 'result'}], - 'options': {} + 'options': {}, + 'config': '#!/bin/bash\n' } return config diff --git a/heat/tests/test_sqlalchemy_api.py b/heat/tests/test_sqlalchemy_api.py index 55099e12cf..b777c12093 100644 --- a/heat/tests/test_sqlalchemy_api.py +++ b/heat/tests/test_sqlalchemy_api.py @@ -622,16 +622,19 @@ class SqlAlchemyTest(HeatTestCase): db_api.software_config_get, self.ctx, str(uuid.uuid4())) - io = {'inputs': [{'name': 'foo'}, {'name': 'bar'}], - 'outputs': [{'name': 'result'}]} - tenant_id = self.ctx.tenant_id conf = ('#!/bin/bash\n' 'echo "$bar and $foo"\n') + config = { + 'inputs': [{'name': 'foo'}, {'name': 'bar'}], + 'outputs': [{'name': 'result'}], + 'config': conf, + 'options': {} + } + tenant_id = self.ctx.tenant_id values = {'name': 'config_mysql', 'tenant': tenant_id, 'group': 'Heat::Shell', - 'config': conf, - 'io': io} + 'config': config} config = db_api.software_config_create( self.ctx, values) config_id = config.id @@ -640,8 +643,7 @@ class SqlAlchemyTest(HeatTestCase): self.assertEqual('config_mysql', config.name) self.assertEqual(tenant_id, config.tenant) self.assertEqual('Heat::Shell', config.group) - self.assertEqual(conf, config.config) - self.assertEqual(io, config.io) + self.assertEqual(conf, config.config['config']) self.ctx.tenant_id = None self.assertRaises( exception.NotFound,