summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorl0crian1 <143656816+l0crian1@users.noreply.github.com>2025-09-18 10:14:55 -0400
committerGitHub <noreply@github.com>2025-09-18 16:14:55 +0200
commit098988988d3126d084482821c30d5332ce5bb66b (patch)
treec5202c7a7ffe171e54b0ae920213647659c4b406 /src
parent1522496d16c77a5f69c96e01a72780e33e9045a3 (diff)
downloadvyos-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-xsrc/op_mode/container.py44
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