Moved QOS_POLICY_ID into qos_consts.py

Partially-Implements: blueprint quantum-qos-api
Change-Id: If789695b4084aed467d5f773c6b6bebea073724d
This commit is contained in:
Ihar Hrachyshka 2015-07-27 20:53:26 +02:00
parent f69c477dc2
commit 87aa42bc76
7 changed files with 56 additions and 44 deletions

View File

@ -24,6 +24,7 @@ from neutron.api.v2 import base
from neutron.api.v2 import resource_helper from neutron.api.v2 import resource_helper
from neutron import manager from neutron import manager
from neutron.plugins.common import constants from neutron.plugins.common import constants
from neutron.services.qos import qos_consts
from neutron.services import service_base from neutron.services import service_base
QOS_PREFIX = "/qos" QOS_PREFIX = "/qos"
@ -80,19 +81,19 @@ SUB_RESOURCE_ATTRIBUTE_MAP = {
} }
} }
QOS_POLICY_ID = "qos_policy_id"
EXTENDED_ATTRIBUTES_2_0 = { EXTENDED_ATTRIBUTES_2_0 = {
'ports': {QOS_POLICY_ID: {'allow_post': True, 'ports': {qos_consts.QOS_POLICY_ID: {
'allow_put': True, 'allow_post': True,
'is_visible': True, 'allow_put': True,
'default': None, 'is_visible': True,
'validate': {'type:uuid_or_none': None}}}, 'default': None,
'networks': {QOS_POLICY_ID: {'allow_post': True, 'validate': {'type:uuid_or_none': None}}},
'allow_put': True, 'networks': {qos_consts.QOS_POLICY_ID: {
'is_visible': True, 'allow_post': True,
'default': None, 'allow_put': True,
'validate': {'type:uuid_or_none': None}}}} 'is_visible': True,
'default': None,
'validate': {'type:uuid_or_none': None}}}}
class Qos(extensions.ExtensionDescriptor): class Qos(extensions.ExtensionDescriptor):

View File

@ -63,7 +63,6 @@ from neutron.extensions import extra_dhcp_opt as edo_ext
from neutron.extensions import portbindings from neutron.extensions import portbindings
from neutron.extensions import portsecurity as psec from neutron.extensions import portsecurity as psec
from neutron.extensions import providernet as provider from neutron.extensions import providernet as provider
from neutron.extensions import qos
from neutron.extensions import vlantransparent from neutron.extensions import vlantransparent
from neutron.i18n import _LE, _LI, _LW from neutron.i18n import _LE, _LI, _LW
from neutron import manager from neutron import manager
@ -76,6 +75,7 @@ from neutron.plugins.ml2 import driver_context
from neutron.plugins.ml2 import managers from neutron.plugins.ml2 import managers
from neutron.plugins.ml2 import models from neutron.plugins.ml2 import models
from neutron.plugins.ml2 import rpc from neutron.plugins.ml2 import rpc
from neutron.services.qos import qos_consts
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@ -1131,9 +1131,9 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
need_port_update_notify = True need_port_update_notify = True
# TODO(QoS): Move out to the extension framework somehow. # TODO(QoS): Move out to the extension framework somehow.
# Follow https://review.openstack.org/#/c/169223 for a solution. # Follow https://review.openstack.org/#/c/169223 for a solution.
if (qos.QOS_POLICY_ID in attrs and if (qos_consts.QOS_POLICY_ID in attrs and
original_port[qos.QOS_POLICY_ID] != original_port[qos_consts.QOS_POLICY_ID] !=
updated_port[qos.QOS_POLICY_ID]): updated_port[qos_consts.QOS_POLICY_ID]):
need_port_update_notify = True need_port_update_notify = True
if addr_pair.ADDRESS_PAIRS in attrs: if addr_pair.ADDRESS_PAIRS in attrs:

View File

