100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
# 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_cast_rules_to_readonly_to_share_instances
|
|
|
|
Revision ID: e9f79621d83f
|
|
Revises: 54667b9cade7
|
|
Create Date: 2016-12-01 04:06:33.115054
|
|
|
|
"""
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = 'e9f79621d83f'
|
|
down_revision = '54667b9cade7'
|
|
|
|
from alembic import op
|
|
from oslo_log import log
|
|
import sqlalchemy as sa
|
|
|
|
from manila.common import constants
|
|
from manila.db.migrations import utils
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
|
|
def upgrade():
|
|
|
|
LOG.info("Adding cast_rules_to_readonly column to share instances.")
|
|
|
|
op.add_column('share_instances',
|
|
sa.Column('cast_rules_to_readonly', sa.Boolean,
|
|
default=False))
|
|
|
|
connection = op.get_bind()
|
|
shares_table = utils.load_table('shares', connection)
|
|
share_instances_table = utils.load_table('share_instances', connection)
|
|
|
|
# First, set the value of ``cast_rules_to_readonly`` in every existing
|
|
# share instance to False
|
|
op.execute(
|
|
share_instances_table.update().values({
|
|
'cast_rules_to_readonly': False,
|
|
})
|
|
)
|
|
|
|
# Set the value of ``cast_rules_to_readonly`` to True for secondary
|
|
# replicas in 'readable' replication relationships
|
|
replicated_shares_query = (
|
|
shares_table.select()
|
|
.where(shares_table.c.deleted == 'False')
|
|
.where(shares_table.c.replication_type
|
|
== constants.REPLICATION_TYPE_READABLE)
|
|
)
|
|
|
|
for replicated_share in connection.execute(replicated_shares_query):
|
|
# NOTE (gouthamr): Only secondary replicas that are not undergoing a
|
|
# 'replication_change' (promotion to active) are considered. When the
|
|
# replication change is complete, the share manager will take care
|
|
# of ensuring the correct values for the replicas that were involved
|
|
# in the transaction.
|
|
secondary_replicas_query = (
|
|
share_instances_table.select().where(
|
|
share_instances_table.c.deleted == 'False').where(
|
|
share_instances_table.c.replica_state
|
|
!= constants.REPLICA_STATE_ACTIVE).where(
|
|
share_instances_table.c.status
|
|
!= constants.STATUS_REPLICATION_CHANGE).where(
|
|
replicated_share['id'] == share_instances_table.c.share_id
|
|
)
|
|
)
|
|
for replica in connection.execute(secondary_replicas_query):
|
|
op.execute(
|
|
share_instances_table.update().where(
|
|
share_instances_table.c.id == replica.id
|
|
).values({
|
|
'cast_rules_to_readonly': True,
|
|
})
|
|
)
|
|
|
|
op.alter_column('share_instances',
|
|
'cast_rules_to_readonly',
|
|
existing_type=sa.Boolean,
|
|
existing_server_default=False,
|
|
nullable=False)
|
|
|
|
|
|
def downgrade():
|
|
LOG.info("Removing cast_rules_to_readonly column from share "
|
|
"instances.")
|
|
op.drop_column('share_instances', 'cast_rules_to_readonly')
|