Esempio n. 1
0
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    # Load the TSIG Keys tables
    tsigkeys_table = Table('tsigkeys', meta, autoload=True)

    scopes = Enum(name='tsig_scopes', metadata=meta, *TSIG_SCOPES)
    scopes.create()

    # Create the scope and resource columns
    scope_col = Column('scope', scopes, nullable=False, server_default='POOL')
    scope_col.create(tsigkeys_table)

    # Start with nullable=True and populate_default=True, then convert
    # to nullable=False once all rows have been populted with a resource_id
    resource_id_col = Column('resource_id', UUID, default=default_pool_id,
                             nullable=True)
    resource_id_col.create(tsigkeys_table, populate_default=True)

    # Now that we've populated the default pool id in existing rows, MySQL
    # will let us convert this over to nullable=False
    tsigkeys_table.c.resource_id.alter(nullable=False)

    dialect = migrate_engine.url.get_dialect().name
    if dialect.startswith('sqlite'):
        # Add missing unique index
        constraint = UniqueConstraint('name', name='unique_tsigkey_name',
                                      table=tsigkeys_table)
        constraint.create()
def _add_visibility_column(meta):
    enum = Enum('private', 'public', 'shared', 'community', metadata=meta,
                name='image_visibility')
    enum.create()
    v_col = Column('visibility', enum, nullable=True, server_default=None)
    op.add_column('images', v_col)
    op.create_index('visibility_image_idx', 'images', ['visibility'])
Esempio n. 3
0
def replace_enum(
    table_name: str,
    column_name: str,
    from_enum: sa.Enum,
    to_enum: sa.Enum,
    default_value: typing.Any,
) -> None:
    if op.get_context().dialect.name == "postgresql":
        op.execute("ALTER TYPE {} RENAME TO {}_old".format(
            from_enum.name, from_enum.name))
        op.execute("ALTER TABLE {} alter {} drop default".format(
            table_name, column_name))
        to_enum.create(op.get_bind(), checkfirst=False)
        with op.batch_alter_table(table_name) as batch_op:
            batch_op.alter_column(
                column_name,
                type_=to_enum,
                postgresql_using="{}::text::{}".format(column_name,
                                                       to_enum.name),
                server_default=default_value,
            )
        op.execute("DROP TYPE {}_old".format(from_enum.name))
    else:
        to_enum.create(op.get_bind(), checkfirst=False)
        with op.batch_alter_table(table_name) as batch_op:
            batch_op.alter_column(column_name, type_=to_enum)
def upgrade():
    enum_roles = Enum("SALES", "ACCOUNTS", name='role_types')
    enum_roles.create(op.get_bind(), checkfirst=False)

    op.create_table('contact_roles',
                    Column('id', Integer, primary_key=True),
                    Column('role', enum_roles)
                    )

    enum_phones = Enum("OFFICE", "MOBILE", "OTHER", name='phone_types')
    enum_phones.create(op.get_bind(), checkfirst=False)

    op.create_table('contact_phones',
                    Column('id', Integer, primary_key=True,),
                    Column('contact_id', Integer, ForeignKey('contact.id')),
                    Column('type', enum_phones),
                    Column('number', String)
                    )

    op.create_table('contact_roles_association',
                    Column('contact_id', Integer, ForeignKey('contact.id')),
                    Column('contact_roles_id', Integer, ForeignKey('contact_roles.id'))
                    )

    op.create_table('contact',
                    Column('id', Integer, primary_key=True),
                    Column('customer_id', Integer, ForeignKey('customer.id')),
                    Column('firstname', String),
                    Column('lastname', String),
                    Column('email', String),
                    )
Esempio n. 5
0
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    # Load the TSIG Keys tables
    tsigkeys_table = Table('tsigkeys', meta, autoload=True)

    scopes = Enum(name='tsig_scopes', metadata=meta, *TSIG_SCOPES)
    scopes.create()

    # Create the scope and resource columns
    scope_col = Column('scope', scopes, nullable=False, server_default='POOL')
    scope_col.create(tsigkeys_table)

    # Start with nullable=True and populate_default=True, then convert
    # to nullable=False once all rows have been populted with a resource_id
    resource_id_col = Column('resource_id', UUID, default=default_pool_id,
                             nullable=True)
    resource_id_col.create(tsigkeys_table, populate_default=True)

    # Now that we've populated the default pool id in existing rows, MySQL
    # will let us convert this over to nullable=False
    tsigkeys_table.c.resource_id.alter(nullable=False)

    dialect = migrate_engine.url.get_dialect().name
    if dialect.startswith('sqlite'):
        # Add missing unique index
        constraint = UniqueConstraint('name', name='unique_tsigkey_name',
                                      table=tsigkeys_table)
        constraint.create()
Esempio n. 6
0
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    domains_table = Table('domains', meta, autoload=True)
    records_table = Table('records', meta, autoload=True)

    # Add a domain & record creation status for async backends
    domain_statuses = Enum(name='domain_statuses',
                           metadata=meta,
                           *RESOURCE_STATUSES)
    domain_statuses.create()

    record_statuses = Enum(name='record_statuses',
                           metadata=meta,
                           *RESOURCE_STATUSES)
    record_statuses.create()

    domain_status = Column('status',
                           domain_statuses,
                           nullable=False,
                           server_default='ACTIVE',
                           default='ACTIVE')

    record_status = Column('status',
                           record_statuses,
                           nullable=False,
                           server_default='ACTIVE',
                           default='ACTIVE')

    domain_status.create(domains_table, populate_default=True)
    record_status.create(records_table, populate_default=True)
Esempio n. 7
0
def _add_visibility_column(meta):
    enum = Enum('private', 'public', 'shared', 'community', metadata=meta,
                name='image_visibility')
    enum.create()
    v_col = Column('visibility', enum, nullable=True, server_default=None)
    op.add_column('images', v_col)
    op.create_index('visibility_image_idx', 'images', ['visibility'])
Esempio n. 8
0
def upgrade():
    enum_roles = Enum("SALES", "ACCOUNTS", name='role_types')
    enum_roles.create(op.get_bind(), checkfirst=False)

    op.create_table('contact_roles', Column('id', Integer, primary_key=True),
                    Column('role', enum_roles))

    enum_phones = Enum("OFFICE", "MOBILE", "OTHER", name='phone_types')
    enum_phones.create(op.get_bind(), checkfirst=False)

    op.create_table('contact_phones', Column(
        'id',
        Integer,
        primary_key=True,
    ), Column('contact_id', Integer, ForeignKey('contact.id')),
                    Column('type', enum_phones), Column('number', String))

    op.create_table(
        'contact_roles_association',
        Column('contact_id', Integer, ForeignKey('contact.id')),
        Column('contact_roles_id', Integer, ForeignKey('contact_roles.id')))

    op.create_table(
        'contact',
        Column('id', Integer, primary_key=True),
        Column('customer_id', Integer, ForeignKey('customer.id')),
        Column('firstname', String),
        Column('lastname', String),
        Column('email', String),
    )
Esempio n. 9
0
def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)

    images = Table('images', meta, autoload=True)

    enum = Enum('private', 'public', 'shared', 'community', metadata=meta,
                name='image_visibility')
    enum.create()

    images.create_column(Column('visibility', enum, nullable=False,
                                server_default='shared'))
    visibility_index = Index('visibility_image_idx', images.c.visibility)
    visibility_index.create(migrate_engine)

    images.update(values={'visibility': 'public'}).where(
        images.c.is_public).execute()

    image_members = Table('image_members', meta, autoload=True)

    # NOTE(dharinic): Mark all the non-public images as 'private' first
    images.update().values(visibility='private').where(
        not_(images.c.is_public)).execute()
    # NOTE(dharinic): Identify 'shared' images from the above
    images.update().values(visibility='shared').where(and_(
        images.c.visibility == 'private', images.c.id.in_(select(
            [image_members.c.image_id]).distinct().where(
                not_(image_members.c.deleted))))).execute()

    insp = reflection.Inspector.from_engine(migrate_engine)
    for index in insp.get_indexes('images'):
        if 'ix_images_is_public' == index['name']:
            Index('ix_images_is_public', images.c.is_public).drop()
            break

    images.c.is_public.drop()
