Remove deprecated support for QoS notification_drivers
In Ocata, notification_drivers were deprecated in favor of the new QoSDriver architecture. This patch removes backwards compatible support for notification drivers along with its testing. Change-Id: I5f747635be3fd66b70326d9f94c85a6736286bd2
This commit is contained in:
parent
79381c0bf0
commit
6037e53f07
@ -6,7 +6,6 @@ namespace = neutron
|
|||||||
namespace = neutron.agent
|
namespace = neutron.agent
|
||||||
namespace = neutron.db
|
namespace = neutron.db
|
||||||
namespace = neutron.extensions
|
namespace = neutron.extensions
|
||||||
namespace = neutron.qos
|
|
||||||
namespace = nova.auth
|
namespace = nova.auth
|
||||||
namespace = oslo.log
|
namespace = oslo.log
|
||||||
namespace = oslo.db
|
namespace = oslo.db
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
# 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_config import cfg
|
|
||||||
|
|
||||||
from neutron._i18n import _
|
|
||||||
|
|
||||||
QOS_PLUGIN_OPTS = [
|
|
||||||
cfg.ListOpt('notification_drivers',
|
|
||||||
default=['message_queue'],
|
|
||||||
help=_("Drivers list to use to send the update notification. "
|
|
||||||
"This option will be unused in Pike."),
|
|
||||||
deprecated_for_removal=True),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def register_qos_plugin_opts(cfg=cfg.CONF):
|
|
||||||
cfg.register_opts(QOS_PLUGIN_OPTS, "qos")
|
|
@ -16,7 +16,6 @@ from oslo_log import log as logging
|
|||||||
from oslo_versionedobjects import base as obj_base
|
from oslo_versionedobjects import base as obj_base
|
||||||
from oslo_versionedobjects import fields as obj_fields
|
from oslo_versionedobjects import fields as obj_fields
|
||||||
|
|
||||||
from neutron._i18n import _LW
|
|
||||||
from neutron.objects import base
|
from neutron.objects import base
|
||||||
from neutron.services.qos import qos_consts
|
from neutron.services.qos import qos_consts
|
||||||
|
|
||||||
@ -48,21 +47,8 @@ class QosRuleType(base.NeutronObject):
|
|||||||
if validate_filters:
|
if validate_filters:
|
||||||
cls.validate_filters(**kwargs)
|
cls.validate_filters(**kwargs)
|
||||||
|
|
||||||
#TODO(mangelajo): remove in backwards compatible available rule
|
|
||||||
# inspection in Pike
|
|
||||||
|
|
||||||
core_plugin_supported_rules = getattr(
|
|
||||||
directory.get_plugin(), 'supported_qos_rule_types', None)
|
|
||||||
|
|
||||||
rule_types = (
|
rule_types = (
|
||||||
core_plugin_supported_rules or
|
|
||||||
directory.get_plugin(alias=constants.QOS).supported_rule_types)
|
directory.get_plugin(alias=constants.QOS).supported_rule_types)
|
||||||
|
|
||||||
if core_plugin_supported_rules:
|
|
||||||
LOG.warning(_LW(
|
|
||||||
"Your core plugin defines supported_qos_rule_types which is "
|
|
||||||
"deprecated and shall be implemented through a QoS driver."
|
|
||||||
))
|
|
||||||
|
|
||||||
# TODO(ihrachys): apply filters to returned result
|
# TODO(ihrachys): apply filters to returned result
|
||||||
return [cls(type=type_) for type_ in rule_types]
|
return [cls(type=type_) for type_ in rule_types]
|
||||||
|
@ -44,7 +44,6 @@ import neutron.conf.plugins.ml2.drivers.ovs_conf
|
|||||||
import neutron.conf.quota
|
import neutron.conf.quota
|
||||||
import neutron.conf.service
|
import neutron.conf.service
|
||||||
import neutron.conf.services.metering_agent
|
import neutron.conf.services.metering_agent
|
||||||
import neutron.conf.services.qos_driver_manager
|
|
||||||
import neutron.conf.wsgi
|
import neutron.conf.wsgi
|
||||||
import neutron.db.agents_db
|
import neutron.db.agents_db
|
||||||
import neutron.db.agentschedulers_db
|
import neutron.db.agentschedulers_db
|
||||||
@ -143,13 +142,6 @@ def list_opts():
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def list_qos_opts():
|
|
||||||
return [
|
|
||||||
('qos',
|
|
||||||
neutron.conf.services.qos_driver_manager.QOS_PLUGIN_OPTS)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def list_base_agent_opts():
|
def list_base_agent_opts():
|
||||||
return [
|
return [
|
||||||
('DEFAULT',
|
('DEFAULT',
|
||||||
|
@ -21,11 +21,9 @@ from neutron.api.rpc.callbacks import resources
|
|||||||
from neutron.api.rpc.handlers import resources_rpc
|
from neutron.api.rpc.handlers import resources_rpc
|
||||||
from neutron.callbacks import events
|
from neutron.callbacks import events
|
||||||
from neutron.callbacks import registry
|
from neutron.callbacks import registry
|
||||||
from neutron.conf.services import qos_driver_manager as qos_mgr
|
|
||||||
from neutron.objects.qos import policy as policy_object
|
from neutron.objects.qos import policy as policy_object
|
||||||
from neutron.services.qos import qos_consts
|
from neutron.services.qos import qos_consts
|
||||||
|
|
||||||
qos_mgr.register_qos_plugin_opts()
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -38,13 +36,10 @@ SKIPPED_VIF_TYPES = [
|
|||||||
|
|
||||||
class QosServiceDriverManager(object):
|
class QosServiceDriverManager(object):
|
||||||
|
|
||||||
def __init__(self, enable_rpc=False):
|
def __init__(self):
|
||||||
self._drivers = []
|
self._drivers = []
|
||||||
self.notification_api = resources_rpc.ResourcesPushRpcApi()
|
self.notification_api = resources_rpc.ResourcesPushRpcApi()
|
||||||
#TODO(mangelajo): remove the enable_rpc parameter in Pike since
|
self.rpc_notifications_required = False
|
||||||
# we only use it when a message_queue derived driver
|
|
||||||
# is found in the notification_drivers
|
|
||||||
self.rpc_notifications_required = enable_rpc
|
|
||||||
rpc_registry.provide(self._get_qos_policy_cb, resources.QOS_POLICY)
|
rpc_registry.provide(self._get_qos_policy_cb, resources.QOS_POLICY)
|
||||||
# notify any registered QoS driver that we're ready, those will
|
# notify any registered QoS driver that we're ready, those will
|
||||||
# call the driver manager back with register_driver if they
|
# call the driver manager back with register_driver if they
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
# 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_config import cfg
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from neutron._i18n import _LI
|
|
||||||
from neutron.conf.services import qos_driver_manager as qos_mgr
|
|
||||||
from neutron import manager
|
|
||||||
from neutron.services.qos.notification_drivers import message_queue
|
|
||||||
|
|
||||||
QOS_DRIVER_NAMESPACE = 'neutron.qos.notification_drivers'
|
|
||||||
qos_mgr.register_qos_plugin_opts()
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class QosServiceNotificationDriverManager(object):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.notification_drivers = []
|
|
||||||
self._load_drivers(cfg.CONF.qos.notification_drivers)
|
|
||||||
|
|
||||||
def update_policy(self, context, qos_policy):
|
|
||||||
for driver in self.notification_drivers:
|
|
||||||
driver.update_policy(context, qos_policy)
|
|
||||||
|
|
||||||
def delete_policy(self, context, qos_policy):
|
|
||||||
for driver in self.notification_drivers:
|
|
||||||
driver.delete_policy(context, qos_policy)
|
|
||||||
|
|
||||||
def create_policy(self, context, qos_policy):
|
|
||||||
for driver in self.notification_drivers:
|
|
||||||
driver.create_policy(context, qos_policy)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def has_message_queue_driver(self):
|
|
||||||
"""Determine if we have any message_queue derived driver in the
|
|
||||||
notifications drivers, so the QoS plugin will forcefully enable
|
|
||||||
the rpc notifications for Pike, since our message_queue driver
|
|
||||||
is a dummy which doesn't send any messages.
|
|
||||||
"""
|
|
||||||
#TODO(mangelajo): remove this in Pike
|
|
||||||
return any(
|
|
||||||
isinstance(driver, message_queue.RpcQosServiceNotificationDriver)
|
|
||||||
for driver in self.notification_drivers)
|
|
||||||
|
|
||||||
def _load_drivers(self, notification_drivers):
|
|
||||||
"""Load all the instances of the configured QoS notification drivers
|
|
||||||
|
|
||||||
:param notification_drivers: comma separated string
|
|
||||||
"""
|
|
||||||
for notification_driver in notification_drivers:
|
|
||||||
driver_ins = self._load_driver_instance(notification_driver)
|
|
||||||
self.notification_drivers.append(driver_ins)
|
|
||||||
|
|
||||||
def _load_driver_instance(self, notification_driver):
|
|
||||||
"""Returns an instance of the configured QoS notification driver
|
|
||||||
|
|
||||||
:returns: An instance of Driver for the QoS notification
|
|
||||||
"""
|
|
||||||
mgr = manager.NeutronManager
|
|
||||||
driver = mgr.load_class_for_provider(QOS_DRIVER_NAMESPACE,
|
|
||||||
notification_driver)
|
|
||||||
driver_instance = driver()
|
|
||||||
LOG.info(
|
|
||||||
_LI("Loading %(name)s (%(description)s) notification driver "
|
|
||||||
"for QoS plugin"),
|
|
||||||
{"name": notification_driver,
|
|
||||||
"description": driver_instance.get_description()})
|
|
||||||
return driver_instance
|
|
@ -1,41 +0,0 @@
|
|||||||
# 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_log import log as logging
|
|
||||||
|
|
||||||
from neutron._i18n import _LW
|
|
||||||
from neutron.services.qos.notification_drivers import qos_base
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class RpcQosServiceNotificationDriver(
|
|
||||||
qos_base.QosServiceNotificationDriverBase):
|
|
||||||
"""RPC message queue service notification driver for QoS."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
LOG.warning(_LW("The QoS message_queue notification driver "
|
|
||||||
"has been ignored, since rpc push is implemented "
|
|
||||||
"for any QoS driver that requests it."))
|
|
||||||
|
|
||||||
def get_description(self):
|
|
||||||
return "Message queue updates"
|
|
||||||
|
|
||||||
def create_policy(self, context, policy):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def update_policy(self, context, policy):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def delete_policy(self, context, policy):
|
|
||||||
pass
|
|
@ -1,42 +0,0 @@
|
|||||||
# 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.
|
|
||||||
import abc
|
|
||||||
|
|
||||||
import six
|
|
||||||
|
|
||||||
|
|
||||||
@six.add_metaclass(abc.ABCMeta)
|
|
||||||
class QosServiceNotificationDriverBase(object):
|
|
||||||
"""QoS service notification driver base class."""
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def get_description(self):
|
|
||||||
"""Get the notification driver description.
|
|
||||||
"""
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def create_policy(self, context, policy):
|
|
||||||
"""Create the QoS policy."""
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def update_policy(self, context, policy):
|
|
||||||
"""Update the QoS policy.
|
|
||||||
|
|
||||||
Apply changes to the QoS policy.
|
|
||||||
"""
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def delete_policy(self, context, policy):
|
|
||||||
"""Delete the QoS policy.
|
|
||||||
|
|
||||||
Remove all rules for this policy and free up all the resources.
|
|
||||||
"""
|
|
@ -26,7 +26,6 @@ from neutron.objects import ports as ports_object
|
|||||||
from neutron.objects.qos import policy as policy_object
|
from neutron.objects.qos import policy as policy_object
|
||||||
from neutron.objects.qos import rule_type as rule_type_object
|
from neutron.objects.qos import rule_type as rule_type_object
|
||||||
from neutron.services.qos.drivers import manager
|
from neutron.services.qos.drivers import manager
|
||||||
from neutron.services.qos.notification_drivers import manager as driver_mgr
|
|
||||||
from neutron.services.qos import qos_consts
|
from neutron.services.qos import qos_consts
|
||||||
|
|
||||||
|
|
||||||
@ -44,13 +43,7 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(QoSPlugin, self).__init__()
|
super(QoSPlugin, self).__init__()
|
||||||
|
self.driver_manager = manager.QosServiceDriverManager()
|
||||||
# TODO(mangelajo): remove notification_driver_manager in Pike
|
|
||||||
self.notification_driver_manager = (
|
|
||||||
driver_mgr.QosServiceNotificationDriverManager())
|
|
||||||
|
|
||||||
self.driver_manager = manager.QosServiceDriverManager(enable_rpc=(
|
|
||||||
self.notification_driver_manager.has_message_queue_driver))
|
|
||||||
|
|
||||||
callbacks_registry.subscribe(
|
callbacks_registry.subscribe(
|
||||||
self._validate_create_port_callback,
|
self._validate_create_port_callback,
|
||||||
@ -170,9 +163,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('create_policy', context, policy_obj)
|
self.driver_manager.call('create_policy', context, policy_obj)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.create_policy(context, policy_obj)
|
|
||||||
|
|
||||||
return policy_obj
|
return policy_obj
|
||||||
|
|
||||||
@db_base_plugin_common.convert_result_to_dict
|
@db_base_plugin_common.convert_result_to_dict
|
||||||
@ -195,9 +185,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('update_policy', context, policy_obj)
|
self.driver_manager.call('update_policy', context, policy_obj)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.update_policy(context, policy_obj)
|
|
||||||
|
|
||||||
return policy_obj
|
return policy_obj
|
||||||
|
|
||||||
def delete_policy(self, context, policy_id):
|
def delete_policy(self, context, policy_id):
|
||||||
@ -216,9 +203,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('delete_policy', context, policy)
|
self.driver_manager.call('delete_policy', context, policy)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.delete_policy(context, policy)
|
|
||||||
|
|
||||||
def _get_policy_obj(self, context, policy_id):
|
def _get_policy_obj(self, context, policy_id):
|
||||||
"""Fetch a QoS policy.
|
"""Fetch a QoS policy.
|
||||||
|
|
||||||
@ -307,9 +291,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('update_policy', context, policy)
|
self.driver_manager.call('update_policy', context, policy)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.update_policy(context, policy)
|
|
||||||
|
|
||||||
return rule
|
return rule
|
||||||
|
|
||||||
@db_base_plugin_common.convert_result_to_dict
|
@db_base_plugin_common.convert_result_to_dict
|
||||||
@ -346,9 +327,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('update_policy', context, policy)
|
self.driver_manager.call('update_policy', context, policy)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.update_policy(context, policy)
|
|
||||||
|
|
||||||
return rule
|
return rule
|
||||||
|
|
||||||
def delete_policy_rule(self, context, rule_cls, rule_id, policy_id):
|
def delete_policy_rule(self, context, rule_cls, rule_id, policy_id):
|
||||||
@ -374,9 +352,6 @@ class QoSPlugin(qos.QoSPluginBase):
|
|||||||
|
|
||||||
self.driver_manager.call('update_policy', context, policy)
|
self.driver_manager.call('update_policy', context, policy)
|
||||||
|
|
||||||
#TODO(majopela): remove notification_driver_manager call in Pike
|
|
||||||
self.notification_driver_manager.update_policy(context, policy)
|
|
||||||
|
|
||||||
@db_base_plugin_common.filter_fields
|
@db_base_plugin_common.filter_fields
|
||||||
@db_base_plugin_common.convert_result_to_dict
|
@db_base_plugin_common.convert_result_to_dict
|
||||||
def get_policy_rule(self, context, rule_cls, rule_id, policy_id,
|
def get_policy_rule(self, context, rule_cls, rule_id, policy_id,
|
||||||
|
@ -14,10 +14,12 @@
|
|||||||
# class on the common base class for all objects
|
# class on the common base class for all objects
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
from neutron_lib.plugins import directory
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
from neutron import manager
|
||||||
from neutron.objects.qos import rule_type
|
from neutron.objects.qos import rule_type
|
||||||
from neutron.services.qos import qos_consts
|
from neutron.services.qos import qos_consts
|
||||||
|
from neutron.services.qos import qos_plugin
|
||||||
from neutron.tests import base as test_base
|
from neutron.tests import base as test_base
|
||||||
|
|
||||||
|
|
||||||
@ -29,15 +31,17 @@ class QosRuleTypeObjectTestCase(test_base.BaseTestCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(QosRuleTypeObjectTestCase, self).setUp()
|
super(QosRuleTypeObjectTestCase, self).setUp()
|
||||||
self.config_parse()
|
self.config_parse()
|
||||||
self.setup_coreplugin(DB_PLUGIN_KLASS)
|
|
||||||
|
self.setup_coreplugin(load_plugins=False)
|
||||||
|
cfg.CONF.set_override("core_plugin", DB_PLUGIN_KLASS)
|
||||||
|
cfg.CONF.set_override("service_plugins", ["qos"])
|
||||||
|
manager.init()
|
||||||
|
|
||||||
def test_get_objects(self):
|
def test_get_objects(self):
|
||||||
core_plugin = directory.get_plugin()
|
|
||||||
rule_types_mock = mock.PropertyMock(
|
rule_types_mock = mock.PropertyMock(
|
||||||
return_value=qos_consts.VALID_RULE_TYPES)
|
return_value=set(qos_consts.VALID_RULE_TYPES))
|
||||||
with mock.patch.object(core_plugin, 'supported_qos_rule_types',
|
with mock.patch.object(qos_plugin.QoSPlugin, 'supported_rule_types',
|
||||||
new_callable=rule_types_mock,
|
new_callable=rule_types_mock):
|
||||||
create=True):
|
|
||||||
types = rule_type.QosRuleType.get_objects()
|
types = rule_type.QosRuleType.get_objects()
|
||||||
self.assertEqual(sorted(qos_consts.VALID_RULE_TYPES),
|
self.assertEqual(sorted(qos_consts.VALID_RULE_TYPES),
|
||||||
sorted(type_['type'] for type_ in types))
|
sorted(type_['type'] for type_ in types))
|
||||||
|
@ -13,11 +13,9 @@
|
|||||||
import mock
|
import mock
|
||||||
from neutron_lib.api.definitions import portbindings
|
from neutron_lib.api.definitions import portbindings
|
||||||
from neutron_lib import context
|
from neutron_lib import context
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
from neutron.common import constants
|
from neutron.common import constants
|
||||||
from neutron.conf.services import qos_driver_manager as notif_driver_mgr_config
|
|
||||||
from neutron.objects import ports as ports_object
|
from neutron.objects import ports as ports_object
|
||||||
from neutron.objects.qos import rule as rule_object
|
from neutron.objects.qos import rule as rule_object
|
||||||
from neutron.services.qos.drivers import base as qos_driver_base
|
from neutron.services.qos.drivers import base as qos_driver_base
|
||||||
@ -32,8 +30,6 @@ class TestQosDriversManagerBase(base.BaseQosTestCase):
|
|||||||
super(TestQosDriversManagerBase, self).setUp()
|
super(TestQosDriversManagerBase, self).setUp()
|
||||||
self.config_parse()
|
self.config_parse()
|
||||||
self.setup_coreplugin(load_plugins=False)
|
self.setup_coreplugin(load_plugins=False)
|
||||||
config = cfg.ConfigOpts()
|
|
||||||
notif_driver_mgr_config.register_qos_plugin_opts(config)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _create_manager_with_drivers(drivers_details):
|
def _create_manager_with_drivers(drivers_details):
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
# 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.services.qos.notification_drivers import qos_base
|
|
||||||
|
|
||||||
|
|
||||||
class DummyQosServiceNotificationDriver(
|
|
||||||
qos_base.QosServiceNotificationDriverBase):
|
|
||||||
"""Dummy service notification driver for QoS."""
|
|
||||||
|
|
||||||
def get_description(self):
|
|
||||||
return "Dummy"
|
|
||||||
|
|
||||||
def create_policy(self, policy):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def update_policy(self, policy):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def delete_policy(self, policy):
|
|
||||||
pass
|
|
@ -1,77 +0,0 @@
|
|||||||
# 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.
|
|
||||||
|
|
||||||
import mock
|
|
||||||
from neutron_lib import context
|
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_utils import uuidutils
|
|
||||||
|
|
||||||
from neutron.conf.services import qos_driver_manager as driver_mgr_config
|
|
||||||
from neutron.objects.qos import policy as policy_object
|
|
||||||
from neutron.services.qos.notification_drivers import manager as driver_mgr
|
|
||||||
from neutron.services.qos.notification_drivers import message_queue
|
|
||||||
from neutron.tests.unit.services.qos import base
|
|
||||||
|
|
||||||
DUMMY_DRIVER = ("neutron.tests.unit.services.qos.notification_drivers."
|
|
||||||
"dummy.DummyQosServiceNotificationDriver")
|
|
||||||
|
|
||||||
|
|
||||||
def _load_multiple_drivers():
|
|
||||||
cfg.CONF.set_override(
|
|
||||||
"notification_drivers",
|
|
||||||
["message_queue", DUMMY_DRIVER],
|
|
||||||
"qos")
|
|
||||||
|
|
||||||
|
|
||||||
class TestQosDriversManagerBase(base.BaseQosTestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestQosDriversManagerBase, self).setUp()
|
|
||||||
self.config_parse()
|
|
||||||
self.setup_coreplugin(load_plugins=False)
|
|
||||||
config = cfg.ConfigOpts()
|
|
||||||
driver_mgr_config.register_qos_plugin_opts(config)
|
|
||||||
self.policy_data = {'policy': {
|
|
||||||
'id': uuidutils.generate_uuid(),
|
|
||||||
'project_id': uuidutils.generate_uuid(),
|
|
||||||
'name': 'test-policy',
|
|
||||||
'description': 'test policy description',
|
|
||||||
'shared': True}}
|
|
||||||
|
|
||||||
self.context = context.get_admin_context()
|
|
||||||
self.policy = policy_object.QosPolicy(self.context,
|
|
||||||
**self.policy_data['policy'])
|
|
||||||
ctxt = None
|
|
||||||
self.kwargs = {'context': ctxt}
|
|
||||||
|
|
||||||
|
|
||||||
class TestQosDriversManagerMulti(TestQosDriversManagerBase):
|
|
||||||
|
|
||||||
def _test_multi_drivers_configuration_op(self, op):
|
|
||||||
_load_multiple_drivers()
|
|
||||||
driver_manager = driver_mgr.QosServiceNotificationDriverManager()
|
|
||||||
handler = '%s_policy' % op
|
|
||||||
with mock.patch('.'.join([DUMMY_DRIVER, handler])) as dummy_mock:
|
|
||||||
rpc_driver = message_queue.RpcQosServiceNotificationDriver
|
|
||||||
with mock.patch.object(rpc_driver, handler) as rpc_mock:
|
|
||||||
getattr(driver_manager, handler)(self.context, self.policy)
|
|
||||||
for mock_ in (dummy_mock, rpc_mock):
|
|
||||||
mock_.assert_called_with(self.context, self.policy)
|
|
||||||
|
|
||||||
def test_multi_drivers_configuration_create(self):
|
|
||||||
self._test_multi_drivers_configuration_op('create')
|
|
||||||
|
|
||||||
def test_multi_drivers_configuration_update(self):
|
|
||||||
self._test_multi_drivers_configuration_op('update')
|
|
||||||
|
|
||||||
def test_multi_drivers_configuration_delete(self):
|
|
||||||
self._test_multi_drivers_configuration_op('delete')
|
|
@ -22,6 +22,7 @@ from neutron.objects.qos import policy as policy_object
|
|||||||
from neutron.objects.qos import rule as rule_object
|
from neutron.objects.qos import rule as rule_object
|
||||||
from neutron.plugins.common import constants
|
from neutron.plugins.common import constants
|
||||||
from neutron.services.qos import qos_consts
|
from neutron.services.qos import qos_consts
|
||||||
|
from neutron.services.qos import qos_plugin
|
||||||
from neutron.tests.unit.services.qos import base
|
from neutron.tests.unit.services.qos import base
|
||||||
|
|
||||||
|
|
||||||
@ -52,8 +53,6 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
manager.init()
|
manager.init()
|
||||||
self.qos_plugin = directory.get_plugin(constants.QOS)
|
self.qos_plugin = directory.get_plugin(constants.QOS)
|
||||||
|
|
||||||
#TODO(mangelajo): Remove notification_driver_manager mock in Pike
|
|
||||||
self.qos_plugin.notification_driver_manager = mock.Mock()
|
|
||||||
self.qos_plugin.driver_manager = mock.Mock()
|
self.qos_plugin.driver_manager = mock.Mock()
|
||||||
|
|
||||||
self.rpc_push = mock.patch('neutron.api.rpc.handlers.resources_rpc'
|
self.rpc_push = mock.patch('neutron.api.rpc.handlers.resources_rpc'
|
||||||
@ -87,12 +86,6 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
self.ctxt, **self.rule_data['dscp_marking_rule'])
|
self.ctxt, **self.rule_data['dscp_marking_rule'])
|
||||||
|
|
||||||
def _validate_driver_params(self, method_name):
|
def _validate_driver_params(self, method_name):
|
||||||
method = getattr(self.qos_plugin.notification_driver_manager,
|
|
||||||
method_name)
|
|
||||||
self.assertTrue(method.called)
|
|
||||||
self.assertIsInstance(
|
|
||||||
method.call_args[0][1], policy_object.QosPolicy)
|
|
||||||
|
|
||||||
self.assertTrue(self.qos_plugin.driver_manager.call.called)
|
self.assertTrue(self.qos_plugin.driver_manager.call.called)
|
||||||
self.assertEqual(self.qos_plugin.driver_manager.call.call_args[0][0],
|
self.assertEqual(self.qos_plugin.driver_manager.call.call_args[0][0],
|
||||||
method_name)
|
method_name)
|
||||||
@ -617,46 +610,15 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
'create_policy_bandwidth_limit_rules')
|
'create_policy_bandwidth_limit_rules')
|
||||||
|
|
||||||
def test_get_rule_types(self):
|
def test_get_rule_types(self):
|
||||||
core_plugin = directory.get_plugin()
|
|
||||||
rule_types_mock = mock.PropertyMock(
|
rule_types_mock = mock.PropertyMock(
|
||||||
return_value=qos_consts.VALID_RULE_TYPES)
|
return_value=qos_consts.VALID_RULE_TYPES)
|
||||||
filters = {'type': 'type_id'}
|
filters = {'type': 'type_id'}
|
||||||
with mock.patch.object(core_plugin, 'supported_qos_rule_types',
|
with mock.patch.object(qos_plugin.QoSPlugin, 'supported_rule_types',
|
||||||
new_callable=rule_types_mock,
|
new_callable=rule_types_mock):
|
||||||
create=True):
|
|
||||||
types = self.qos_plugin.get_rule_types(self.ctxt, filters=filters)
|
types = self.qos_plugin.get_rule_types(self.ctxt, filters=filters)
|
||||||
self.assertEqual(sorted(qos_consts.VALID_RULE_TYPES),
|
self.assertEqual(sorted(qos_consts.VALID_RULE_TYPES),
|
||||||
sorted(type_['type'] for type_ in types))
|
sorted(type_['type'] for type_ in types))
|
||||||
|
|
||||||
@mock.patch('neutron.objects.qos.policy.QosPolicy')
|
|
||||||
def test_policy_notification_ordering(self, qos_policy_mock):
|
|
||||||
|
|
||||||
policy_actions = {'create': [self.ctxt, {'policy': {}}],
|
|
||||||
'update': [self.ctxt, self.policy.id,
|
|
||||||
{'policy': {}}],
|
|
||||||
'delete': [self.ctxt, self.policy.id]}
|
|
||||||
|
|
||||||
self.qos_plugin.notification_driver_manager = mock.Mock()
|
|
||||||
|
|
||||||
mock_manager = mock.Mock()
|
|
||||||
mock_manager.attach_mock(qos_policy_mock, 'QosPolicy')
|
|
||||||
mock_manager.attach_mock(self.qos_plugin.notification_driver_manager,
|
|
||||||
'notification_driver')
|
|
||||||
|
|
||||||
for action, arguments in policy_actions.items():
|
|
||||||
mock_manager.reset_mock()
|
|
||||||
|
|
||||||
method = getattr(self.qos_plugin, "%s_policy" % action)
|
|
||||||
method(*arguments)
|
|
||||||
|
|
||||||
policy_mock_call = getattr(mock.call.QosPolicy(), action)()
|
|
||||||
notify_mock_call = getattr(mock.call.notification_driver,
|
|
||||||
'%s_policy' % action)(self.ctxt,
|
|
||||||
mock.ANY)
|
|
||||||
|
|
||||||
self.assertTrue(mock_manager.mock_calls.index(policy_mock_call) <
|
|
||||||
mock_manager.mock_calls.index(notify_mock_call))
|
|
||||||
|
|
||||||
@mock.patch('neutron.objects.ports.Port')
|
@mock.patch('neutron.objects.ports.Port')
|
||||||
@mock.patch('neutron.objects.qos.policy.QosPolicy')
|
@mock.patch('neutron.objects.qos.policy.QosPolicy')
|
||||||
def test_rule_notification_and_driver_ordering(self, qos_policy_mock,
|
def test_rule_notification_and_driver_ordering(self, qos_policy_mock,
|
||||||
@ -672,16 +634,10 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
'delete': [self.ctxt, rule_cls_mock,
|
'delete': [self.ctxt, rule_cls_mock,
|
||||||
self.rule.id, self.policy.id]}
|
self.rule.id, self.policy.id]}
|
||||||
|
|
||||||
# TODO(mangelajo): Remove notification_driver_manager checks in Pike
|
|
||||||
# and rename this test
|
|
||||||
self.qos_plugin.notification_driver_manager = mock.Mock()
|
|
||||||
|
|
||||||
mock_manager = mock.Mock()
|
mock_manager = mock.Mock()
|
||||||
mock_manager.attach_mock(qos_policy_mock, 'QosPolicy')
|
mock_manager.attach_mock(qos_policy_mock, 'QosPolicy')
|
||||||
mock_manager.attach_mock(port_mock, 'Port')
|
mock_manager.attach_mock(port_mock, 'Port')
|
||||||
mock_manager.attach_mock(rule_cls_mock, 'RuleCls')
|
mock_manager.attach_mock(rule_cls_mock, 'RuleCls')
|
||||||
mock_manager.attach_mock(self.qos_plugin.notification_driver_manager,
|
|
||||||
'notification_driver')
|
|
||||||
mock_manager.attach_mock(self.qos_plugin.driver_manager, 'driver')
|
mock_manager.attach_mock(self.qos_plugin.driver_manager, 'driver')
|
||||||
|
|
||||||
for action, arguments in rule_actions.items():
|
for action, arguments in rule_actions.items():
|
||||||
@ -695,9 +651,6 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
# some actions construct rule from class reference
|
# some actions construct rule from class reference
|
||||||
rule_mock_call = getattr(mock.call.RuleCls(), action)()
|
rule_mock_call = getattr(mock.call.RuleCls(), action)()
|
||||||
|
|
||||||
notify_mock_call = mock.call.notification_driver.update_policy(
|
|
||||||
self.ctxt, mock.ANY)
|
|
||||||
|
|
||||||
driver_mock_call = mock.call.driver.call('update_policy',
|
driver_mock_call = mock.call.driver.call('update_policy',
|
||||||
self.ctxt, mock.ANY)
|
self.ctxt, mock.ANY)
|
||||||
|
|
||||||
@ -707,8 +660,5 @@ class TestQosPlugin(base.BaseQosTestCase):
|
|||||||
action_index = mock_manager.mock_calls.index(
|
action_index = mock_manager.mock_calls.index(
|
||||||
get_rule_mock_call)
|
get_rule_mock_call)
|
||||||
|
|
||||||
self.assertTrue(
|
|
||||||
action_index < mock_manager.mock_calls.index(notify_mock_call))
|
|
||||||
|
|
||||||
self.assertTrue(
|
self.assertTrue(
|
||||||
action_index < mock_manager.mock_calls.index(driver_mock_call))
|
action_index < mock_manager.mock_calls.index(driver_mock_call))
|
||||||
|
@ -80,8 +80,6 @@ neutron.service_plugins =
|
|||||||
timestamp = neutron.services.timestamp.timestamp_plugin:TimeStampPlugin
|
timestamp = neutron.services.timestamp.timestamp_plugin:TimeStampPlugin
|
||||||
trunk = neutron.services.trunk.plugin:TrunkPlugin
|
trunk = neutron.services.trunk.plugin:TrunkPlugin
|
||||||
loki = neutron.services.loki.loki_plugin:LokiPlugin
|
loki = neutron.services.loki.loki_plugin:LokiPlugin
|
||||||
neutron.qos.notification_drivers =
|
|
||||||
message_queue = neutron.services.qos.notification_drivers.message_queue:RpcQosServiceNotificationDriver
|
|
||||||
neutron.ml2.type_drivers =
|
neutron.ml2.type_drivers =
|
||||||
flat = neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver
|
flat = neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver
|
||||||
local = neutron.plugins.ml2.drivers.type_local:LocalTypeDriver
|
local = neutron.plugins.ml2.drivers.type_local:LocalTypeDriver
|
||||||
@ -137,7 +135,6 @@ oslo.config.opts =
|
|||||||
neutron.ml2.ovs.agent = neutron.opts:list_ovs_opts
|
neutron.ml2.ovs.agent = neutron.opts:list_ovs_opts
|
||||||
neutron.ml2.sriov.agent = neutron.opts:list_sriov_agent_opts
|
neutron.ml2.sriov.agent = neutron.opts:list_sriov_agent_opts
|
||||||
neutron.ml2.xenapi = neutron.opts:list_xenapi_opts
|
neutron.ml2.xenapi = neutron.opts:list_xenapi_opts
|
||||||
neutron.qos = neutron.opts:list_qos_opts
|
|
||||||
nova.auth = neutron.opts:list_auth_opts
|
nova.auth = neutron.opts:list_auth_opts
|
||||||
oslo.config.opts.defaults =
|
oslo.config.opts.defaults =
|
||||||
neutron = neutron.common.config:set_cors_middleware_defaults
|
neutron = neutron.common.config:set_cors_middleware_defaults
|
||||||
|
Loading…
Reference in New Issue
Block a user