Merge "Rename DB columns: tenant -> project"

This commit is contained in:
Jenkins
2016年08月04日 21:25:19 +00:00
committed by Gerrit Code Review

View File

@@ -13,34 +13,61 @@
# License for the specific language governing permissions and limitations
# under the License.
from oslo_db import exception as db_exc
from oslo_log import log
from oslo_utils import uuidutils
import sqlalchemy as sa
from sqlalchemy.ext import declarative
from sqlalchemy import orm
from sqlalchemy.orm import exc
from neutron.api.v2 import attributes as attr
from neutron.db import common_db_mixin
from neutron.db import model_base
from neutron.db import models_v2
from oslo_db import exception as db_exc
from oslo_log import log
from oslo_utils import uuidutils
import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.orm import exc
from networking_bgpvpn._i18n import _LI
from networking_bgpvpn._i18n import _LW
from networking_bgpvpn.neutron.extensions import bgpvpn as bgpvpn_ext
from networking_bgpvpn.neutron.services.common import utils
LOG = log.getLogger(__name__)
class HasTenantNotNullable(object):
"""Non-nullable Tenant mixin."""
tenant_id = sa.Column(sa.String(255), index=True, nullable=False)
class HasProject(object):
# NOTE(dasm): Temporary solution!
# Remove when I87a8ef342ccea004731ba0192b23a8e79bc382dc is merged.
# NOTE(jkoelker) project_id is just a free form string ;(
project_id = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN), index=True)
def __init__(self, *args, **kwargs):
# NOTE(dasm): debtcollector requires init in class
super(HasProject, self).__init__(*args, **kwargs)
def get_tenant_id(self):
return self.project_id
def set_tenant_id(self, value):
self.project_id = value
@declarative.declared_attr
def tenant_id(cls):
return orm.synonym(
'project_id',
descriptor=property(cls.get_tenant_id, cls.set_tenant_id))
class HasProjectNotNullable(HasProject):
# NOTE(dasm): Temporary solution!
# Remove when I87a8ef342ccea004731ba0192b23a8e79bc382dc is merged.
project_id = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN), index=True,
nullable=False)
class BGPVPNNetAssociation(model_base.BASEV2, models_v2.HasId,
HasTenantNotNullable):
HasProjectNotNullable):
"""Represents the association between a bgpvpn and a network."""
__tablename__ = 'bgpvpn_network_associations'
@@ -58,7 +85,7 @@ class BGPVPNNetAssociation(model_base.BASEV2, models_v2.HasId,
class BGPVPNRouterAssociation(model_base.BASEV2, models_v2.HasId,
HasTenantNotNullable):
HasProjectNotNullable):
"""Represents the association between a bgpvpn and a router."""
__tablename__ = 'bgpvpn_router_associations'
@@ -75,7 +102,7 @@ class BGPVPNRouterAssociation(model_base.BASEV2, models_v2.HasId,
lazy='joined',)
class BGPVPN(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
class BGPVPN(model_base.BASEV2, models_v2.HasId, HasProject):
"""Represents a BGPVPN Object."""
name = sa.Column(sa.String(255))
type = sa.Column(sa.Enum("l2", "l3",

View File

@@ -0,0 +1,135 @@
# Copyright 2016 Intel Corporation
#
# 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.
#
"""rename tenant to project
Revision ID: 010308b06b49
Create Date: 2016年06月29日 19:42:17.862721
"""
# revision identifiers, used by Alembic.
revision = '23ce05e0a19f'
down_revision = '180baa4183e0'
depends_on = ('0ab4049986b8',)
from alembic import op
import sqlalchemy as sa
from sqlalchemy.engine import reflection
_INSPECTOR = None
def get_inspector():
"""Reuse inspector"""
global _INSPECTOR
if _INSPECTOR:
return _INSPECTOR
else:
bind = op.get_bind()
_INSPECTOR = reflection.Inspector.from_engine(bind)
return _INSPECTOR
def get_tables():
"""Returns hardcoded list of tables which have ``tenant_id`` column.
The list is hard-coded to match the state of the schema when this upgrade
script is run.
"""
tables = [
'bgpvpn_router_associations',
'bgpvpns',
'bgpvpn_network_associations',
]
return tables
def get_columns(table):
"""Returns list of columns for given table."""
inspector = get_inspector()
return inspector.get_columns(table)
def get_data():
"""Returns combined list of tuples: [(table, column)].
The list is built from tables with a tenant_id column.
"""
output = []
tables = get_tables()
for table in tables:
columns = get_columns(table)
for column in columns:
if column['name'] == 'tenant_id':
output.append((table, column))
return output
def alter_column(table, column):
old_name = 'tenant_id'
new_name = 'project_id'
op.alter_column(
table_name=table,
column_name=old_name,
new_column_name=new_name,
existing_type=column['type'],
existing_nullable=column['nullable']
)
def recreate_index(index, table_name):
old_name = index['name']
new_name = old_name.replace('tenant', 'project')
op.drop_index(op.f(old_name), table_name)
op.create_index(new_name, table_name, ['project_id'])
def upgrade():
inspector = get_inspector()
data = get_data()
for table, column in data:
alter_column(table, column)
indexes = inspector.get_indexes(table)
for index in indexes:
if 'tenant_id' in index['name']:
recreate_index(index, table)
def contract_creation_exceptions():
"""Special migration for the blueprint to support Keystone V3.
We drop all tenant_id columns and create project_id columns instead.
"""
return {
sa.Column: ['.'.join([table, 'project_id']) for table in get_tables()],
sa.Index: get_tables()
}
Reference in New Issue
openstack/networking-bgpvpn
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.

The note is not visible to the blocked user.