¡@

Home 

OpenStack Study: 022_image_member_index.py

OpenStack Index

**** CubicPower OpenStack Study ****

def upgrade(migrate_engine):

    image_members = _get_image_members_table(migrate_engine)

    if (migrate_engine.name == 'mysql' or

            migrate_engine.name == 'postgresql'):

        try:

            UniqueConstraint('image_id',

                             name=_get_original_keyname(migrate_engine.name),

                             table=image_members).drop()

        except (OperationalError, ProgrammingError):

            UniqueConstraint('image_id',

                             name=_infer_original_keyname(image_members),

                             table=image_members).drop()

        UniqueConstraint('image_id',

                         'member',

                         'deleted_at',

                         name=NEW_KEYNAME,

                         table=image_members).create()

**** CubicPower OpenStack Study ****

def downgrade(migrate_engine):

    image_members = _get_image_members_table(migrate_engine)

    if (migrate_engine.name == 'mysql' or

            migrate_engine.name == 'postgresql'):

        _sanitize(migrate_engine, image_members)

        UniqueConstraint('image_id',

                         name=NEW_KEYNAME,

                         table=image_members).drop()

        UniqueConstraint('image_id',

                         'member',

                         name=_get_original_keyname(migrate_engine.name),

                         table=image_members).create()

**** CubicPower OpenStack Study ****

def _get_image_members_table(migrate_engine):

    meta = MetaData()

    meta.bind = migrate_engine

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

**** CubicPower OpenStack Study ****

def _get_original_keyname(db):

    return {'mysql': 'image_id',

            'postgresql': 'image_members_image_id_member_key'}[db]

**** CubicPower OpenStack Study ****

def _infer_original_keyname(table):

    for i in table.indexes:

        if ORIGINAL_KEYNAME_RE.match(i.name):

            return i.name

**** CubicPower OpenStack Study ****

def _sanitize(migrate_engine, table):

    """

    Avoid possible integrity error by removing deleted rows

    to accommdate less restrictive uniqueness constraint

    """

    session = orm.sessionmaker(bind=migrate_engine)()

    # find the image_member rows containing duplicate combinations

    # of image_id and member

    qry = (session.query(table.c.image_id, table.c.member)

                  .group_by(table.c.image_id, table.c.member)

                  .having(func.count() > 1))

    for image_id, member in qry:

        # only remove duplicate rows already marked deleted

        d = table.delete().where(and_(table.c.deleted == True,

                                      table.c.image_id == image_id,

                                      table.c.member == member))

        d.execute()

    session.close()