Esempio n. 10
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    # Enhance the services enum to include ceph
    service_parameter = Table('service_parameter',
                              meta,
                              Column('id',
                                     Integer,
                                     primary_key=True,
                                     nullable=False),
                              mysql_engine=ENGINE,
                              mysql_charset=CHARSET,
                              autoload=True)

    if migrate_engine.url.get_dialect() is postgresql.dialect:
        old_serviceEnum = Enum('identity', 'horizon', name='serviceEnum')

        serviceEnum = Enum('identity', 'horizon', 'ceph', name='serviceEnum')

        service_col = service_parameter.c.service
        service_col.alter(Column('service', String(60)))
        old_serviceEnum.drop(bind=migrate_engine, checkfirst=False)
        serviceEnum.create(bind=migrate_engine, checkfirst=False)
        migrate_engine.execute(
            'ALTER TABLE service_parameter ALTER COLUMN service TYPE "serviceEnum" '
            'USING service::text::"serviceEnum"')
Esempio n. 11
0
def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    migrations = Table('migrations', meta, autoload=True)
    shadow_migrations = Table('shadow_migrations', meta, autoload=True)

    enum = Enum('migration',
                'resize',
                'live-migration',
                'evacuation',
                metadata=meta,
                name='migration_type')
    enum.create()

    migration_type = Column('migration_type', enum, nullable=True)

    if not hasattr(migrations.c, 'migration_type'):
        migrations.create_column(migration_type)
    if not hasattr(shadow_migrations.c, 'migration_type'):
        shadow_migrations.create_column(migration_type.copy())

    hidden = Column('hidden', Boolean, default=False)
    if not hasattr(migrations.c, 'hidden'):
        migrations.create_column(hidden)
    if not hasattr(shadow_migrations.c, 'hidden'):
        shadow_migrations.create_column(hidden.copy())
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    enum = Enum('ssh', 'x509', metadata=meta, name='keypair_types')
    enum.create(checkfirst=True)

    keypairs = Table('key_pairs',
                     meta,
                     Column('created_at', DateTime),
                     Column('updated_at', DateTime),
                     Column('id', Integer, primary_key=True, nullable=False),
                     Column('name', String(255), nullable=False),
                     Column('user_id', String(255), nullable=False),
                     Column('fingerprint', String(255)),
                     Column('public_key', Text()),
                     Column('type',
                            enum,
                            nullable=False,
                            server_default=keypair.KEYPAIR_TYPE_SSH),
                     UniqueConstraint('user_id',
                                      'name',
                                      name="uniq_key_pairs0user_id0name"),
                     mysql_engine='InnoDB',
                     mysql_charset='utf8')
    keypairs.create(checkfirst=True)
Esempio n. 13
0
def add_municipality_domain(context):
    # Rename the columns
    renames = (
        ('elections', 'total_municipalities', 'total_entities'),
        ('elections', 'counted_municipalities', 'counted_entities'),
        ('election_results', 'municipality_id', 'entity_id'),
        ('ballot_results', 'municipality_id', 'entity_id'),
    )

    for table, old, new in renames:
        if context.has_column(table, old):
            context.operations.alter_column(table, old, new_column_name=new)

    # Add the new domain, see http://stackoverflow.com/a/14845740
    table_names = []
    inspector = Inspector(context.operations_connection)
    if 'elections' in inspector.get_table_names(context.schema):
        table_names.append('elections')
    if 'election_compounds' in inspector.get_table_names(context.schema):
        table_names.append('election_compounds')
    if 'votes' in inspector.get_table_names(context.schema):
        table_names.append('votes')
    if 'archived_results' in inspector.get_table_names(context.schema):
        table_names.append('archived_results')

    old_type = Enum('federation', 'canton', name='domain_of_influence')
    new_type = Enum('federation', 'canton', 'municipality',
                    name='domain_of_influence')
    tmp_type = Enum('federation', 'canton', 'municipality',
                    name='_domain_of_influence')

    tmp_type.create(context.operations.get_bind(), checkfirst=False)

    for table_name in table_names:
        context.operations.execute(
            (
                'ALTER TABLE {} ALTER COLUMN domain TYPE _domain_of_influence '
                'USING domain::text::_domain_of_influence'
            ).format(table_name)
        )

    old_type.drop(context.operations.get_bind(), checkfirst=False)

    new_type.create(context.operations.get_bind(), checkfirst=False)

    for table_name in table_names:
        context.operations.execute(
            (
                'ALTER TABLE {} ALTER COLUMN domain TYPE domain_of_influence '
                'USING domain::text::domain_of_influence'
            ).format(table_name)
        )

    tmp_type.drop(context.operations.get_bind(), checkfirst=False)
Esempio n. 14
0
def upgrade():
    enum_types = Enum("BILLING", "SHIPPING", name='address_types')
    enum_types.create(op.get_bind(), checkfirst=False)

    op.create_table('address',
                    Column('id', Integer, primary_key=True),
                    Column('customer_id', Integer, ForeignKey('customer.id')),
                    Column('type', enum_types),
                    Column('line1', String),
                    Column('line2', String),
                    Column('suburb', String),
                    Column('postcode', String),
                    Column('state', String),
                    Column('country', String)
                    )
Esempio n. 15
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine
    for table_name in ['instances', 'shadow_instances']:
        enum = Enum('owner', 'admin', name='%s0locked_by' % table_name)
        if migrate_engine.url.get_dialect() is postgresql.dialect:
            # Need to explicitly create Postgres enums during migrations
            enum.create(migrate_engine, checkfirst=False)

        instances = Table(table_name, meta, autoload=True)
        locked_by = Column('locked_by', enum)
        instances.create_column(locked_by)
        instances.update().\
            where(instances.c.locked == True).\
            values(locked_by='admin').execute()
Esempio n. 16
0
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    keys = Enum(name='key', *ZONE_ATTRIBUTE_KEYS)

    domain_attributes_table = Table(
        'domain_attributes', meta,
        Column('id', UUID(), default=utils.generate_uuid, primary_key=True),
        Column('version', Integer(), default=1, nullable=False),
        Column('created_at', DateTime, default=lambda: timeutils.utcnow()),
        Column('updated_at', DateTime, onupdate=lambda: timeutils.utcnow()),

        Column('key', keys),
        Column('value', String(255), nullable=False),
        Column('domain_id', UUID(), nullable=False),

        UniqueConstraint('key', 'value', 'domain_id',
                         name='unique_attributes'),
        ForeignKeyConstraint(['domain_id'], ['domains.id'],
                             ondelete='CASCADE'),

        mysql_engine='INNODB',
        mysql_charset='utf8'
    )

    domains_table = Table('domains', meta, autoload=True)
    types = Enum(name='types', metadata=meta, *ZONE_TYPES)
    types.create()

    # Add type and transferred_at to domains
    type_ = Column('type', types, default='PRIMARY', server_default='PRIMARY')
    transferred_at = Column('transferred_at', DateTime, default=None)

    type_.create(domains_table, populate_default=True)
    transferred_at.create(domains_table, populate_default=True)

    domain_attributes_table.create()

    dialect = migrate_engine.url.get_dialect().name
    if dialect.startswith('sqlite'):
        constraint = UniqueConstraint(
            'name', 'deleted', name='unique_domain_name', table=domains_table)

        # Add missing unique index
        constraint.create()
