Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libvirt_numa: Fix parsing of continuous numa nodes #3883

Merged
merged 4 commits into from
May 17, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 0 additions & 70 deletions virttest/utils_libvirt/libvirt_numa.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import ast
import logging

from avocado.core import exceptions

from virttest.libvirt_xml import vm_xml

LOG = logging.getLogger("avocado." + __name__)
Expand Down Expand Up @@ -118,71 +116,3 @@ def convert_all_nodes_to_string(node_list):
converted_numa_nodes = ",".join(node_ranges)
LOG.debug("Convert output for all online numa nodes: '%s'", converted_numa_nodes)
return converted_numa_nodes


def parse_numa_nodeset_to_str(numa_nodeset, node_list, ignore_error=False):
"""
Parse numa nodeset to a string

:param numa_nodeset: str, formats supported are 'x', 'x,y', 'x-y', 'x-y,^y'
:param node_list: list, host numa nodes
:param ignore_error: no exception raised if True
:return: str, parsed numa nodeset
:raises exceptions.TestError if unsupported format of numa nodeset
"""

def _get_first_continuous_numa_node_index(node_list):
"""
Get the first continues numa node index
For example:
If node list is [0, 1, 3, 4], return 0
If node list is [0, 2, 3, 5], return 1
If node list is [1, 4, 8], return -1

:param node_list: list, the host numa node list
:return: int, the first index of continuous numa node or -1 if not exists
"""
for index in range(0, len(node_list) - 1):
if node_list[index] + 1 == node_list[index + 1]:
return index
return -1

LOG.debug("numa_nodeset='%s', node_list=%s" % (numa_nodeset, node_list))
if numa_nodeset == "x":
numa_nodeset = str(node_list[0])
elif numa_nodeset == "x,y":
numa_nodeset = ",".join(map(str, node_list))
elif numa_nodeset == "x-y":
candidate_index = _get_first_continuous_numa_node_index(node_list)
if candidate_index == -1:
LOG.debug(
"No continuous numa node, use 'x,y' format instead of 'x-y' format"
)
numa_nodeset = ",".join(map(str, node_list))
else:
numa_nodeset = "%s-%s" % (
str(node_list[candidate_index]),
str(node_list[candidate_index + 1]),
)
elif numa_nodeset == "x-y,^y":
candidate_index = _get_first_continuous_numa_node_index(node_list)
if candidate_index == -1:
LOG.debug(
"No continuous numa node, use 'x,y' format instead of 'x-y' format"
)
numa_nodeset = ",".join(map(str, node_list))
else:
numa_nodeset = "%s-%s,^%s" % (
str(node_list[candidate_index]),
str(node_list[candidate_index + 1]),
str(node_list[candidate_index + 1]),
)
elif ignore_error:
LOG.error("Supported formats are not found. No parsing happens.")
else:
raise exceptions.TestError(
"Unsupported format for numa_" "nodeset value '%s'" % numa_nodeset
)

LOG.debug("Parse output for numa nodeset: '%s'", numa_nodeset)
return numa_nodeset
Loading