From b3a4ae122de2344c6b043ce8fbb493abc6df5704 Mon Sep 17 00:00:00 2001 From: Artom Lifshitz Date: Mon, 13 Jul 2020 15:27:15 -0400 Subject: [PATCH] Use nested-virt nodepool label To avoid being 100% dependant on the OpenEdge (formerly Fort Nebula) nodepool provider, this patch starts using the nested-virt label. In addition, because we can no longer expect SMT (aka Hyper-Threading) to be present with the new nodepool label, the new configurable [whitebox-hardware]/smt_hosts is introduced. It lists the hostnames of compute hosts that support SMT. We do have tests that require multi-NUMA and/or SMT. Those are moved to a new non-voting job that runs on the multi-numa label provided by OpenEdge. Story: 2007395 Change-Id: If62d3a23044bf17f35a370e2f84fb459c166c9b2 --- .zuul.yaml | 66 +++++++++++++++++-- devstack/plugin.sh | 3 + devstack/settings | 1 + .../api/compute/test_cpu_pinning.py | 6 ++ whitebox_tempest_plugin/config.py | 5 ++ 5 files changed, 75 insertions(+), 6 deletions(-) diff --git a/.zuul.yaml b/.zuul.yaml index e87a46cd..28482d8e 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -1,6 +1,3 @@ -# TODO(artom) Once https://review.opendev.org/#/c/679656/ merges, we can unify -# the nodeset names and use the one in Nova. Until then, have a different name -# here. - nodeset: name: multi-numa-multinode nodes: @@ -31,12 +28,42 @@ nodes: - compute +- nodeset: + name: nested-virt-multinode + nodes: + - name: controller + label: nested-virt-ubuntu-bionic + - name: compute + label: nested-virt-ubuntu-bionic + groups: + # Node where tests are executed and test results collected + - name: tempest + nodes: + - controller + # Nodes running the compute service + - name: compute + nodes: + - controller + - compute + # Nodes that are not the controller + - name: subnode + nodes: + - compute + # Switch node for multinode networking setup + - name: switch + nodes: + - controller + # Peer nodes for multinode networking setup + - name: peers + nodes: + - compute + - job: - name: whitebox-multinode-devstack - nodeset: multi-numa-multinode + name: whitebox-multinode-devstack-base + abstract: true parent: tempest-multinode-full-py3 description: | - Devstack multinode job. + Base devstack multinode job. required-projects: openstack/whitebox-tempest-plugin pre-run: playbooks/whitebox/pre.yaml @@ -69,6 +96,31 @@ tempest: num_hugepages: 512 +- job: + name: whitebox-multinode-devstack + parent: whitebox-multinode-devstack-base + nodeset: nested-virt-multinode + description: | + Runs the entire test suite on single-NUMA, non-SMT, nested virt VMs. + Tests that need SMT and/or more than 1 NUMA node are skipped in the test + code itself. + vars: + tempest_test_regex: ^whitebox_tempest_plugin\. + +- job: + name: whitebox-multinode-multinuma-devstack + parent: whitebox-multinode-devstack-base + nodeset: multi-numa-multinode + voting: false + description: | + Runs specific tests that need SMT and/or more than 1 NUMA node. + Non-voting because there is currently only 1 provider of the `multi-numa` + label, and it's not super reliable. + vars: + tempest_test_regex: '(NUMALiveMigrationTest.test_cpu_pinning|CPUThreadPolicyTest)' + devstack_localrc: + SMT_HOSTS: "{{ hostvars['controller']['ansible_facts']['ansible_hostname'] }},{{ hostvars['compute']['ansible_facts']['ansible_hostname'] }}" + - project: templates: - openstack-python-jobs @@ -77,6 +129,8 @@ check: jobs: - whitebox-multinode-devstack + - whitebox-multinode-multinuma-devstack gate: jobs: - whitebox-multinode-devstack + - whitebox-multinode-multinuma-devstack diff --git a/devstack/plugin.sh b/devstack/plugin.sh index e2368d0b..74c9c1dd 100644 --- a/devstack/plugin.sh +++ b/devstack/plugin.sh @@ -9,6 +9,9 @@ function configure { # nodes are in the env iniset $TEMPEST_CONFIG whitebox max_compute_nodes $MAX_COMPUTE_NODES iniset $TEMPEST_CONFIG whitebox available_cinder_storage $WHITEBOX_AVAILABLE_CINDER_STORAGE + if [ -n "$SMT_HOSTS" ]; then + iniset $TEMPEST_CONFIG whitebox-hardware smt_hosts "$SMT_HOSTS" + fi iniset $TEMPEST_CONFIG whitebox-nova-compute config_path "$WHITEBOX_NOVA_COMPUTE_CONFIG_PATH" iniset $TEMPEST_CONFIG whitebox-nova-compute restart_command "$WHITEBOX_NOVA_COMPUTE_RESTART_COMMAND" diff --git a/devstack/settings b/devstack/settings index 9670dde2..6a743358 100644 --- a/devstack/settings +++ b/devstack/settings @@ -1,6 +1,7 @@ NOVA_FILTERS="$NOVA_FILTERS,NUMATopologyFilter" WHITEBOX_AVAILABLE_CINDER_STORAGE=${WHITEBOX_AVAILABLE_CINDER_STORAGE:-24} +SMT_HOSTS=${SMT_HOSTS:-''} WHITEBOX_NOVA_COMPUTE_CONFIG_PATH=${WHITEBOX_NOVA_COMPUTE_CONFIG_PATH:-/etc/nova/nova-cpu.conf} WHITEBOX_NOVA_COMPUTE_RESTART_COMMAND=${WHITEBOX_NOVA_COMPUTE_RESTART_COMMAND:-'systemctl restart devstack@n-cpu'} diff --git a/whitebox_tempest_plugin/api/compute/test_cpu_pinning.py b/whitebox_tempest_plugin/api/compute/test_cpu_pinning.py index 5139de71..31e56455 100644 --- a/whitebox_tempest_plugin/api/compute/test_cpu_pinning.py +++ b/whitebox_tempest_plugin/api/compute/test_cpu_pinning.py @@ -33,6 +33,7 @@ from tempest.common import compute from tempest.common import utils from tempest.common import waiters from tempest import config +from tempest.lib import decorators from whitebox_tempest_plugin.api.compute import base from whitebox_tempest_plugin import exceptions @@ -372,6 +373,8 @@ class CPUThreadPolicyTest(BasePinningTest): set(sib).isdisjoint(cpu_pinnings.values()), "vCPUs siblings should not have been used") + @testtools.skipUnless(len(CONF.whitebox_hardware.smt_hosts) > 0, + 'At least 1 SMT-capable compute host is required') def test_threads_prefer(self): """Ensure vCPUs *are* placed on thread siblings. @@ -397,6 +400,8 @@ class CPUThreadPolicyTest(BasePinningTest): "vCPUs siblings were required by not used. Does this host " "have HyperThreading enabled?") + @testtools.skipUnless(len(CONF.whitebox_hardware.smt_hosts) > 0, + 'At least 1 SMT-capable compute host is required') def test_threads_require(self): """Ensure thread siblings are required and used. @@ -483,6 +488,7 @@ class NUMALiveMigrationTest(BasePinningTest): """ return set([len(cpu_list) for cpu_list in chain(*args)]) + @decorators.skip_because(bug='2007395', bug_type='storyboard') def test_cpu_pinning(self): host1, host2 = [self.get_ctlplane_address(host) for host in self.list_compute_hosts()] diff --git a/whitebox_tempest_plugin/config.py b/whitebox_tempest_plugin/config.py index 4a30e855..a7a9664b 100644 --- a/whitebox_tempest_plugin/config.py +++ b/whitebox_tempest_plugin/config.py @@ -146,4 +146,9 @@ hardware_opts = [ default=None, help='The vendor id of the underlying vgpu hardware of the compute. ' 'An example with Nvidia would be 10de'), + cfg.ListOpt( + 'smt_hosts', + default=[], + help='List of compute hosts that have SMT (Hyper-Threading in Intel ' + 'parlance).'), ]