Flavor and Service Profile to OVO

This patch introduces and integrates Flavor and Service Profile model
classes to Oslo-Versioned Objects

Change-Id: I2963fabfc857ca68e9e6fb4e89e3c3ca6807a959
Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db
Co-author-by: Eli Qiao <liyong.qiao@intel.com>
This commit is contained in:
Victor Morales 2016-04-16 00:11:14 -05:00
parent d8e3596259
commit 8de5060784
6 changed files with 295 additions and 154 deletions

View File

@ -14,8 +14,6 @@
from oslo_db import exception as db_exc
from oslo_log import log as logging
from oslo_utils import uuidutils
from sqlalchemy.orm import exc as sa_exc
from neutron.common import _deprecate
from neutron.db import _utils as db_utils
@ -24,6 +22,8 @@ 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
from neutron.objects import base as base_obj
from neutron.objects import flavor as obj_flavor
_deprecate._moved_global('Flavor', new_module=flavor_models)
_deprecate._moved_global('ServiceProfile', new_module=flavor_models)
@ -39,41 +39,37 @@ 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_models.Flavor, flavor_id)
except sa_exc.NoResultFound:
flavor = obj_flavor.Flavor.get_object(context, id=flavor_id)
if not flavor:
raise ext_flavors.FlavorNotFound(flavor_id=flavor_id)
return flavor
def _get_service_profile(self, context, sp_id):
try:
return self._get_by_id(
context, flavor_models.ServiceProfile, sp_id)
except sa_exc.NoResultFound:
service_profile = obj_flavor.ServiceProfile.get_object(
context, id=sp_id)
if not service_profile:
raise ext_flavors.ServiceProfileNotFound(sp_id=sp_id)
return service_profile
@staticmethod
def _make_flavor_dict(flavor_db, fields=None):
res = {'id': flavor_db['id'],
'name': flavor_db['name'],
'description': flavor_db['description'],
'service_type': flavor_db['service_type'],
'enabled': flavor_db['enabled'],
'service_profiles': []}
if flavor_db.service_profiles:
res['service_profiles'] = [sp['service_profile_id']
for sp in flavor_db.service_profiles]
def _make_flavor_dict(flavor_obj, fields=None):
res = {'id': flavor_obj['id'],
'name': flavor_obj['name'],
'description': flavor_obj['description'],
'service_type': flavor_obj['service_type'],
'enabled': flavor_obj['enabled'],
'service_profiles': list(flavor_obj['service_profile_ids'])}
return db_utils.resource_fields(res, fields)
@staticmethod
def _make_service_profile_dict(sp_db, fields=None):
res = {'id': sp_db['id'],
'description': sp_db['description'],
'driver': sp_db['driver'],
'enabled': sp_db['enabled'],
'metainfo': sp_db['metainfo']}
if sp_db.flavors:
res['flavors'] = [fl['flavor_id']
for fl in sp_db.flavors]
def _make_service_profile_dict(sp_obj, fields=None):
res = {'id': sp_obj['id'],
'description': sp_obj['description'],
'driver': sp_obj['driver'],
'enabled': sp_obj['enabled'],
'metainfo': sp_obj['metainfo'],
'flavors': list(sp_obj['flavor_ids'])}
return db_utils.resource_fields(res, fields)
def _ensure_flavor_not_in_use(self, context, flavor_id):
@ -89,9 +85,8 @@ 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(flavor_models.FlavorServiceProfileBinding).
filter_by(service_profile_id=sp_id).first())
if fl:
if obj_flavor.FlavorServiceProfileBinding.objects_exist(
context, service_profile_id=sp_id):
raise ext_flavors.ServiceProfileInUse(sp_id=sp_id)
def _validate_driver(self, context, driver):
@ -106,22 +101,19 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
def create_flavor(self, context, flavor):
fl = flavor['flavor']
with db_api.context_manager.writer.using(context):
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)
obj = obj_flavor.Flavor(
context, name=fl['name'], description=fl['description'],
service_type=fl['service_type'], enabled=fl['enabled'])
obj.create()
return self._make_flavor_dict(obj)
def update_flavor(self, context, flavor_id, flavor):
fl = flavor['flavor']
with db_api.context_manager.writer.using(context):
self._ensure_flavor_not_in_use(context, flavor_id)
fl_db = self._get_flavor(context, flavor_id)
fl_db.update(fl)
return self._make_flavor_dict(fl_db)
fl_obj = self._get_flavor(context, flavor_id)
fl_obj.update_fields(flavor['flavor'])
fl_obj.update()
return self._make_flavor_dict(fl_obj)
def get_flavor(self, context, flavor_id, fields=None):
fl = self._get_flavor(context, flavor_id)
@ -135,65 +127,49 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
try:
with db_api.context_manager.writer.using(context):
self._ensure_flavor_not_in_use(context, flavor_id)
fl_db = self._get_flavor(context, flavor_id)
context.session.delete(fl_db)
self._get_flavor(context, flavor_id).delete()
except db_exc.DBReferenceError:
raise ext_flavors.FlavorInUse(flavor_id=flavor_id)
def get_flavors(self, context, filters=None, fields=None,
sorts=None, limit=None, marker=None, page_reverse=False):
return self._get_collection(context, flavor_models.Flavor,
self._make_flavor_dict,
filters=filters, fields=fields,
sorts=sorts, limit=limit,
marker_obj=marker,
page_reverse=page_reverse)
pager = base_obj.Pager(sorts, limit, page_reverse, marker)
filters = filters or {}
flavor_objs = obj_flavor.Flavor.get_objects(context, _pager=pager,
**filters)
return [self._make_flavor_dict(flavor_object, fields)
for flavor_object in flavor_objs]
def create_flavor_service_profile(self, context,
service_profile, flavor_id):
sp = service_profile['service_profile']
with db_api.context_manager.writer.using(context):
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:
if obj_flavor.FlavorServiceProfileBinding.objects_exist(
context, service_profile_id=sp['id'], flavor_id=flavor_id):
raise ext_flavors.FlavorServiceProfileBindingExists(
sp_id=sp['id'], fl_id=flavor_id)
binding = flavor_models.FlavorServiceProfileBinding(
service_profile_id=sp['id'],
flavor_id=flavor_id)
context.session.add(binding)
fl_db = self._get_flavor(context, flavor_id)
return self._make_flavor_dict(fl_db)
obj_flavor.FlavorServiceProfileBinding(
context, service_profile_id=sp['id'],
flavor_id=flavor_id).create()
fl_obj = self._get_flavor(context, flavor_id)
return self._make_flavor_dict(fl_obj)
def delete_flavor_service_profile(self, context,
service_profile_id, flavor_id):
with db_api.context_manager.writer.using(context):
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)
context.session.delete(binding)
if (obj_flavor.FlavorServiceProfileBinding.delete_objects(
context, service_profile_id=service_profile_id,
flavor_id=flavor_id) == 0):
raise ext_flavors.FlavorServiceProfileBindingNotFound(
sp_id=service_profile_id, fl_id=flavor_id)
@staticmethod
def get_flavor_service_profile(context,
service_profile_id, flavor_id, fields=None):
with db_api.context_manager.reader.using(context):
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)
if not obj_flavor.FlavorServiceProfileBinding.objects_exist(
context, service_profile_id=service_profile_id,
flavor_id=flavor_id):
raise ext_flavors.FlavorServiceProfileBindingNotFound(
sp_id=service_profile_id, fl_id=flavor_id)
res = {'service_profile_id': service_profile_id,
'flavor_id': flavor_id}
return db_utils.resource_fields(res, fields)
@ -207,14 +183,11 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
if not sp['metainfo']:
raise ext_flavors.ServiceProfileEmpty()
with db_api.context_manager.writer.using(context):
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)
obj = obj_flavor.ServiceProfile(
context, description=sp['description'], driver=sp['driver'],
enabled=sp['enabled'], metainfo=sp['metainfo'])
obj.create()
return self._make_service_profile_dict(obj)
def update_service_profile(self, context,
service_profile_id, service_profile):
@ -226,9 +199,10 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
with db_api.context_manager.writer.using(context):
self._ensure_service_profile_not_in_use(context,
service_profile_id)
sp_db = self._get_service_profile(context, service_profile_id)
sp_db.update(sp)
return self._make_service_profile_dict(sp_db)
sp_obj = self._get_service_profile(context, service_profile_id)
sp_obj.update_fields(sp)
sp_obj.update()
return self._make_service_profile_dict(sp_obj)
def get_service_profile(self, context, sp_id, fields=None):
sp_db = self._get_service_profile(context, sp_id)
@ -237,18 +211,17 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
def delete_service_profile(self, context, sp_id):
with db_api.context_manager.writer.using(context):
self._ensure_service_profile_not_in_use(context, sp_id)
sp_db = self._get_service_profile(context, sp_id)
context.session.delete(sp_db)
self._get_service_profile(context, sp_id).delete()
def get_service_profiles(self, context, filters=None, fields=None,
sorts=None, limit=None, marker=None,
page_reverse=False):
return self._get_collection(context, flavor_models.ServiceProfile,
self._make_service_profile_dict,
filters=filters, fields=fields,
sorts=sorts, limit=limit,
marker_obj=marker,
page_reverse=page_reverse)
pager = base_obj.Pager(sorts, limit, page_reverse, marker)
filters = filters or {}
sp_objs = obj_flavor.ServiceProfile.get_objects(context, _pager=pager,
**filters)
return [self._make_service_profile_dict(sp_obj, fields)
for sp_obj in sp_objs]
def get_flavor_next_provider(self, context, flavor_id,
filters=None, fields=None,
@ -256,35 +229,32 @@ class FlavorsDbMixin(common_db_mixin.CommonDbMixin):
marker=None, page_reverse=False):
"""From flavor, choose service profile and find provider for driver."""
with db_api.context_manager.reader.using(context):
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(
sp_id='', fl_id=flavor_id)
objs = obj_flavor.FlavorServiceProfileBinding.get_objects(context,
flavor_id=flavor_id)
if not objs:
raise ext_flavors.FlavorServiceProfileBindingNotFound(
sp_id='', fl_id=flavor_id)
# Get the service profile from the first binding
# TODO(jwarendt) Should become a scheduling framework instead
sp_db = self._get_service_profile(context,
binding['service_profile_id'])
sp_obj = self._get_service_profile(context, objs[0].service_profile_id)
if not sp_db.enabled:
if not sp_obj.enabled:
raise ext_flavors.ServiceProfileDisabled()
LOG.debug("Found driver %s.", sp_db.driver)
LOG.debug("Found driver %s.", sp_obj.driver)
service_type_manager = sdb.ServiceTypeManager.get_instance()
providers = service_type_manager.get_service_providers(
context,
filters={'driver': sp_db.driver})
filters={'driver': sp_obj.driver})
if not providers:
raise ext_flavors.ServiceProfileDriverNotFound(driver=sp_db.driver)
raise ext_flavors.ServiceProfileDriverNotFound(
driver=sp_obj.driver)
LOG.debug("Found providers %s.", providers)
res = {'driver': sp_db.driver,
res = {'driver': sp_obj.driver,
'provider': providers[0].get('name')}
return [db_utils.resource_fields(res, fields)]

97
neutron/objects/flavor.py Normal file
View File

@ -0,0 +1,97 @@
# Copyright (c) 2016 Intel Corporation.
# All Rights Reserved.
#
# 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_versionedobjects import base as obj_base
from oslo_versionedobjects import fields as obj_fields
from neutron.db.models import flavor as models
from neutron.objects import base
from neutron.objects import common_types
@obj_base.VersionedObjectRegistry.register
class FlavorServiceProfileBinding(base.NeutronDbObject):
# Version 1.0: Initial version
VERSION = '1.0'
db_model = models.FlavorServiceProfileBinding
primary_keys = ['flavor_id', 'service_profile_id']
fields = {
'flavor_id': common_types.UUIDField(),
'service_profile_id': common_types.UUIDField(),
}
@obj_base.VersionedObjectRegistry.register
class ServiceProfile(base.NeutronDbObject):
# Version 1.0: Initial version
VERSION = '1.0'
db_model = models.ServiceProfile
synthetic_fields = ['flavor_ids']
fields = {
'id': common_types.UUIDField(),
'description': obj_fields.StringField(nullable=True),
'driver': obj_fields.StringField(),
'enabled': obj_fields.BooleanField(default=True),
'metainfo': obj_fields.StringField(nullable=True),
'flavor_ids': common_types.SetOfUUIDsField(nullable=True, default=None)
}
def from_db_object(self, db_obj):
super(ServiceProfile, self).from_db_object(db_obj)
if db_obj.get('flavors', []):
self.flavor_ids = {
fl.flavor_id
for fl in db_obj.flavors
}
else:
self.flavor_ids = set()
self.obj_reset_changes(['flavor_ids'])
@obj_base.VersionedObjectRegistry.register
class Flavor(base.NeutronDbObject):
# Version 1.0: Initial version
VERSION = '1.0'
db_model = models.Flavor
synthetic_fields = ['service_profile_ids']
fields = {
'id': common_types.UUIDField(),
'name': obj_fields.StringField(nullable=True),
'description': obj_fields.StringField(nullable=True),
'enabled': obj_fields.BooleanField(default=True),
'service_type': obj_fields.StringField(nullable=True),
'service_profile_ids': common_types.SetOfUUIDsField(nullable=True,
default=None)
}
def from_db_object(self, db_obj):
super(Flavor, self).from_db_object(db_obj)
if db_obj.get('service_profiles', []):
self.service_profile_ids = {
sp.service_profile_id
for sp in db_obj.service_profiles
}
else:
self.service_profile_ids = set()
self.obj_reset_changes(['service_profile_ids'])

View File

@ -24,10 +24,10 @@ from webob import exc
from neutron import context
from neutron.db import api as dbapi
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
from neutron.objects import flavor as flavor_obj
from neutron.plugins.common import constants
from neutron.services.flavors import flavors_plugin
from neutron.services import provider_configuration as provconf
@ -409,10 +409,6 @@ class FlavorExtensionTestCase(extension.ExtensionTestCase):
status=exc.HTTPBadRequest.code)
class DummyCorePlugin(object):
pass
class DummyServicePlugin(object):
def driver_loaded(self, driver, service_profile):
@ -442,9 +438,6 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
super(FlavorPluginTestCase, self).setUp()
self.config_parse()
cfg.CONF.set_override(
'core_plugin',
'neutron.tests.unit.extensions.test_flavors.DummyCorePlugin')
cfg.CONF.set_override(
'service_plugins',
['neutron.tests.unit.extensions.test_flavors.DummyServicePlugin'])
@ -476,7 +469,7 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
def test_create_flavor(self):
self._create_flavor()
res = self.ctx.session.query(flavor_models.Flavor).all()
res = flavor_obj.Flavor.get_objects(self.ctx)
self.assertEqual(1, len(res))
self.assertEqual('GOLD', res[0]['name'])
self.assertEqual(constants.DUMMY, res[0]['service_type'])
@ -486,19 +479,17 @@ 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(flavor_models.Flavor).
filter_by(id=fl['id']).one())
res = flavor_obj.Flavor.get_object(self.ctx, id=fl['id'])
self.assertEqual('Silver', res['name'])
self.assertFalse(res['enabled'])
def test_delete_flavor(self):
fl, data = self._create_flavor()
fl, _ = self._create_flavor()
self.plugin.delete_flavor(self.ctx, fl['id'])
res = (self.ctx.session.query(flavor_models.Flavor).all())
self.assertFalse(res)
self.assertFalse(flavor_obj.Flavor.objects_exist(self.ctx))
def test_show_flavor(self):
fl, data = self._create_flavor()
fl, _ = self._create_flavor()
show_fl = self.plugin.get_flavor(self.ctx, fl['id'])
self.assertEqual(fl, show_fl)
@ -521,10 +512,10 @@ 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(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'])
res = flavor_obj.ServiceProfile.get_object(self.ctx, id=sp['id'])
self.assertIsNotNone(res)
self.assertEqual(data['service_profile']['driver'], res.driver)
self.assertEqual(data['service_profile']['metainfo'], res.metainfo)
def test_create_service_profile_empty_driver(self):
data = {'service_profile':
@ -534,10 +525,10 @@ 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(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'])
res = flavor_obj.ServiceProfile.get_object(self.ctx, id=sp['id'])
self.assertIsNotNone(res)
self.assertEqual(data['service_profile']['driver'], res.driver)
self.assertEqual(data['service_profile']['metainfo'], res.metainfo)
def test_create_service_profile_invalid_driver(self):
data = {'service_profile':
@ -566,14 +557,13 @@ 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(flavor_models.ServiceProfile).
filter_by(id=sp['id']).one())
res = flavor_obj.ServiceProfile.get_object(self.ctx, id=sp['id'])
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(flavor_models.ServiceProfile).all()
res = flavor_obj.ServiceProfile.get_objects(self.ctx)
self.assertFalse(res)
def test_show_service_profile(self):
@ -593,9 +583,8 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
self.ctx,
{'service_profile': {'id': sp['id']}},
fl['id'])
binding = (
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
first())
binding = flavor_obj.FlavorServiceProfileBinding.get_objects(
self.ctx)[0]
self.assertEqual(fl['id'], binding['flavor_id'])
self.assertEqual(sp['id'], binding['service_profile_id'])
@ -615,10 +604,8 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
{'service_profile': {'id': sp['id']}},
fl['id'])
self.plugin.delete_flavor(self.ctx, fl['id'])
binding = (
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
first())
self.assertIsNone(binding)
self.assertFalse(
flavor_obj.FlavorServiceProfileBinding.objects_exist(self.ctx))
def test_associate_service_profile_with_flavor_exists(self):
sp, data = self._create_service_profile()
@ -642,10 +629,9 @@ class FlavorPluginTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase,
fl['id'])
self.plugin.delete_flavor_service_profile(
self.ctx, sp['id'], fl['id'])
binding = (
self.ctx.session.query(flavor_models.FlavorServiceProfileBinding).
first())
self.assertIsNone(binding)
self.assertFalse(
flavor_obj.FlavorServiceProfileBinding.objects_exist(self.ctx))
self.assertRaises(
flavors.FlavorServiceProfileBindingNotFound,

View File

@ -40,6 +40,7 @@ from neutron.objects import base
from neutron.objects import common_types
from neutron.objects.db import api as obj_db_api
from neutron.objects import exceptions as o_exc
from neutron.objects import flavor
from neutron.objects import network as net_obj
from neutron.objects import ports
from neutron.objects import rbac_db
@ -1335,6 +1336,18 @@ class BaseDbObjectTestCase(_BaseObjectTestCase,
self.assertEqual(
model.standard_attr_id, retrieved_obj.standard_attr_id)
def _create_test_flavor(self):
attrs = self.get_random_object_fields(obj_cls=flavor.Flavor)
self._flavor = flavor.Flavor(self.context, **attrs)
self._flavor.create()
return self._flavor
def _create_test_service_profile(self):
attrs = self.get_random_object_fields(obj_cls=flavor.ServiceProfile)
self._service_profile = flavor.ServiceProfile(self.context, **attrs)
self._service_profile.create()
return self._service_profile
def _make_object(self, fields):
fields = get_non_synthetic_fields(self._test_class, fields)
return self._test_class(self.context,

View File

@ -0,0 +1,72 @@
# Copyright 2016 Intel Corporation.
# All Rights Reserved.
#
# 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.objects import flavor
from neutron.tests.unit.objects import test_base as obj_test_base
from neutron.tests.unit import testlib_api
class FlavorServiceProfileBindingIfaceObjectTestCase(
obj_test_base.BaseObjectIfaceTestCase):
_test_class = flavor.FlavorServiceProfileBinding
class FlavorServiceProfileBindingDbObjectTestCase(
obj_test_base.BaseDbObjectTestCase, testlib_api.SqlTestCase):
_test_class = flavor.FlavorServiceProfileBinding
def setUp(self):
super(FlavorServiceProfileBindingDbObjectTestCase, self).setUp()
self.update_obj_fields(
{'flavor_id': lambda: self._create_test_flavor().id})
self.update_obj_fields(
{'service_profile_id': lambda: self._create_test_service_profile(
).id})
class ServiceProfileIfaceObjectTestCase(obj_test_base.BaseObjectIfaceTestCase):
_test_class = flavor.ServiceProfile
class ServiceProfileDbObjectTestCase(obj_test_base.BaseDbObjectTestCase,
testlib_api.SqlTestCase):
_test_class = flavor.ServiceProfile
def test_get_objects_queries_constant(self):
# FIXME(electrocucaracha): There are no lazy loading for flavors
# relationship in ServiceProfile model db disable this UT to avoid
# failing
pass
class FlavorIfaceObjectTestCase(obj_test_base.BaseObjectIfaceTestCase):
_test_class = flavor.Flavor
class FlavorDbObjectTestCase(obj_test_base.BaseDbObjectTestCase,
testlib_api.SqlTestCase):
_test_class = flavor.Flavor
def test_get_objects_queries_constant(self):
# FIXME(electrocucaracha): There are no lazy loading for
# service_profiles relationship in Flavor model db disable this UT to
# avoid failing
pass

View File

@ -35,6 +35,8 @@ object_data = {
'DNSNameServer': '1.0-bf87a85327e2d812d1666ede99d9918b',
'ExtraDhcpOpt': '1.0-632f689cbeb36328995a7aed1d0a78d3',
'FlatAllocation': '1.0-bf666f24f4642b047eeca62311fbcb41',
'Flavor': '1.0-82194de5c9aafce08e8527bb7977f5c6',
'FlavorServiceProfileBinding': '1.0-a2c8731e16cefdac4571f80abf1f8930',
'FloatingIPDNS': '1.0-ee3db848500fa1825235f701828c06d5',
'GeneveAllocation': '1.0-d5f76e8eac60a778914d61dd8e23e90f',
'GeneveEndpoint': '1.0-040f026996b5952e2ae4ccd40ac61ca6',
@ -64,6 +66,7 @@ object_data = {
'SecurityGroup': '1.0-e26b90c409b31fd2e3c6fcec402ac0b9',
'SecurityGroupRule': '1.0-e9b8dace9d48b936c62ad40fe1f339d5',
'SegmentHostMapping': '1.0-521597cf82ead26217c3bd10738f00f0',
'ServiceProfile': '1.0-9beafc9e7d081b8258f3c5cb66ac5eed',
'Subnet': '1.0-9c19023a61b42d29fbf3766df380e5b7',
'SubnetPool': '1.0-e8300bfbc4762cc88a7f6205b52da2f8',
'SubnetPoolPrefix': '1.0-13c15144135eb869faa4a76dc3ee3b6c',