NSX-V: support qos policy in network get

Return the policy id when getting a network

Change-Id: Ib3dbf3910dc1299a8b916788810d3e7ef024a4e8
This commit is contained in:
Adit Sarfaty 2016-05-31 10:03:13 +03:00 committed by Kobi Samoray
parent 0f8acc0c4b
commit b05f9d533c
7 changed files with 71 additions and 35 deletions

View File

@ -928,6 +928,8 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
if backend_network:
# Update the QOS restrictions of the backend network
self._update_network_qos(context, net_data, dvs_net_ids, net_moref)
new_net[qos_consts.QOS_POLICY_ID] = (
qos_com_utils.get_network_policy_id(context, new_net['id']))
# this extra lookup is necessary to get the
# latest db model for the extension functions
@ -1039,6 +1041,11 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
for mapping in mappings:
self._delete_backend_network(mapping)
def _extend_get_network_dict_provider(self, context, net):
self._extend_network_dict_provider(context, net)
net[qos_consts.QOS_POLICY_ID] = qos_com_utils.get_network_policy_id(
context, net['id'])
def get_network(self, context, id, fields=None):
with context.session.begin(subtransactions=True):
# goto to the plugin DB and fetch the network
@ -1047,7 +1054,7 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# to add provider networks fields
net_result = self._make_network_dict(network,
context=context)
self._extend_network_dict_provider(context, net_result)
self._extend_get_network_dict_provider(context, net_result)
return self._fields(net_result, fields)
def get_networks(self, context, filters=None, fields=None,
@ -1060,7 +1067,7 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
context, filters, fields, sorts,
limit, marker, page_reverse))
for net in networks:
self._extend_network_dict_provider(context, net)
self._extend_get_network_dict_provider(context, net)
return (networks if not fields else
[self._fields(network, fields) for network in networks])
@ -1130,6 +1137,9 @@ class NsxVPluginV2(addr_pair_db.AllowedAddressPairsMixin,
qos_com_utils.update_network_policy_binding(
context, id, net_attrs[qos_consts.QOS_POLICY_ID])
net_res[qos_consts.QOS_POLICY_ID] = (
qos_com_utils.get_network_policy_id(context, id))
return net_res
def _validate_address_pairs(self, attrs, db_port):

View File

@ -597,7 +597,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
net_data[qos_consts.QOS_POLICY_ID])
created_net[qos_consts.QOS_POLICY_ID] = (
qos_utils.get_network_policy_id(context, created_net['id']))
qos_com_utils.get_network_policy_id(context, created_net['id']))
return created_net
@ -758,8 +758,8 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
def _extend_get_network_dict_provider(self, context, network):
self._extend_network_dict_provider(context, network)
network[qos_consts.QOS_POLICY_ID] = qos_utils.get_network_policy_id(
context, network['id'])
network[qos_consts.QOS_POLICY_ID] = (qos_com_utils.
get_network_policy_id(context, network['id']))
def get_network(self, context, id, fields=None):
with context.session.begin(subtransactions=True):
@ -899,7 +899,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
qos_policy_id = port_data[qos_consts.QOS_POLICY_ID]
elif device_owner.startswith(const.DEVICE_OWNER_COMPUTE_PREFIX):
# check if the network of this port has a policy
qos_policy_id = qos_utils.get_network_policy_id(
qos_policy_id = qos_com_utils.get_network_policy_id(
context, port_data['network_id'])
if qos_policy_id:
qos_profile_id = self._get_qos_profile_id(context, qos_policy_id)
@ -1262,14 +1262,14 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
policy_id = updated_port[qos_consts.QOS_POLICY_ID]
else:
# Look for the previous QoS policy
policy_id = qos_utils.get_port_policy_id(
policy_id = qos_com_utils.get_port_policy_id(
context, updated_port['id'])
# If the port is now a 'compute' port (attached to a vm) and
# Qos policy was not configured on the port directly,
# try to take it from the ports network
if policy_id is None and is_new_compute:
# check if the network of this port has a policy
policy_id = qos_utils.get_network_policy_id(
policy_id = qos_com_utils.get_network_policy_id(
context, updated_port.get('network_id'))
if policy_id is not None:
@ -1362,7 +1362,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
self._extend_port_dict_binding(context, port)
# add the qos policy id from the DB
port[qos_consts.QOS_POLICY_ID] = qos_utils.get_port_policy_id(
port[qos_consts.QOS_POLICY_ID] = qos_com_utils.get_port_policy_id(
context, port['id'])
def get_port(self, context, id, fields=None):

View File

@ -49,3 +49,17 @@ def update_port_policy_binding(context, port_id, new_policy_id):
context, id=new_policy_id)
if new_policy:
new_policy.attach_port(port_id)
def get_port_policy_id(context, port_id):
policy = qos_policy.QosPolicy.get_port_policy(
context, port_id)
if policy:
return policy.id
def get_network_policy_id(context, net_id):
policy = qos_policy.QosPolicy.get_network_policy(
context, net_id)
if policy:
return policy.id

View File

@ -31,20 +31,6 @@ LOG = logging.getLogger(__name__)
MAX_KBPS_MIN_VALUE = 1024
def get_port_policy_id(context, port_id):
policy = qos_policy.QosPolicy.get_port_policy(
context, port_id)
if policy:
return policy.id
def get_network_policy_id(context, net_id):
policy = qos_policy.QosPolicy.get_network_policy(
context, net_id)
if policy:
return policy.id
def handle_qos_notification(policy_obj, event_type):
handler = QosNotificationsHandler()
context = n_context.get_admin_context()

View File

@ -31,6 +31,7 @@ from neutron.extensions import securitygroup as secgrp
from neutron import manager
from neutron.objects.qos import policy as qos_pol
from neutron.plugins.common import constants as plugin_const
from neutron.services.qos import qos_consts
from neutron.tests.unit import _test_extension_portbindings as test_bindings
import neutron.tests.unit.db.test_allowedaddresspairs_db as test_addr_pair
import neutron.tests.unit.db.test_db_base_plugin_v2 as test_plugin
@ -529,10 +530,18 @@ class TestNetworksV2(test_plugin.TestNetworksV2, NsxVPluginV2TestCase):
'admin_state_up': False,
'shared': False
}}
# create the network - should succeed and translate the policy id
plugin.create_network(ctx, data)
fake_init_from_policy.assert_called_once_with(ctx, policy_id)
self.assertTrue(fake_dvs_update.called)
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id',
return_value=policy_id):
# create the network - should succeed and translate the policy id
net = plugin.create_network(ctx, data)
self.assertEqual(policy_id, net[qos_consts.QOS_POLICY_ID])
fake_init_from_policy.assert_called_once_with(ctx, policy_id)
self.assertTrue(fake_dvs_update.called)
# Get network should also return the qos policy id
net2 = plugin.get_network(ctx, net['id'])
self.assertEqual(policy_id, net2[qos_consts.QOS_POLICY_ID])
@mock.patch.object(dvs.DvsManager, 'update_port_groups_config')
@mock.patch.object(qos_utils.NsxVQosRule, '_init_from_policy_id')
@ -557,9 +566,17 @@ class TestNetworksV2(test_plugin.TestNetworksV2, NsxVPluginV2TestCase):
policy_id = _uuid()
data['network']['qos_policy_id'] = policy_id
# update the network - should succeed and translate the policy id
plugin.update_network(ctx, net['id'], data)
fake_init_from_policy.assert_called_once_with(ctx, policy_id)
self.assertTrue(fake_dvs_update.called)
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id',
return_value=policy_id):
res = plugin.update_network(ctx, net['id'], data)
self.assertEqual(policy_id, res[qos_consts.QOS_POLICY_ID])
fake_init_from_policy.assert_called_once_with(ctx, policy_id)
self.assertTrue(fake_dvs_update.called)
# Get network should also return the qos policy id
net2 = plugin.get_network(ctx, net['id'])
self.assertEqual(policy_id, net2[qos_consts.QOS_POLICY_ID])
@mock.patch.object(dvs.DvsManager, 'update_port_groups_config')
@mock.patch.object(qos_utils.NsxVQosRule, '_init_from_policy_id')

