manila/manila/db/migrations/alembic/versions/55761e5f59c5_add_snapshot_s...

126 lines
4.1 KiB
Python

# Copyright 2015 Mirantis Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Add 'snapshot_support' extra spec to share types
Revision ID: 55761e5f59c5
Revises: 1f0bd302c1a6
Create Date: 2015-08-13 14:02:54.656864
"""
# revision identifiers, used by Alembic.
revision = '55761e5f59c5'
down_revision = '1f0bd302c1a6'
from alembic import op
from oslo_utils import timeutils
import sqlalchemy as sa
from sqlalchemy.sql import table
from manila.common import constants
def upgrade():
"""Performs DB upgrade to support feature of making snapshots optional.
Add 'snapshot_support' extra spec to all share types and
attr 'snapshot_support' to Share model.
"""
with sa.orm.Session(bind=op.get_bind()) as session:
es_table = table(
'share_type_extra_specs',
sa.Column('created_at', sa.DateTime),
sa.Column('deleted', sa.Integer),
sa.Column('share_type_id', sa.String(length=36)),
sa.Column('spec_key', sa.String(length=255)),
sa.Column('spec_value', sa.String(length=255)))
st_table = table(
'share_types',
sa.Column('deleted', sa.Integer),
sa.Column('id', sa.Integer))
# NOTE(vponomaryov): field 'deleted' is integer here.
existing_extra_specs = (session.query(es_table).
filter(es_table.c.spec_key ==
constants.ExtraSpecs.SNAPSHOT_SUPPORT).
filter(es_table.c.deleted == 0).
all())
exclude_st_ids = [es.share_type_id for es in existing_extra_specs]
# NOTE(vponomaryov): field 'deleted' is string here.
share_types = (session.query(st_table).
filter(st_table.c.deleted.in_(('0', 'False', ))).
filter(st_table.c.id.notin_(exclude_st_ids)).
all())
extra_specs = []
now = timeutils.utcnow()
for st in share_types:
extra_specs.append({
'spec_key': constants.ExtraSpecs.SNAPSHOT_SUPPORT,
'spec_value': 'True',
'deleted': 0,
'created_at': now,
'share_type_id': st.id,
})
if extra_specs:
op.bulk_insert(es_table, extra_specs)
# NOTE(vponomaryov): shares that were created before applying this
# migration can have incorrect value because they were created without
# consideration of driver capability to create snapshots.
op.add_column('shares',
sa.Column('snapshot_support', sa.Boolean, default=True))
connection = op.get_bind()
shares = sa.Table(
'shares',
sa.MetaData(),
autoload_with=connection)
# pylint: disable=no-value-for-parameter
update = shares.update().where(
shares.c.deleted == 'False'
).values(snapshot_support=True)
connection.execute(update)
def downgrade():
"""Performs DB downgrade removing support of 'optional snapshots' feature.
Remove 'snapshot_support' extra spec from all share types and
attr 'snapshot_support' from Share model.
"""
connection = op.get_bind()
extra_specs = sa.Table(
'share_type_extra_specs',
sa.MetaData(),
autoload_with=connection)
# pylint: disable=no-value-for-parameter
update = extra_specs.update().where(
extra_specs.c.spec_key == constants.ExtraSpecs.SNAPSHOT_SUPPORT).where(
extra_specs.c.deleted == 0).values(
deleted=extra_specs.c.id,
deleted_at=timeutils.utcnow(),
)
connection.execute(update)
op.drop_column('shares', 'snapshot_support')