@ -28,11 +28,11 @@ from neutron.common import rpc as n_rpc
from neutron.common import topics from neutron.common import topics
from neutron.extensions import portbindings from neutron.extensions import portbindings
from neutron.extensions import portsecurity as psec from neutron.extensions import portsecurity as psec
from neutron.extensions import qos
from neutron.i18n import _LW from neutron.i18n import _LW
from neutron import manager from neutron import manager
from neutron.plugins.ml2 import driver_api as api from neutron.plugins.ml2 import driver_api as api
from neutron.plugins.ml2.drivers import type_tunnel from neutron.plugins.ml2.drivers import type_tunnel
from neutron.services.qos import qos_consts
# REVISIT(kmestery): Allow the type and mechanism drivers to supply the # REVISIT(kmestery): Allow the type and mechanism drivers to supply the
# mixins and eventually remove the direct dependencies on type_tunnel. # mixins and eventually remove the direct dependencies on type_tunnel.
@ -107,8 +107,9 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
host, host,
port_context.network.current) port_context.network.current)
qos_profile_id = (port.get(qos.QOS_POLICY_ID) or qos_policy_id = (port.get(qos_consts.QOS_POLICY_ID) or
port_context.network._network.get(qos.QOS_POLICY_ID)) port_context.network._network.get(
qos_consts.QOS_POLICY_ID))
entry = {'device': device, entry = {'device': device,
'network_id': port['network_id'], 'network_id': port['network_id'],
'port_id': port['id'], 'port_id': port['id'],
@ -121,7 +122,7 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
'device_owner': port['device_owner'], 'device_owner': port['device_owner'],
'allowed_address_pairs': port['allowed_address_pairs'], 'allowed_address_pairs': port['allowed_address_pairs'],
'port_security_enabled': port.get(psec.PORTSECURITY, True), 'port_security_enabled': port.get(psec.PORTSECURITY, True),
'qos_policy_id': qos_profile_id, 'qos_policy_id': qos_policy_id,
'profile': port[portbindings.PROFILE]} 'profile': port[portbindings.PROFILE]}
LOG.debug("Returning: %s", entry) LOG.debug("Returning: %s", entry)
return entry return entry

View File

@ -15,3 +15,5 @@
RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth_limit' RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth_limit'
VALID_RULE_TYPES = [RULE_TYPE_BANDWIDTH_LIMIT] VALID_RULE_TYPES = [RULE_TYPE_BANDWIDTH_LIMIT]
QOS_POLICY_ID = 'qos_policy_id'

View File

