Honor staged edge gateway update windows

This commit is contained in:
Jeppe Bundgaard
2026-06-30 17:23:04 +02:00
parent b0ea771e6a
commit eefe5630f4
2 changed files with 37 additions and 1 deletions
@@ -64,6 +64,32 @@ config_value() {
' "$CONFIG_PATH" "$key" "$fallback"
}
staged_update_value() {
local key="$1"
local fallback="${2:-}"
php -r '
$path = $argv[1];
$key = $argv[2];
$fallback = $argv[3];
if (!is_file($path)) {
echo $fallback;
exit(0);
}
$decoded = json_decode((string)file_get_contents($path), true);
if (!is_array($decoded) || !array_key_exists($key, $decoded) || $decoded[$key] === null || $decoded[$key] === "") {
echo $fallback;
exit(0);
}
echo is_scalar($decoded[$key]) ? (string)$decoded[$key] : json_encode($decoded[$key], JSON_UNESCAPED_SLASHES);
' "$STAGED_UPDATE_PATH" "$key" "$fallback"
}
staged_update_is_applied() {
local status
status="$(staged_update_value status '')"
[ "$status" = "APPLIED" ]
}
ensure_dirs() {
mkdir -p "$RUNTIME_DIR" "$RUNTIME_DIR/backups"
}
@@ -106,7 +132,10 @@ ensure_stack_env() {
within_update_window() {
local window
window="$(config_value updateWindow '02:00-04:00')"
window="$(staged_update_value update_window '')"
if [ -z "$window" ]; then
window="$(config_value updateWindow '02:00-04:00')"
fi
php -r '
$window = $argv[1];
[$start, $end] = array_pad(explode("-", $window, 2), 2, "");
@@ -286,6 +315,10 @@ case "$ACTION" in
reconcile_stack
;;
reconcile)
if [ -f "$STAGED_UPDATE_PATH" ] && staged_update_is_applied; then
log "Staged update already applied; nothing to reconcile"
exit 0
fi
if [ -f "$STAGED_UPDATE_PATH" ] && ! within_update_window; then
log "Update is staged but outside the maintenance window; keeping current stack running"
exit 0
@@ -88,6 +88,9 @@ it('builds the installer around the compose stack artifacts and management polli
expect($launcherSource)->toContain('ensure_stack_env');
expect($launcherSource)->toContain('REDIS_PASSWORD');
expect($launcherSource)->toContain('chmod 0600 "$ENV_FILE"');
expect($launcherSource)->toContain('staged_update_value()');
expect($launcherSource)->toContain('window="$(staged_update_value update_window \'\')"');
expect($launcherSource)->toContain('Staged update already applied; nothing to reconcile');
expect($launcherSource)->toContain('AUTO_UPDATER_BASE_IMAGE="$auto_updater_base_image"');
expect($launcherSource)->toContain('COMPOSE_PROJECT_NAME="$compose_project_name" compose_cmd -f "$COMPOSE_FILE" ps || true');
expect($launcherSource)->toContain('COMPOSE_PROJECT_NAME="$compose_project_name" compose_cmd -f "$COMPOSE_FILE" logs --tail=80 || true');