diff options
author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-07-01 06:23:38 +0000 |
---|---|---|
committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-07-01 06:23:38 +0000 |
commit | 8b2b036b4f045316032643c6170d694b0efd6788 (patch) | |
tree | f357d415f5d5f2267cd80b1f255c164312e94797 /src/conf_mode/vpp.py | |
parent | 865d9db1b9843f7ac818b82904580bd09f1c2ac5 (diff) | |
download | vyos-1x-8b2b036b4f045316032643c6170d694b0efd6788.tar.gz vyos-1x-8b2b036b4f045316032643c6170d694b0efd6788.zip |
T1797: VPP verify minimal installed memory and apply sysctl
Do not allow configure VPP if on the systems with low amount
installed memory
Add sysctl VPP parameters (hugepages, kernel.shmmax)
Diffstat (limited to 'src/conf_mode/vpp.py')
-rwxr-xr-x | src/conf_mode/vpp.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/conf_mode/vpp.py b/src/conf_mode/vpp.py index dd01da87e..62ec4c162 100755 --- a/src/conf_mode/vpp.py +++ b/src/conf_mode/vpp.py @@ -14,6 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +import os +import psutil from pathlib import Path from re import search as re_search, MULTILINE as re_M @@ -39,6 +41,10 @@ airbag.enable() service_name = 'vpp' service_conf = Path(f'/run/vpp/{service_name}.conf') systemd_override = '/run/systemd/system/vpp.service.d/10-override.conf' +sysctl_vpp = '/etc/sysctl.d/80-vpp.conf' + +# Min memory 6GB (2GB reserved for vpp) +MIN_TOTAL_MEMORY = 6 def _get_pci_address_by_interface(iface) -> str: @@ -128,15 +134,26 @@ def verify(config): if 'corelist_workers' in config['cpu'] and 'main_core' not in config['cpu']: raise ConfigError(f'"cpu main-core" is required but not set!') + memory = psutil.virtual_memory() + memory_total = round(memory.total / (1024 ** 3), 2) + if memory_total < MIN_TOTAL_MEMORY: + raise ConfigError( + f'Not enough installed memory {memory_total}GB! ' + f'The minimum required memory is {MIN_TOTAL_MEMORY}GB.' + ) + def generate(config): if not config or (len(config) == 1 and 'removed_ifaces' in config): # Remove old config and return service_conf.unlink(missing_ok=True) + if os.path.isfile(sysctl_vpp): + os.unlink(sysctl_vpp) return None render(service_conf, 'vpp/startup.conf.j2', config) render(systemd_override, 'vpp/override.conf.j2', config) + render(sysctl_vpp, 'vpp/sysctl.conf.j2', config) return None @@ -148,6 +165,8 @@ def apply(config): call('systemctl daemon-reload') call(f'systemctl restart {service_name}.service') + call(f'sysctl -qp {sysctl_vpp}') + # Initialize interfaces removed from VPP for iface in config.get('removed_ifaces', []): host_control = HostControl() |