tests: replace pycodestyle with black
[vpp.git] / extras / vpp_config / vpplib / VppHugePageUtil.py
1 # Copyright (c) 2016 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 from __future__ import print_function
15
16 """VPP Huge Page Utilities"""
17
18 import re
19
20 from vpplib.VPPUtil import VPPUtil
21
22 # VPP Huge page File
23 DEFAULT_VPP_HUGE_PAGE_CONFIG_FILENAME = "/etc/vpp/80-vpp.conf"
24 VPP_HUGEPAGE_CONFIG = """
25 vm.nr_hugepages={nr_hugepages}
26 vm.max_map_count={max_map_count}
27 vm.hugetlb_shm_group=0
28 kernel.shmmax={shmmax}
29 """
30
31
32 class VppHugePageUtil(object):
33     """
34     Huge Page Utilities
35     """
36
37     def hugepages_dryrun_apply(self):
38         """
39         Apply the huge page configuration
40
41         """
42
43         node = self._node
44         hugepages = node["hugepages"]
45
46         vpp_hugepage_config = VPP_HUGEPAGE_CONFIG.format(
47             nr_hugepages=hugepages["total"],
48             max_map_count=hugepages["max_map_count"],
49             shmmax=hugepages["shmax"],
50         )
51
52         rootdir = node["rootdir"]
53         filename = rootdir + node["hugepages"]["hugepage_config_file"]
54
55         cmd = 'echo "{0}" | sudo tee {1}'.format(vpp_hugepage_config, filename)
56         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
57         if ret != 0:
58             raise RuntimeError(
59                 "{} failed on node {} {} {}".format(cmd, node["host"], stdout, stderr)
60             )
61
62     def get_actual_huge_pages(self):
63         """
64         Get the current huge page configuration
65
66         :returns the hugepage total, hugepage free, hugepage size,
67         total memory, and total memory free
68         :rtype: tuple
69         """
70
71         # Get the memory information using /proc/meminfo
72         cmd = "sudo cat /proc/meminfo"
73         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
74         if ret != 0:
75             raise RuntimeError(
76                 "{} failed on node {} {} {}".format(
77                     cmd, self._node["host"], stdout, stderr
78                 )
79             )
80
81         total = re.findall(r"HugePages_Total:\s+\w+", stdout)
82         free = re.findall(r"HugePages_Free:\s+\w+", stdout)
83         size = re.findall(r"Hugepagesize:\s+\w+\s+\w+", stdout)
84         memtotal = re.findall(r"MemTotal:\s+\w+\s+\w+", stdout)
85         memfree = re.findall(r"MemFree:\s+\w+\s+\w+", stdout)
86
87         total = total[0].split(":")[1].lstrip()
88         free = free[0].split(":")[1].lstrip()
89         size = size[0].split(":")[1].lstrip()
90         memtotal = memtotal[0].split(":")[1].lstrip()
91         memfree = memfree[0].split(":")[1].lstrip()
92         return total, free, size, memtotal, memfree
93
94     def show_huge_pages(self):
95         """
96         Print the current huge page configuration
97
98         """
99
100         node = self._node
101         hugepages = node["hugepages"]
102         print("  {:30}: {}".format("Total System Memory", hugepages["memtotal"]))
103         print("  {:30}: {}".format("Total Free Memory", hugepages["memfree"]))
104         print("  {:30}: {}".format("Actual Huge Page Total", hugepages["actual_total"]))
105         print("  {:30}: {}".format("Configured Huge Page Total", hugepages["total"]))
106         print("  {:30}: {}".format("Huge Pages Free", hugepages["free"]))
107         print("  {:30}: {}".format("Huge Page Size", hugepages["size"]))
108
109     def get_huge_page_config(self):
110         """
111         Returns the huge page config.
112
113         :returns: The map max count and shmmax
114         """
115
116         total = self._node["hugepages"]["total"]
117         max_map_count = int(total) * 2 + 1024
118         shmmax = int(total) * 2 * 1024 * 1024
119         return max_map_count, shmmax
120
121     def __init__(self, node):
122         self._node = node