Esempio n. 17
0
def add_imported_state_to_notices(context):
    old = ['drafted', 'submitted', 'published', 'rejected', 'accepted']
    new = old + ['imported']
    old_type = Enum(*old, name='official_notice_state')
    new_type = Enum(*new, name='official_notice_state')
    tmp_type = Enum(*new, name='_official_notice_state')

    tmp_type.create(context.operations.get_bind(), checkfirst=False)
    context.operations.execute(
        'ALTER TABLE official_notices ALTER COLUMN state '
        'TYPE _official_notice_state USING state::text::_official_notice_state'
    )
    old_type.drop(context.operations.get_bind(), checkfirst=False)
    new_type.create(context.operations.get_bind(), checkfirst=False)
    context.operations.execute(
        'ALTER TABLE official_notices ALTER COLUMN state '
        'TYPE official_notice_state USING state::text::official_notice_state')
    tmp_type.drop(context.operations.get_bind(), checkfirst=False)
Esempio n. 18
0
def upgrade(migrate_engine):
    """Function adds key_pairs type field."""
    meta = MetaData(bind=migrate_engine)
    key_pairs = Table("key_pairs", meta, autoload=True)
    shadow_key_pairs = Table("shadow_key_pairs", meta, autoload=True)

    enum = Enum("ssh", "x509", metadata=meta, name="keypair_types")
    enum.create()

    keypair_type = Column("type", enum, nullable=False, server_default=keypair.KEYPAIR_TYPE_SSH)

    if hasattr(key_pairs.c, "type"):
        key_pairs.c.type.drop()

    if hasattr(shadow_key_pairs.c, "type"):
        shadow_key_pairs.c.type.drop()

    key_pairs.create_column(keypair_type)
    shadow_key_pairs.create_column(keypair_type.copy())
Esempio n. 19
0
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    status_enum = Enum(name='service_statuses', metadata=meta, *SERVICE_STATES)
    status_enum.create()

    service_status_table = Table('service_statuses', meta,
        Column('id', UUID(), default=utils.generate_uuid, primary_key=True),
        Column('created_at', DateTime),
        Column('updated_at', DateTime),

        Column('service_name', String(40), nullable=False),
        Column('hostname', String(255), nullable=False),
        Column('heartbeated_at', DateTime, nullable=True),
        Column('status', status_enum, nullable=False),
        Column('stats', Text, nullable=False),
        Column('capabilities', Text, nullable=False),
    )
    service_status_table.create()
Esempio n. 20
0
def add_region_domain(context):
    # Add the new domain, see http://stackoverflow.com/a/14845740
    table_names = []
    inspector = Inspector(context.operations_connection)
    if 'elections' in inspector.get_table_names(context.schema):
        table_names.append('elections')
    if 'election_compounds' in inspector.get_table_names(context.schema):
        table_names.append('election_compounds')
    if 'votes' in inspector.get_table_names(context.schema):
        table_names.append('votes')
    if 'archived_results' in inspector.get_table_names(context.schema):
        table_names.append('archived_results')

    old_type = Enum('federation', 'canton', 'municipality',
                    name='domain_of_influence')
    new_type = Enum('federation', 'region', 'canton', 'municipality',
                    name='domain_of_influence')
    tmp_type = Enum('federation', 'region', 'canton', 'municipality',
                    name='_domain_of_influence')

    tmp_type.create(context.operations.get_bind(), checkfirst=False)

    for table_name in table_names:
        context.operations.execute(
            (
                'ALTER TABLE {} ALTER COLUMN domain TYPE _domain_of_influence '
                'USING domain::text::_domain_of_influence'
            ).format(table_name)
        )

    old_type.drop(context.operations.get_bind(), checkfirst=False)

    new_type.create(context.operations.get_bind(), checkfirst=False)

    for table_name in table_names:
        context.operations.execute(
            (
                'ALTER TABLE {} ALTER COLUMN domain TYPE domain_of_influence '
                'USING domain::text::domain_of_influence'
            ).format(table_name)
        )

    tmp_type.drop(context.operations.get_bind(), checkfirst=False)
Esempio n. 21
0
def upgrade(migrate_engine):
    """Function adds key_pairs type field."""
    meta = MetaData(bind=migrate_engine)
    key_pairs = Table('key_pairs', meta, autoload=True)
    shadow_key_pairs = Table('shadow_key_pairs', meta, autoload=True)

    enum = Enum('ssh', 'x509', metadata=meta, name='keypair_types')
    enum.create()

    keypair_type = Column('type', enum, nullable=False,
                          server_default=keypair.KEYPAIR_TYPE_SSH)

    if hasattr(key_pairs.c, 'type'):
        key_pairs.c.type.drop()

    if hasattr(shadow_key_pairs.c, 'type'):
        shadow_key_pairs.c.type.drop()

    key_pairs.create_column(keypair_type)
    shadow_key_pairs.create_column(keypair_type.copy())
def upgrade(migrate_engine):
    """Function adds key_pairs type field."""
    meta = MetaData(bind=migrate_engine)
    key_pairs = Table('key_pairs', meta, autoload=True)
    shadow_key_pairs = Table('shadow_key_pairs', meta, autoload=True)

    enum = Enum('ssh', 'x509', metadata=meta, name='keypair_types')
    enum.create()

    keypair_type = Column('type', enum, nullable=False,
                          server_default=keypair.KEYPAIR_TYPE_SSH)

    if hasattr(key_pairs.c, 'type'):
        key_pairs.c.type.drop()

    if hasattr(shadow_key_pairs.c, 'type'):
        shadow_key_pairs.c.type.drop()

    key_pairs.create_column(keypair_type)
    shadow_key_pairs.create_column(keypair_type.copy())
Esempio n. 23
0
def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    migrations = Table("migrations", meta, autoload=True)
    shadow_migrations = Table("shadow_migrations", meta, autoload=True)

    enum = Enum("migration", "resize", "live-migration", "evacuation", metadata=meta, name="migration_type")
    enum.create()

    migration_type = Column("migration_type", enum, nullable=True)

    if not hasattr(migrations.c, "migration_type"):
        migrations.create_column(migration_type)
    if not hasattr(shadow_migrations.c, "migration_type"):
        shadow_migrations.create_column(migration_type.copy())

    hidden = Column("hidden", Boolean, default=False)
    if not hasattr(migrations.c, "hidden"):
        migrations.create_column(hidden)
    if not hasattr(shadow_migrations.c, "hidden"):
        shadow_migrations.create_column(hidden.copy())
Esempio n. 24
0
def upgrade():
    migrate_engine = op.get_bind()
    meta = MetaData(bind=migrate_engine)

    engine_name = migrate_engine.engine.name
    if engine_name == 'sqlite':
        sql_file = os.path.splitext(__file__)[0]
        sql_file += '.sql'
        with open(sql_file, 'r') as sqlite_script:
            sql = sqlparse.format(sqlite_script.read(), strip_comments=True)
            for statement in sqlparse.split(sql):
                op.execute(statement)
        return

    enum = Enum('private', 'public', 'shared', 'community', metadata=meta,
                name='image_visibility')
    enum.create()
    v_col = Column('visibility', enum, nullable=False, server_default='shared')
    op.add_column('images', v_col)

    op.create_index('visibility_image_idx', 'images', ['visibility'])

    images = Table('images', meta, autoload=True)
    images.update(values={'visibility': 'public'}).where(
        images.c.is_public).execute()

    image_members = Table('image_members', meta, autoload=True)

    # NOTE(dharinic): Mark all the non-public images as 'private' first
    images.update().values(visibility='private').where(
        not_(images.c.is_public)).execute()
    # NOTE(dharinic): Identify 'shared' images from the above
    images.update().values(visibility='shared').where(and_(
        images.c.visibility == 'private', images.c.id.in_(select(
            [image_members.c.image_id]).distinct().where(
                not_(image_members.c.deleted))))).execute()

    op.drop_index('ix_images_is_public', 'images')
    op.drop_column('images', 'is_public')
