mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 01:13:00 +02:00
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
"""Manage Infix containers"""
|
|
import time
|
|
from infamy.util import warn
|
|
|
|
|
|
class Container:
|
|
"""Helper methods"""
|
|
HTTPD_IMAGE = "/lib/oci/curios-httpd-latest.tar.gz"
|
|
NFTABLES_IMAGE = "/lib/oci/curios-nftables-latest.tar.gz"
|
|
|
|
def __init__(self, target):
|
|
self.system = target
|
|
|
|
def _find(self, name):
|
|
oper = self.system.get_data("/infix-containers:containers")
|
|
if not oper:
|
|
return None
|
|
|
|
for container in oper["containers"]["container"]:
|
|
if container["name"] == name:
|
|
return container
|
|
return None
|
|
|
|
def exists(self, name):
|
|
"""Check if container {name} runs on target."""
|
|
container = self._find(name)
|
|
if not container:
|
|
return False
|
|
return True
|
|
|
|
def running(self, name):
|
|
"""Check if container {name} exists and is running."""
|
|
container = self._find(name)
|
|
if container and container["running"]:
|
|
return True
|
|
return False
|
|
|
|
def action(self, name, act):
|
|
"""Call container action (context RPC), retry three times."""
|
|
xpath = f"/infix-containers:containers/container[name='{name}']/{act}"
|
|
|
|
for attempt in range(3):
|
|
try:
|
|
return self.system.call_action(xpath)
|
|
except Exception as e:
|
|
warn(f"failed {act} {name} ({attempt + 1}/3): {e}")
|
|
time.sleep(1)
|
|
if attempt == 2:
|
|
raise
|