Relocate Flavor and ServiceProfile DB models
This patch will separate flavor and service profile db models from mixins for Oslo-Versioned Objects implementation work. Change-Id: Ia35d24c075dc716e44fbf8a9b6a2ebb0297e7aa9 Partial-Bug: #1597913
This commit is contained in:
parent
7200f0832f
commit
fc93f7fcdb
|
@ -12,68 +12,40 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from neutron_lib.db import model_base
|
||||
from oslo_db import exception as db_exc
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import uuidutils
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
from sqlalchemy.orm import exc as sa_exc
|
||||
|
||||
from neutron.api.v2 import attributes as attr
|
||||
from neutron.common import _deprecate
|
||||
from neutron.db import common_db_mixin
|
||||
from neutron.db.models import flavor as flavor_models
|
||||
from neutron.db import servicetype_db as sdb
|
||||
from neutron.extensions import flavors as ext_flavors
|
||||
|
||||
_deprecate._moved_global('Flavor', new_module=flavor_models)
|
||||
_deprecate._moved_global('ServiceProfile', new_module=flavor_models)
|
||||
_deprecate._moved_global('FlavorServiceProfileBinding',
|
||||
new_module=flavor_models)
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Flavor(model_base.BASEV2, model_base.HasId):
|
||||
name = sa.Column(sa.String(attr.NAME_MAX_LEN))
|
||||
description = sa.Column(sa.String(attr.LONG_DESCRIPTION_MAX_LEN))
|
||||
enabled = sa.Column(sa.Boolean, nullable=False, default=True,
|
||||
server_default=sa.sql.true())
|
||||
# Make it True for multi-type flavors
|
||||
service_type = sa.Column(sa.String(36), nullable=True)
|
||||
service_profiles = orm.relationship("FlavorServiceProfileBinding",
|
||||
cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class ServiceProfile(model_base.BASEV2, model_base.HasId):
|
||||
description = sa.Column(sa.String(attr.LONG_DESCRIPTION_MAX_LEN))
|
||||
driver = sa.Column(sa.String(1024), nullable=False)
|
||||
enabled = sa.Column(sa.Boolean, nullable=False, default=True,
|
||||
server_default=sa.sql.true())
|
||||
metainfo = sa.Column(sa.String(4096))
|
||||
flavors = orm.relationship("FlavorServiceProfileBinding")
|
||||
|
||||
|
||||
class FlavorServiceProfileBinding(model_base.BASEV2):
|
||||
flavor_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey("flavors.id",
|
||||
ondelete="CASCADE"),
|
||||
nullable=False, primary_key=True)
|
||||
flavor = orm.relationship(Flavor)
|
||||
service_profile_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey("serviceprofiles.id",
|
||||
ondelete="CASCADE"),
|
||||
nullable=False, primary_key=True)
|
||||
service_profile = orm.relationship(ServiceProfile)
|
||||
|
||||
|
||||
class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
||||
|
||||
"""Class to support flavors and service profiles."""
|
||||
|
||||
def _get_flavor(self, context, flavor_id):
|
||||
try:
|
||||
return self._get_by_id(context, Flavor, flavor_id)
|
||||
return self._get_by_id(context, flavor_models.Flavor, flavor_id)
|
||||
except sa_exc.NoResultFound:
|
||||
raise ext_flavors.FlavorNotFound(flavor_id=flavor_id)
|
||||
|
||||
def _get_service_profile(self, context, sp_id):
|
||||
try:
|
||||
return self._get_by_id(context, ServiceProfile, sp_id)
|
||||
return self._get_by_id(
|
||||
context, flavor_models.ServiceProfile, sp_id)
|
||||
except sa_exc.NoResultFound:
|
||||
raise ext_flavors.ServiceProfileNotFound(sp_id=sp_id)
|
||||
|
||||
|
@ -113,7 +85,7 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
|
||||
def _ensure_service_profile_not_in_use(self, context, sp_id):
|
||||
"""Ensures no current bindings to flavors exist."""
|
||||
fl = (context.session.query(FlavorServiceProfileBinding).
|
||||
fl = (context.session.query(flavor_models.FlavorServiceProfileBinding).
|
||||
filter_by(service_profile_id=sp_id).first())
|
||||
if fl:
|
||||
raise ext_flavors.ServiceProfileInUse(sp_id=sp_id)
|
||||
|
@ -131,11 +103,11 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
def create_flavor(self, context, flavor):
|
||||
fl = flavor['flavor']
|
||||
with context.session.begin(subtransactions=True):
|
||||
fl_db = Flavor(id=uuidutils.generate_uuid(),
|
||||
name=fl['name'],
|
||||
description=fl['description'],
|
||||
service_type=fl['service_type'],
|
||||
enabled=fl['enabled'])
|
||||
fl_db = flavor_models.Flavor(id=uuidutils.generate_uuid(),
|
||||
name=fl['name'],
|
||||
description=fl['description'],
|
||||
service_type=fl['service_type'],
|
||||
enabled=fl['enabled'])
|
||||
context.session.add(fl_db)
|
||||
return self._make_flavor_dict(fl_db)
|
||||
|
||||
|
@ -166,7 +138,8 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
|
||||
def get_flavors(self, context, filters=None, fields=None,
|
||||
sorts=None, limit=None, marker=None, page_reverse=False):
|
||||
return self._get_collection(context, Flavor, self._make_flavor_dict,
|
||||
return self._get_collection(context, flavor_models.Flavor,
|
||||
self._make_flavor_dict,
|
||||
filters=filters, fields=fields,
|
||||
sorts=sorts, limit=limit,
|
||||
marker_obj=marker,
|
||||
|
@ -176,13 +149,14 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
service_profile, flavor_id):
|
||||
sp = service_profile['service_profile']
|
||||
with context.session.begin(subtransactions=True):
|
||||
bind_qry = context.session.query(FlavorServiceProfileBinding)
|
||||
bind_qry = context.session.query(
|
||||
flavor_models.FlavorServiceProfileBinding)
|
||||
binding = bind_qry.filter_by(service_profile_id=sp['id'],
|
||||
flavor_id=flavor_id).first()
|
||||
if binding:
|
||||
raise ext_flavors.FlavorServiceProfileBindingExists(
|
||||
sp_id=sp['id'], fl_id=flavor_id)
|
||||
binding = FlavorServiceProfileBinding(
|
||||
binding = flavor_models.FlavorServiceProfileBinding(
|
||||
service_profile_id=sp['id'],
|
||||
flavor_id=flavor_id)
|
||||
context.session.add(binding)
|
||||
|
@ -192,9 +166,12 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
def delete_flavor_service_profile(self, context,
|
||||
service_profile_id, flavor_id):
|
||||
with context.session.begin(subtransactions=True):
|
||||
binding = (context.session.query(FlavorServiceProfileBinding).
|
||||
filter_by(service_profile_id=service_profile_id,
|
||||
flavor_id=flavor_id).first())
|
||||
binding = (
|
||||
context.session.query(
|
||||
flavor_models.FlavorServiceProfileBinding).
|
||||
filter_by(service_profile_id=service_profile_id,
|
||||
flavor_id=flavor_id).
|
||||
first())
|
||||
if not binding:
|
||||
raise ext_flavors.FlavorServiceProfileBindingNotFound(
|
||||
sp_id=service_profile_id, fl_id=flavor_id)
|
||||
|
@ -203,9 +180,12 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
def get_flavor_service_profile(self, context,
|
||||
service_profile_id, flavor_id, fields=None):
|
||||
with context.session.begin(subtransactions=True):
|
||||
binding = (context.session.query(FlavorServiceProfileBinding).
|
||||
filter_by(service_profile_id=service_profile_id,
|
||||
flavor_id=flavor_id).first())
|
||||
binding = (
|
||||
context.session.query(
|
||||
flavor_models.FlavorServiceProfileBinding).
|
||||
filter_by(service_profile_id=service_profile_id,
|
||||
flavor_id=flavor_id).
|
||||
first())
|
||||
if not binding:
|
||||
raise ext_flavors.FlavorServiceProfileBindingNotFound(
|
||||
sp_id=service_profile_id, fl_id=flavor_id)
|
||||
|
@ -223,11 +203,11 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
raise ext_flavors.ServiceProfileEmpty()
|
||||
|
||||
with context.session.begin(subtransactions=True):
|
||||
sp_db = ServiceProfile(id=uuidutils.generate_uuid(),
|
||||
description=sp['description'],
|
||||
driver=sp['driver'],
|
||||
enabled=sp['enabled'],
|
||||
metainfo=sp['metainfo'])
|
||||
sp_db = flavor_models.ServiceProfile(id=uuidutils.generate_uuid(),
|
||||
description=sp['description'],
|
||||
driver=sp['driver'],
|
||||
enabled=sp['enabled'],
|
||||
metainfo=sp['metainfo'])
|
||||
context.session.add(sp_db)
|
||||
|
||||
return self._make_service_profile_dict(sp_db)
|
||||
|
@ -259,7 +239,7 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
def get_service_profiles(self, context, filters=None, fields=None,
|
||||
sorts=None, limit=None, marker=None,
|
||||
page_reverse=False):
|
||||
return self._get_collection(context, ServiceProfile,
|
||||
return self._get_collection(context, flavor_models.ServiceProfile,
|
||||
self._make_service_profile_dict,
|
||||
filters=filters, fields=fields,
|
||||
sorts=sorts, limit=limit,
|
||||
|
@ -273,7 +253,8 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
"""From flavor, choose service profile and find provider for driver."""
|
||||
|
||||
with context.session.begin(subtransactions=True):
|
||||
bind_qry = context.session.query(FlavorServiceProfileBinding)
|
||||
bind_qry = context.session.query(
|
||||
flavor_models.FlavorServiceProfileBinding)
|
||||
binding = bind_qry.filter_by(flavor_id=flavor_id).first()
|
||||
if not binding:
|
||||
raise ext_flavors.FlavorServiceProfileBindingNotFound(
|
||||
|
@ -303,3 +284,6 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
|
|||
'provider': providers[0].get('name')}
|
||||
|
||||
return [self._fields(res, fields)]
|
||||
|
||||
|
||||
_deprecate._MovedGlobals()
|
||||
|
|
|
@ -30,7 +30,6 @@ from neutron.db import agents_db # noqa
|
|||
from neutron.db import agentschedulers_db # noqa
|
||||
from neutron.db import dns_db # noqa
|
||||
from neutron.db.extra_dhcp_opt import models as edo_models # noqa
|
||||
from neutron.db import flavors_db # noqa
|
||||
from neutron.db import l3_dvrscheduler_db # noqa
|
||||
from neutron.db import l3_gwmode_db # noqa
|
||||
from neutron.db import models
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
# 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 neutron_lib.db import model_base
|
||||
from oslo_log import log as logging
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
|
||||
from neutron.api.v2 import attributes as attr
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Flavor(model_base.BASEV2, model_base.HasId):
|
||||
name = sa.Column(sa.String(attr.NAME_MAX_LEN))
|
||||
description = sa.Column(sa.String(attr.LONG_DESCRIPTION_MAX_LEN))
|
||||
enabled = sa.Column(sa.Boolean, nullable=False, default=True,
|
||||
server_default=sa.sql.true())
|
||||
# Make it True for multi-type flavors
|
||||
service_type = sa.Column(sa.String(36), nullable=True)
|
||||
service_profiles = orm.relationship("FlavorServiceProfileBinding",
|
||||
cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class ServiceProfile(model_base.BASEV2, model_base.HasId):
|
||||
description = sa.Column(sa.String(attr.LONG_DESCRIPTION_MAX_LEN))
|
||||
driver = sa.Column(sa.String(1024), nullable=False)
|
||||
enabled = sa.Column(sa.Boolean, nullable=False, default=True,
|
||||
server_default=sa.sql.true())
|
||||
metainfo = sa.Column(sa.String(4096))
|
||||
flavors = orm.relationship("FlavorServiceProfileBinding")
|
||||
|
||||
|
||||
class FlavorServiceProfileBinding(model_base.BASEV2):
|
||||
flavor_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey("flavors.id",
|
||||
ondelete="CASCADE"),
|
||||
nullable=False, primary_key=True)
|
||||
flavor = orm.relationship(Flavor)
|
||||
service_profile_id = sa.Column(sa.String(36),
|
||||
sa.ForeignKey("serviceprofiles.id",
|
||||
ondelete="CASCADE"),
|
||||
nullable=False, primary_key=True)
|
||||
service_profile = orm.relationship(ServiceProfile)
|
|
@ -24,7 +24,7 @@ from webob import exc
|
|||
from neutron.api.v2 import attributes as attr
|
||||
from neutron import context
|
||||
from neutron.db import api as dbapi
|
||||
from neutron.db import flavors_db
|
||||
from neutron.db.models import flavor as flavor_models
|
||||
from neutron.db.models import l3 as l3_models
|
||||
from neutron.db import servicetype_db
|
||||
from neutron.extensions import flavors
|
||||
|
@ -476,7 +476,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
|
||||
def test_create_flavor(self):
|
||||
self._create_flavor()
|
||||
res = self.ctx.session.query(flavors_db.Flavor).all()
|
||||
res = self.ctx.session.query(flavor_models.Flavor).all()
|
||||
self.assertEqual(1, len(res))
|
||||
self.assertEqual('GOLD', res[0]['name'])
|
||||
self.assertEqual(constants.DUMMY, res[0]['service_type'])
|
||||
|
@ -486,7 +486,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
flavor = {'flavor': {'name': 'Silver',
|
||||
'enabled': False}}
|
||||
self.plugin.update_flavor(self.ctx, fl['id'], flavor)
|
||||
res = (self.ctx.session.query(flavors_db.Flavor).
|
||||
res = (self.ctx.session.query(flavor_models.Flavor).
|
||||
filter_by(id=fl['id']).one())
|
||||
self.assertEqual('Silver', res['name'])
|
||||
self.assertFalse(res['enabled'])
|
||||
|
@ -494,7 +494,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
def test_delete_flavor(self):
|
||||
fl, data = self._create_flavor()
|
||||
self.plugin.delete_flavor(self.ctx, fl['id'])
|
||||
res = (self.ctx.session.query(flavors_db.Flavor).all())
|
||||
res = (self.ctx.session.query(flavor_models.Flavor).all())
|
||||
self.assertFalse(res)
|
||||
|
||||
def test_show_flavor(self):
|
||||
|
@ -521,7 +521,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
|
||||
def test_create_service_profile(self):
|
||||
sp, data = self._create_service_profile()
|
||||
res = (self.ctx.session.query(flavors_db.ServiceProfile).
|
||||
res = (self.ctx.session.query(flavor_models.ServiceProfile).
|
||||
filter_by(id=sp['id']).one())
|
||||
self.assertEqual(data['service_profile']['driver'], res['driver'])
|
||||
self.assertEqual(data['service_profile']['metainfo'], res['metainfo'])
|
||||
|
@ -534,7 +534,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
'metainfo': '{"data": "value"}'}}
|
||||
sp = self.plugin.create_service_profile(self.ctx,
|
||||
data)
|
||||
res = (self.ctx.session.query(flavors_db.ServiceProfile).
|
||||
res = (self.ctx.session.query(flavor_models.ServiceProfile).
|
||||
filter_by(id=sp['id']).one())
|
||||
self.assertEqual(data['service_profile']['driver'], res['driver'])
|
||||
self.assertEqual(data['service_profile']['metainfo'], res['metainfo'])
|
||||
|
@ -566,14 +566,14 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
data['service_profile']['metainfo'] = '{"data": "value1"}'
|
||||
sp = self.plugin.update_service_profile(self.ctx, sp['id'],
|
||||
data)
|
||||
res = (self.ctx.session.query(flavors_db.ServiceProfile).
|
||||
res = (self.ctx.session.query(flavor_models.ServiceProfile).
|
||||
filter_by(id=sp['id']).one())
|
||||
self.assertEqual(data['service_profile']['metainfo'], res['metainfo'])
|
||||
|
||||
def test_delete_service_profile(self):
|
||||
sp, data = self._create_service_profile()
|
||||
self.plugin.delete_service_profile(self.ctx, sp['id'])
|
||||
res = self.ctx.session.query(flavors_db.ServiceProfile).all()
|
||||
res = self.ctx.session.query(flavor_models.ServiceProfile).all()
|
||||
self.assertFalse(res)
|
||||
|
||||
def test_show_service_profile(self):
|
||||
|
@ -594,7 +594,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
{'service_profile': {'id': sp['id']}},
|
||||
fl['id'])
|
||||
binding = (
|
||||
self.ctx.session.query(flavors_db.FlavorServiceProfileBinding).
|
||||
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
|
||||
first())
|
||||
self.assertEqual(fl['id'], binding['flavor_id'])
|
||||
self.assertEqual(sp['id'], binding['service_profile_id'])
|
||||
|
@ -616,7 +616,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
fl['id'])
|
||||
self.plugin.delete_flavor(self.ctx, fl['id'])
|
||||
binding = (
|
||||
self.ctx.session.query(flavors_db.FlavorServiceProfileBinding).
|
||||
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
|
||||
first())
|
||||
self.assertIsNone(binding)
|
||||
|
||||
|
@ -643,7 +643,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
|
|||
self.plugin.delete_flavor_service_profile(
|
||||
self.ctx, sp['id'], fl['id'])
|
||||
binding = (
|
||||
self.ctx.session.query(flavors_db.FlavorServiceProfileBinding).
|
||||
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
|
||||
first())
|
||||
self.assertIsNone(binding)
|
||||
|
||||
|
|
Loading…
Reference in New Issue