View File

@ -280,7 +280,7 @@ class TestPortsV2(test_plugin.TestPortsV2, NsxV3PluginTestCaseMixin,
port = self.plugin.create_port(self.ctx, data)
self.assertEqual(policy_id, port['qos_policy_id'])
# Get port should also return the qos policy id
with mock.patch('vmware_nsx.services.qos.nsx_v3.utils.'
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_port_policy_id',
return_value=policy_id):
port = self.plugin.get_port(self.ctx, port['id'])
@ -305,7 +305,7 @@ class TestPortsV2(test_plugin.TestPortsV2, NsxV3PluginTestCaseMixin,
res = self.plugin.update_port(self.ctx, port['id'], data)
self.assertEqual(policy_id, res['qos_policy_id'])
# Get port should also return the qos policy id
with mock.patch('vmware_nsx.services.qos.nsx_v3.utils.'
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_port_policy_id',
return_value=policy_id):
res = self.plugin.get_port(self.ctx, port['id'])
@ -338,7 +338,7 @@ class TestPortsV2(test_plugin.TestPortsV2, NsxV3PluginTestCaseMixin,
}
with mock.patch.object(self.plugin,
'_get_qos_profile_id') as get_profile:
with mock.patch('vmware_nsx.services.qos.nsx_v3.utils.'
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id', return_value=policy_id):
self.plugin.create_port(self.ctx, data)
get_profile.assert_called_once_with(self.ctx, policy_id)
@ -361,7 +361,7 @@ class TestPortsV2(test_plugin.TestPortsV2, NsxV3PluginTestCaseMixin,
data['port']['device_owner'] = device_owner
with mock.patch.object(self.plugin,
'_get_qos_profile_id') as get_profile:
with mock.patch('vmware_nsx.services.qos.nsx_v3.utils.'
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id', return_value=policy_id):
self.plugin.update_port(self.ctx, port['id'], data)
get_profile.assert_called_once_with(self.ctx, policy_id)

View File

@ -111,8 +111,17 @@ class TestQosNsxVNotification(test_plugin.NsxVPluginV2TestCase,
cfg.CONF.set_override('dvs_name', 'fake_dvs', group='dvs')
cfg.CONF.set_default('use_dvs_features', True, 'nsxv')
def test_create_port_anticipating_allocation(self):
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id'):
super(TestQosNsxVNotification,
self).test_create_port_anticipating_allocation()
def _create_net(self):
return self._core_plugin.create_network(self.ctxt, self._net_data)
with mock.patch('vmware_nsx.services.qos.common.utils.'
'get_network_policy_id',
return_value=self.policy.id):
return self._core_plugin.create_network(self.ctxt, self._net_data)
@mock.patch.object(qos_com_utils, 'update_network_policy_binding')
@mock.patch.object(dvs.DvsManager, 'update_port_groups_config')