Esempio n. 25
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    enum = Enum("ssh", "x509", metadata=meta, name="keypair_types")
    enum.create(checkfirst=True)

    keypairs = Table(
        "key_pairs",
        meta,
        Column("created_at", DateTime),
        Column("updated_at", DateTime),
        Column("id", Integer, primary_key=True, nullable=False),
        Column("name", String(255), nullable=False),
        Column("user_id", String(255), nullable=False),
        Column("fingerprint", String(255)),
        Column("public_key", Text()),
        Column("type", enum, nullable=False, server_default=keypair.KEYPAIR_TYPE_SSH),
        UniqueConstraint("user_id", "name", name="uniq_key_pairs0user_id0name"),
        mysql_engine="InnoDB",
        mysql_charset="utf8",
    )
    keypairs.create(checkfirst=True)
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    domains_table = Table('domains', meta, autoload=True)
    records_table = Table('records', meta, autoload=True)

    # Add a domain & record creation status for async backends
    domain_statuses = Enum(name='domain_statuses', metadata=meta,
                           *RESOURCE_STATUSES)
    domain_statuses.create()

    record_statuses = Enum(name='record_statuses', metadata=meta,
                           *RESOURCE_STATUSES)
    record_statuses.create()

    domain_status = Column('status', domain_statuses, nullable=False,
                           server_default='ACTIVE', default='ACTIVE')

    record_status = Column('status', record_statuses, nullable=False,
                           server_default='ACTIVE', default='ACTIVE')

    domain_status.create(domains_table, populate_default=True)
    record_status.create(records_table, populate_default=True)
Esempio n. 27
0
def add_election_compound_to_archive(context):
    old_type = Enum('election', 'vote', name='type_of_result')
    new_type = Enum(
        'election', 'election_compound', 'vote', name='type_of_result'
    )
    tmp_type = Enum(
        'election', 'election_compound', 'vote', name='_type_of_result'
    )

    tmp_type.create(context.operations.get_bind(), checkfirst=False)
    context.operations.execute(
        'ALTER TABLE archived_results ALTER COLUMN type '
        'TYPE _type_of_result USING type::text::_type_of_result'
    )

    old_type.drop(context.operations.get_bind(), checkfirst=False)

    new_type.create(context.operations.get_bind(), checkfirst=False)
    context.operations.execute(
        'ALTER TABLE archived_results ALTER COLUMN type '
        'TYPE type_of_result USING type::text::type_of_result'
    )

    tmp_type.drop(context.operations.get_bind(), checkfirst=False)
