2ef027ed39
The Network model was implicitly relying on a core plugin to import the db_base_plugin_v2 module which would import the rbac model module so "NetworkRBAC" would be defined by the time something would query the DB. However, this isn't the case for scripts or agents that are importing models_v2 and trying to query the DB directly so they will now break with an sqlaclhemy error about a missing model. This patch makes models_v2 import the rbac_db_models module directly so the model will always be defined. This would have resulted in a circular import because the rbac_db_models module required the HasId and HasTenant classes in models_v2. So this patch also moves these helper classes into model_base. Change-Id: I338ce1c0ba55647e6410a63f937737f75a63057d Closes-Bug: #1488032
80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
# Copyright (c) 2012 OpenStack Foundation.
|
|
#
|
|
# 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.
|
|
|
|
from oslo_db.sqlalchemy import models
|
|
from oslo_utils import uuidutils
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.ext import declarative
|
|
from sqlalchemy import orm
|
|
|
|
from neutron.api.v2 import attributes as attr
|
|
|
|
|
|
class HasTenant(object):
|
|
"""Tenant mixin, add to subclasses that have a tenant."""
|
|
|
|
# NOTE(jkoelker) tenant_id is just a free form string ;(
|
|
tenant_id = sa.Column(sa.String(attr.TENANT_ID_MAX_LEN), index=True)
|
|
|
|
|
|
class HasId(object):
|
|
"""id mixin, add to subclasses that have an id."""
|
|
|
|
id = sa.Column(sa.String(36),
|
|
primary_key=True,
|
|
default=uuidutils.generate_uuid)
|
|
|
|
|
|
class HasStatusDescription(object):
|
|
"""Status with description mixin."""
|
|
|
|
status = sa.Column(sa.String(16), nullable=False)
|
|
status_description = sa.Column(sa.String(attr.DESCRIPTION_MAX_LEN))
|
|
|
|
|
|
class NeutronBase(models.ModelBase):
|
|
"""Base class for Neutron Models."""
|
|
|
|
__table_args__ = {'mysql_engine': 'InnoDB'}
|
|
|
|
def __iter__(self):
|
|
self._i = iter(orm.object_mapper(self).columns)
|
|
return self
|
|
|
|
def next(self):
|
|
n = next(self._i).name
|
|
return n, getattr(self, n)
|
|
|
|
__next__ = next
|
|
|
|
def __repr__(self):
|
|
"""sqlalchemy based automatic __repr__ method."""
|
|
items = ['%s=%r' % (col.name, getattr(self, col.name))
|
|
for col in self.__table__.columns]
|
|
return "<%s.%s[object at %x] {%s}>" % (self.__class__.__module__,
|
|
self.__class__.__name__,
|
|
id(self), ', '.join(items))
|
|
|
|
|
|
class NeutronBaseV2(NeutronBase):
|
|
|
|
@declarative.declared_attr
|
|
def __tablename__(cls):
|
|
# NOTE(jkoelker) use the pluralized name of the class as the table
|
|
return cls.__name__.lower() + 's'
|
|
|
|
|
|
BASEV2 = declarative.declarative_base(cls=NeutronBaseV2)
|