From dc4ca77e4c21ab4730bec6305c58f18b9fa2f8db Mon Sep 17 00:00:00 2001 From: Balazs Gibizer Date: Wed, 3 Jul 2019 17:54:50 +0200 Subject: [PATCH] Add 'resource_request' to neutronv2/constants This patch replaces of the string usage with referring to the new constant in neutronv2/constants.py Change-Id: I6fc3cb0651f65b2448fbbb58989c920974f076c3 --- nova/api/openstack/common.py | 5 +++-- nova/cmd/manage.py | 14 ++++++++------ nova/compute/api.py | 3 ++- nova/network/neutronv2/api.py | 10 +++++----- nova/network/neutronv2/constants.py | 1 + nova/tests/fixtures.py | 8 ++++---- nova/tests/functional/test_nova_manage.py | 5 +++-- nova/tests/functional/test_servers.py | 8 +++++--- nova/tests/unit/compute/test_compute_api.py | 3 ++- nova/tests/unit/network/test_neutronv2.py | 17 ++++++++++------- 10 files changed, 43 insertions(+), 31 deletions(-) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 770dcfec1f..36f6ed739a 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -30,6 +30,7 @@ from nova.compute import vm_states import nova.conf from nova import exception from nova.i18n import _ +from nova.network.neutronv2 import constants from nova import objects from nova import quota from nova import utils @@ -578,9 +579,9 @@ def instance_has_port_with_resource_request( # instance has no port with resource request. If the instance is shelve # offloaded then we still have to hit neutron. search_opts = {'device_id': instance_uuid, - 'fields': ['resource_request']} + 'fields': [constants.RESOURCE_REQUEST]} ports = network_api.list_ports(context, **search_opts).get('ports', []) for port in ports: - if port.get('resource_request'): + if port.get(constants.RESOURCE_REQUEST): return True return False diff --git a/nova/cmd/manage.py b/nova/cmd/manage.py index e87ddcae4f..c0a43551b5 100644 --- a/nova/cmd/manage.py +++ b/nova/cmd/manage.py @@ -1676,7 +1676,8 @@ class PlacementCommands(object): try: return neutron.list_ports( ctxt, device_id=instance.uuid, - fields=['id', 'resource_request', constants.BINDING_PROFILE] + fields=['id', constants.RESOURCE_REQUEST, + constants.BINDING_PROFILE] )['ports'] except neutron_client_exc.NeutronClientException as e: raise exception.UnableToQueryPorts( @@ -1684,7 +1685,7 @@ class PlacementCommands(object): @staticmethod def _has_request_but_no_allocation(port): - request = port.get('resource_request') + request = port.get(constants.RESOURCE_REQUEST) binding_profile = port.get(constants.BINDING_PROFILE, {}) or {} allocation = binding_profile.get(constants.ALLOCATION) # We are defensive here about 'resources' and 'required' in the @@ -1774,7 +1775,8 @@ class PlacementCommands(object): instance allocation dict. """ matching_rp_uuids = self._get_rps_in_tree_with_required_traits( - ctxt, node_uuid, port['resource_request']['required'], placement) + ctxt, node_uuid, port[constants.RESOURCE_REQUEST]['required'], + placement) if len(matching_rp_uuids) > 1: # If there is more than one such RP then it is an ambiguous @@ -1796,7 +1798,7 @@ class PlacementCommands(object): raise exception.NoResourceProviderToHealFrom( port_id=port['id'], instance_uuid=instance_uuid, - traits=port['resource_request']['required'], + traits=port[constants.RESOURCE_REQUEST]['required'], node_uuid=node_uuid) # We found one RP that matches the traits. Assume that we can allocate @@ -1806,7 +1808,7 @@ class PlacementCommands(object): port_allocation = { rp_uuid: { - 'resources': port['resource_request']['resources'] + 'resources': port[constants.RESOURCE_REQUEST]['resources'] } } return port_allocation @@ -1880,7 +1882,7 @@ class PlacementCommands(object): "traits for port %(port_uuid)s with resource request " "%(request)s attached to instance %(instance_uuid)s") % {"rp_uuid": rp_uuid, "port_uuid": port["id"], - "request": port.get("resource_request"), + "request": port.get(constants.RESOURCE_REQUEST), "instance_uuid": instance.uuid}) return allocations, ports_to_heal diff --git a/nova/compute/api.py b/nova/compute/api.py index e067b2e637..f51ad72d59 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -63,6 +63,7 @@ from nova.i18n import _ from nova import image from nova import network from nova.network import model as network_model +from nova.network.neutronv2 import constants from nova.network.security_group import openstack_driver from nova.network.security_group import security_group_base from nova import objects @@ -4361,7 +4362,7 @@ class API(base.Base): # need a new scheduling if resource on this host is not available. if port_id: port = self.network_api.show_port(context, port_id) - if port['port'].get('resource_request'): + if port['port'].get(constants.RESOURCE_REQUEST): raise exception.AttachInterfaceWithQoSPolicyNotSupported( instance_uuid=instance.uuid) diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index b34f47cdb3..d22f23f8ab 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -462,7 +462,7 @@ class API(base_api.NetworkAPI): # such ports are currently not supported as they would at least # need resource allocation manipulation in placement but might also # need a new scheduling if resource on this host is not available. - if port.get('resource_request', None): + if port.get(constants.RESOURCE_REQUEST, None): msg = _( "The auto-created port %(port_id)s is being deleted due " "to its network having QoS policy.") @@ -1003,7 +1003,7 @@ class API(base_api.NetworkAPI): for port in requested_ports_dict.values(): # only communicate the allocations if the port has resource # requests - if port.get('resource_request'): + if port.get(constants.RESOURCE_REQUEST): profile = port.get(constants.BINDING_PROFILE, {}) # NOTE(gibi): In the resource provider mapping there can be # more than one RP fulfilling a request group. But resource @@ -1663,7 +1663,7 @@ class API(base_api.NetworkAPI): if port: # if there is resource associated to this port then that needs to # be deallocated so lets return info about such allocation - resource_request = port.get('resource_request') + resource_request = port.get(constants.RESOURCE_REQUEST) allocated_rp = port.get( constants.BINDING_PROFILE, {}).get(constants.ALLOCATION) if resource_request and allocated_rp: @@ -1950,7 +1950,7 @@ class API(base_api.NetworkAPI): port = self._show_port( context, port_id, neutron_client=neutron, fields=['binding:vnic_type', constants.BINDING_PROFILE, - 'network_id', 'resource_request']) + 'network_id', constants.RESOURCE_REQUEST]) network_id = port.get('network_id') trusted = None vnic_type = port.get('binding:vnic_type', @@ -1962,7 +1962,7 @@ class API(base_api.NetworkAPI): # set depending on neutron configuration, e.g. if QoS rules are # applied to the port/network and the port-resource-request API # extension is enabled. - resource_request = port.get('resource_request', None) + resource_request = port.get(constants.RESOURCE_REQUEST, None) return vnic_type, trusted, network_id, resource_request def create_resource_requests(self, context, requested_networks, diff --git a/nova/network/neutronv2/constants.py b/nova/network/neutronv2/constants.py index 19bf3565f0..1bb4605c9f 100644 --- a/nova/network/neutronv2/constants.py +++ b/nova/network/neutronv2/constants.py @@ -27,3 +27,4 @@ BINDING_HOST_ID = 'binding:host_id' MIGRATING_ATTR = 'migrating_to' L3_NETWORK_TYPES = ['vxlan', 'gre', 'geneve'] ALLOCATION = 'allocation' +RESOURCE_REQUEST = 'resource_request' diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index d31deb2838..a90aa7be4c 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -1284,7 +1284,7 @@ class NeutronFixture(fixtures.Fixture): } ], 'tenant_id': tenant_id, - 'resource_request': { + neutron_constants.RESOURCE_REQUEST: { "resources": { orc.NET_BW_IGR_KILOBIT_PER_SEC: 1000, orc.NET_BW_EGR_KILOBIT_PER_SEC: 1000}, @@ -1337,7 +1337,7 @@ class NeutronFixture(fixtures.Fixture): } ], 'tenant_id': tenant_id, - 'resource_request': {}, + neutron_constants.RESOURCE_REQUEST: {}, 'binding:vnic_type': 'direct', } @@ -1355,7 +1355,7 @@ class NeutronFixture(fixtures.Fixture): } ], 'tenant_id': tenant_id, - 'resource_request': { + neutron_constants.RESOURCE_REQUEST: { "resources": { orc.NET_BW_IGR_KILOBIT_PER_SEC: 10000, orc.NET_BW_EGR_KILOBIT_PER_SEC: 10000}, @@ -1378,7 +1378,7 @@ class NeutronFixture(fixtures.Fixture): } ], 'tenant_id': tenant_id, - 'resource_request': { + neutron_constants.RESOURCE_REQUEST: { "resources": { orc.NET_BW_IGR_KILOBIT_PER_SEC: 10000, orc.NET_BW_EGR_KILOBIT_PER_SEC: 10000}, diff --git a/nova/tests/functional/test_nova_manage.py b/nova/tests/functional/test_nova_manage.py index 609e2a2a57..4ed16cc240 100644 --- a/nova/tests/functional/test_nova_manage.py +++ b/nova/tests/functional/test_nova_manage.py @@ -24,6 +24,7 @@ from nova.cmd import manage from nova import config from nova import context from nova import exception +from nova.network.neutronv2 import constants from nova import objects from nova import test from nova.tests import fixtures as nova_fixtures @@ -770,7 +771,7 @@ class TestNovaManagePlacementHealPortAllocations( # _ports list is safe as it is re-created for each Neutron fixture # instance therefore for each individual test using that fixture. bound_port = self.neutron._ports[port_id] - bound_port['resource_request'] = resource_request + bound_port[constants.RESOURCE_REQUEST] = resource_request def _create_server_with_missing_port_alloc( self, ports, resource_request=None): @@ -822,7 +823,7 @@ class TestNovaManagePlacementHealPortAllocations( # bridge RP total_request = collections.defaultdict(int) for port in ports: - port_request = port['resource_request']['resources'] + port_request = port[constants.RESOURCE_REQUEST]['resources'] for rc, amount in port_request.items(): total_request[rc] += amount self.assertEqual(total_request, network_allocations) diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py index 5fd05e1c23..2c5e8c5f96 100644 --- a/nova/tests/functional/test_servers.py +++ b/nova/tests/functional/test_servers.py @@ -36,6 +36,7 @@ from nova.compute import instance_actions from nova.compute import manager as compute_manager from nova import context from nova import exception +from nova.network.neutronv2 import constants from nova import objects from nova.objects import block_device as block_device_obj from nova.scheduler import utils @@ -5521,7 +5522,7 @@ class PortResourceRequestBasedSchedulingTestBase( self._create_sriov_networking_rp_tree(compute_rp_uuid) def assertPortMatchesAllocation(self, port, allocations): - port_request = port['resource_request']['resources'] + port_request = port[constants.RESOURCE_REQUEST]['resources'] for rc, amount in allocations.items(): self.assertEqual(port_request[rc], amount, 'port %s requested %d %s ' @@ -5540,8 +5541,9 @@ class UnsupportedPortResourceRequestBasedSchedulingTest( # _ports list is safe as it is re-created for each Neutron fixture # instance therefore for each individual test using that fixture. bound_port = self.neutron._ports[port_id] - bound_port['resource_request'] = ( - self.neutron.port_with_resource_request['resource_request']) + bound_port[constants.RESOURCE_REQUEST] = ( + self.neutron.port_with_resource_request[ + constants.RESOURCE_REQUEST]) def test_interface_attach_with_port_resource_request(self): # create a server diff --git a/nova/tests/unit/compute/test_compute_api.py b/nova/tests/unit/compute/test_compute_api.py index e7ec2b9f41..7d8e7ffbd1 100644 --- a/nova/tests/unit/compute/test_compute_api.py +++ b/nova/tests/unit/compute/test_compute_api.py @@ -43,6 +43,7 @@ from nova.db import api as db from nova import exception from nova.image import api as image_api from nova.network.neutronv2 import api as neutron_api +from nova.network.neutronv2 import constants from nova import objects from nova.objects import base as obj_base from nova.objects import block_device as block_device_obj @@ -6200,7 +6201,7 @@ class ComputeAPIUnitTestCase(_ComputeAPIUnitTestMixIn, test.NoDBTestCase): with mock.patch.object( self.compute_api.network_api, 'show_port', return_value={'port': { - 'resource_request': { + constants.RESOURCE_REQUEST: { 'resources': {'CUSTOM_RESOURCE_CLASS': 42} }}}) as mock_show_port: self.assertRaises( diff --git a/nova/tests/unit/network/test_neutronv2.py b/nova/tests/unit/network/test_neutronv2.py index fd7b6e4eea..7631a252cc 100644 --- a/nova/tests/unit/network/test_neutronv2.py +++ b/nova/tests/unit/network/test_neutronv2.py @@ -2135,7 +2135,8 @@ class TestNeutronv2(TestNeutronv2Base): if binding_vnic_type: test_port['port']['binding:vnic_type'] = binding_vnic_type if port_resource_request: - test_port['port']['resource_request'] = port_resource_request + test_port['port'][ + constants.RESOURCE_REQUEST] = port_resource_request mock_get_client.reset_mock() mock_client = mock_get_client() @@ -2147,7 +2148,7 @@ class TestNeutronv2(TestNeutronv2Base): mock_client.show_port.assert_called_once_with(test_port['port']['id'], fields=['binding:vnic_type', 'binding:profile', 'network_id', - 'resource_request']) + constants.RESOURCE_REQUEST]) self.assertEqual(expected_vnic_type, vnic_type) self.assertEqual('net-id', network_id) self.assertIsNone(trusted) @@ -3523,7 +3524,7 @@ class TestNeutronv2WithMock(TestNeutronv2Base): mock_client.show_port.assert_called_once_with(test_port['port']['id'], fields=['binding:vnic_type', 'binding:profile', 'network_id', - 'resource_request']) + constants.RESOURCE_REQUEST]) self.assertEqual(model.VNIC_TYPE_DIRECT, vnic_type) self.assertEqual('net-id', network_id) self.assertTrue(trusted) @@ -3968,7 +3969,8 @@ class TestNeutronv2WithMock(TestNeutronv2Base): mock_client = mock.MagicMock() mock_client.create_port.return_value = {'port': { 'id': uuids.port_id, - 'resource_request': {'resources': {'CUSTOM_RESOURCE_CLASS': 42}} + constants.RESOURCE_REQUEST: { + 'resources': {'CUSTOM_RESOURCE_CLASS': 42}} }} exc = self.assertRaises(exception.NetworksWithQoSPolicyNotSupported, @@ -3989,7 +3991,8 @@ class TestNeutronv2WithMock(TestNeutronv2Base): mock_client = mock.MagicMock() mock_client.create_port.return_value = {'port': { 'id': uuids.port_id, - 'resource_request': {'resources': {'CUSTOM_RESOURCE_CLASS': 42}} + constants.RESOURCE_REQUEST: { + 'resources': {'CUSTOM_RESOURCE_CLASS': 42}} }} mock_client.delete_port.side_effect = \ exceptions.NeutronClientException() @@ -5038,7 +5041,7 @@ class TestNeutronv2WithMock(TestNeutronv2Base): mock_client = mock.Mock() mock_client.show_port.return_value = { 'port': { - 'resource_request': { + constants.RESOURCE_REQUEST: { 'resources': { 'NET_BW_EGR_KILOBIT_PER_SEC': 1000 } @@ -5178,7 +5181,7 @@ class TestNeutronv2WithMock(TestNeutronv2Base): 'tenant_id': uuids.project_id, 'network_id': uuids.networkid_1, 'mac_address': 'fake-mac', - 'resource_request': 'fake-request' + constants.RESOURCE_REQUEST: 'fake-request' } mock_show_port.return_value = port mock_get_client.return_value.list_networks.return_value = {