@ -13,10 +13,10 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from neutron.extensions import qos
from neutron import manager from neutron import manager
from neutron.objects.qos import policy as policy_object from neutron.objects.qos import policy as policy_object
from neutron.plugins.common import constants as plugin_constants from neutron.plugins.common import constants as plugin_constants
from neutron.services.qos import qos_consts
NETWORK = 'network' NETWORK = 'network'
PORT = 'port' PORT = 'port'
@ -46,14 +46,14 @@ class QosResourceExtensionHandler(object):
# at db api level automatically within transaction. # at db api level automatically within transaction.
old_policy.detach_port(port['id']) old_policy.detach_port(port['id'])
qos_policy_id = port_changes.get(qos.QOS_POLICY_ID) qos_policy_id = port_changes.get(qos_consts.QOS_POLICY_ID)
if qos_policy_id is not None: if qos_policy_id is not None:
policy = self._get_policy_obj(context, qos_policy_id) policy = self._get_policy_obj(context, qos_policy_id)
#TODO(QoS): If the policy doesn't exist (or if it is not shared and #TODO(QoS): If the policy doesn't exist (or if it is not shared and
# the tenant id doesn't match the context's), this will # the tenant id doesn't match the context's), this will
# raise an exception (policy is None). # raise an exception (policy is None).
policy.attach_port(port['id']) policy.attach_port(port['id'])
port[qos.QOS_POLICY_ID] = qos_policy_id port[qos_consts.QOS_POLICY_ID] = qos_policy_id
def _update_network_policy(self, context, network, network_changes): def _update_network_policy(self, context, network, network_changes):
old_policy = policy_object.QosPolicy.get_network_policy( old_policy = policy_object.QosPolicy.get_network_policy(
@ -61,21 +61,22 @@ class QosResourceExtensionHandler(object):
if old_policy: if old_policy:
old_policy.detach_network(network['id']) old_policy.detach_network(network['id'])
qos_policy_id = network_changes.get(qos.QOS_POLICY_ID) qos_policy_id = network_changes.get(qos_consts.QOS_POLICY_ID)
if qos_policy_id: if qos_policy_id:
policy = self._get_policy_obj(context, qos_policy_id) policy = self._get_policy_obj(context, qos_policy_id)
#TODO(QoS): If the policy doesn't exist (or if it is not shared and #TODO(QoS): If the policy doesn't exist (or if it is not shared and
# the tenant id doesn't match the context's), this will # the tenant id doesn't match the context's), this will
# raise an exception (policy is None). # raise an exception (policy is None).
policy.attach_network(network['id']) policy.attach_network(network['id'])
network[qos.QOS_POLICY_ID] = qos_policy_id network[qos_consts.QOS_POLICY_ID] = qos_policy_id
def _exec(self, method_name, context, kwargs): def _exec(self, method_name, context, kwargs):
return getattr(self, method_name)(context=context, **kwargs) return getattr(self, method_name)(context=context, **kwargs)
def process_resource(self, context, resource_type, requested_resource, def process_resource(self, context, resource_type, requested_resource,
actual_resource): actual_resource):
if qos.QOS_POLICY_ID in requested_resource and self.plugin_loaded: if (qos_consts.QOS_POLICY_ID in requested_resource and
self.plugin_loaded):
self._exec('_update_%s_policy' % resource_type, context, self._exec('_update_%s_policy' % resource_type, context,
{resource_type: actual_resource, {resource_type: actual_resource,
"%s_changes" % resource_type: requested_resource}) "%s_changes" % resource_type: requested_resource})
@ -85,4 +86,5 @@ class QosResourceExtensionHandler(object):
return {} return {}
binding = resource['qos_policy_binding'] binding = resource['qos_policy_binding']
return {qos.QOS_POLICY_ID: binding['policy_id'] if binding else None} qos_policy_id = binding['policy_id'] if binding else None
return {qos_consts.QOS_POLICY_ID: qos_policy_id}

View File

@ -28,10 +28,10 @@ from neutron.agent import rpc as agent_rpc
from neutron.common import constants from neutron.common import constants
from neutron.common import exceptions from neutron.common import exceptions
from neutron.common import topics from neutron.common import topics
from neutron.extensions import qos
from neutron.plugins.ml2.drivers import type_tunnel from neutron.plugins.ml2.drivers import type_tunnel
from neutron.plugins.ml2 import managers from neutron.plugins.ml2 import managers
from neutron.plugins.ml2 import rpc as plugin_rpc from neutron.plugins.ml2 import rpc as plugin_rpc
from neutron.services.qos import qos_consts
from neutron.tests import base from neutron.tests import base
@ -147,16 +147,19 @@ class RpcCallbacksTestCase(base.BaseTestCase):
port = collections.defaultdict(lambda: 'fake_port') port = collections.defaultdict(lambda: 'fake_port')
self.plugin.get_bound_port_context().current = port self.plugin.get_bound_port_context().current = port
self.plugin.get_bound_port_context().network._network = ( self.plugin.get_bound_port_context().network._network = (
{"id": "fake_network", qos.QOS_POLICY_ID: 'test-policy-id'}) {"id": "fake_network",
qos_consts.QOS_POLICY_ID: 'test-policy-id'})
res = self.callbacks.get_device_details(mock.Mock(), host='fake') res = self.callbacks.get_device_details(mock.Mock(), host='fake')
self.assertEqual('test-policy-id', res['qos_policy_id']) self.assertEqual('test-policy-id', res['qos_policy_id'])
def test_get_device_details_qos_policy_id_taken_from_port(self): def test_get_device_details_qos_policy_id_taken_from_port(self):
port = collections.defaultdict( port = collections.defaultdict(
lambda: 'fake_port', {qos.QOS_POLICY_ID: 'test-port-policy-id'}) lambda: 'fake_port',
{qos_consts.QOS_POLICY_ID: 'test-port-policy-id'})
self.plugin.get_bound_port_context().current = port self.plugin.get_bound_port_context().current = port
self.plugin.get_bound_port_context().network._network = ( self.plugin.get_bound_port_context().network._network = (
{"id": "fake_network", qos.QOS_POLICY_ID: 'test-net-policy-id'}) {"id": "fake_network",
qos_consts.QOS_POLICY_ID: 'test-net-policy-id'})
res = self.callbacks.get_device_details(mock.Mock(), host='fake') res = self.callbacks.get_device_details(mock.Mock(), host='fake')
self.assertEqual('test-port-policy-id', res['qos_policy_id']) self.assertEqual('test-port-policy-id', res['qos_policy_id'])

View File

@ -15,8 +15,8 @@
import mock import mock
from neutron.extensions import qos
from neutron.plugins.common import constants as plugin_constants from neutron.plugins.common import constants as plugin_constants
from neutron.services.qos import qos_consts
from neutron.services.qos import qos_extension from neutron.services.qos import qos_extension
from neutron.tests import base from neutron.tests import base
@ -47,19 +47,21 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
def test_process_resource_no_qos_plugin_loaded(self): def test_process_resource_no_qos_plugin_loaded(self):
with self._mock_plugin_loaded(False): with self._mock_plugin_loaded(False):
self.ext_handler.process_resource(None, qos_extension.PORT, self.ext_handler.process_resource(
{qos.QOS_POLICY_ID: None}, None) None, qos_extension.PORT,
{qos_consts.QOS_POLICY_ID: None}, None)
self.assertFalse(self.policy_m.called) self.assertFalse(self.policy_m.called)
def test_process_resource_port_new_policy(self): def test_process_resource_port_new_policy(self):
with self._mock_plugin_loaded(True): with self._mock_plugin_loaded(True):
qos_policy_id = mock.Mock() qos_policy_id = mock.Mock()
actual_port = {'id': mock.Mock(), actual_port = {'id': mock.Mock(),
qos.QOS_POLICY_ID: qos_policy_id} qos_consts.QOS_POLICY_ID: qos_policy_id}
qos_policy = mock.MagicMock() qos_policy = mock.MagicMock()
self.policy_m.get_by_id = mock.Mock(return_value=qos_policy) self.policy_m.get_by_id = mock.Mock(return_value=qos_policy)
self.ext_handler.process_resource( self.ext_handler.process_resource(
None, qos_extension.PORT, {qos.QOS_POLICY_ID: qos_policy_id}, None, qos_extension.PORT,
{qos_consts.QOS_POLICY_ID: qos_policy_id},
actual_port) actual_port)
qos_policy.attach_port.assert_called_once_with(actual_port['id']) qos_policy.attach_port.assert_called_once_with(actual_port['id'])
@ -69,14 +71,15 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
qos_policy_id = mock.Mock() qos_policy_id = mock.Mock()
port_id = mock.Mock() port_id = mock.Mock()
actual_port = {'id': port_id, actual_port = {'id': port_id,
qos.QOS_POLICY_ID: qos_policy_id} qos_consts.QOS_POLICY_ID: qos_policy_id}
old_qos_policy = mock.MagicMock() old_qos_policy = mock.MagicMock()
self.policy_m.get_port_policy = mock.Mock( self.policy_m.get_port_policy = mock.Mock(
return_value=old_qos_policy) return_value=old_qos_policy)
new_qos_policy = mock.MagicMock() new_qos_policy = mock.MagicMock()
self.policy_m.get_by_id = mock.Mock(return_value=new_qos_policy) self.policy_m.get_by_id = mock.Mock(return_value=new_qos_policy)
self.ext_handler.process_resource( self.ext_handler.process_resource(
None, qos_extension.PORT, {qos.QOS_POLICY_ID: qos_policy_id}, None, qos_extension.PORT,
{qos_consts.QOS_POLICY_ID: qos_policy_id},
actual_port) actual_port)
old_qos_policy.detach_port.assert_called_once_with(port_id) old_qos_policy.detach_port.assert_called_once_with(port_id)
@ -86,12 +89,12 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
with self._mock_plugin_loaded(True): with self._mock_plugin_loaded(True):
qos_policy_id = mock.Mock() qos_policy_id = mock.Mock()
actual_network = {'id': mock.Mock(), actual_network = {'id': mock.Mock(),
qos.QOS_POLICY_ID: qos_policy_id} qos_consts.QOS_POLICY_ID: qos_policy_id}
qos_policy = mock.MagicMock() qos_policy = mock.MagicMock()
self.policy_m.get_by_id = mock.Mock(return_value=qos_policy) self.policy_m.get_by_id = mock.Mock(return_value=qos_policy)
self.ext_handler.process_resource( self.ext_handler.process_resource(
None, qos_extension.NETWORK, None, qos_extension.NETWORK,
{qos.QOS_POLICY_ID: qos_policy_id}, actual_network) {qos_consts.QOS_POLICY_ID: qos_policy_id}, actual_network)
qos_policy.attach_network.assert_called_once_with( qos_policy.attach_network.assert_called_once_with(
actual_network['id']) actual_network['id'])
@ -101,7 +104,7 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
qos_policy_id = mock.Mock() qos_policy_id = mock.Mock()
network_id = mock.Mock() network_id = mock.Mock()
actual_network = {'id': network_id, actual_network = {'id': network_id,
qos.QOS_POLICY_ID: qos_policy_id} qos_consts.QOS_POLICY_ID: qos_policy_id}
old_qos_policy = mock.MagicMock() old_qos_policy = mock.MagicMock()
self.policy_m.get_network_policy = mock.Mock( self.policy_m.get_network_policy = mock.Mock(
return_value=old_qos_policy) return_value=old_qos_policy)
@ -109,7 +112,7 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
self.policy_m.get_by_id = mock.Mock(return_value=new_qos_policy) self.policy_m.get_by_id = mock.Mock(return_value=new_qos_policy)
self.ext_handler.process_resource( self.ext_handler.process_resource(
None, qos_extension.NETWORK, None, qos_extension.NETWORK,
{qos.QOS_POLICY_ID: qos_policy_id}, actual_network) {qos_consts.QOS_POLICY_ID: qos_policy_id}, actual_network)
old_qos_policy.detach_network.assert_called_once_with(network_id) old_qos_policy.detach_network.assert_called_once_with(network_id)
new_qos_policy.attach_network.assert_called_once_with(network_id) new_qos_policy.attach_network.assert_called_once_with(network_id)
@ -123,7 +126,7 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
with self._mock_plugin_loaded(True): with self._mock_plugin_loaded(True):
fields = self.ext_handler.extract_resource_fields( fields = self.ext_handler.extract_resource_fields(
qos_extension.PORT, _get_test_dbdata(qos_policy_id)) qos_extension.PORT, _get_test_dbdata(qos_policy_id))
self.assertEqual({qos.QOS_POLICY_ID: qos_policy_id}, fields) self.assertEqual({qos_consts.QOS_POLICY_ID: qos_policy_id}, fields)
def test_extract_resource_fields_no_port_policy(self): def test_extract_resource_fields_no_port_policy(self):
self._test_extract_resource_fields_for_port(None) self._test_extract_resource_fields_for_port(None)
@ -136,7 +139,7 @@ class QosResourceExtensionHandlerTestCase(base.BaseTestCase):
with self._mock_plugin_loaded(True): with self._mock_plugin_loaded(True):
fields = self.ext_handler.extract_resource_fields( fields = self.ext_handler.extract_resource_fields(
qos_extension.NETWORK, _get_test_dbdata(qos_policy_id)) qos_extension.NETWORK, _get_test_dbdata(qos_policy_id))
self.assertEqual({qos.QOS_POLICY_ID: qos_policy_id}, fields) self.assertEqual({qos_consts.QOS_POLICY_ID: qos_policy_id}, fields)
def test_extract_resource_fields_no_network_policy(self): def test_extract_resource_fields_no_network_policy(self):
self._test_extract_resource_fields_for_network(None) self._test_extract_resource_fields_for_network(None)