From 794fc7032efca33c24e229d94f914be632911124 Mon Sep 17 00:00:00 2001 From: Przemyslaw Szczerbik Date: Wed, 18 Aug 2021 13:24:06 +0200 Subject: [PATCH] Add util to generate resource request group UUID Add a new utility function that can be used to generate a stable UUID for a resource request group. Related-Bug: #1922237 See-Also: https://review.opendev.org/785236 Change-Id: Ic3718defd74c2165077bb5a942e46474d3582cf5 --- neutron_lib/placement/utils.py | 12 ++++++++ .../tests/unit/placement/test_utils.py | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/neutron_lib/placement/utils.py b/neutron_lib/placement/utils.py index a1ac8ceb6..683985b77 100644 --- a/neutron_lib/placement/utils.py +++ b/neutron_lib/placement/utils.py @@ -111,6 +111,18 @@ def device_resource_provider_uuid(namespace, host, device, separator=':'): return six_uuid5(namespace=namespace, name=name) +def resource_request_group_uuid(namespace, qos_rules, separator=':'): + """Generate a stable UUID for a resource request group. + + :param namespace: A UUID object identifying a port. + :param qos_rules: A list of QoS rules contributing to the group. + :param separator: A string used in assembling a name for uuid5(). Optional. + :returns: A unique and stable UUID identifying a resource request group. + """ + name = separator.join([rule.id for rule in qos_rules]) + return six_uuid5(namespace=namespace, name=name) + + def _parse_rp_rate(rate_str): """Parse the config string value to an non-negative integer. diff --git a/neutron_lib/tests/unit/placement/test_utils.py b/neutron_lib/tests/unit/placement/test_utils.py index c21dc3759..51e9ca920 100755 --- a/neutron_lib/tests/unit/placement/test_utils.py +++ b/neutron_lib/tests/unit/placement/test_utils.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from unittest import mock import uuid from neutron_lib.placement import utils as place_utils @@ -73,6 +74,18 @@ class TestPlacementUtils(base.BaseTestCase): except Exception: self.fail('could not generate device resource provider uuid') + def test_resource_request_group_uuid(self): + try: + # assertNotRaises + place_utils.resource_request_group_uuid( + namespace=self._uuid_ns, + qos_rules=[ + mock.MagicMock(id='fake_id_0'), + mock.MagicMock(id='fake_id_1') + ]) + except Exception: + self.fail('could not generate resource request group uuid') + def test_agent_resource_provider_uuid_stable(self): uuid_a = place_utils.agent_resource_provider_uuid( namespace=self._uuid_ns, @@ -93,6 +106,23 @@ class TestPlacementUtils(base.BaseTestCase): device='some-device') self.assertEqual(uuid_a, uuid_b) + def test_resource_request_group_uuid_stable(self): + uuid_a = place_utils.resource_request_group_uuid( + namespace=self._uuid_ns, + qos_rules=[ + mock.MagicMock(id='fake_id_0'), + mock.MagicMock(id='fake_id_1') + ] + ) + uuid_b = place_utils.resource_request_group_uuid( + namespace=self._uuid_ns, + qos_rules=[ + mock.MagicMock(id='fake_id_0'), + mock.MagicMock(id='fake_id_1') + ] + ) + self.assertEqual(uuid_a, uuid_b) + def test_parse_rp_bandwidths(self): self.assertEqual( {},