Esempio n. 28
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    # Seed SDN disabled capability in the i_system DB table
    systems = Table('i_system', meta, autoload=True)
    # only one system entry should be populated
    sys = list(systems.select().where(systems.c.uuid is not None).execute())
    if len(sys) > 0:
        json_dict = json.loads(sys[0].capabilities)
        json_dict['sdn_enabled'] = 'n'
        systems.update().where(systems.c.uuid == sys[0].uuid).values({
            'capabilities':
            json.dumps(json_dict)
        }).execute()

    # Enhance the services enum to include network
    service_parameter = Table('service_parameter',
                              meta,
                              Column('id',
                                     Integer,
                                     primary_key=True,
                                     nullable=False),
                              mysql_engine=ENGINE,
                              mysql_charset=CHARSET,
                              autoload=True)

    if migrate_engine.url.get_dialect() is postgresql.dialect:
        old_serviceEnum = Enum('identity',
                               'horizon',
                               'ceph',
                               name='serviceEnum')

        serviceEnum = Enum('identity',
                           'horizon',
                           'ceph',
                           'network',
                           name='serviceEnum')

        service_col = service_parameter.c.service
        service_col.alter(Column('service', String(60)))
        old_serviceEnum.drop(bind=migrate_engine, checkfirst=False)
        serviceEnum.create(bind=migrate_engine, checkfirst=False)
        migrate_engine.execute(
            'ALTER TABLE service_parameter ALTER COLUMN service TYPE "serviceEnum" '
            'USING service::text::"serviceEnum"')

    sdn_controller = Table(
        'sdn_controller',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('ip_address', String(255)),
        Column('port', Integer),
        Column('transport', String(255)),
        Column('state', String(255)),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sdn_controller.create()
Esempio n. 29
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    # Enum definitions
    recordTypeEnum = Enum('standard',
                          'profile',
                          'sprofile',
                          'reserve1',
                          'reserve2',
                          name='recordtypeEnum')

    personalityEnum = Enum('controller',
                           'worker',
                           'network',
                           'storage',
                           'profile',
                           'reserve1',
                           'reserve2',
                           name='invPersonalityEnum')

    adminEnum = Enum('locked',
                     'unlocked',
                     'reserve1',
                     'reserve2',
                     name='administrativeEnum')

    operationalEnum = Enum('disabled',
                           'enabled',
                           'reserve1',
                           'reserve2',
                           name='operationalEnum')

    availabilityEnum = Enum('available',
                            'intest',
                            'degraded',
                            'failed',
                            'power-off',
                            'offline',
                            'offduty',
                            'online',
                            'dependency',
                            'not-installed',
                            'reserve1',
                            'reserve2',
                            name='availabilityEnum')

    actionEnum = Enum('none',
                      'lock',
                      'force-lock',
                      'unlock',
                      'reset',
                      'swact',
                      'force-swact',
                      'reboot',
                      'power-on',
                      'power-off',
                      'reinstall',
                      'reserve1',
                      'reserve2',
                      name='actionEnum')

    typeEnum = Enum('snmpv2c_trap',
                    'reserve1',
                    'reserve2',
                    name='snmpVersionEnum')

    transportEnum = Enum('udp',
                         'reserve1',
                         'reserve2',
                         name='snmpTransportType')

    accessEnum = Enum('ro', 'rw', 'reserve1', 'reserve2', name='accessEnum')

    provisionEnum = Enum('unprovisioned',
                         'inventoried',
                         'configured',
                         'provisioned',
                         'reserve1',
                         'reserve2',
                         name='invprovisionStateEnum')

    i_system = Table(
        'i_system',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),

        # system name
        Column('name', String(255), unique=True),
        Column('description', String(255), unique=True),
        Column('capabilities', Text),
        Column('contact', String(255)),
        Column('location', String(255)),
        Column('services', Integer, default=72),
        Column('software_version', String(255)),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_system.create()

    i_Host = Table(
        'i_host',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),

        # Host is reserved while it runs a blocking operation ; like Lock
        Column('reserved', Boolean),
        Column('recordtype', recordTypeEnum, default="standard"),
        Column('uuid', String(36), unique=True),
        Column('id', Integer, primary_key=True, nullable=False),  # autoincr
        Column('hostname', String(255), unique=True, index=True),
        Column('mgmt_mac', String(255), unique=True),
        # MAC 01:34:67:9A:CD:FG  (only need 16 bytes)
        Column('mgmt_ip', String(255), unique=True),

        # Board Management database members
        Column('bm_ip', String(255)),
        Column('bm_mac', String(255)),
        Column('bm_type', String(255)),
        Column('bm_username', String(255)),
        Column('personality', personalityEnum),
        Column('serialid', String(255)),
        Column('location', Text),
        Column('administrative', adminEnum, default="locked"),
        Column('operational', operationalEnum, default="disabled"),
        Column('availability', availabilityEnum, default="offline"),
        Column('action', actionEnum, default="none"),
        Column('task', String(64)),
        Column('uptime', Integer),
        Column('capabilities', Text),
        Column('config_status', String(255)),
        Column('config_applied', String(255)),
        Column('config_target', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )

    i_Host.create()

    if migrate_engine.url.get_dialect() is postgresql.dialect:
        # Need to explicitly create Postgres enums during migrations
        provisionEnum.create(migrate_engine, checkfirst=False)

    invprovision = Column('invprovision',
                          provisionEnum,
                          default="unprovisioned")
    i_Host.create_column(invprovision)

    i_node = Table(
        'i_node',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),

        # numaNode from /sys/devices/system/node/nodeX/cpulist or cpumap
        Column('numa_node', Integer),
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        UniqueConstraint('numa_node', 'forihostid', name='u_hostnuma'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_node.create()

    i_cpu = Table(
        'i_icpu',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),

        # Column('numa_node', Integer, unique=True), API attribute
        Column('cpu', Integer),
        Column('core', Integer),
        Column('thread', Integer),
        Column('cpu_family', String(255)),
        Column('cpu_model', String(255)),
        Column('allocated_function', String(255)),
        # JSONEncodedDict e.g. {'Crypto':'CaveCreek'}
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('forinodeid', Integer,
               ForeignKey('i_node.id', ondelete='CASCADE')),
        UniqueConstraint('cpu', 'forihostid', name='u_hostcpu'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_cpu.create()

    i_memory = Table(
        'i_imemory',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),

        # per NUMA: /sys/devices/system/node/node<x>/meminfo
        Column('memtotal_mib', Integer),
        Column('memavail_mib', Integer),
        Column('platform_reserved_mib', Integer),
        Column('hugepages_configured', Boolean),
        Column('avs_hugepages_size_mib', Integer),
        Column('avs_hugepages_reqd', Integer),
        Column('avs_hugepages_nr', Integer),
        Column('avs_hugepages_avail', Integer),
        Column('vm_hugepages_size_mib', Integer),
        Column('vm_hugepages_nr', Integer),
        Column('vm_hugepages_avail', Integer),
        Column('capabilities', Text),

        # psql requires unique FK
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('forinodeid', Integer, ForeignKey('i_node.id')),
        UniqueConstraint('forihostid', 'forinodeid', name='u_hostnode'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_memory.create()

    i_interface = Table(
        'i_interface',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36)),
        Column('ifname', String(255)),
        Column('iftype', String(255)),
        Column('imac', String(255), unique=True),
        Column('imtu', Integer),
        Column('networktype', String(255)),
        Column('aemode', String(255)),
        Column('txhashpolicy', String(255)),
        Column('providernetworks', String(255)),
        Column('providernetworksdict', Text),
        Column('schedpolicy', String(255)),
        Column('ifcapabilities', Text),
        # JSON{'speed':1000, 'MTU':9600, 'duplex':'','autoneg':'false'}
        Column('farend', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        UniqueConstraint('ifname', 'forihostid', name='u_ifnameihost'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_interface.create()

    i_port = Table(
        'i_port',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36)),
        Column('pname', String(255)),
        Column('pnamedisplay', String(255)),
        Column('pciaddr', String(255)),
        Column('pclass', String(255)),
        Column('pvendor', String(255)),
        Column('pdevice', String(255)),
        Column('psvendor', String(255)),
        Column('psdevice', String(255)),
        Column('numa_node', Integer),
        Column('mac', String(255)),
        Column('mtu', Integer),
        Column('speed', Integer),
        Column('link_mode', String(255)),
        Column('autoneg', String(255)),
        Column('bootp', String(255)),
        Column('capabilities', Text),
        # JSON{'speed':1000, 'MTU':9600, 'duplex':'','autoneg':'false'}
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('foriinterfaceid', Integer,
               ForeignKey('i_interface.id')),  # keep if unassign interface
        UniqueConstraint('pciaddr', 'forihostid', name='u_pciaddrihost'),
        Column('forinodeid', Integer,
               ForeignKey('i_node.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_port.create()

    i_stor = Table(
        'i_istor',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('osdid', Integer),
        Column('idisk_uuid', String(255)),
        Column('state', String(255)),
        Column('function', String(255)),
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),

        # UniqueConstraint('name', 'forihostid', name='u_namehost'),
        UniqueConstraint('osdid', 'forihostid', name='u_osdhost'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_stor.create()

    i_disk = Table(
        'i_idisk',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('device_node', String(255)),
        Column('device_num', Integer),
        Column('device_type', String(255)),
        Column('size_mib', Integer),
        Column('serial_id', String(255)),
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('foristorid', Integer,
               ForeignKey('i_istor.id')),  # keep if stor deleted

        # JKUNG is unique required for name ?
        UniqueConstraint('device_node', 'forihostid', name='u_devhost'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_disk.create()

    i_ServiceGroup = Table(
        'i_servicegroup',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('servicename', String(255), unique=True),
        Column('state', String(255), default="unknown"),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_ServiceGroup.create()

    i_Service = Table(
        'i_service',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),  # autoincr
        Column('uuid', String(36), unique=True),
        Column('servicename', String(255)),
        Column('hostname', String(255)),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('activity', String),  # active/standby
        Column('state', String),
        Column('reason', Text),  # JSON encodedlist of string
        UniqueConstraint('servicename', 'hostname', name='u_servicehost'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_Service.create()

    i_trap = Table(
        'i_trap_destination',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('ip_address', String(40), unique=True, index=True),
        Column('community', String(255)),
        Column('port', Integer, default=162),
        Column('type', typeEnum, default='snmpv2c_trap'),
        Column('transport', transportEnum, default='udp'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_trap.create()

    i_community = Table(
        'i_community',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('community', String(255), unique=True, index=True),
        Column('view', String(255), default='.1'),
        Column('access', accessEnum, default='ro'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_community.create()

    i_user = Table(
        'i_user',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('root_sig', String(255)),
        Column('reserved_1', String(255)),
        Column('reserved_2', String(255)),
        Column('reserved_3', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_user.create()

    i_dns = Table(
        'i_dns',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('nameservers', String(255)),  # csv list of nameservers
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_dns.create()

    i_ntp = Table(
        'i_ntp',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('ntpservers', String(255)),  # csv list of ntp servers
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_ntp.create()

    i_extoam = Table(
        'i_extoam',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('oam_subnet', String(255)),
        Column('oam_gateway_ip', String(255)),
        Column('oam_floating_ip', String(255)),
        Column('oam_c0_ip', String(255)),
        Column('oam_c1_ip', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_extoam.create()

    i_pm = Table(
        'i_pm',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('retention_secs', String(255)),  # retention period in secs
        Column('reserved_1', String(255)),
        Column('reserved_2', String(255)),
        Column('reserved_3', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_pm.create()

    i_storconfig = Table(
        'i_storconfig',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('cinder_backend', String(255)),  # not configurable
        Column('database_gib', String(255)),
        Column('image_gib', String(255)),
        Column('backup_gib', String(255)),
        Column('cinder_device', String(255)),  # not configurable
        Column('cinder_gib', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_storconfig.create()
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    RESOURCE_STATUSES = ['ACTIVE', 'PENDING', 'DELETED', 'ERROR']

    # Get associated database tables
    domains_table = Table('domains', meta, autoload=True)
    records_table = Table('records', meta, autoload=True)

    dialect = migrate_engine.url.get_dialect().name
    if dialect.startswith("postgresql"):
        migrate_engine.execute(
            "ALTER TYPE domain_statuses RENAME TO resource_statuses;")

        with migrate_engine.connect() as conn:
            conn.execution_options(isolation_level="AUTOCOMMIT")
            conn.execute(
                "ALTER TYPE resource_statuses ADD VALUE 'ERROR' "
                "AFTER 'DELETED'")
            conn.close()

    actions = Enum(name='actions', metadata=meta, *ACTIONS)
    actions.create()

    resource_statuses = Enum(name='resource_statuses', metadata=meta,
                             *RESOURCE_STATUSES)

    # Upgrade the domains table.
    domains_table.c.status.alter(
        type=resource_statuses,
        default='PENDING', server_default='PENDING')

    action_column = Column('action', actions,
                           default='CREATE', server_default='CREATE',
                           nullable=False)
    action_column.create(domains_table)

    # Re-add constraint for sqlite.
    if dialect.startswith('sqlite'):
        constraint = UniqueConstraint(
            'name', 'deleted', name='unique_domain_name', table=domains_table)
        constraint.create()

    # Upgrade the records table.
    if dialect.startswith("postgresql"):
        sql = "ALTER TABLE records ALTER COLUMN status DROP DEFAULT, " \
              "ALTER COLUMN status TYPE resource_statuses USING " \
              "records::text::resource_statuses, ALTER COLUMN status " \
              "SET DEFAULT 'PENDING';"
        migrate_engine.execute(sql)
        record_statuses = Enum(name='record_statuses', metadata=meta,
                               *RESOURCE_STATUSES)
        record_statuses.drop()
    else:
        records_table.c.status.alter(
            type=resource_statuses,
            default='PENDING', server_default='PENDING')

    action_column = Column('action', actions,
                           default='CREATE', server_default='CREATE',
                           nullable=False)
    action_column.create(records_table)
    serial_column = Column('serial', Integer(), server_default='1',
                           nullable=False)
    serial_column.create(records_table)

    # Re-add constraint for sqlite.
    if dialect.startswith('sqlite'):
        constraint = UniqueConstraint(
            'hash', name='unique_record', table=records_table)
        constraint.create()
Esempio n. 31
0
def upgrade(migrate_engine):
    meta = MetaData()
    meta.bind = migrate_engine

    Table('i_system',
          meta,
          Column('id', Integer, primary_key=True, nullable=False),
          mysql_engine=ENGINE,
          mysql_charset=CHARSET)

    i_host = Table('i_host',
                   meta,
                   Column('id', Integer, primary_key=True, nullable=False),
                   mysql_engine=ENGINE,
                   mysql_charset=CHARSET,
                   autoload=True)

    if migrate_engine.url.get_dialect() is postgresql.dialect:
        old_provisionEnum = Enum('unprovisioned',
                                 'inventoried',
                                 'configured',
                                 'provisioned',
                                 'reserve1',
                                 'reserve2',
                                 name='invprovisionStateEnum')

        provisionEnum = Enum('unprovisioned',
                             'inventoried',
                             'configured',
                             'provisioning',
                             'provisioned',
                             'reserve1',
                             'reserve2',
                             name='invprovisionStateEnum')

        inv_provision_col = i_host.c.invprovision
        inv_provision_col.alter(Column('invprovision', String(60)))
        old_provisionEnum.drop(bind=migrate_engine, checkfirst=False)
        provisionEnum.create(bind=migrate_engine, checkfirst=False)
        migrate_engine.execute(
            'ALTER TABLE i_host ALTER COLUMN invprovision TYPE "invprovisionStateEnum" '
            'USING invprovision::text::"invprovisionStateEnum"')

    Table('i_node',
          meta,
          Column('id', Integer, primary_key=True, nullable=False),
          mysql_engine=ENGINE,
          mysql_charset=CHARSET)

    i_alarm_history = Table(
        'i_alarm_history',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(255), unique=True, index=True),
        Column('alarm_id', String(255), index=True),
        Column('alarm_state', String(255)),
        Column('entity_type_id', String(255), index=True),
        Column('entity_instance_id', String(255), index=True),
        Column('timestamp', DateTime(timezone=False)),
        Column('severity', String(255), index=True),
        Column('reason_text', String(255)),
        Column('alarm_type', String(255), index=True),
        Column('probable_cause', String(255)),
        Column('proposed_repair_action', String(255)),
        Column('service_affecting', Boolean),
        Column('suppression', Boolean),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_alarm_history.create()

    i_customer_log = Table(
        'i_customer_log',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(255), unique=True, index=True),
        Column('log_id', String(255), index=True),
        Column('entity_type_id', String(255), index=True),
        Column('entity_instance_id', String(255), index=True),
        Column('timestamp', DateTime(timezone=False)),
        Column('severity', String(255), index=True),
        Column('reason_text', String(255)),
        Column('log_type', String(255), index=True),
        Column('probable_cause', String(255)),
        Column('service_affecting', Boolean),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_customer_log.create()

    i_infra = Table(
        'i_infra',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('infra_subnet', String(255)),
        Column('infra_start', String(255)),
        Column('infra_end', String(255)),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_infra.create()

    interfaces = Table(
        'interfaces',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('iftype', String(255)),
        Column('ifname', String(255)),
        Column('networktype', String(255)),
        Column('sriov_numvfs', Integer),
        Column('ifcapabilities', Text),
        Column('farend', Text),
        UniqueConstraint('ifname', 'forihostid', name='u_interfacenameihost'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    interfaces.create()

    interfaces_to_interfaces = Table(
        'interfaces_to_interfaces',
        meta,
        Column("used_by_id",
               Integer,
               ForeignKey("interfaces.id", ondelete='CASCADE'),
               primary_key=True),
        Column("uses_id",
               Integer,
               ForeignKey("interfaces.id", ondelete='CASCADE'),
               primary_key=True),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    interfaces_to_interfaces.create()

    ethernet_interfaces = Table(
        'ethernet_interfaces',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('imac', String(255)),
        Column('imtu', Integer),
        Column('providernetworks', String(255)),
        Column('providernetworksdict', Text),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    ethernet_interfaces.create()

    ae_interfaces = Table(
        'ae_interfaces',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('aemode', String(255)),
        Column('aedict', Text),
        Column('txhashpolicy', String(255)),
        Column('schedpolicy', String(255)),
        Column('imac', String(255)),
        Column('imtu', Integer),
        Column('providernetworks', String(255)),
        Column('providernetworksdict', Text),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    ae_interfaces.create()

    vlan_interfaces = Table(
        'vlan_interfaces',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('vlan_id', String(255)),
        Column('vlan_type', String(255)),
        Column('imac', String(255)),
        Column('imtu', Integer),
        Column('providernetworks', String(255)),
        Column('providernetworksdict', Text),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    vlan_interfaces.create()

    ports = Table(
        'ports',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('host_id', Integer, ForeignKey('i_host.id',
                                              ondelete='CASCADE')),
        Column('node_id', Integer, ForeignKey('i_node.id',
                                              ondelete='SET NULL')),
        Column('interface_id', Integer,
               ForeignKey('interfaces.id', ondelete='SET NULL')),
        Column('type', String(255)),
        Column('name', String(255)),
        Column('namedisplay', String(255)),
        Column('pciaddr', String(255)),
        Column('dev_id', Integer),
        Column('sriov_totalvfs', Integer),
        Column('sriov_numvfs', Integer),
        Column('sriov_vfs_pci_address', String(1020)),
        Column('driver', String(255)),
        Column('pclass', String(255)),
        Column('pvendor', String(255)),
        Column('pdevice', String(255)),
        Column('psvendor', String(255)),
        Column('psdevice', String(255)),
        Column('dpdksupport', Boolean, default=False),
        Column('numa_node', Integer),
        Column('capabilities', Text),
        UniqueConstraint('pciaddr',
                         'dev_id',
                         'host_id',
                         name='u_pciaddr_dev_host_id'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    ports.create()

    ethernet_ports = Table(
        'ethernet_ports',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('ports.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('mac', String(255)),
        Column('mtu', Integer),
        Column('speed', Integer),
        Column('link_mode', String(255)),
        Column('duplex', String(255)),
        Column('autoneg', String(255)),
        Column('bootp', String(255)),
        Column('capabilities', Text),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    ethernet_ports.create()

    address_pools = Table(
        'address_pools',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('name', String(128), unique=True, nullable=False),
        Column('family', Integer, nullable=False),
        Column('network', String(50), nullable=False),
        Column('prefix', Integer, nullable=False),
        Column('order', String(32), nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    address_pools.create()

    address_pool_ranges = Table(
        'address_pool_ranges',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('start', String(50), nullable=False),
        Column('end', String(50), nullable=False),
        Column('address_pool_id',
               Integer,
               ForeignKey('address_pools.id', ondelete="CASCADE"),
               nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    address_pool_ranges.create()

    addresses = Table(
        'addresses',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('name', String(255)),
        Column('family', Integer, nullable=False),
        Column('address', String(50), nullable=False),
        Column('prefix', Integer, nullable=False),
        Column('enable_dad', Boolean(), default=True),
        Column('interface_id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               nullable=True),
        Column('address_pool_id',
               Integer,
               ForeignKey('address_pools.id', ondelete="CASCADE"),
               nullable=True),
        UniqueConstraint('family',
                         'address',
                         'interface_id',
                         name='u_address@family@interface'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    addresses.create()

    address_modes = Table(
        'address_modes',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('family', Integer, nullable=False),
        Column('mode', String(32), nullable=False),
        Column('interface_id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               nullable=False),
        Column('address_pool_id',
               Integer,
               ForeignKey('address_pools.id', ondelete="CASCADE"),
               nullable=True),
        UniqueConstraint('family', 'interface_id', name='u_family@interface'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    address_modes.create()

    routes = Table(
        'routes',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('family', Integer, nullable=False),
        Column('network', String(50), nullable=False),
        Column('prefix', Integer, nullable=False),
        Column('gateway', String(50), nullable=False),
        Column('metric', Integer, default=1, nullable=False),
        Column('interface_id',
               Integer,
               ForeignKey('interfaces.id', ondelete="CASCADE"),
               nullable=False),
        UniqueConstraint('family',
                         'network',
                         'prefix',
                         'gateway',
                         'interface_id',
                         name='u_family@network@prefix@gateway@host'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    routes.create()

    networks = Table(
        'networks',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('type', String(255), unique=True),
        Column('mtu', Integer, nullable=False),
        Column('link_capacity', Integer),
        Column('dynamic', Boolean, nullable=False),
        Column('vlan_id', Integer),
        Column('address_pool_id',
               Integer,
               ForeignKey('address_pools.id', ondelete='CASCADE'),
               nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    networks.create()

    i_port = Table('i_port', meta, autoload=True)
    i_port.create_column(Column('sriov_totalvfs', Integer))
    i_port.create_column(Column('sriov_numvfs', Integer))
    i_port.create_column(Column('sriov_vfs_pci_address', String(1020)))
    i_port.create_column(Column('driver', String(255)))
    i_interface = Table('i_interface', meta, autoload=True)
    i_interface.create_column(Column('sriov_numvfs', Integer))

    i_port = Table('i_port', meta, autoload=True)
    i_port.create_column(Column('dpdksupport', Boolean, default=False))

    i_interface = Table('i_interface', meta, autoload=True)
    i_interface.create_column(Column('aedict', Text))

    pvTypeEnum = Enum('disk',
                      'partition',
                      'reserve1',
                      'reserve2',
                      native_enum=False,
                      name='physicalVolTypeEnum')

    pvStateEnum = Enum('unprovisioned',
                       'adding',
                       'provisioned',
                       'removing',
                       'reserve1',
                       'reserve2',
                       native_enum=False,
                       name='pvStateEnum')

    vgStateEnum = Enum('unprovisioned',
                       'adding',
                       'provisioned',
                       'removing',
                       'reserve1',
                       'reserve2',
                       native_enum=False,
                       name='vgStateEnum')

    i_lvg = Table(
        'i_lvg',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('vg_state', vgStateEnum, default="unprovisioned"),
        Column('lvm_vg_name', String(64)),
        Column('lvm_vg_uuid', String(64)),
        Column('lvm_vg_access', String(64)),
        Column('lvm_max_lv', Integer),
        Column('lvm_cur_lv', Integer),
        Column('lvm_max_pv', Integer),
        Column('lvm_cur_pv', Integer),
        Column('lvm_vg_size', BigInteger),
        Column('lvm_vg_total_pe', Integer),
        Column('lvm_vg_free_pe', Integer),
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_lvg.create()

    i_pv = Table(
        'i_pv',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('pv_state', pvStateEnum, default="unprovisioned"),
        Column('pv_type', pvTypeEnum, default="disk"),
        Column('idisk_uuid', String()),
        Column('idisk_device_node', String(64)),
        Column('lvm_pv_name', String(64)),
        Column('lvm_vg_name', String(64)),
        Column('lvm_pv_uuid', String(64)),
        Column('lvm_pv_size', BigInteger),
        Column('lvm_pe_total', Integer),
        Column('lvm_pe_alloced', Integer),
        Column('capabilities', Text),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('forilvgid', Integer, ForeignKey('i_lvg.id',
                                                ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    i_pv.create()

    i_idisk = Table('i_idisk', meta, autoload=True)
    foripvid = Column('foripvid', Integer, ForeignKey('i_pv.id'))
    foripvid.create(i_idisk)

    sensorgroups = Table(
        'i_sensorgroups',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('host_id', Integer, ForeignKey('i_host.id',
                                              ondelete='CASCADE')),
        Column('sensorgroupname', String(255)),
        Column('path', String(255)),
        Column('datatype', String(255)),  # polymorphic 'analog'/'discrete
        Column('sensortype', String(255)),
        Column('description', String(255)),
        Column('state', String(255)),  # enabled or disabled
        Column('possible_states', String(255)),
        Column('audit_interval_group', Integer),
        Column('record_ttl', Integer),
        Column('algorithm', String(255)),
        Column('actions_critical_choices', String(255)),
        Column('actions_major_choices', String(255)),
        Column('actions_minor_choices', String(255)),
        Column('actions_minor_group', String(255)),
        Column('actions_major_group', String(255)),
        Column('actions_critical_group', String(255)),
        Column('suppress', Boolean),  # True, disables the action
        Column('capabilities', Text),
        UniqueConstraint('sensorgroupname',
                         'path',
                         'host_id',
                         name='u_sensorgroupname_path_hostid'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensorgroups.create()

    # polymorphic on datatype 'discrete'
    sensorgroups_discrete = Table(
        'i_sensorgroups_discrete',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('i_sensorgroups.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensorgroups_discrete.create()

    # polymorphic on datatype 'analog'
    sensorgroups_analog = Table(
        'i_sensorgroups_analog',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('i_sensorgroups.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('unit_base_group', String(255)),  # revolutions
        Column('unit_modifier_group', String(255)),  # 100
        Column('unit_rate_group', String(255)),  # minute
        Column('t_minor_lower_group', String(255)),
        Column('t_minor_upper_group', String(255)),
        Column('t_major_lower_group', String(255)),
        Column('t_major_upper_group', String(255)),
        Column('t_critical_lower_group', String(255)),
        Column('t_critical_upper_group', String(255)),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensorgroups_analog.create()

    sensors = Table(
        'i_sensors',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('host_id', Integer, ForeignKey('i_host.id',
                                              ondelete='CASCADE')),
        Column('sensorgroup_id', Integer,
               ForeignKey('i_sensorgroups.id', ondelete='SET NULL')),
        Column('sensorname', String(255)),
        Column('path', String(255)),
        Column('datatype', String(255)),  # polymorphic on datatype
        Column('sensortype', String(255)),
        Column('status', String(255)),  # ok, minor, major, critical, disabled
        Column('state', String(255)),  # enabled, disabled
        Column('state_requested', String(255)),
        Column('sensor_action_requested', String(255)),
        Column('audit_interval', Integer),
        Column('algorithm', String(255)),
        Column('actions_minor', String(255)),
        Column('actions_major', String(255)),
        Column('actions_critical', String(255)),
        Column('suppress', Boolean),  # True, disables the action
        Column('capabilities', Text),
        UniqueConstraint('sensorname',
                         'path',
                         'host_id',
                         name='u_sensorname_path_host_id'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensors.create()

    # discrete sensor
    sensors_discrete = Table(
        'i_sensors_discrete',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('i_sensors.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensors_discrete.create()

    # analog sensor
    sensors_analog = Table(
        'i_sensors_analog',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id',
               Integer,
               ForeignKey('i_sensors.id', ondelete="CASCADE"),
               primary_key=True,
               nullable=False),
        Column('unit_base', String(255)),  # revolutions
        Column('unit_modifier', String(255)),  # 10^2
        Column('unit_rate', String(255)),  # minute
        Column('t_minor_lower', String(255)),
        Column('t_minor_upper', String(255)),
        Column('t_major_lower', String(255)),
        Column('t_major_upper', String(255)),
        Column('t_critical_lower', String(255)),
        Column('t_critical_upper', String(255)),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    sensors_analog.create()

    pci_devices = Table(
        'pci_devices',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(255), unique=True, index=True),
        Column('host_id', Integer, ForeignKey('i_host.id',
                                              ondelete='CASCADE')),
        Column('name', String(255)),
        Column('pciaddr', String(255)),
        Column('pclass_id', String(6)),
        Column('pvendor_id', String(4)),
        Column('pdevice_id', String(4)),
        Column('pclass', String(255)),
        Column('pvendor', String(255)),
        Column('pdevice', String(255)),
        Column('psvendor', String(255)),
        Column('psdevice', String(255)),
        Column('numa_node', Integer),
        Column('driver', String(255)),
        Column('sriov_totalvfs', Integer),
        Column('sriov_numvfs', Integer),
        Column('sriov_vfs_pci_address', String(1020)),
        Column('enabled', Boolean),
        Column('extra_info', Text),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    pci_devices.create()

    loads = Table(
        'loads',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36)),
        Column('state', String(255)),
        Column('software_version', String(255)),
        Column('compatible_version', String(255)),
        Column('required_patches', String(2047)),
        UniqueConstraint('software_version'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    loads.create()

    # loads = Table('loads', meta, Column('id', Integer, primary_key=True,
    #                                     nullable=False))
    software_upgrade = Table(
        'software_upgrade',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('state', String(128), nullable=False),
        Column('from_load',
               Integer,
               ForeignKey('loads.id', ondelete="CASCADE"),
               nullable=False),
        Column('to_load',
               Integer,
               ForeignKey('loads.id', ondelete="CASCADE"),
               nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    software_upgrade.create()

    host_upgrade = Table(
        'host_upgrade',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('forihostid', Integer,
               ForeignKey('i_host.id', ondelete='CASCADE')),
        Column('software_load',
               Integer,
               ForeignKey('loads.id'),
               nullable=False),
        Column('target_load', Integer, ForeignKey('loads.id'), nullable=False),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    host_upgrade.create()

    drbdconfig = Table(
        'drbdconfig',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('link_util', Integer),
        Column('num_parallel', Integer),
        Column('rtt_ms', Float),
        Column('forisystemid', Integer,
               ForeignKey('i_system.id', ondelete='CASCADE')),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    drbdconfig.create()

    i_host.create_column(Column('ihost_action', String(255)))
    i_host.create_column(Column('vim_progress_status', String(255)))
    i_host.create_column(Column('subfunctions', String(255)))
    i_host.create_column(
        Column('subfunction_oper', String(255), default="disabled"))
    i_host.create_column(
        Column('subfunction_avail', String(255), default="not-installed"))
    i_host.create_column(Column('boot_device', String(255)))
    i_host.create_column(Column('rootfs_device', String(255)))
    i_host.create_column(Column('install_output', String(255)))
    i_host.create_column(Column('console', String(255)))
    i_host.create_column(Column('vsc_controllers', String(255)))
    i_host.create_column(Column('ttys_dcd', Boolean))

    # 005_add_hugepage_attributes.py
    i_memory = Table('i_imemory', meta, autoload=True)
    i_memory.drop_column('vm_hugepages_size_mib')
    i_memory.drop_column('vm_hugepages_nr')
    i_memory.drop_column('vm_hugepages_avail')

    i_memory.create_column(Column('vm_hugepages_nr_2M', Integer))
    i_memory.create_column(Column('vm_hugepages_nr_1G', Integer))
    i_memory.create_column(Column('vm_hugepages_use_1G', Boolean))
    i_memory.create_column(Column('vm_hugepages_possible_2M', Integer))
    i_memory.create_column(Column('vm_hugepages_possible_1G', Integer))
    # 012_hugepage_enhancements.py
    i_memory.create_column(Column('vm_hugepages_nr_2M_pending', Integer))
    i_memory.create_column(Column('vm_hugepages_nr_1G_pending', Integer))
    i_memory.create_column(Column('vm_hugepages_avail_2M', Integer))
    i_memory.create_column(Column('vm_hugepages_avail_1G', Integer))
    # 014_hugepage_4K_memory.py
    i_memory.create_column(Column('vm_hugepages_nr_4K', Integer))
    # 016_compute_memory.py
    i_memory.create_column(Column('node_memtotal_mib', Integer))

    i_extoam = Table('i_extoam', meta, autoload=True)
    i_extoam.create_column(Column('oam_start_ip', String(255)))
    i_extoam.create_column(Column('oam_end_ip', String(255)))

    i_storconfig = Table('i_storconfig', meta, autoload=True)
    i_storconfig.create_column(Column('glance_backend', String(255)))
    i_storconfig.create_column(Column('glance_gib', Integer, default=0))
    i_storconfig.create_column(Column('img_conversions_gib', String(255)))

    table_names = ['i_extoam', 'i_infra']
    for name in table_names:
        table = Table(name, meta, autoload=True)
        table.drop()

    serviceEnum = Enum('identity', name='serviceEnum')

    service_parameter = Table(
        'service_parameter',
        meta,
        Column('created_at', DateTime),
        Column('updated_at', DateTime),
        Column('deleted_at', DateTime),
        Column('id', Integer, primary_key=True, nullable=False),
        Column('uuid', String(36), unique=True),
        Column('service', serviceEnum),
        Column('section', String(255)),
        Column('name', String(255)),
        Column('value', String(255)),
        UniqueConstraint('service',
                         'section',
                         'name',
                         name='u_servicesectionname'),
        mysql_engine=ENGINE,
        mysql_charset=CHARSET,
    )
    service_parameter.create()
def upgrade(migrate_engine):
    meta.bind = migrate_engine

    RESOURCE_STATUSES = ['ACTIVE', 'PENDING', 'DELETED', 'ERROR']

    # Get associated database tables
    domains_table = Table('domains', meta, autoload=True)
    records_table = Table('records', meta, autoload=True)

    dialect = migrate_engine.url.get_dialect().name
    if dialect.startswith("postgresql"):
        migrate_engine.execute(
            "ALTER TYPE domain_statuses RENAME TO resource_statuses;")

        with migrate_engine.connect() as conn:
            conn.execution_options(isolation_level="AUTOCOMMIT")
            conn.execute("ALTER TYPE resource_statuses ADD VALUE 'ERROR' "
                         "AFTER 'DELETED'")
            conn.close()

    actions = Enum(name='actions', metadata=meta, *ACTIONS)
    actions.create()

    resource_statuses = Enum(name='resource_statuses',
                             metadata=meta,
                             *RESOURCE_STATUSES)

    # Upgrade the domains table.
    domains_table.c.status.alter(type=resource_statuses,
                                 default='PENDING',
                                 server_default='PENDING')

    action_column = Column('action',
                           actions,
                           default='CREATE',
                           server_default='CREATE',
                           nullable=False)
    action_column.create(domains_table)

    # Re-add constraint for sqlite.
    if dialect.startswith('sqlite'):
        constraint = UniqueConstraint('name',
                                      'deleted',
                                      name='unique_domain_name',
                                      table=domains_table)
        constraint.create()

    # Upgrade the records table.
    if dialect.startswith("postgresql"):
        sql = "ALTER TABLE records ALTER COLUMN status DROP DEFAULT, " \
              "ALTER COLUMN status TYPE resource_statuses USING " \
              "records::text::resource_statuses, ALTER COLUMN status " \
              "SET DEFAULT 'PENDING';"
        migrate_engine.execute(sql)
        record_statuses = Enum(name='record_statuses',
                               metadata=meta,
                               *RESOURCE_STATUSES)
        record_statuses.drop()
    else:
        records_table.c.status.alter(type=resource_statuses,
                                     default='PENDING',
                                     server_default='PENDING')

    action_column = Column('action',
                           actions,
                           default='CREATE',
                           server_default='CREATE',
                           nullable=False)
    action_column.create(records_table)
    serial_column = Column('serial',
                           Integer(),
                           server_default='1',
                           nullable=False)
    serial_column.create(records_table)

    # Re-add constraint for sqlite.
    if dialect.startswith('sqlite'):
        constraint = UniqueConstraint('hash',
                                      name='unique_record',
                                      table=records_table)
        constraint.create()