def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (define_images_table,) = from_migration_import("001_add_images_table", ["define_images_table"]) (define_image_properties_table,) = from_migration_import( "002_add_image_properties_table", ["define_image_properties_table"] ) conn = migrate_engine.connect() images = define_images_table(meta) image_properties = define_image_properties_table(meta) # Steps to take, in this order: # 1) Move the existing type column from Image into # ImageProperty for all image records that have a non-NULL # type column # 2) Drop the type column in images # 3) Add the new columns to images # The below wackiness correlates to the following ANSI SQL: # SELECT images.* FROM images # LEFT JOIN image_properties # ON images.id = image_properties.image_id # AND image_properties.key = 'type' # WHERE image_properties.image_id IS NULL # AND images.type IS NOT NULL # # which returns all the images that have a type set # but that DO NOT yet have an image_property record # with key of type. from_stmt = [ images.outerjoin( image_properties, and_(images.c.id == image_properties.c.image_id, image_properties.c.key == "type") ) ] and_stmt = and_(image_properties.c.image_id == None, images.c.type != None) sel = select([images], from_obj=from_stmt).where(and_stmt) image_records = conn.execute(sel).fetchall() property_insert = image_properties.insert() for record in image_records: conn.execute( property_insert, image_id=record.id, key="type", created_at=record.created_at, deleted=False, value=record.type, ) conn.close() disk_format = Column("disk_format", String(20)) disk_format.create(images) container_format = Column("container_format", String(20)) container_format.create(images) images.columns["type"].drop()
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (define_images_table, ) = from_migration_import('001_add_images_table', ['define_images_table']) (define_image_properties_table, ) = from_migration_import( '002_add_image_properties_table', ['define_image_properties_table']) conn = migrate_engine.connect() images = define_images_table(meta) image_properties = define_image_properties_table(meta) # Steps to take, in this order: # 1) Move the existing type column from Image into # ImageProperty for all image records that have a non-NULL # type column # 2) Drop the type column in images # 3) Add the new columns to images # The below wackiness correlates to the following ANSI SQL: # SELECT images.* FROM images # LEFT JOIN image_properties # ON images.id = image_properties.image_id # AND image_properties.key = 'type' # WHERE image_properties.image_id IS NULL # AND images.type IS NOT NULL # # which returns all the images that have a type set # but that DO NOT yet have an image_property record # with key of type. from_stmt = [ images.outerjoin( image_properties, and_(images.c.id == image_properties.c.image_id, image_properties.c.key == 'type')) ] and_stmt = and_(image_properties.c.image_id == None, images.c.type != None) sel = select([images], from_obj=from_stmt).where(and_stmt) image_records = conn.execute(sel).fetchall() property_insert = image_properties.insert() for record in image_records: conn.execute(property_insert, image_id=record.id, key='type', created_at=record.created_at, deleted=False, value=record.type) conn.close() disk_format = Column('disk_format', String(20)) disk_format.create(images) container_format = Column('container_format', String(20)) container_format.create(images) images.columns['type'].drop()
def define_image_properties_table(meta): (define_images_table, ) = from_migration_import('001_add_images_table', ['define_images_table']) images = define_images_table(meta) image_properties = Table('image_properties', meta, Column('id', Integer(), primary_key=True, nullable=False), Column('image_id', Integer(), ForeignKey('images.id'), nullable=False, index=True), Column('key', String(255), nullable=False), Column('value', Text()), Column('created_at', DateTime(), nullable=False), Column('updated_at', DateTime()), Column('deleted_at', DateTime()), Column('deleted', Boolean(), nullable=False, default=False, index=True), UniqueConstraint('image_id', 'key'), mysql_engine='InnoDB', extend_existing=True) Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) return image_properties
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (get_image_properties_table, ) = from_migration_import( '004_add_checksum', ['get_image_properties_table']) image_properties = get_image_properties_table(meta) if migrate_engine.name == "ibm_db_sa": # NOTE(dperaza) ibm db2 does not allow ALTER INDEX so we will drop # the index, rename the column, then re-create the index sql_commands = [ """ALTER TABLE image_properties DROP UNIQUE ix_image_properties_image_id_key;""", """ALTER TABLE image_properties RENAME COLUMN \"key\" to name;""", """ALTER TABLE image_properties ADD CONSTRAINT ix_image_properties_image_id_name UNIQUE(image_id, name);""", ] for command in sql_commands: meta.bind.execute(command) else: index = Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) index.rename('ix_image_properties_image_id_name') image_properties = get_image_properties_table(meta) image_properties.columns['key'].alter(name="name")
def get_image_properties_table(meta): """ Returns the Table object for the image_properties table that corresponds to the image_properties table definition of this version. """ (get_images_table,) = from_migration_import("004_add_checksum", ["get_images_table"]) images = get_images_table(meta) image_properties = Table( "image_properties", meta, Column("id", Integer(), primary_key=True, nullable=False), Column("image_id", Integer(), ForeignKey("images.id"), nullable=False, index=True), Column("name", String(255), nullable=False), Column("value", Text()), Column("created_at", DateTime(), nullable=False), Column("updated_at", DateTime()), Column("deleted_at", DateTime()), Column("deleted", Boolean(), nullable=False, default=False, index=True), UniqueConstraint("image_id", "name"), mysql_engine="InnoDB", extend_existing=True, ) return image_properties
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (get_image_properties_table,) = from_migration_import("004_add_checksum", ["get_image_properties_table"]) image_properties = get_image_properties_table(meta) if migrate_engine.name == "ibm_db_sa": # NOTE(dperaza) ibm db2 does not allow ALTER INDEX so we will drop # the index, rename the column, then re-create the index sql_commands = [ """ALTER TABLE image_properties DROP UNIQUE ix_image_properties_image_id_key;""", """ALTER TABLE image_properties RENAME COLUMN \"key\" to name;""", """ALTER TABLE image_properties ADD CONSTRAINT ix_image_properties_image_id_name UNIQUE(image_id, name);""", ] for command in sql_commands: meta.bind.execute(command) else: index = Index("ix_image_properties_image_id_key", image_properties.c.image_id, image_properties.c.key) index.rename("ix_image_properties_image_id_name") image_properties = get_image_properties_table(meta) image_properties.columns["key"].alter(name="name")
def define_image_properties_table(meta): (define_images_table,) = from_migration_import( '001_add_images_table', ['define_images_table']) images = define_images_table(meta) image_properties = Table('image_properties', meta, Column('id', Integer(), primary_key=True, nullable=False), Column('image_id', Integer(), ForeignKey('images.id'), nullable=False, index=True), Column('key', String(255), nullable=False), Column('value', Text()), Column('created_at', DateTime(), nullable=False), Column('updated_at', DateTime()), Column('deleted_at', DateTime()), Column('deleted', Boolean(), nullable=False, default=False, index=True), UniqueConstraint('image_id', 'key'), mysql_engine='InnoDB', extend_existing=True) Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) return image_properties
def test_legacy_parse_swift_uri_015(self): (legacy_parse_uri,) = from_migration_import("015_quote_swift_credentials", ["legacy_parse_uri"]) uri = legacy_parse_uri("swift://*****:*****@example.com/container/obj-id", True) self.assertTrue(uri, "swift://acct%3Ausr:[email protected]" "/container/obj-id") self._assert_invalid_swift_uri_raises_bad_store_uri(legacy_parse_uri)
def get_image_properties_table(meta): """ No changes to the image properties table from 006... """ (get_image_properties_table,) = from_migration_import("006_key_to_name", ["get_image_properties_table"]) image_properties = get_image_properties_table(meta) return image_properties
def get_image_properties_table(meta): """ No changes to the image properties table from 007... """ (get_image_properties_table,) = from_migration_import("007_add_owner", ["get_image_properties_table"]) image_properties = get_image_properties_table(meta) return image_properties
def get_images_table(meta): """ No changes to the image properties table from 002... """ (get_images_table,) = from_migration_import("004_add_checksum", ["get_images_table"]) images = get_images_table(meta) return images
def get_images_table(meta): """ No changes to the image properties table from 002... """ (get_images_table, ) = from_migration_import('004_add_checksum', ['get_images_table']) images = get_images_table(meta) return images
def get_image_properties_table(meta): """ No changes to the image properties table from 002... """ (define_image_properties_table, ) = from_migration_import( '002_add_image_properties_table', ['define_image_properties_table']) image_properties = define_image_properties_table(meta) return image_properties
def get_image_properties_table(meta): """ No changes to the image properties table from 006... """ (get_image_properties_table, ) = from_migration_import( '006_key_to_name', ['get_image_properties_table']) image_properties = get_image_properties_table(meta) return image_properties
def get_image_properties_table(meta): """ No changes to the image properties table from 002... """ (define_image_properties_table,) = from_migration_import( '002_add_image_properties_table', ['define_image_properties_table']) image_properties = define_image_properties_table(meta) return image_properties
def get_images_table(meta): """ No changes to the images table from 008... """ (get_images_table,) = from_migration_import( '008_add_image_members_table', ['get_images_table']) images = get_images_table(meta) return images
def get_image_properties_table(meta): """ No changes to the image properties table from 007... """ (get_image_properties_table, ) = from_migration_import( '007_add_owner', ['get_image_properties_table']) image_properties = get_image_properties_table(meta) return image_properties
def get_images_table(meta): """ No changes to the images table from 007... """ (get_images_table,) = from_migration_import( '007_add_owner', ['get_images_table']) images = get_images_table(meta) return images
def get_image_members_table(meta): """ No changes to the image members table from 008... """ (get_image_members_table,) = from_migration_import( '008_add_image_members_table', ['get_image_members_table']) images = get_image_members_table(meta) return images
def get_image_properties_table(meta): """ No changes to the image properties table from 008... """ (define_image_properties_table,) = from_migration_import( "008_add_image_members_table", ["define_image_properties_table"] ) image_properties = define_image_properties_table(meta) return image_properties
def test_legacy_parse_swift_uri_015(self): (legacy_parse_uri,) = from_migration_import( '015_quote_swift_credentials', ['legacy_parse_uri']) uri = legacy_parse_uri( 'swift://*****:*****@example.com/container/obj-id', True) self.assertTrue(uri, 'swift://acct%3Ausr:[email protected]' '/container/obj-id') self._assert_invalid_swift_uri_raises_bad_store_uri(legacy_parse_uri)
def test_legacy_parse_swift_uri_017(self): metadata_encryption_key = "a" * 16 self.config(metadata_encryption_key=metadata_encryption_key) (legacy_parse_uri, encrypt_location) = from_migration_import( "017_quote_encrypted_swift_credentials", ["legacy_parse_uri", "encrypt_location"] ) uri = legacy_parse_uri("swift://*****:*****@example.com" "/container/obj-id", True) self.assertTrue(uri, encrypt_location("swift://acct%3Ausr:[email protected]/container/obj-id")) self._assert_invalid_swift_uri_raises_bad_store_uri(legacy_parse_uri)
def test_legacy_parse_swift_uri_017(self): metadata_encryption_key = 'a' * 16 CONF.set_override('metadata_encryption_key', metadata_encryption_key) self.addCleanup(CONF.reset) (legacy_parse_uri, encrypt_location) = from_migration_import( '017_quote_encrypted_swift_credentials', ['legacy_parse_uri', 'encrypt_location']) uri = legacy_parse_uri('swift://*****:*****@example.com' '/container/obj-id', True) self.assertTrue(uri, encrypt_location( 'swift://acct%3Ausr:[email protected]/container/obj-id')) self._assert_invalid_swift_uri_raises_bad_store_uri(legacy_parse_uri)
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (get_image_properties_table, ) = from_migration_import( '004_add_checksum', ['get_image_properties_table']) image_properties = get_image_properties_table(meta) index = Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) index.rename('ix_image_properties_image_id_name') image_properties = get_image_properties_table(meta) image_properties.columns['key'].alter(name="name")
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine (get_image_properties_table,) = from_migration_import( '004_add_checksum', ['get_image_properties_table']) image_properties = get_image_properties_table(meta) index = Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) index.rename('ix_image_properties_image_id_name') image_properties = get_image_properties_table(meta) image_properties.columns['key'].alter(name="name")
def define_image_properties_table(meta): (define_images_table,) = from_migration_import( '001_add_images_table', ['define_images_table']) images = define_images_table(meta) # noqa # NOTE(dperaza) DB2: specify the UniqueConstraint option when creating the # table will cause an index being created to specify the index # name and skip the step of creating another index with the same columns. # The index name is needed so it can be dropped and re-created later on. constr_kwargs = {} if meta.bind.name == 'ibm_db_sa': constr_kwargs['name'] = 'ix_image_properties_image_id_key' image_properties = Table('image_properties', meta, Column('id', Integer(), primary_key=True, nullable=False), Column('image_id', Integer(), ForeignKey('images.id'), nullable=False, index=True), Column('key', String(255), nullable=False), Column('value', Text()), Column('created_at', DateTime(), nullable=False), Column('updated_at', DateTime()), Column('deleted_at', DateTime()), Column('deleted', Boolean(), nullable=False, default=False, index=True), UniqueConstraint('image_id', 'key', **constr_kwargs), mysql_engine='InnoDB', mysql_charset='utf8', extend_existing=True) if meta.bind.name != 'ibm_db_sa': Index('ix_image_properties_image_id_key', image_properties.c.image_id, image_properties.c.key) return image_properties
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine # No changes to SQLite stores are necessary, since # there is no BIG INTEGER type in SQLite. Unfortunately, # running the Python 005_size_big_integer.py migration script # on a SQLite datastore results in an error in the sa-migrate # code that does the workarounds for SQLite not having # ALTER TABLE MODIFY COLUMN ability dialect = migrate_engine.url.get_dialect().name if not dialect.startswith("sqlite"): (get_images_table,) = from_migration_import("003_add_disk_format", ["get_images_table"]) images = get_images_table(meta) images.columns["size"].alter(type=BigInteger())
def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine # No changes to SQLite stores are necessary, since # there is no BIG INTEGER type in SQLite. Unfortunately, # running the Python 005_size_big_integer.py migration script # on a SQLite datastore results in an error in the sa-migrate # code that does the workarounds for SQLite not having # ALTER TABLE MODIFY COLUMN ability dialect = migrate_engine.url.get_dialect().name if not dialect.startswith('sqlite'): (get_images_table, ) = from_migration_import('003_add_disk_format', ['get_images_table']) images = get_images_table(meta) images.columns['size'].alter(type=BigInteger())
def define_image_properties_table(meta): (define_images_table,) = from_migration_import("001_add_images_table", ["define_images_table"]) images = define_images_table(meta) image_properties = Table( "image_properties", meta, Column("id", Integer(), primary_key=True, nullable=False), Column("image_id", Integer(), ForeignKey("images.id"), nullable=False, index=True), Column("key", String(255), nullable=False), Column("value", Text()), Column("created_at", DateTime(), nullable=False), Column("updated_at", DateTime()), Column("deleted_at", DateTime()), Column("deleted", Boolean(), nullable=False, default=False, index=True), UniqueConstraint("image_id", "key"), mysql_engine="InnoDB", extend_existing=True, ) Index("ix_image_properties_image_id_key", image_properties.c.image_id, image_properties.c.key) return image_properties
def get_image_properties_table(meta): """ Returns the Table object for the image_properties table that corresponds to the image_properties table definition of this version. """ (get_images_table, ) = from_migration_import('004_add_checksum', ['get_images_table']) images = get_images_table(meta) image_properties = Table('image_properties', meta, Column('id', Integer(), primary_key=True, nullable=False), Column('image_id', Integer(), ForeignKey('images.id'), nullable=False, index=True), Column('name', String(255), nullable=False), Column('value', Text()), Column('created_at', DateTime(), nullable=False), Column('updated_at', DateTime()), Column('deleted_at', DateTime()), Column('deleted', Boolean(), nullable=False, default=False, index=True), UniqueConstraint('image_id', 'name'), mysql_engine='InnoDB', extend_existing=True) return image_properties
def get_image_properties_table(meta): """ Returns the Table object for the image_properties table that corresponds to the image_properties table definition of this version. """ (get_images_table,) = from_migration_import( '004_add_checksum', ['get_images_table']) images = get_images_table(meta) image_properties = Table('image_properties', meta, Column('id', Integer(), primary_key=True, nullable=False), Column('image_id', Integer(), ForeignKey('images.id'), nullable=False, index=True), Column('name', String(255), nullable=False), Column('value', Text()), Column('created_at', DateTime(), nullable=False), Column('updated_at', DateTime()), Column('deleted_at', DateTime()), Column('deleted', Boolean(), nullable=False, default=False, index=True), UniqueConstraint('image_id', 'name'), mysql_engine='InnoDB', extend_existing=True) return image_properties