diff options
| author | Robert Günzler <r@gnzler.io> | 2026-02-23 14:12:22 +0100 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-02-23 14:12:36 +0100 |
| commit | 4fa05f4c140205450f63337626680c65f2879896 (patch) | |
| tree | 889c0b239eea1e98aa7b2290b1db2028a4cb34aa | |
| parent | 090a357ef46473e76b0cd0e0e1b013e6080a7360 (diff) | |
replace containers,www with svtree modules equivalents
Signed-off-by: Robert Günzler <r@gnzler.io>
| -rw-r--r-- | bundles/containers/items.py | 62 | ||||
| -rwxr-xr-x | bundles/svtree-containers/files/bin/podman-healthcheck | 32 | ||||
| -rwxr-xr-x | bundles/svtree-containers/files/bin/podman-healthcheckd | 34 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf (renamed from bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/init.d/podman-healthcheck (renamed from bundles/containers/files/etc/init.d/podman-healthcheck) | 0 | ||||
| -rwxr-xr-x | bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck (renamed from bundles/containers/files/etc/periodic/15min/podman-healthcheck) | 0 | ||||
| -rwxr-xr-x | bundles/svtree-containers/files/etc/periodic/weekly/podman-prune (renamed from bundles/containers/files/etc/periodic/weekly/podman-prune) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run | 7 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/run) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/type) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for) | 0 | ||||
| -rwxr-xr-x | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type) | 0 | ||||
| -rw-r--r-- | bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml | 13 | ||||
| -rw-r--r-- | bundles/svtree-containers/items.py | 86 | ||||
| -rw-r--r-- | bundles/svtree-containers/metadata.py (renamed from bundles/containers/metadata.py) | 4 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/run) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/type) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for) | 0 | ||||
| -rwxr-xr-x | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/run) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/type) | 0 | ||||
| -rw-r--r-- | bundles/svtree-www/items.py (renamed from bundles/www/items.py) | 12 | ||||
| -rw-r--r-- | bundles/svtree-www/metadata.py (renamed from bundles/www/metadata.py) | 0 |
30 files changed, 183 insertions, 67 deletions
diff --git a/bundles/containers/items.py b/bundles/containers/items.py deleted file mode 100644 index ea5b341..0000000 --- a/bundles/containers/items.py +++ /dev/null @@ -1,62 +0,0 @@ -if node.os != "alpine": - raise BundleError(f"{node.name}: OS {node.os} is not supported.") - -from os.path import join - -# TODO: healthcheck metrics? -svc_openrc = { - "podman-healthcheck": { - "runlevel": "default", - "enabled": True, - "needs": {"file:/etc/init.d/podman-healthcheck"}, - }, -} - -directories = { - "/etc/s6-rc/src/containers/contents.d": { 'purge': True }, -} - -files = { - "/etc/containers/containers.conf.d/10-firewall-driver.conf": { - "needs": { - "bundle:firewall", - }, - }, - - "/etc/s6-rc/templates/container/+service-srv/run": { "mode": "0755" }, - "/etc/s6-rc/templates/container/+service-log/run": { "mode": "0755" }, - "/etc/s6-rc/src/default/contents.d/containers": { - "content_type": "text", - "content": "", - "triggers": { - "svc_openrc:svtree:reload", - }, - }, - "/etc/s6-rc/src/containers/type": { - "content_type": "text", - "content": "bundle", - "triggers": { - "svc_openrc:svtree:reload", - }, - }, - - "/bin/podman-healthcheck": { "mode": "0755" }, - "/etc/periodic/15min/podman-healthcheck": { "mode": "0755" }, - "/etc/periodic/weekly/podman-prune": { "mode": "0755" }, - "/bin/podman-healthcheckd": { "mode": "0755" }, - "/etc/init.d/podman-healthcheck": { "mode": "0755" }, -} - -repo.libs.gen.add_files_recursive( - files, - join(repo.path, "bundles", "containers", "files"), -) - -for container, _ in node.metadata.get("containers", {}).items(): - svc_s6rc[container] = { - "bundle": "containers", - "generate": "container", - "triggers": { - "svc_openrc:svtree:reload", - }, - } diff --git a/bundles/svtree-containers/files/bin/podman-healthcheck b/bundles/svtree-containers/files/bin/podman-healthcheck new file mode 100755 index 0000000..ab3dcc7 --- /dev/null +++ b/bundles/svtree-containers/files/bin/podman-healthcheck @@ -0,0 +1,32 @@ +#!/bin/sh +set -eu +[ -n "${DEBUG:-}" ] && set -x + +healthcheck() { + local container=${1:?} + + podman healthcheck run "$container" >/dev/null 2>&1 || true + + podman inspect --format '{{if .State.Health}}{{.Name}} {{.State.Health.Status}}{{end}}' "$container" | ( + read -r name status + + test -n "$name" || return + + printf '%s (%s) is %s\n' "$container" "$name" "$status" + case "$status" in + healthy) ;; + *) + # tgnotify "!!! service $container unhealthy" + ;; + esac + ) +} + +main() { + case "${1:-}" in + "") podman container ls --format '{{.ID}}' | xargs -n1 $0 ;; + *) healthcheck "$1" ;; + esac +} + +main $@ diff --git a/bundles/svtree-containers/files/bin/podman-healthcheckd b/bundles/svtree-containers/files/bin/podman-healthcheckd new file mode 100755 index 0000000..cdbef0e --- /dev/null +++ b/bundles/svtree-containers/files/bin/podman-healthcheckd @@ -0,0 +1,34 @@ +#!/bin/sh +set -eu +[ -n "${DEBUG:-}" ] && set -x + +healthcheck_with_retry() { + local container="${1:-}" + + podman inspect --format '{{with .Config.Healthcheck}}{{.StartPeriod}} {{.Timeout}} {{.Retries}}{{end}}' "$container" | + ( + read -r start_period timeout retries + test -n "$start_period$timeout$retries" || return + + sleep "$start_period" + + podman-healthcheck "$container" && return + + count=0 + while [ "$count" -lt "$retries" ]; do + sleep "$timeout" + podman-healthcheck "$container" && return + count=$((count + 1)) + done + ) + +} + +main() { + podman events --filter 'type=container' --filter 'event=start' --format '{{.ID}}' | + while read -r container; do + healthcheck_with_retry "$container" || true + done +} + +main $@ diff --git a/bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf b/bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf index be33d99..be33d99 100644 --- a/bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf +++ b/bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf diff --git a/bundles/containers/files/etc/init.d/podman-healthcheck b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck index 8e12fa4..8e12fa4 100644 --- a/bundles/containers/files/etc/init.d/podman-healthcheck +++ b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck diff --git a/bundles/containers/files/etc/periodic/15min/podman-healthcheck b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck index 7aa6d41..7aa6d41 100755 --- a/bundles/containers/files/etc/periodic/15min/podman-healthcheck +++ b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck diff --git a/bundles/containers/files/etc/periodic/weekly/podman-prune b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune index 5715b95..5715b95 100755 --- a/bundles/containers/files/etc/periodic/weekly/podman-prune +++ b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune diff --git a/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run b/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run new file mode 100644 index 0000000..01b0ebf --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run @@ -0,0 +1,7 @@ +#!/bin/sh +exec prometheus-podman-exporter \ + --collector.enable-all \ + --collector.enhance-metrics \ + --web.disable-exporter-metrics \ + --web.listen-address=:9882 \ + --web.telemetry-path=/metrics/podman diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for index 83c1762..83c1762 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd index 00750ed..00750ed 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name index 0db7d83..0db7d83 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run index d558f3c..d558f3c 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/run +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type index 5883cff..5883cff 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/type +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for index cba6eea..cba6eea 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run index 3ca06e2..3ca06e2 100755 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type index 5883cff..5883cff 100644 --- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type diff --git a/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml b/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml new file mode 100644 index 0000000..471446c --- /dev/null +++ b/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml @@ -0,0 +1,13 @@ +http: + services: + podman-exporter: + loadBalancer: + servers: + - url: http://${node.metadata.get("container_gateway", "10.89.0.1")}:9882 + + routers: + podman-exporter: + rule: Path(`/metrics/podman`) + entryPoints: + - metrics + service: podman-exporter diff --git a/bundles/svtree-containers/items.py b/bundles/svtree-containers/items.py new file mode 100644 index 0000000..320ab75 --- /dev/null +++ b/bundles/svtree-containers/items.py @@ -0,0 +1,86 @@ +if node.os != "alpine": + raise BundleError(f"{node.name}: OS {node.os} is not supported.") + +from os.path import join + +# TODO: healthcheck metrics? +svc_openrc = { + "podman-healthcheck": { + "runlevel": "default", + "enabled": True, + "needs": { + "file:/etc/init.d/podman-healthcheck", + }, + }, +} + +svc_s6rc = { + "podman-exporter": { + "bundle": "services", + "generate": "service", + "needs": { + "file:/etc/s6-rc/services/podman-exporter.run", + }, + } +} + +files = { + "/etc/containers/containers.conf.d/10-firewall-driver.conf": { + "needs": { + "bundle:firewall", + }, + }, + "/etc/s6-rc/templates/container/+service-srv/run": {"mode": "0755"}, + "/etc/s6-rc/templates/container/+service-log/run": {"mode": "0755"}, + "/etc/s6-rc/src/default/contents.d/containers": { + "content_type": "text", + "content": "", + "triggers": { + "svc_openrc:svtree:reload", + }, + }, + "/etc/s6-rc/src/containers/type": { + "content_type": "text", + "content": "bundle", + "triggers": { + "svc_openrc:svtree:reload", + }, + }, + # healthchecks + "/bin/podman-healthcheck": {"mode": "0755"}, + "/etc/periodic/15min/podman-healthcheck": {"mode": "0755"}, + "/etc/periodic/weekly/podman-prune": {"mode": "0755"}, + "/bin/podman-healthcheckd": {"mode": "0755"}, + "/etc/init.d/podman-healthcheck": {"mode": "0755"}, + # monitoring + "/etc/s6-rc/services/podman-exporter.run": { + "mode": "0755", + "triggers": { + "svc_s6rc:podman-exporter:restart", + }, + }, + "/etc/traefik/podman-exporter.yaml": { + "content_type": "mako", + }, +} + +repo.libs.gen.add_files_recursive( + files, + join(repo.bundles_dir, "svtree-containers", "files"), +) + +# TODO: can we use purge = True here? + +directories = { + "/etc/s6-rc/src/containers/contents.d": {}, +} + +for container, _ in node.metadata.get("containers", {}).items(): + svc_s6rc[container] = { + "bundle": "containers", + "generate": "container", + "triggers": { + "svc_openrc:svtree:reload", + }, + } + diff --git a/bundles/containers/metadata.py b/bundles/svtree-containers/metadata.py index dc5832c..85fa34b 100644 --- a/bundles/containers/metadata.py +++ b/bundles/svtree-containers/metadata.py @@ -3,6 +3,10 @@ defaults = { "packages": { "crun": {}, "podman": {}, + "prometheus-podman-exporter": {}, }, }, + "metrics": { + "podman": {}, + }, } diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for index 83c1762..83c1762 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd index 00750ed..00750ed 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name index 0db7d83..0db7d83 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/run b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run index d558f3c..d558f3c 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/run +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/type b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type index 5883cff..5883cff 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/type +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd index 00750ed..00750ed 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for index cba6eea..cba6eea 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/run b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run index 677d7e1..677d7e1 100755 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/run +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/type b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type index 5883cff..5883cff 100644 --- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/type +++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type diff --git a/bundles/www/items.py b/bundles/svtree-www/items.py index b6f0cfd..086bc33 100644 --- a/bundles/www/items.py +++ b/bundles/svtree-www/items.py @@ -3,10 +3,6 @@ if node.os != "alpine": from os.path import join -directories = { - "/etc/s6-rc/src/www/contents.d": { 'purge': True } -} - files = { "/etc/s6-rc/templates/www/+service-srv/run": { "mode": "0755" }, "/etc/s6-rc/templates/www/+service-log/run": { "mode": "0755" }, @@ -28,9 +24,15 @@ files = { repo.libs.gen.add_files_recursive( files, - join(repo.path, "bundles", "www", "files"), + join(repo.bundles_dir, "svtree-www", "files"), ) +# TODO: can we use purge = True here? + +directories = { + "/etc/s6-rc/src/www/contents.d": {} +} + for www, _ in node.metadata.get("www", {}).items(): svc_s6rc[www] = { "bundle": "www", diff --git a/bundles/www/metadata.py b/bundles/svtree-www/metadata.py index 1d5700a..1d5700a 100644 --- a/bundles/www/metadata.py +++ b/bundles/svtree-www/metadata.py |