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 35be2d6bda..7b628e1710 100644 --- a/nova/cmd/manage.py +++ b/nova/cmd/manage.py @@ -1677,7 +1677,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( @@ -1685,7 +1686,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 @@ -1775,7 +1776,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 @@ -1797,7 +1799,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 @@ -1807,7 +1809,7 @@ class PlacementCommands(object): port_allocation = { rp_uuid: { - 'resources': port['resource_request']['resources'] + 'resources': port[constants.RESOURCE_REQUEST]['resources'] } } return port_allocation @@ -1881,7 +1883,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 a8eedbbbc7..a2b2eb6a9a 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 @@ -4352,7 +4353,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 91c959f131..bd6931b7bf 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 @@ -1668,7 +1668,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: @@ -1955,7 +1955,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', @@ -1967,7 +1967,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 d513af5e90..5112fbf7a4 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 c666cecc9b..22834e5d16 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 @@ -5655,7 +5656,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 ' @@ -5674,8 +5675,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 59eb9431fc..58616b9b70 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 @@ -6219,7 +6220,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 4ba2cd03ad..8ef446ff4e 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 = {