arcsecond 4.4.2__tar.gz → 4.4.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {arcsecond-4.4.2 → arcsecond-4.4.3}/PKG-INFO +1 -1
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/composedoc.py +30 -1
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/docker/docker-compose.yml +19 -7
- {arcsecond-4.4.2 → arcsecond-4.4.3}/pyproject.toml +1 -1
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_composedoc.py +24 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/uv.lock +1 -1
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.docker/Dockerfile_postgres +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.docker/Dockerfile_redis +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.flake8 +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.gitattributes +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.github/dependabot.yml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.github/workflows/pythonpublish.yml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.github/workflows/tests.yml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/.gitignore +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/LICENSE +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/Makefile +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/README.md +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/__version__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/alpaca/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/alpaca/commands.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/alpaca/dome_probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/alpaca/probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/alpaca/telescope_probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/config.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/constants.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/endpoint.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/main.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/api/resources.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cli.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/auth.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/resources.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/constants.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/context.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/datafiles/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/datafiles/context.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/datafiles/errors.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/datafiles/uploader.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/datafiles/utils.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/errors.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/logger.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/uploader.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/utils.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploader/walker.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/cloud/uploads.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/docgen.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/errors.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/backups.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/database.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/docker/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/doctor.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/lifecycle.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/local.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/guard.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/manifest.toml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/outbound.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/network/sheet.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/skybrightness.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/stack.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/token.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/hosting/utils.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/autostart.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/commands.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/detection.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/proxy.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/registry.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/runtime.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/base.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/filewatch.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/mdns.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/network.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/sources/opencv.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/imagesources/store.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/options.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/arcsecond/targets.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/examples/example_upload_files.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/requirements.txt +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/setup.cfg +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/setup.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/sonar-project.properties +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/test_api.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/test_api_endpoint.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/test_config.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/test_config_pointer.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/api/test_targets.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/__init__.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_errors.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_full_process.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_init.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_prepare.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_upload.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/conftest.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/fixtures/docker-compose-6.2.yml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/fixtures/docker-compose-6.4.yml +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/fixtures/file1.fits +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_alpaca_probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_cli.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_cli_api_commands.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_docgen.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_backups_install_dir.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_backups_restore.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_database.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_doctor.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_lifecycle.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_local.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_network_guard.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_network_manifest.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_network_outbound.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_network_probe.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_network_sheet.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_skybrightness.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_stack.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_token.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_hosting_utils_secret_key.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_autostart.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_commands.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_detection.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_mdns.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_network.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_proxy.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_store.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_imagesources_webcam.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/test_targets_planning.py +0 -0
- {arcsecond-4.4.2 → arcsecond-4.4.3}/tests/utils.py +0 -0
|
@@ -34,6 +34,7 @@ from .local import (
|
|
|
34
34
|
MARKER_START = re.compile(r"^\s*# >>> arcsecond:(\S+)\s*$")
|
|
35
35
|
MARKER_END = re.compile(r"^\s*# <<< arcsecond:(\S+)\s*$")
|
|
36
36
|
ENV_REF = re.compile(r"\$\{([A-Z_][A-Z0-9_]*)(?::-[^}]*)?\}")
|
|
37
|
+
ENV_DEFAULT = re.compile(r"^\$\{[A-Z_][A-Z0-9_]*:-([^}]*)\}$")
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
@dataclass
|
|
@@ -58,6 +59,12 @@ def _strip_comment(line: str) -> str:
|
|
|
58
59
|
return line.strip().lstrip("#").strip()
|
|
59
60
|
|
|
60
61
|
|
|
62
|
+
def _as_shipped(value: str) -> str:
|
|
63
|
+
"""A `${VAR:-default}` value as an installation that leaves VAR unset runs it."""
|
|
64
|
+
match = ENV_DEFAULT.match(value)
|
|
65
|
+
return match.group(1) if match else value
|
|
66
|
+
|
|
67
|
+
|
|
61
68
|
class _Reader:
|
|
62
69
|
"""Walks the template line by line, keeping the comments."""
|
|
63
70
|
|
|
@@ -134,7 +141,7 @@ class _Reader:
|
|
|
134
141
|
"stop_grace_period": "stop_grace_period",
|
|
135
142
|
}
|
|
136
143
|
if key in scalar:
|
|
137
|
-
setattr(self.current, scalar[key], value)
|
|
144
|
+
setattr(self.current, scalar[key], _as_shipped(value))
|
|
138
145
|
elif key == "healthcheck":
|
|
139
146
|
self.current.healthcheck = True
|
|
140
147
|
elif key == "ports" and value.startswith("["):
|
|
@@ -289,6 +296,28 @@ ENV_KEYS: Dict[str, tuple] = {
|
|
|
289
296
|
OPERATOR,
|
|
290
297
|
"How many jobs the data worker runs at once. Default 2; each can hold a few hundred MB.",
|
|
291
298
|
),
|
|
299
|
+
"ARCSECOND_API_IMAGE": (
|
|
300
|
+
OPERATOR,
|
|
301
|
+
"The image the backend, both workers, beat and the alerts consumer run instead of the published one: "
|
|
302
|
+
"one built from the backend's sources, e.g. `arcsecond-api:latest`. Empty: the published image. Set "
|
|
303
|
+
"ARCSECOND_API_PULL_POLICY to `never` with it, then `arcsecond restart`.",
|
|
304
|
+
),
|
|
305
|
+
"ARCSECOND_API_PULL_POLICY": (
|
|
306
|
+
OPERATOR,
|
|
307
|
+
"`never` when ARCSECOND_API_IMAGE names an image that exists on this machine only, so `arcsecond update` "
|
|
308
|
+
"and `arcsecond start --pull` leave it alone rather than fail to download it. Default `missing`.",
|
|
309
|
+
),
|
|
310
|
+
"ARCSECOND_WEB_IMAGE": (
|
|
311
|
+
OPERATOR,
|
|
312
|
+
"The image the web interface runs instead of the published one: one built from the webapp's sources, "
|
|
313
|
+
"e.g. `arcsecond-web:latest`. Empty: the published image. Set ARCSECOND_WEB_PULL_POLICY to `never` "
|
|
314
|
+
"with it, then `arcsecond restart web`.",
|
|
315
|
+
),
|
|
316
|
+
"ARCSECOND_WEB_PULL_POLICY": (
|
|
317
|
+
OPERATOR,
|
|
318
|
+
"`never` when ARCSECOND_WEB_IMAGE names an image that exists on this machine only, as "
|
|
319
|
+
"ARCSECOND_API_PULL_POLICY does for the backend's. Default `missing`.",
|
|
320
|
+
),
|
|
292
321
|
}
|
|
293
322
|
|
|
294
323
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# === Arcsecond.local config. ===
|
|
2
2
|
# *** DO NOT change any name or port number. ***
|
|
3
|
-
# Version 7.
|
|
3
|
+
# Version 7.5
|
|
4
4
|
|
|
5
5
|
services:
|
|
6
6
|
# Database (PostgresQL)
|
|
@@ -29,7 +29,12 @@ services:
|
|
|
29
29
|
|
|
30
30
|
# Arcsecond backend (REST APIs). Can be used for API calls and external pipelines, scripts etc.
|
|
31
31
|
backend:
|
|
32
|
-
image
|
|
32
|
+
# ARCSECOND_API_IMAGE swaps the published image for one built from the
|
|
33
|
+
# backend's sources, here and on every service below that runs it.
|
|
34
|
+
# ARCSECOND_API_PULL_POLICY=never goes with it: such an image exists on
|
|
35
|
+
# this machine only, and `arcsecond update` must not try to download it.
|
|
36
|
+
image: ${ARCSECOND_API_IMAGE:-ghcr.io/arcsecond-io/arcsecond-api:latest}
|
|
37
|
+
pull_policy: ${ARCSECOND_API_PULL_POLICY:-missing}
|
|
33
38
|
container_name: arcsecond-api
|
|
34
39
|
restart: unless-stopped
|
|
35
40
|
entrypoint: /home/app/entrypoint-server.sh
|
|
@@ -72,7 +77,8 @@ services:
|
|
|
72
77
|
# Arcsecond worker, for offloading background work: the Control Room's
|
|
73
78
|
# exposures and procedures, and everything else someone is waiting on.
|
|
74
79
|
worker:
|
|
75
|
-
image: ghcr.io/arcsecond-io/arcsecond-api:latest
|
|
80
|
+
image: ${ARCSECOND_API_IMAGE:-ghcr.io/arcsecond-io/arcsecond-api:latest}
|
|
81
|
+
pull_policy: ${ARCSECOND_API_PULL_POLICY:-missing}
|
|
76
82
|
container_name: arcsecond-worker
|
|
77
83
|
restart: unless-stopped
|
|
78
84
|
entrypoint: /home/app/entrypoint-worker.sh
|
|
@@ -100,7 +106,8 @@ services:
|
|
|
100
106
|
# storages, database backups, keograms, catalogue refreshes. On its own
|
|
101
107
|
# queue, so a long zip can never hold up a frame the observer is waiting for.
|
|
102
108
|
dataworker:
|
|
103
|
-
image: ghcr.io/arcsecond-io/arcsecond-api:latest
|
|
109
|
+
image: ${ARCSECOND_API_IMAGE:-ghcr.io/arcsecond-io/arcsecond-api:latest}
|
|
110
|
+
pull_policy: ${ARCSECOND_API_PULL_POLICY:-missing}
|
|
104
111
|
container_name: arcsecond-dataworker
|
|
105
112
|
restart: unless-stopped
|
|
106
113
|
entrypoint: /home/app/entrypoint-worker.sh
|
|
@@ -126,7 +133,8 @@ services:
|
|
|
126
133
|
|
|
127
134
|
# Arcsecond beat, to launch specific background tasks at specific times.
|
|
128
135
|
beat:
|
|
129
|
-
image: ghcr.io/arcsecond-io/arcsecond-api:latest
|
|
136
|
+
image: ${ARCSECOND_API_IMAGE:-ghcr.io/arcsecond-io/arcsecond-api:latest}
|
|
137
|
+
pull_policy: ${ARCSECOND_API_PULL_POLICY:-missing}
|
|
130
138
|
container_name: arcsecond-beat
|
|
131
139
|
restart: unless-stopped
|
|
132
140
|
entrypoint: /home/app/entrypoint-beat.sh
|
|
@@ -149,7 +157,10 @@ services:
|
|
|
149
157
|
# organisation-based and therefore always a portal, so the second port that
|
|
150
158
|
# used to be here (5577) served the very same app.
|
|
151
159
|
web:
|
|
152
|
-
|
|
160
|
+
# ARCSECOND_WEB_IMAGE and ARCSECOND_WEB_PULL_POLICY: the same as the
|
|
161
|
+
# backend's pair above, for an image built from the webapp's sources.
|
|
162
|
+
image: ${ARCSECOND_WEB_IMAGE:-ghcr.io/arcsecond-io/arcsecond-web:latest}
|
|
163
|
+
pull_policy: ${ARCSECOND_WEB_PULL_POLICY:-missing}
|
|
153
164
|
container_name: arcsecond-web
|
|
154
165
|
restart: unless-stopped
|
|
155
166
|
depends_on:
|
|
@@ -183,7 +194,8 @@ services:
|
|
|
183
194
|
# GCN_CONSUMER_CLIENT_SECRET in .env; idles harmlessly when they are absent.
|
|
184
195
|
# Single instance only — do not scale it.
|
|
185
196
|
alerts:
|
|
186
|
-
image: ghcr.io/arcsecond-io/arcsecond-api:latest
|
|
197
|
+
image: ${ARCSECOND_API_IMAGE:-ghcr.io/arcsecond-io/arcsecond-api:latest}
|
|
198
|
+
pull_policy: ${ARCSECOND_API_PULL_POLICY:-missing}
|
|
187
199
|
container_name: arcsecond-alerts
|
|
188
200
|
restart: unless-stopped
|
|
189
201
|
entrypoint: /home/app/entrypoint-alerts.sh
|
|
@@ -58,6 +58,30 @@ def test_optional_services_are_recognised_by_their_markers():
|
|
|
58
58
|
assert "GCN_CONSUMER_CLIENT_ID" in " ".join(s["alerts"].description)
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
def test_every_service_on_the_backend_image_can_be_given_a_local_build():
|
|
62
|
+
s = _services()
|
|
63
|
+
api = [name for name, service in s.items() if "arcsecond-api" in service.image]
|
|
64
|
+
assert api == ["backend", "worker", "dataworker", "beat", "alerts"]
|
|
65
|
+
for name in api:
|
|
66
|
+
assert "ARCSECOND_API_IMAGE" in s[name].env_vars, name
|
|
67
|
+
assert "ARCSECOND_API_PULL_POLICY" in s[name].env_vars, name
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_the_web_interface_can_be_given_a_local_build():
|
|
71
|
+
web = _services()["web"]
|
|
72
|
+
assert (
|
|
73
|
+
web.image == "ghcr.io/arcsecond-io/arcsecond-web:latest"
|
|
74
|
+
) # what an unset key runs
|
|
75
|
+
assert "ARCSECOND_WEB_IMAGE" in web.env_vars
|
|
76
|
+
assert "ARCSECOND_WEB_PULL_POLICY" in web.env_vars
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_every_key_the_template_reads_is_documented():
|
|
80
|
+
for service in composedoc.parse_services(local.packaged_compose_text()):
|
|
81
|
+
for key in service.env_vars:
|
|
82
|
+
assert key in composedoc.ENV_KEYS, (service.name, key)
|
|
83
|
+
|
|
84
|
+
|
|
61
85
|
def test_every_key_setup_writes_is_documented():
|
|
62
86
|
for key in local.REQUIRED_ENV_PROVIDERS:
|
|
63
87
|
assert key in composedoc.ENV_KEYS, key
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{arcsecond-4.4.2 → arcsecond-4.4.3}/tests/cloud/uploader/datafiles/test_uploader_full_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|