diff options
Diffstat (limited to 'resources/libraries/python/CpuUtils.py')
-rw-r--r-- | resources/libraries/python/CpuUtils.py | 139 |
1 files changed, 68 insertions, 71 deletions
diff --git a/resources/libraries/python/CpuUtils.py b/resources/libraries/python/CpuUtils.py index 91db83eb5c..842c16d7ef 100644 --- a/resources/libraries/python/CpuUtils.py +++ b/resources/libraries/python/CpuUtils.py @@ -19,10 +19,10 @@ from resources.libraries.python.Constants import Constants from resources.libraries.python.ssh import exec_cmd_no_error from resources.libraries.python.topology import Topology -__all__ = ["CpuUtils"] +__all__ = [u"CpuUtils"] -class CpuUtils(object): +class CpuUtils: """CPU utilities""" # Number of threads per core. @@ -54,7 +54,7 @@ class CpuUtils(object): :rtype: bool """ cpu_mems = [item[-4:] for item in cpu_info] - cpu_mems_len = len(cpu_mems) / CpuUtils.NR_OF_THREADS + cpu_mems_len = len(cpu_mems) // CpuUtils.NR_OF_THREADS count = 0 for cpu_mem in cpu_mems[:cpu_mems_len]: if cpu_mem in cpu_mems[cpu_mems_len:]: @@ -71,17 +71,18 @@ class CpuUtils(object): :param nodes: DICT__nodes from Topology.DICT__nodes. :type nodes: dict :raises RuntimeError: If an ssh command retrieving cpu information - fails. + fails. """ for node in nodes.values(): - stdout, _ = exec_cmd_no_error(node, 'uname -m') - node['arch'] = stdout.strip() - stdout, _ = exec_cmd_no_error(node, 'lscpu -p') - node['cpuinfo'] = list() - for line in stdout.split("\n"): - if line and line[0] != "#": - node['cpuinfo'].append([CpuUtils.__str2int(x) for x in - line.split(",")]) + stdout, _ = exec_cmd_no_error(node, u"uname -m") + node[u"arch"] = stdout.strip() + stdout, _ = exec_cmd_no_error(node, u"lscpu -p") + node[u"cpuinfo"] = list() + for line in stdout.split(u"\n"): + if line and line[0] != u"#": + node[u"cpuinfo"].append( + [CpuUtils.__str2int(x) for x in line.split(u",")] + ) @staticmethod def cpu_node_count(node): @@ -93,11 +94,11 @@ class CpuUtils(object): :rtype: int :raises RuntimeError: If node cpuinfo is not available. """ - cpu_info = node.get("cpuinfo") + cpu_info = node.get(u"cpuinfo") if cpu_info is not None: - return node["cpuinfo"][-1][3] + 1 - else: - raise RuntimeError("Node cpuinfo not available.") + return node[u"cpuinfo"][-1][3] + 1 + + raise RuntimeError(u"Node cpuinfo not available.") @staticmethod def cpu_list_per_node(node, cpu_node, smt_used=False): @@ -115,13 +116,13 @@ class CpuUtils(object): or if SMT is not enabled. """ cpu_node = int(cpu_node) - cpu_info = node.get("cpuinfo") + cpu_info = node.get(u"cpuinfo") if cpu_info is None: - raise RuntimeError("Node cpuinfo not available.") + raise RuntimeError(u"Node cpuinfo not available.") smt_enabled = CpuUtils.is_smt_enabled(cpu_info) if not smt_enabled and smt_used: - raise RuntimeError("SMT is not enabled.") + raise RuntimeError(u"SMT is not enabled.") cpu_list = [] for cpu in cpu_info: @@ -133,13 +134,13 @@ class CpuUtils(object): if smt_enabled and not smt_used: cpu_list_len = len(cpu_list) - cpu_list = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS] + cpu_list = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS] return cpu_list @staticmethod - def cpu_slice_of_list_per_node(node, cpu_node, skip_cnt=0, cpu_cnt=0, - smt_used=False): + def cpu_slice_of_list_per_node( + node, cpu_node, skip_cnt=0, cpu_cnt=0, smt_used=False): """Return string of node related list of CPU numbers. :param node: Node dictionary with cpuinfo. @@ -160,26 +161,25 @@ class CpuUtils(object): cpu_list_len = len(cpu_list) if cpu_cnt + skip_cnt > cpu_list_len: - raise RuntimeError("cpu_cnt + skip_cnt > length(cpu list).") + raise RuntimeError(u"cpu_cnt + skip_cnt > length(cpu list).") if cpu_cnt == 0: cpu_cnt = cpu_list_len - skip_cnt if smt_used: - cpu_list_0 = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS] - cpu_list_1 = cpu_list[cpu_list_len / CpuUtils.NR_OF_THREADS:] - cpu_list = [cpu for cpu in cpu_list_0[skip_cnt:skip_cnt + cpu_cnt]] - cpu_list_ex = [cpu for cpu in - cpu_list_1[skip_cnt:skip_cnt + cpu_cnt]] + cpu_list_0 = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS] + cpu_list_1 = cpu_list[cpu_list_len // CpuUtils.NR_OF_THREADS:] + cpu_list = cpu_list_0[skip_cnt:skip_cnt + cpu_cnt] + cpu_list_ex = cpu_list_1[skip_cnt:skip_cnt + cpu_cnt] cpu_list.extend(cpu_list_ex) else: - cpu_list = [cpu for cpu in cpu_list[skip_cnt:skip_cnt + cpu_cnt]] + cpu_list = cpu_list[skip_cnt:skip_cnt + cpu_cnt] return cpu_list @staticmethod - def cpu_list_per_node_str(node, cpu_node, skip_cnt=0, cpu_cnt=0, sep=",", - smt_used=False): + def cpu_list_per_node_str( + node, cpu_node, skip_cnt=0, cpu_cnt=0, sep=u",", smt_used=False): """Return string of node related list of CPU numbers. :param node: Node dictionary with cpuinfo. @@ -197,15 +197,15 @@ class CpuUtils(object): :returns: Cpu numbers related to numa from argument. :rtype: str """ - cpu_list = CpuUtils.cpu_slice_of_list_per_node(node, cpu_node, - skip_cnt=skip_cnt, - cpu_cnt=cpu_cnt, - smt_used=smt_used) + cpu_list = CpuUtils.cpu_slice_of_list_per_node( + node, cpu_node, skip_cnt=skip_cnt, cpu_cnt=cpu_cnt, + smt_used=smt_used + ) return sep.join(str(cpu) for cpu in cpu_list) @staticmethod - def cpu_range_per_node_str(node, cpu_node, skip_cnt=0, cpu_cnt=0, sep="-", - smt_used=False): + def cpu_range_per_node_str( + node, cpu_node, skip_cnt=0, cpu_cnt=0, sep=u"-", smt_used=False): """Return string of node related range of CPU numbers, e.g. 0-4. :param node: Node dictionary with cpuinfo. @@ -223,27 +223,25 @@ class CpuUtils(object): :returns: String of node related range of CPU numbers. :rtype: str """ - cpu_list = CpuUtils.cpu_slice_of_list_per_node(node, cpu_node, - skip_cnt=skip_cnt, - cpu_cnt=cpu_cnt, - smt_used=smt_used) + cpu_list = CpuUtils.cpu_slice_of_list_per_node( + node, cpu_node, skip_cnt=skip_cnt, cpu_cnt=cpu_cnt, + smt_used=smt_used + ) if smt_used: cpu_list_len = len(cpu_list) - cpu_list_0 = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS] - cpu_list_1 = cpu_list[cpu_list_len / CpuUtils.NR_OF_THREADS:] - cpu_range = "{}{}{},{}{}{}".format(cpu_list_0[0], sep, - cpu_list_0[-1], - cpu_list_1[0], sep, - cpu_list_1[-1]) + cpu_list_0 = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS] + cpu_list_1 = cpu_list[cpu_list_len // CpuUtils.NR_OF_THREADS:] + cpu_range = f"{cpu_list_0[0]}{sep}{cpu_list_0[-1]}," \ + f"{cpu_list_1[0]}{sep}{cpu_list_1[-1]}" else: - cpu_range = "{}{}{}".format(cpu_list[0], sep, cpu_list[-1]) + cpu_range = f"{cpu_list[0]}{sep}{cpu_list[-1]}" return cpu_range @staticmethod - def cpu_slice_of_list_for_nf(node, cpu_node, nf_chains=1, nf_nodes=1, - nf_chain=1, nf_node=1, nf_dtc=1, nf_mtcr=2, - nf_dtcr=1, skip_cnt=0): + def cpu_slice_of_list_for_nf( + node, cpu_node, nf_chains=1, nf_nodes=1, nf_chain=1, nf_node=1, + nf_dtc=1, nf_mtcr=2, nf_dtcr=1, skip_cnt=0): """Return list of DUT node related list of CPU numbers. The main computing unit is physical core count. @@ -253,9 +251,9 @@ class CpuUtils(object): :param nf_nodes: Number of NF nodes in chain. :param nf_chain: Chain number indexed from 1. :param nf_node: Node number indexed from 1. - :param nf_dtc: Amount of physical cores for NF dataplane. + :param nf_dtc: Amount of physical cores for NF data plane. :param nf_mtcr: NF main thread per core ratio. - :param nf_dtcr: NF dataplane thread per core ratio. + :param nf_dtcr: NF data plane thread per core ratio. :param skip_cnt: Skip first "skip_cnt" CPUs. :type node: dict :param cpu_node: int. @@ -273,18 +271,18 @@ class CpuUtils(object): placement is not possible due to wrong parameters. """ if not 1 <= nf_chain <= nf_chains: - raise RuntimeError("ChainID is out of range!") + raise RuntimeError(u"ChainID is out of range!") if not 1 <= nf_node <= nf_nodes: - raise RuntimeError("NodeID is out of range!") + raise RuntimeError(u"NodeID is out of range!") - smt_used = CpuUtils.is_smt_enabled(node['cpuinfo']) + smt_used = CpuUtils.is_smt_enabled(node[u"cpuinfo"]) cpu_list = CpuUtils.cpu_list_per_node(node, cpu_node, smt_used) # CPU thread sibling offset. - sib = len(cpu_list) / CpuUtils.NR_OF_THREADS + sib = len(cpu_list) // CpuUtils.NR_OF_THREADS dtc_is_integer = isinstance(nf_dtc, int) if not smt_used and not dtc_is_integer: - raise RuntimeError("Cannot allocate if SMT is not enabled!") + raise RuntimeError(u"Cannot allocate if SMT is not enabled!") # TODO: Please reword the following todo if it is still relevant # TODO: Workaround as we are using physical core as main unit, we must # adjust number of physical dataplane cores in case of float for further @@ -298,7 +296,7 @@ class CpuUtils(object): dt_req = ((nf_chains * nf_nodes) + nf_dtcr - 1) // nf_dtcr if (skip_cnt + mt_req + dt_req) > (sib if smt_used else len(cpu_list)): - raise RuntimeError("Not enough CPU cores available for placement!") + raise RuntimeError(u"Not enough CPU cores available for placement!") offset = (nf_node - 1) + (nf_chain - 1) * nf_nodes mt_skip = skip_cnt + (offset % mt_req) @@ -319,8 +317,9 @@ class CpuUtils(object): return result @staticmethod - def get_affinity_nf(nodes, node, nf_chains=1, nf_nodes=1, nf_chain=1, - nf_node=1, vs_dtc=1, nf_dtc=1, nf_mtcr=2, nf_dtcr=1): + def get_affinity_nf( + nodes, node, nf_chains=1, nf_nodes=1, nf_chain=1, nf_node=1, + vs_dtc=1, nf_dtc=1, nf_mtcr=2, nf_dtcr=1): """Get affinity of NF (network function). Result will be used to compute the amount of CPUs and also affinity. @@ -331,10 +330,10 @@ class CpuUtils(object): :param nf_nodes: Number of NF nodes in chain. :param nf_chain: Chain number indexed from 1. :param nf_node: Node number indexed from 1. - :param vs_dtc: Amount of physical cores for vswitch dataplane. - :param nf_dtc: Amount of physical cores for NF dataplane. + :param vs_dtc: Amount of physical cores for vswitch data plane. + :param nf_dtc: Amount of physical cores for NF data plane. :param nf_mtcr: NF main thread per core ratio. - :param nf_dtcr: NF dataplane thread per core ratio. + :param nf_dtcr: NF data plane thread per core ratio. :type nodes: dict :type node: dict :type nf_chains: int @@ -350,11 +349,9 @@ class CpuUtils(object): """ skip_cnt = Constants.CPU_CNT_SYSTEM + Constants.CPU_CNT_MAIN + vs_dtc - interface_list = [] - interface_list.append( - BuiltIn().get_variable_value('${{{node}_if1}}'.format(node=node))) - interface_list.append( - BuiltIn().get_variable_value('${{{node}_if2}}'.format(node=node))) + interface_list = list() + interface_list.append(BuiltIn().get_variable_value(f"${{{node}_if1}}")) + interface_list.append(BuiltIn().get_variable_value(f"${{{node}_if2}}")) cpu_node = Topology.get_interfaces_numa_node( nodes[node], *interface_list) @@ -362,5 +359,5 @@ class CpuUtils(object): return CpuUtils.cpu_slice_of_list_for_nf( node=nodes[node], cpu_node=cpu_node, nf_chains=nf_chains, nf_nodes=nf_nodes, nf_chain=nf_chain, nf_node=nf_node, - nf_mtcr=nf_mtcr, nf_dtcr=nf_dtcr, nf_dtc=nf_dtc, skip_cnt=skip_cnt) - + nf_mtcr=nf_mtcr, nf_dtcr=nf_dtcr, nf_dtc=nf_dtc, skip_cnt=skip_cnt + ) |