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:
Victor Morales 2016-07-29 15:38:06 -05:00
parent 7200f0832f
commit fc93f7fcdb
4 changed files with 109 additions and 73 deletions

View File

@ -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()

View File

@ -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

View File

@ -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)

View File

@ -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)