All checks were successful
continuous-integration/drone/push Build is passing
harness.meta.HookCtx (frozen): .domain, .base_url, .meta (RecipeMeta), .deps (provisioned dep creds from $CCCI_DEPS_FILE or None), .op (current lifecycle op or None); built via meta.hook_ctx() at each hook call site. All recipe callables now take ctx: EXTRA_ENV(ctx), UPGRADE_EXTRA_ENV(ctx), READY_PROBE(ctx), BACKUP_VERIFY(ctx), SCREENSHOT(page, ctx), ops.py pre_<op>(ctx). Dict-valued EXTRA_ENV/UPGRADE_EXTRA_ENV unchanged (only the callable signature moved). Call sites converted: deploy_app env shaping, perform_upgrade, wait_ready_probes (gains op=), _perform_op BACKUP_VERIFY, screenshot.capture, _run_pre_hook. Legacy signatures fail FAST with a clear migration message: the registry carries hook_params per hook key, enforced at meta.load() (MetaError names the old vs new signature); ops.py pre-op hooks get the same check at the orchestrator call site (meta.check_hook_signature) — no silent TypeError mid-run. Migrated every in-repo user mechanically (17 ops.py files; cryptpad/lasuite-*/ mailu EXTRA_ENV; mumble+lasuite-drive READY_PROBE; ghost/discourse BACKUP_VERIFY) — seeded values, probes and assertions byte-identical (domain -> ctx.domain; keycloak pre_restore's meta arg -> ctx.meta). Unit tests: hook_ctx field contract, ctx.deps from the run deps file, legacy- signature MetaError (READY_PROBE/EXTRA_ENV/SCREENSHOT + pre-op checker), ctx signatures accepted. Docs table regenerated (signature docs in key docs). Verified on cc-ci: cc-ci-run -m pytest tests/unit -q -> 180 passed; scripts/lint.sh -> PASS.
71 lines
4.4 KiB
Python
71 lines
4.4 KiB
Python
# Per-recipe harness config for mumble (Phase 2 Q4.2 — a TCP/voice recipe, not HTTP-native).
|
|
#
|
|
# Mumble's voice server speaks its own TLS protocol on 64738 (no HTTP API). To fit cc-ci's
|
|
# HTTP-readiness + on-host test model we deploy upstream recipe overlays:
|
|
# - compose.mumbleweb.yml -> a mumble-web HTTP client routed through Traefik on the app domain,
|
|
# giving the generic harness a real HTTP readiness/serving signal (HEALTH_PATH "/") AND the
|
|
# web_client.py parity surface. Shipped upstream from 0.1.0 (present on the 0.2.0 base too).
|
|
# - compose.host-ports.yml -> publishes 64738 (tcp+udp, mode:host) on the cc-ci host so on-host
|
|
# tests (cc-ci-run) reach the voice server at 127.0.0.1:64738. Shipped upstream ONLY from 1.0.0.
|
|
#
|
|
# F2-14c disposition (Adversary REVIEW-2 @16:22:07Z VETO): the upgrade tier's base is the previous
|
|
# published version 0.2.0+v1.6.870-0, which PREDATES compose.host-ports.yml (added in 1.0.0). We do
|
|
# NOT carry a cc-ci copy of that upstream overlay (no fork). Instead:
|
|
# - the BASE 0.2.0 deploys MINIMALLY with `compose.yml:compose.mumbleweb.yml` (HTTP health via
|
|
# mumble-web works; the voice port is NOT host-published on 0.2.0), and the on-host voice/protocol
|
|
# custom tests are SKIPPED on 0.2.0 (they run in the CUSTOM tier, which executes once on the
|
|
# post-upgrade LATEST);
|
|
# - the UPGRADE to latest (1.0.0+, which ships compose.host-ports.yml NATIVELY) adds host-ports to
|
|
# COMPOSE_FILE via UPGRADE_EXTRA_ENV (applied by generic.perform_upgrade after the PR-head
|
|
# checkout, before the chaos redeploy), so the voice port IS host-published on latest and the
|
|
# voice tests run there. The current version's native overlay is untouched (no cc-ci fork).
|
|
#
|
|
# Distinctive config markers (read back by the recipe-specific functional tests, proving our config
|
|
# actually propagated into the running server — version-independent, not hard-coded upstream values):
|
|
# WELCOME_TEXT -> MUMBLE_CONFIG_WELCOMETEXT, surfaced in the ServerSync welcome_text.
|
|
# USERS -> MUMBLE_CONFIG_USERS (max users), surfaced in the ServerConfig.max_users.
|
|
|
|
HEALTH_PATH = "/" # mumble-web client UI (present on both 0.2.0 base and 1.0.0 latest)
|
|
HEALTH_OK = (200,)
|
|
|
|
DEPLOY_TIMEOUT = 900 # two images to pull (mumble-server + mumble-web) on a cold node
|
|
HTTP_TIMEOUT = 300
|
|
|
|
# A unique, stable welcome-text marker the round-trip test asserts surfaces over the protocol
|
|
# (underscore prefix = recipe-private constant, exempt from registry validation — rcust P1).
|
|
_WELCOME_TEXT_MARKER = "cc-ci-mumble-welcome-7f3a9c"
|
|
# A distinctive max-users value (not the recipe default 100) the server_config test asserts.
|
|
_MAX_USERS = 42
|
|
|
|
# BASE deploy (0.2.0): mumble-web only — NO host-ports (0.2.0 predates it). The voice-config env is
|
|
# set here and persists across the upgrade so it takes effect on the latest (where the custom config
|
|
# round-trip tests assert it).
|
|
EXTRA_ENV = {
|
|
"COMPOSE_FILE": "compose.yml:compose.mumbleweb.yml",
|
|
"WELCOME_TEXT": _WELCOME_TEXT_MARKER,
|
|
"USERS": str(_MAX_USERS),
|
|
}
|
|
|
|
# UPGRADE-target deploy (latest 1.0.0+): add the NATIVE compose.host-ports.yml so 64738 is
|
|
# host-published and the on-host voice/protocol custom tests can run on latest.
|
|
UPGRADE_EXTRA_ENV = {
|
|
"COMPOSE_FILE": "compose.yml:compose.mumbleweb.yml:compose.host-ports.yml",
|
|
}
|
|
|
|
|
|
def READY_PROBE(ctx):
|
|
# The voice server on 64738 is testable on-host ONLY when compose.host-ports.yml is active — i.e.
|
|
# the post-upgrade LATEST, not the minimal 0.2.0 base. Read the live COMPOSE_FILE to decide, so the
|
|
# SAME probe fn is correct in both phases: the post-install probe (base, no host-ports) returns []
|
|
# (HTTP health alone gates the base), the post-upgrade probe (latest, host-ports) gates readiness
|
|
# on the voice port being STABLY listening (3 consecutive connects) before the harness proceeds to
|
|
# backup — after the chaos upgrade redeploy the host-mode 64738 must be released by the old task and
|
|
# rebound by the new one (a window where mumble-web 200s while the voice container isn't yet up, and
|
|
# backup-bot would then exec into a not-running app container -> 409).
|
|
from harness import abra # lazy: recipe_meta is exec'd with `harness` importable at call time
|
|
|
|
cf = abra.env_get(ctx.domain, "COMPOSE_FILE") or ""
|
|
if "compose.host-ports.yml" in cf:
|
|
return [{"tcp_host": "127.0.0.1", "tcp_port": 64738, "stable": 3}]
|
|
return []
|