From 04cf30b92aed3bc0b7a9ee327b377a8ba4ff08a3 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Thu, 6 Jun 2024 17:33:11 +0200
Subject: [PATCH] Implement create_on_start
---
etc/container.toml.example | 12 +++++++++++-
etc/shipcat.toml | 12 +++++++++---
shipcat/config.py | 13 ++++++++++---
shipcat/main.py | 3 +++
4 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/etc/container.toml.example b/etc/container.toml.example
index ef1c321..72b9e1e 100644
--- a/etc/container.toml.example
+++ b/etc/container.toml.example
@@ -1,4 +1,14 @@
-root_dir = "/tmp/root"
+# Example configuration of a container
+
+# Image to pull
image = "registry.ks.matfyz.cz/gimli/web-checker"
+
+# Root directory where data of the container reside
+root_dir = "/tmp/root"
+
+# Users and groups allowed to operate the container
allowed_users = ['root', 'mj']
allowed_groups = []
+
+# Do we re-create the container on every start?
+create_on_start = false
diff --git a/etc/shipcat.toml b/etc/shipcat.toml
index 6d09296..5c62070 100644
--- a/etc/shipcat.toml
+++ b/etc/shipcat.toml
@@ -3,8 +3,14 @@
# Where to find container configuration files
container_config_dir = "/etc/shipcat/containers"
-# Where to find container roots (can be overridden by container's config)
-container_root_dir = "/aux/containers"
-
# Overall verbosity
verbosity = 0
+
+# Default values of container configuration
+[defaults]
+
+# Where to find container root: root_dir/container_name
+root_dir = "/aux/containers"
+
+# Do we re-create the container on every start?
+create_on_start = false
diff --git a/shipcat/config.py b/shipcat/config.py
index f756e64..0393535 100644
--- a/shipcat/config.py
+++ b/shipcat/config.py
@@ -17,8 +17,9 @@ class ConfigError(RuntimeError):
class GlobalConfig:
container_config_path: Path
- container_root_path: Path
verbosity: int
+ default_root_path: Path
+ default_create_on_start: bool
@classmethod
def load(self, filename: str) -> 'GlobalConfig':
@@ -41,9 +42,12 @@ class GlobalConfig:
def parse(self, walker: Walker) -> None:
with walker.enter_object() as w:
self.container_config_path = Path(w['container_config_dir'].as_str())
- self.container_root_path = Path(w['container_root_dir'].as_str())
self.verbosity = w['verbosity'].as_int(0)
+ with w['defaults'].enter_object() as d:
+ self.default_root_path = Path(d['root_dir'].as_str())
+ self.default_create_on_start = d['create_on_start'].as_bool(False)
+
class ContainerConfig:
name: str
@@ -52,6 +56,7 @@ class ContainerConfig:
image: str
allowed_users: Set[int]
allowed_groups: Set[int]
+ create_on_start: bool
global_config: GlobalConfig
# Automatically generated
@@ -88,7 +93,7 @@ class ContainerConfig:
if rd.is_present():
self.root_path = Path(rd.as_str())
else:
- self.root_path = self.global_config.container_root_path / self.name
+ self.root_path = self.global_config.default_root_path / self.name
self.data_path = self.root_path / 'data'
self.root_dir = w['root_dir'].as_str()
@@ -112,5 +117,7 @@ class ContainerConfig:
wu.raise_error(f'Unknown group {name}')
self.allowed_groups.add(grp.gr_gid)
+ self.create_on_start = w['create_on_start'].as_bool(self.global_config.default_create_on_start)
+
self.pid_file = f'/run/shc/{self.name}.pid'
self.user_name = self.name
diff --git a/shipcat/main.py b/shipcat/main.py
index 7c1f2f5..9d17d34 100755
--- a/shipcat/main.py
+++ b/shipcat/main.py
@@ -312,6 +312,9 @@ def main_service_start():
pid_file = f'/run/shc/{cc.name}.pid'
Path(pid_file).unlink(missing_ok=True)
+ if cc.create_on_start:
+ create_container(cc)
+
run_command(['podman', 'start', cc.name])
--
GitLab