summaryrefslogtreecommitdiff
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
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']
-rw-r--r--python/vyos/defaults.py1
-rwxr-xr-xsrc/op_mode/container.py44
2 files changed, 43 insertions, 2 deletions
diff --git a/python/vyos/defaults.py b/python/vyos/defaults.py
index 5e3ba4e63..027e4480d 100644
--- a/python/vyos/defaults.py
+++ b/python/vyos/defaults.py
@@ -38,6 +38,7 @@ directories = {
'vyos_configdir' : '/opt/vyatta/config',
'completion_dir' : f'{base_dir}/completion',
'ca_certificates' : '/usr/local/share/ca-certificates/vyos',
+ 'podman_storage' : '/usr/lib/live/mount/persistence/container/storage',
'ppp_nexthop_dir' : '/run/ppp_nexthop',
'proto_path' : '/usr/share/vyos/vyconf',
'vyconf_session_dir' : f'{base_dir}/vyconf/session'
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