diff options
| author | l0crian1 <143656816+l0crian1@users.noreply.github.com> | 2025-09-18 10:14:55 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-18 16:14:55 +0200 |
| commit | 098988988d3126d084482821c30d5332ce5bb66b (patch) | |
| tree | c5202c7a7ffe171e54b0ae920213647659c4b406 /src | |
| parent | 1522496d16c77a5f69c96e01a72780e33e9045a3 (diff) | |
| download | vyos-1x-098988988d3126d084482821c30d5332ce5bb66b.tar.gz vyos-1x-098988988d3126d084482821c30d5332ce5bb66b.zip | |
container: T6673: Fix restart of containers with podman (#4691)
Fixed issue with podman and systemd sync when restarting
containers with 'podman restart' command.
- Placed podman storage directory in vyos/defaults.py
- Replaced repeated declarations with vyos.defaults.directories['podman_storage']
Diffstat (limited to 'src')
| -rwxr-xr-x | src/op_mode/container.py | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/op_mode/container.py b/src/op_mode/container.py index 2dc7ce4ec..3dd665051 100755 --- a/src/op_mode/container.py +++ b/src/op_mode/container.py @@ -16,13 +16,51 @@ import typing import json +import shutil import sys import subprocess +from pathlib import Path +from vyos.defaults import directories from vyos.utils.process import cmd from vyos.utils.process import rc_cmd +from vyos.utils.process import run import vyos.opmode +def clean_layer(name: str) -> int: + def layer_id_from_containers(name: str) -> str | None: + if containers.is_file(): + try: + index = json.loads(containers.read_text()) + except Exception: + return None + for item in index: + if name in item.get("names", []): + return item.get("layer") + return None + + def purge_layer_by_id(layer_id: str): + layer_dir = overlay_root / layer_id + + # Remove the overlay ID directory + shutil.rmtree(layer_dir, ignore_errors=True) + storage_dir = Path(directories['podman_storage']) + overlay_root = storage_dir / "overlay" + containers = storage_dir / "overlay-containers/containers.json" + unit = f"vyos-container-{name}.service" + layer_id = layer_id_from_containers(name) + if not layer_id: + # No mapping found; nothing to do + return 2 + + purge_layer_by_id(layer_id) + + # Reinitiate the container's overlay layer + cmd(f"rm -f /run/{unit}.cid /run/{unit}.pid") + cmd(f"systemctl reset-failed {unit}") + result = run(f"systemctl start {unit}") + return result + def _get_json_data(command: str) -> list: """ Get container command format JSON @@ -131,8 +169,10 @@ def restart(name: str): rc, output = rc_cmd(f'systemctl restart vyos-container-{name}.service') if rc != 0: - print(output) - return None + rc2 = clean_layer(name) + if rc2 != 0: + print(output) + return None print(f'Container "{name}" restarted!') return output |
