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'])
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), )
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 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)
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'])
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), )
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()
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"')
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)
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)
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) )
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()
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()
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)
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): 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()
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)
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())
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 = 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')
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)
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)
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()
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()
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()