Keep binding:profile keys during placement allocation change
[1] overwrites the port's binding:profile with the allocation dict,but that dict can contain other fields also. [1]: https://review.opendev.org/c/openstack/neutron/+/805637#617 Change-Id: I687686a673979cd9b95bac7282e836a6435f0521 Partial-Bug: #1922237
This commit is contained in:
parent
bd8e78401c
commit
6288dc7259
|
@ -13,6 +13,7 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import copy
|
||||||
import types
|
import types
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
@ -613,7 +614,10 @@ class QoSPlugin(qos.QoSPluginBase):
|
||||||
#
|
#
|
||||||
# Subscribers should *NOT* modify event payload objects, but this is
|
# Subscribers should *NOT* modify event payload objects, but this is
|
||||||
# the only way we can avoid inconsistency in port's attributes.
|
# the only way we can avoid inconsistency in port's attributes.
|
||||||
port['binding:profile'] = {'allocation': updated_allocation}
|
orig_binding_prof = orig_port.get('binding:profile', {})
|
||||||
|
binding_prof = copy.deepcopy(orig_binding_prof)
|
||||||
|
binding_prof.update({'allocation': updated_allocation})
|
||||||
|
port['binding:profile'] = binding_prof
|
||||||
|
|
||||||
def _validate_update_port_callback(self, resource, event, trigger,
|
def _validate_update_port_callback(self, resource, event, trigger,
|
||||||
payload=None):
|
payload=None):
|
||||||
|
|
|
@ -2223,7 +2223,8 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
original_min_kbps=None,
|
original_min_kbps=None,
|
||||||
desired_min_kbps=None,
|
desired_min_kbps=None,
|
||||||
original_min_kpps=None,
|
original_min_kpps=None,
|
||||||
desired_min_kpps=None):
|
desired_min_kpps=None,
|
||||||
|
is_sriov=False):
|
||||||
kwargs = self._prepare_for_port_placement_allocation_change(
|
kwargs = self._prepare_for_port_placement_allocation_change(
|
||||||
original_qos, desired_qos)
|
original_qos, desired_qos)
|
||||||
orig_port = kwargs['original_port']
|
orig_port = kwargs['original_port']
|
||||||
|
@ -2251,17 +2252,33 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
if desired_min_kpps:
|
if desired_min_kpps:
|
||||||
desired_qos.rules += [self._make_qos_minpps_rule(
|
desired_qos.rules += [self._make_qos_minpps_rule(
|
||||||
desired_qos.id, min_kpps=desired_min_kpps)]
|
desired_qos.id, min_kpps=desired_min_kpps)]
|
||||||
|
|
||||||
|
binding_prof = {}
|
||||||
|
if is_sriov:
|
||||||
|
binding_prof = {
|
||||||
|
'pci_slot': '0000:42:41.0',
|
||||||
|
'pci_vendor_info': '8086:107ed',
|
||||||
|
'physical_network': 'sriov_phy'
|
||||||
|
}
|
||||||
|
|
||||||
|
binding_prof.update({'allocation': allocation})
|
||||||
orig_port.update(
|
orig_port.update(
|
||||||
{'binding:profile':
|
{'binding:profile': binding_prof,
|
||||||
{'allocation': allocation},
|
'device_id': 'uu:id'}
|
||||||
'device_id': 'uu:id'})
|
)
|
||||||
return orig_port, kwargs['port']
|
return orig_port, kwargs['port']
|
||||||
|
|
||||||
|
def _assert_pci_info(self, port):
|
||||||
|
self.assertIn('pci_slot', port['binding:profile'])
|
||||||
|
self.assertIn('pci_vendor_info', port['binding:profile'])
|
||||||
|
self.assertIn('physical_network', port['binding:profile'])
|
||||||
|
|
||||||
def test_change_placement_allocation_increase(self):
|
def test_change_placement_allocation_increase(self):
|
||||||
qos1 = self._make_qos_policy()
|
qos1 = self._make_qos_policy()
|
||||||
qos2 = self._make_qos_policy()
|
qos2 = self._make_qos_policy()
|
||||||
orig_port, port = self._prepare_port_for_placement_allocation(
|
orig_port, port = self._prepare_port_for_placement_allocation(
|
||||||
qos1, qos2, original_min_kbps=1000, desired_min_kbps=2000)
|
qos1, qos2, original_min_kbps=1000, desired_min_kbps=2000,
|
||||||
|
is_sriov=True)
|
||||||
with mock.patch.object(self.qos_plugin._placement_client,
|
with mock.patch.object(self.qos_plugin._placement_client,
|
||||||
'update_qos_allocation') as mock_update_qos_alloc:
|
'update_qos_allocation') as mock_update_qos_alloc:
|
||||||
self.qos_plugin._change_placement_allocation(
|
self.qos_plugin._change_placement_allocation(
|
||||||
|
@ -2269,12 +2286,14 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
mock_update_qos_alloc.assert_called_once_with(
|
mock_update_qos_alloc.assert_called_once_with(
|
||||||
consumer_uuid='uu:id',
|
consumer_uuid='uu:id',
|
||||||
alloc_diff={self.MIN_BW_RP: {'NET_BW_IGR_KILOBIT_PER_SEC': 1000}})
|
alloc_diff={self.MIN_BW_RP: {'NET_BW_IGR_KILOBIT_PER_SEC': 1000}})
|
||||||
|
self._assert_pci_info(port)
|
||||||
|
|
||||||
def test_change_placement_allocation_increase_min_pps(self):
|
def test_change_placement_allocation_increase_min_pps(self):
|
||||||
qos1 = self._make_qos_policy()
|
qos1 = self._make_qos_policy()
|
||||||
qos2 = self._make_qos_policy()
|
qos2 = self._make_qos_policy()
|
||||||
orig_port, port = self._prepare_port_for_placement_allocation(
|
orig_port, port = self._prepare_port_for_placement_allocation(
|
||||||
qos1, qos2, original_min_kpps=1000, desired_min_kpps=2000)
|
qos1, qos2, original_min_kpps=1000, desired_min_kpps=2000,
|
||||||
|
is_sriov=True)
|
||||||
with mock.patch.object(self.qos_plugin._placement_client,
|
with mock.patch.object(self.qos_plugin._placement_client,
|
||||||
'update_qos_allocation') as mock_update_qos_alloc:
|
'update_qos_allocation') as mock_update_qos_alloc:
|
||||||
self.qos_plugin._change_placement_allocation(
|
self.qos_plugin._change_placement_allocation(
|
||||||
|
@ -2283,6 +2302,7 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
consumer_uuid='uu:id',
|
consumer_uuid='uu:id',
|
||||||
alloc_diff={self.MIN_PPS_RP: {
|
alloc_diff={self.MIN_PPS_RP: {
|
||||||
'NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC': 1000}})
|
'NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC': 1000}})
|
||||||
|
self._assert_pci_info(port)
|
||||||
|
|
||||||
def test_change_placement_allocation_increase_min_pps_and_min_bw(self):
|
def test_change_placement_allocation_increase_min_pps_and_min_bw(self):
|
||||||
qos1 = self._make_qos_policy()
|
qos1 = self._make_qos_policy()
|
||||||
|
@ -2372,7 +2392,7 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
desired_qos = self._make_qos_policy()
|
desired_qos = self._make_qos_policy()
|
||||||
orig_port, port = self._prepare_port_for_placement_allocation(
|
orig_port, port = self._prepare_port_for_placement_allocation(
|
||||||
original_qos, desired_qos, original_min_kbps=2000,
|
original_qos, desired_qos, original_min_kbps=2000,
|
||||||
desired_min_kbps=1000)
|
desired_min_kbps=1000, is_sriov=True)
|
||||||
with mock.patch.object(self.qos_plugin._placement_client,
|
with mock.patch.object(self.qos_plugin._placement_client,
|
||||||
'update_qos_allocation') as mock_update_qos_alloc:
|
'update_qos_allocation') as mock_update_qos_alloc:
|
||||||
self.qos_plugin._change_placement_allocation(
|
self.qos_plugin._change_placement_allocation(
|
||||||
|
@ -2380,13 +2400,14 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
mock_update_qos_alloc.assert_called_once_with(
|
mock_update_qos_alloc.assert_called_once_with(
|
||||||
consumer_uuid='uu:id',
|
consumer_uuid='uu:id',
|
||||||
alloc_diff={self.MIN_BW_RP: {'NET_BW_IGR_KILOBIT_PER_SEC': -1000}})
|
alloc_diff={self.MIN_BW_RP: {'NET_BW_IGR_KILOBIT_PER_SEC': -1000}})
|
||||||
|
self._assert_pci_info(port)
|
||||||
|
|
||||||
def test_change_placement_allocation_decrease_min_pps(self):
|
def test_change_placement_allocation_decrease_min_pps(self):
|
||||||
original_qos = self._make_qos_policy()
|
original_qos = self._make_qos_policy()
|
||||||
desired_qos = self._make_qos_policy()
|
desired_qos = self._make_qos_policy()
|
||||||
orig_port, port = self._prepare_port_for_placement_allocation(
|
orig_port, port = self._prepare_port_for_placement_allocation(
|
||||||
original_qos, desired_qos, original_min_kpps=2000,
|
original_qos, desired_qos, original_min_kpps=2000,
|
||||||
desired_min_kpps=1000)
|
desired_min_kpps=1000, is_sriov=True)
|
||||||
with mock.patch.object(self.qos_plugin._placement_client,
|
with mock.patch.object(self.qos_plugin._placement_client,
|
||||||
'update_qos_allocation') as mock_update_qos_alloc:
|
'update_qos_allocation') as mock_update_qos_alloc:
|
||||||
self.qos_plugin._change_placement_allocation(
|
self.qos_plugin._change_placement_allocation(
|
||||||
|
@ -2395,6 +2416,7 @@ class TestQosPluginDB(base.BaseQosTestCase):
|
||||||
consumer_uuid='uu:id',
|
consumer_uuid='uu:id',
|
||||||
alloc_diff={self.MIN_PPS_RP: {
|
alloc_diff={self.MIN_PPS_RP: {
|
||||||
'NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC': -1000}})
|
'NET_PACKET_RATE_IGR_KILOPACKET_PER_SEC': -1000}})
|
||||||
|
self._assert_pci_info(port)
|
||||||
|
|
||||||
def test_change_placement_allocation_no_original_qos(self):
|
def test_change_placement_allocation_no_original_qos(self):
|
||||||
qos1 = None
|
qos1 = None
|
||||||
|
|
Loading…
Reference in New Issue