diff --git a/murano/db/cfapi_migration/__init__.py b/murano/db/cfapi_migration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/murano/db/cfapi_migration/alembic.ini b/murano/db/cfapi_migration/alembic.ini new file mode 100644 index 00000000..886c8088 --- /dev/null +++ b/murano/db/cfapi_migration/alembic.ini @@ -0,0 +1,54 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = murano/db/cfapi_migration/alembic_migrations + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +sqlalchemy.url = + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/murano/db/cfapi_migration/alembic_migrations/env.py b/murano/db/cfapi_migration/alembic_migrations/env.py new file mode 100644 index 00000000..f98fda02 --- /dev/null +++ b/murano/db/cfapi_migration/alembic_migrations/env.py @@ -0,0 +1,48 @@ +# 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 alembic import context +from sqlalchemy import create_engine, pool + +from murano.db import cfapi_models as models + + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config +murano_config = config.murano_config + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +target_metadata = models.Base.metadata + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + engine = create_engine( + murano_config.database.connection, + poolclass=pool.NullPool) + + with engine.connect() as connection: + context.configure(connection=connection, + target_metadata=target_metadata) + with context.begin_transaction(): + context.run_migrations() + + +run_migrations_online() diff --git a/murano/db/cfapi_migration/alembic_migrations/script.py.mako b/murano/db/cfapi_migration/alembic_migrations/script.py.mako new file mode 100644 index 00000000..4a23e952 --- /dev/null +++ b/murano/db/cfapi_migration/alembic_migrations/script.py.mako @@ -0,0 +1,37 @@ +# Copyright ${create_date.year} OpenStack Foundation. +# +# 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. + +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision} +Create Date: ${create_date} + +""" + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} \ No newline at end of file diff --git a/murano/db/cfapi_migration/alembic_migrations/versions/001_initial_version.py b/murano/db/cfapi_migration/alembic_migrations/versions/001_initial_version.py new file mode 100644 index 00000000..8b4664a2 --- /dev/null +++ b/murano/db/cfapi_migration/alembic_migrations/versions/001_initial_version.py @@ -0,0 +1,67 @@ +# 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. + +""" +Revision ID: 001 +Revises: None +Create Date: 2016-03-30 16:34:33.698760 + +""" + +# revision identifiers, used by Alembic. +revision = '001' +down_revision = None + +from alembic import op +import sqlalchemy as sa + + +MYSQL_ENGINE = 'InnoDB' +MYSQL_CHARSET = 'utf8' + + +def upgrade(): + op.create_table( + 'cf_orgs', + sa.Column('id', sa.String(length=255), nullable=False), + sa.Column('tenant', sa.String(length=255), nullable=False), + sa.UniqueConstraint('tenant'), + sa.PrimaryKeyConstraint('id'), + mysql_engine=MYSQL_ENGINE, + mysql_charset=MYSQL_CHARSET) + + op.create_table( + 'cf_spaces', + sa.Column('id', sa.String(length=255), nullable=False), + sa.Column('environment_id', sa.String(length=255), nullable=False), + sa.UniqueConstraint('environment_id'), + sa.PrimaryKeyConstraint('id'), + mysql_engine=MYSQL_ENGINE, + mysql_charset=MYSQL_CHARSET) + + op.create_table( + 'cf_serv_inst', + sa.Column('id', sa.String(length=255), primary_key=True), + sa.Column('service_id', sa.String(255), nullable=False), + sa.Column('environment_id', sa.String(255), nullable=False), + sa.Column('tenant', sa.String(255), nullable=False), + mysql_engine=MYSQL_ENGINE, + mysql_charset=MYSQL_CHARSET) + # end Alembic commands # + + +def downgrade(): + op.drop_table('cf_orgs') + op.drop_table('cf_spaces') + op.drop_table('cf_serv_inst') + # end Alembic commands # diff --git a/murano/db/cfapi_migration/migration.py b/murano/db/cfapi_migration/migration.py new file mode 100644 index 00000000..8f03ce56 --- /dev/null +++ b/murano/db/cfapi_migration/migration.py @@ -0,0 +1,86 @@ +# 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. + +import os + +import alembic +from alembic import config as alembic_config +from alembic import migration as alembic_migration + +from murano.db import session as db_session + + +def get_alembic_config(): + path = os.path.join(os.path.dirname(__file__), 'alembic.ini') + + config = alembic_config.Config(path) + config.set_main_option('script_location', + 'murano.db.cfapi_migration:alembic_migrations') + return config + + +def version(engine=None): + """Returns current database version.""" + engine = engine or db_session.get_engine() + with engine.connect() as conn: + context = alembic_migration.MigrationContext.configure(conn) + return context.get_current_revision() + + +def upgrade(revision, config=None): + """Used for upgrading database. + + :param version: Desired database version + :type version: string + """ + revision = revision or 'head' + config = config or get_alembic_config() + + alembic.command.upgrade(config, revision or 'head') + + +def downgrade(revision, config=None): + """Used for downgrading database. + + :param version: Desired database version7 + :type version: string + """ + revision = revision or 'base' + config = config or get_alembic_config() + return alembic.command.downgrade(config, revision) + + +def stamp(revision, config=None): + """Stamps database with provided revision. + + Don't run any migrations. + + :param revision: Should match one from repository or head - to stamp + database with most recent revision + :type revision: string + """ + config = config or get_alembic_config() + return alembic.command.stamp(config, revision=revision) + + +def revision(message=None, autogenerate=False, config=None): + """Creates template for migration. + + :param message: Text that will be used for migration title + :type message: string + :param autogenerate: If True - generates diff based on current database + state + :type autogenerate: bool + """ + config = config or get_alembic_config() + return alembic.command.revision(config, message=message, + autogenerate=autogenerate) diff --git a/murano/db/cfapi_models.py b/murano/db/cfapi_models.py new file mode 100644 index 00000000..04c7fcb7 --- /dev/null +++ b/murano/db/cfapi_models.py @@ -0,0 +1,61 @@ +# 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. + +""" +SQLAlchemy models for service broker data +""" +from oslo_db.sqlalchemy import models +import sqlalchemy as sa +from sqlalchemy.ext import declarative + + +class _ServiceBrokerBase(models.ModelBase): + pass + + +Base = declarative.declarative_base(cls=_ServiceBrokerBase) + + +class CFOrganization(Base): + __tablename__ = "cf_orgs" + id = sa.Column(sa.String(255), primary_key=True) + tenant = sa.Column(sa.String(255), nullable=False) + + +class CFSpace(Base): + __tablename__ = "cf_spaces" + + id = sa.Column(sa.String(255), primary_key=True) + environment_id = sa.Column(sa.String(255), nullable=False) + + +class CFServiceInstance(Base): + __tablename__ = 'cf_serv_inst' + + id = sa.Column(sa.String(255), primary_key=True) + service_id = sa.Column(sa.String(255), nullable=False) + environment_id = sa.Column(sa.String(255), nullable=False) + tenant = sa.Column(sa.String(255), nullable=False) + + +def register_models(engine): + """Creates database tables for all models with the given engine.""" + models = (CFSpace, CFOrganization, CFServiceInstance) + for model in models: + model.metadata.create_all(engine) + + +def unregister_models(engine): + """Drops database tables for all models with the given engine.""" + models = (CFOrganization, CFSpace, CFServiceInstance) + for model in models: + model.metadata.drop_all(engine)