mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-10-08 22:46:41 +00:00
fix(oci): keep every declared image data path on a volume so installs can be updated
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
"""Every path an image declares as a volume is mounted, or stated to hold no data,
|
||||
so the installed container can be updated."""
|
||||
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "src"))
|
||||
sys.path.insert(0, str(ROOT / "remote"))
|
||||
|
||||
from proxmenux_oci.catalog import Catalog
|
||||
|
||||
# The VOLUME paths of each image, as `skopeo inspect --config` reports them.
|
||||
DECLARED = {
|
||||
"postgresql": ["/var/lib/postgresql"],
|
||||
"threadfin": ["/home/threadfin/conf", "/tmp/threadfin"],
|
||||
"handbrake-jlesage": ["/config", "/output", "/storage", "/trash", "/watch"],
|
||||
"medusa-official": ["/anime", "/config", "/downloads", "/tv"],
|
||||
"cloudflared": ["/config", "/root/.cloudflared"],
|
||||
"archivebox": ["/data", "/out"],
|
||||
"flaresolverr": ["/config"],
|
||||
"openspeedtest": ["/var/log/letsencrypt"],
|
||||
}
|
||||
|
||||
|
||||
class ImageVolumeCoverageTests(unittest.TestCase):
|
||||
catalog = Catalog(ROOT)
|
||||
|
||||
def test_declared_volumes_are_mounted_or_hold_no_data(self):
|
||||
for app, declared in DECLARED.items():
|
||||
template = self.catalog.compose(app)
|
||||
mounts = [v["container_path"] for v in template["container_contract"]["volumes"]]
|
||||
transient = set(template["proxmox"]["installer_profile"].get("non_persistent_image_volumes", []))
|
||||
uncovered = [p for p in declared if p not in transient
|
||||
and not any(p == m or p.startswith(m.rstrip("/") + "/") for m in mounts)]
|
||||
self.assertEqual(uncovered, [], app)
|
||||
|
||||
def test_postgresql_keeps_the_versioned_data_directory_on_the_volume(self):
|
||||
# PostgreSQL 18 stores PGDATA in /var/lib/postgresql/18/docker.
|
||||
template = self.catalog.compose("postgresql")
|
||||
self.assertEqual([v["container_path"] for v in template["container_contract"]["volumes"]],
|
||||
["/var/lib/postgresql"])
|
||||
|
||||
def test_the_updater_leaves_paths_without_data_out(self):
|
||||
import oci_instance_transaction
|
||||
template = {"proxmox": {"installer_profile": {"non_persistent_image_volumes": ["/tmp/threadfin"]}}}
|
||||
self.assertEqual(oci_instance_transaction.non_persistent_image_volumes(template), {"/tmp/threadfin"})
|
||||
self.assertEqual(oci_instance_transaction.non_persistent_image_volumes({}), set())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user