Add "socket" NUMA affinity policy
This new extension adds a new parameter to the NUMA affinity policy list: "socket". The "socket" NUMA affinity policy has been supported in Nova since [1]. [1]https://review.opendev.org/c/openstack/nova/+/773792 Closes-Bug: #2052786 Change-Id: Iad2d4c461a2aceef6ed2d5e622cce38362d79687
This commit is contained in:
parent
ca479b9e22
commit
70ddf4eef5
|
@ -58,6 +58,7 @@ from neutron_lib.api.definitions import port_device_profile
|
||||||
from neutron_lib.api.definitions import port_hardware_offload_type
|
from neutron_lib.api.definitions import port_hardware_offload_type
|
||||||
from neutron_lib.api.definitions import port_mac_address_regenerate
|
from neutron_lib.api.definitions import port_mac_address_regenerate
|
||||||
from neutron_lib.api.definitions import port_numa_affinity_policy
|
from neutron_lib.api.definitions import port_numa_affinity_policy
|
||||||
|
from neutron_lib.api.definitions import port_numa_affinity_policy_socket
|
||||||
from neutron_lib.api.definitions import port_resource_request
|
from neutron_lib.api.definitions import port_resource_request
|
||||||
from neutron_lib.api.definitions import port_security
|
from neutron_lib.api.definitions import port_security
|
||||||
from neutron_lib.api.definitions import portbindings
|
from neutron_lib.api.definitions import portbindings
|
||||||
|
@ -153,6 +154,7 @@ ML2_SUPPORTED_API_EXTENSIONS = [
|
||||||
port_hardware_offload_type.ALIAS,
|
port_hardware_offload_type.ALIAS,
|
||||||
port_mac_address_regenerate.ALIAS,
|
port_mac_address_regenerate.ALIAS,
|
||||||
port_numa_affinity_policy.ALIAS,
|
port_numa_affinity_policy.ALIAS,
|
||||||
|
port_numa_affinity_policy_socket.ALIAS,
|
||||||
port_security.ALIAS,
|
port_security.ALIAS,
|
||||||
provider_net.ALIAS,
|
provider_net.ALIAS,
|
||||||
port_resource_request.ALIAS,
|
port_resource_request.ALIAS,
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
# Copyright 2024 OpenStack Foundation
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
from neutron_lib import constants
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
from neutron.db import migration
|
||||||
|
|
||||||
|
|
||||||
|
# Add NUMA policy 'socket'
|
||||||
|
#
|
||||||
|
# Revision ID: 175fa80908e1
|
||||||
|
# Revises: 0e6eff810791
|
||||||
|
# Create Date: 2024-02-24 10:25:52.418502
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '175fa80908e1'
|
||||||
|
down_revision = '0e6eff810791'
|
||||||
|
|
||||||
|
table = 'portnumaaffinitypolicies'
|
||||||
|
new_enum = sa.Enum(*constants.PORT_NUMA_POLICIES,
|
||||||
|
name='numa_affinity_policy')
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
migration.alter_enum_add_value(table, 'numa_affinity_policy', new_enum,
|
||||||
|
True)
|
|
@ -1 +1 @@
|
||||||
0e6eff810791
|
175fa80908e1
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Copyright (c) 2024 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from neutron_lib.api.definitions import port_numa_affinity_policy_socket
|
||||||
|
from neutron_lib.api import extensions as api_extensions
|
||||||
|
|
||||||
|
|
||||||
|
class Port_numa_affinity_policy_socket(api_extensions.APIExtensionDescriptor):
|
||||||
|
api_definition = port_numa_affinity_policy_socket
|
|
@ -47,6 +47,8 @@ from neutron_lib.api.definitions import port_hardware_offload_type as phot_def
|
||||||
from neutron_lib.api.definitions import port_mac_address_override
|
from neutron_lib.api.definitions import port_mac_address_override
|
||||||
from neutron_lib.api.definitions import port_mac_address_regenerate
|
from neutron_lib.api.definitions import port_mac_address_regenerate
|
||||||
from neutron_lib.api.definitions import port_numa_affinity_policy as pnap_def
|
from neutron_lib.api.definitions import port_numa_affinity_policy as pnap_def
|
||||||
|
from neutron_lib.api.definitions import port_numa_affinity_policy_socket as \
|
||||||
|
pnaps_def
|
||||||
from neutron_lib.api.definitions import port_security as psec
|
from neutron_lib.api.definitions import port_security as psec
|
||||||
from neutron_lib.api.definitions import portbindings
|
from neutron_lib.api.definitions import portbindings
|
||||||
from neutron_lib.api.definitions import portbindings_extended as pbe_ext
|
from neutron_lib.api.definitions import portbindings_extended as pbe_ext
|
||||||
|
@ -241,6 +243,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
|
||||||
stateful_security_group.ALIAS,
|
stateful_security_group.ALIAS,
|
||||||
addrgrp_def.ALIAS,
|
addrgrp_def.ALIAS,
|
||||||
pnap_def.ALIAS,
|
pnap_def.ALIAS,
|
||||||
|
pnaps_def.ALIAS,
|
||||||
pdp_def.ALIAS,
|
pdp_def.ALIAS,
|
||||||
quota_check_limit.ALIAS,
|
quota_check_limit.ALIAS,
|
||||||
port_mac_address_override.ALIAS,
|
port_mac_address_override.ALIAS,
|
||||||
|
|
|
@ -63,6 +63,7 @@ NETWORK_API_EXTENSIONS+=",port-device-profile"
|
||||||
NETWORK_API_EXTENSIONS+=",port-hardware-offload-type"
|
NETWORK_API_EXTENSIONS+=",port-hardware-offload-type"
|
||||||
NETWORK_API_EXTENSIONS+=",port-mac-address-regenerate"
|
NETWORK_API_EXTENSIONS+=",port-mac-address-regenerate"
|
||||||
NETWORK_API_EXTENSIONS+=",port-numa-affinity-policy"
|
NETWORK_API_EXTENSIONS+=",port-numa-affinity-policy"
|
||||||
|
NETWORK_API_EXTENSIONS+=",port-numa-affinity-policy-socket"
|
||||||
NETWORK_API_EXTENSIONS+=",port-security-groups-filtering"
|
NETWORK_API_EXTENSIONS+=",port-security-groups-filtering"
|
||||||
NETWORK_API_EXTENSIONS+=",segment"
|
NETWORK_API_EXTENSIONS+=",segment"
|
||||||
NETWORK_API_EXTENSIONS+=",segments-peer-subnet-host-routes"
|
NETWORK_API_EXTENSIONS+=",segments-peer-subnet-host-routes"
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Copyright (c) 2020 Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import ddt
|
||||||
|
from neutron_lib.api.definitions import port_numa_affinity_policy_socket as \
|
||||||
|
apidef
|
||||||
|
from neutron_lib import constants
|
||||||
|
|
||||||
|
from neutron.tests.unit.db import test_db_base_plugin_v2
|
||||||
|
from neutron.tests.unit.extensions import test_port_numa_affinity_policy
|
||||||
|
|
||||||
|
|
||||||
|
TESTED_POLICIES = constants.PORT_NUMA_POLICIES
|
||||||
|
|
||||||
|
|
||||||
|
class PortNumaAffinityPolicySocketExtensionTestPlugin(
|
||||||
|
test_port_numa_affinity_policy.
|
||||||
|
PortNumaAffinityPolicyExtensionTestPlugin):
|
||||||
|
"""Test plugin to mixin the port NUMA affinity policy socket extension."""
|
||||||
|
supported_extension_aliases = [apidef.ALIAS]
|
||||||
|
|
||||||
|
|
||||||
|
@ddt.ddt
|
||||||
|
class PortNumaAffinityPolicySocketExtensionTestCase(
|
||||||
|
test_db_base_plugin_v2.NeutronDbPluginV2TestCase):
|
||||||
|
"""Test API extension numa_affinity_policy_socket attributes."""
|
||||||
|
|
||||||
|
def setUp(self, *args):
|
||||||
|
plugin = (
|
||||||
|
'neutron.tests.unit.extensions.test_port_numa_affinity_policy_'
|
||||||
|
'socket.PortNumaAffinityPolicySocketExtensionTestPlugin')
|
||||||
|
super().setUp(plugin=plugin)
|
||||||
|
|
||||||
|
def _create_and_check_port_nap(self, numa_affinity_policy):
|
||||||
|
name = 'numa_affinity_policy'
|
||||||
|
keys = [('name', name), ('admin_state_up', True),
|
||||||
|
('status', self.port_create_status),
|
||||||
|
('numa_affinity_policy', numa_affinity_policy)]
|
||||||
|
with self.port(name=name,
|
||||||
|
numa_affinity_policy=numa_affinity_policy) as port:
|
||||||
|
for k, v in keys:
|
||||||
|
self.assertEqual(v, port['port'][k])
|
||||||
|
return port
|
||||||
|
|
||||||
|
def _update_and_check_port_nap(self, port, numa_affinity_policy):
|
||||||
|
data = {'port': {'numa_affinity_policy': numa_affinity_policy}}
|
||||||
|
req = self.new_update_request('ports', data,
|
||||||
|
port['port']['id'])
|
||||||
|
res = self.deserialize(self.fmt, req.get_response(self.api))
|
||||||
|
self.assertEqual(numa_affinity_policy,
|
||||||
|
res['port']['numa_affinity_policy'])
|
||||||
|
|
||||||
|
@ddt.data(*TESTED_POLICIES, None)
|
||||||
|
def test_create_and_update_port_numa_affinity_policy(self,
|
||||||
|
numa_affinity_policy):
|
||||||
|
port = self._create_and_check_port_nap(numa_affinity_policy)
|
||||||
|
for new_nap in (*TESTED_POLICIES, None):
|
||||||
|
self._update_and_check_port_nap(port, new_nap)
|
|
@ -12,9 +12,8 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from neutron_lib import constants
|
|
||||||
|
|
||||||
from neutron.objects.port.extensions import port_numa_affinity_policy
|
from neutron.objects.port.extensions import port_numa_affinity_policy
|
||||||
|
from neutron.tests import tools as test_tools
|
||||||
from neutron.tests.unit.objects import test_base as obj_test_base
|
from neutron.tests.unit.objects import test_base as obj_test_base
|
||||||
from neutron.tests.unit import testlib_api
|
from neutron.tests.unit import testlib_api
|
||||||
|
|
||||||
|
@ -33,6 +32,7 @@ class PortNumaAffinityPolicyDbObjectTestCase(
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(PortNumaAffinityPolicyDbObjectTestCase, self).setUp()
|
super(PortNumaAffinityPolicyDbObjectTestCase, self).setUp()
|
||||||
|
numa = test_tools.get_random_port_numa_affinity_policy()
|
||||||
self.update_obj_fields(
|
self.update_obj_fields(
|
||||||
{'port_id': lambda: self._create_test_port_id(),
|
{'port_id': lambda: self._create_test_port_id(),
|
||||||
'numa_affinity_policy': constants.PORT_NUMA_POLICY_PREFERRED})
|
'numa_affinity_policy': numa})
|
||||||
|
|
Loading…
Reference in New Issue