Publish curated Unraid-AppOps-Gateway source from f8f5bf0a29159bd69accd7e58f6427ec32140640

This commit is contained in:
Public Source Publisher committed 2026-10-02 17:21:36 +00:00
1 parent 2de6e5c85e
commit 27a33107a3
4 files changed
+105 -8

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
# Public source export # Public source export
This source snapshot was generated from the private canonical repository at revision `3c5fb0c6d1f4e693e4a0fa50e7151509b4450786`. It contains no private Git history or operational evidence. Changes are published from the canonical repository. This source snapshot was generated from the private canonical repository at revision `f8f5bf0a29159bd69accd7e58f6427ec32140640`. It contains no private Git history or operational evidence. Changes are published from the canonical repository.
+5 -5
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"sourceRevision": "3c5fb0c6d1f4e693e4a0fa50e7151509b4450786", "sourceRevision": "f8f5bf0a29159bd69accd7e58f6427ec32140640",
"files": [ "files": [
{ {
"path": ".dockerignore", "path": ".dockerignore",
@@ -834,13 +834,13 @@
}, },
{ {
"path": "backend/tests/test_controller_hub_release_volume.py", "path": "backend/tests/test_controller_hub_release_volume.py",
"sha256": "2bc2345aa0ea65aa78471aac85909c671040041c44cdb67d01c127c1be17eb70", "sha256": "0dddc78484ebc4a09bc75e3e71cdca5f48cb3b6afba91c3b36aa16703266d6e0",
"bytes": 18590 "bytes": 21814
}, },
{ {
"path": "backend/tests/test_controller_root_procedure_contract.py", "path": "backend/tests/test_controller_root_procedure_contract.py",
"sha256": "618a3c641191d5b9ebd904856b56d71ad1661e251c29c86f9b635ad856557ee7", "sha256": "1552a883e13a66e0f154481c6f3cf2b162ad867d6bbaaed7a84cedd45c5935ac",
"bytes": 1866 "bytes": 2793
}, },
{ {
"path": "backend/tests/test_controller_state_reconciliation.py", "path": "backend/tests/test_controller_state_reconciliation.py",
@@ -3,6 +3,8 @@ from __future__ import annotations
import importlib.util import importlib.util
import json import json
import os import os
import sys
import types
from pathlib import Path from pathlib import Path
import pytest import pytest
@@ -415,6 +417,85 @@ def test_source_compose_preflight_rejects_host_file_reads_before_compose(compose
assert calls == [] assert calls == []
@pytest.mark.parametrize(
"source",
[
b"services:\n app:\n 'env_file': /tmp/secret\n",
b"services: {app: {\"include\": ./untrusted.yml}}\n",
b"services:\n - \"build\": ./untrusted\n",
b"services:\n app:\n \"\\u0065nv_file\": /tmp/secret\n",
],
)
def test_source_compose_preflight_rejects_quoted_or_escaped_file_keys(source):
with pytest.raises(module.VolumeTransitionError):
module._preflight_source_compose(source)
def test_preparer_uses_the_pinned_bundled_yaml_parser():
assert module.yaml.__version__ == "6.0.2"
assert module.yaml.__name__.startswith("_appops_controller_yaml_")
assert module.yaml.__with_libyaml__ is False
assert Path(module.yaml.__file__).resolve().parent == ROOT / "scripts/vendor/yaml"
def test_preparer_does_not_replace_a_host_cached_yaml_module(monkeypatch):
host_yaml = types.ModuleType("yaml")
host_yaml.__file__ = "/host/site-packages/yaml/__init__.py"
monkeypatch.setitem(sys.modules, "yaml", host_yaml)
original_sys_path = sys.path.copy()
module_name = "_controller_volume_import_isolation_test"
spec = importlib.util.spec_from_file_location(
module_name, ROOT / "scripts/prepare_controller_hub_release_volume.py"
)
assert spec is not None and spec.loader is not None
isolated_module = importlib.util.module_from_spec(spec)
monkeypatch.setitem(sys.modules, module_name, isolated_module)
spec.loader.exec_module(isolated_module)
assert sys.modules["yaml"] is host_yaml
assert isolated_module.yaml.__name__.startswith("_appops_controller_yaml_")
assert isolated_module.yaml.safe_load(b"services: {}") == {"services": {}}
assert sys.path == original_sys_path
def test_source_compose_preflight_ignores_comments_strings_and_block_scalars():
source = (
b"name: gitea-deploy-runners\n"
b"# include: ./disabled.yml\n"
b"services:\n app:\n"
b" command: |\n"
b" echo 'env_file: is command text'\n"
b" echo include: is command text\n"
b" labels: {note: \"build: is a label value\"}\n"
)
module._preflight_source_compose(source)
def test_source_compose_preflight_rejects_unresolvable_alias_keys():
source = b"services:\n app:\n *unsafe-key: value\n"
with pytest.raises(module.VolumeTransitionError, match="compose_source_invalid"):
module._preflight_source_compose(source)
@pytest.mark.parametrize(
"source",
[
b"services: {}\nconfigs:\n tls-material:\n file: /etc/ssl/private/key.pem\n",
b"services: {}\nsecrets: {gitea-token: {environment: GITEA_TOKEN}}\n",
],
)
def test_source_compose_preflight_rejects_local_config_and_secret_sources(source):
with pytest.raises(module.VolumeTransitionError, match="external_source_invalid"):
module._preflight_source_compose(source)
def test_source_compose_preflight_allows_external_config_and_service_environment_fields():
source = (
b"configs:\n tls-material:\n external: true\n"
b"services:\n app:\n environment:\n file: no-local-file-read\n"
)
module._preflight_source_compose(source)
def test_capture_program_is_fixed_descriptor_based_and_compiles(): def test_capture_program_is_fixed_descriptor_based_and_compiles():
legacy = module._controller_capture_source(config_root_in_code=True) legacy = module._controller_capture_source(config_root_in_code=True)
protected = module._controller_capture_source(config_root_in_code=False) protected = module._controller_capture_source(config_root_in_code=False)
@@ -4,7 +4,6 @@ import re
import shlex import shlex
from pathlib import Path from pathlib import Path
ROOT = Path(__file__).resolve().parents[2] ROOT = Path(__file__).resolve().parents[2]
@@ -16,13 +15,30 @@ def test_windows_wrapper_archives_every_file_required_by_root_installer():
archived = re.search(r"& git archive --format=tar .*? \$SourceRevision (.*?)\r?\n", wrapper) archived = re.search(r"& git archive --format=tar .*? \$SourceRevision (.*?)\r?\n", wrapper)
assert required is not None and archived is not None assert required is not None and archived is not None
archive_paths = set(shlex.split(archived.group(1))) archive_paths = set(shlex.split(archived.group(1)))
required_paths = shlex.split(required.group(1))
assert all( assert all(
path in archive_paths path in archive_paths
or any(path.startswith(f"{directory}/") for directory in archive_paths) or any(path.startswith(f"{directory}/") for directory in archive_paths)
for path in shlex.split(required.group(1)) for path in required_paths
) )
vendor_sources = sorted(
path.relative_to(ROOT).as_posix()
for path in (ROOT / "scripts/vendor").rglob("*")
if path.is_file() and (path.suffix == ".py" or path.name == "pyyaml-LICENSE")
)
required_vendor_sources = sorted(
path for path in required_paths if path.startswith("scripts/vendor/")
)
assert vendor_sources == required_vendor_sources
assert "scripts/prepare_controller_hub_release_volume.py" in archived.group(1) assert "scripts/prepare_controller_hub_release_volume.py" in archived.group(1)
assert "scripts/upgrade_deployment_controller.sh" in archived.group(1) assert "scripts/upgrade_deployment_controller.sh" in archived.group(1)
assert "scripts/vendor" in archived.group(1)
assert "scripts/vendor/pyyaml-LICENSE" in required.group(1)
assert "scripts/vendor/yaml/__init__.py" in required.group(1)
assert 'mkdir -m 0700 "${work}/vendor" "${work}/vendor/yaml"' in installer
assert '"${work}/vendor/yaml/${vendor_file}"' in installer
assert ('[[ -d "${script_dir}/vendor" && ! -L "${script_dir}/vendor" && '
'-d "${script_dir}/vendor/yaml" && ! -L "${script_dir}/vendor/yaml" ]]') in installer
def test_windows_wrapper_supplies_private_archive_and_exact_image_identity(): def test_windows_wrapper_supplies_private_archive_and_exact_image_identity():