Create RequestGroup from neutron port

This patch adds a factory method for the RequestGroup ovo that
constructs an object based on the resource request in a neutron port.

blueprint bandwidth-resource-provider

Change-Id: Id3813d8b064f0981b51c9ffbb90fc819e9617e42
This commit is contained in:
Balazs Gibizer
2018-12-18 15:16:37 +01:00
parent 8364abecfa
commit 1d44fbddef
2 changed files with 72 additions and 0 deletions

View File

@@ -816,3 +816,35 @@ class RequestGroup(base.NovaObject):
def __init__(self, context=None, **kwargs):
super(RequestGroup, self).__init__(context=context, **kwargs)
self.obj_set_defaults()
@classmethod
def from_port_request(cls, context, port_resource_request):
"""Init the group from the resource request of a neutron port
:param context: the request context
:param port_resource_request: the resource_request attribute of the
neutron port
For example:
port_resource_request = {
"resources": {
"NET_BW_IGR_KILOBIT_PER_SEC": 1000,
"NET_BW_EGR_KILOBIT_PER_SEC": 1000},
"required": ["CUSTOM_PHYSNET_2",
"CUSTOM_VNIC_TYPE_NORMAL"]
}
"""
# NOTE(gibi): Assumptions:
# * a port requests resource from a single provider.
# * a port only specifies resources and required traits
# NOTE(gibi): Placement rejects allocation candidates where a request
# group has traits but no resources specified. This is why resources
# are handled as mandatory below but not traits.
obj = cls(context=context,
use_same_provider=True,
resources=port_resource_request['resources'],
required_traits=set(port_resource_request.get(
'required', [])))
obj.obj_set_defaults()
return obj

View File

@@ -844,3 +844,43 @@ class TestRequestGroupObject(test.TestCase):
self.assertEqual(set(), rg.required_traits)
self.assertEqual(set(), rg.forbidden_traits)
self.assertEqual([], rg.aggregates)
def test_from_port_request(self):
port_resource_request = {
"resources": {
"NET_BW_IGR_KILOBIT_PER_SEC": 1000,
"NET_BW_EGR_KILOBIT_PER_SEC": 1000},
"required": ["CUSTOM_PHYSNET_2",
"CUSTOM_VNIC_TYPE_NORMAL"]
}
rg = request_spec.RequestGroup.from_port_request(
self.context, port_resource_request)
self.assertTrue(rg.use_same_provider)
self.assertEqual(
{"NET_BW_IGR_KILOBIT_PER_SEC": 1000,
"NET_BW_EGR_KILOBIT_PER_SEC": 1000},
rg.resources)
self.assertEqual({"CUSTOM_PHYSNET_2", "CUSTOM_VNIC_TYPE_NORMAL"},
rg.required_traits)
# and the rest is defaulted
self.assertEqual(set(), rg.forbidden_traits)
self.assertEqual([], rg.aggregates)
def test_from_port_request_without_traits(self):
port_resource_request = {
"resources": {
"NET_BW_IGR_KILOBIT_PER_SEC": 1000,
"NET_BW_EGR_KILOBIT_PER_SEC": 1000}}
rg = request_spec.RequestGroup.from_port_request(
self.context, port_resource_request)
self.assertTrue(rg.use_same_provider)
self.assertEqual(
{"NET_BW_IGR_KILOBIT_PER_SEC": 1000,
"NET_BW_EGR_KILOBIT_PER_SEC": 1000},
rg.resources)
# and the rest is defaulted
self.assertEqual(set(), rg.required_traits)
self.assertEqual(set(), rg.forbidden_traits)
self.assertEqual([], rg.aggregates)