Skip to content

feat: add refresh-app script to platform image for ArgoCD hard-refresh - #6

Open
rrp-bot wants to merge 66 commits into
mainfrom
worktree-argocd-refresh-script
Open

feat: add refresh-app script to platform image for ArgoCD hard-refresh#6
rrp-bot wants to merge 66 commits into
mainfrom
worktree-argocd-refresh-script

Conversation

@rrp-bot

@rrp-bot rrp-bot commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds `refresh-app` bash script to the platform (bastion) ECS image so operators can trigger a hard ArgoCD refresh on any application directly from an ECS Exec session
  • Always refreshes the `root` app first before the specified target app (to ensure generated child apps are up-to-date), unless `root` is the explicit target
  • Wires the scripts directory into the Dockerfile via `COPY` + `PATH` so `refresh-app` is callable by name with no path prefix

Usage

```bash

From an ECS Exec session on the bastion task:

refresh-app hyperfleet-operator # refreshes root, then hyperfleet-operator
refresh-app argocd # refreshes root, then argocd
refresh-app root # refreshes root only
```

Under the hood this runs:

```bash
kubectl annotate app <app_name> -n argocd argocd.argoproj.io/refresh=hard --overwrite
```

Changes

File Change
`terraform/modules/platform-image/scripts/refresh-app.sh` New script
`terraform/modules/platform-image/Dockerfile` `COPY scripts/`, `chmod`, `PATH` wiring

The Dockerfile change causes the image tag (computed as `sha256(Dockerfile)` in `main.tf`) to rotate, so the new image will be built and pushed on the next `build-platform-image.sh` run.

Notes

  • `fzf` is not available in the UBI9 minimal repos so interactive app picking is not included; the script requires an explicit app name argument
  • Script follows repo conventions: `#!/usr/bin/env bash`, `set -euo pipefail`, `ERROR:` prefix on stderr, `=== ... ===` section headers

redhat-chai-bot and others added 30 commits July 24, 2026 03:14
…fleet-db

PR openshift-online#677 replaced Maestro (MQTT-based resource distribution) with
kube-applier (DynamoDB-backed controller) and hyperfleet-db (Aurora
PostgreSQL). Update core documentation to reflect the current
architecture:

- CLAUDE.md/AGENTS.md: Replace Maestro references in architecture
  overview, key technologies, and architecture patterns
- docs/README.md: Fix broken links to deleted maestro-infrastructure
  and maestro-agent terraform modules; add kube-applier, kube-applier-
  dynamodb, and hyperfleet-db module links
- docs/FAQ.md: Update RC service list, disaster recovery section,
  and rewrite Maestro Q&A as kube-applier Q&A
- docs/design/maestro-mqtt-resource-distribution.md: Mark status as
  Superseded with link to replacement modules
- docs/environment-provisioning.md: Update ArgoCD app lists and
  remove obsolete Maestro connectivity verification step
- docs/development-environment.md: Remove Maestro from port-forward
  service table
- docs/hostedcluster-teardown.md: Update deletion propagation to
  reference kube-applier

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Bot PRs (e.g. docs-agent updates) were invisible on the dashboard because
they had no labels. Fetch all open redhat-chai-bot PRs and merge them into
the Automated & AI PRs section, deduplicating against label-fetched results.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ROSAENG-61610: Adding SRE documentation on SRE-UI ALB.
ROSAENG-62511: Enabling "can_edit" for viewers.
This forces the refresh of cached Helm charts on sync failure and pulls the correct values instead of using outdated ones.
ROSAENG-62507: Add refresh flag to ArgoCD automatic retries.
ROSAENG-61610: Removing Loki from the exposed SRE UI apps.
…ate-maestro-kube-applier-2026-07-24

NO-JIRA: [docs-agent] Update architecture docs: Maestro → kube-applier + hyperfleet-db
NO-JIRA: Include all open chai-bot PRs in the PR dashboard
Introduce a standalone elasticache-valkey Terraform module with:
- Single-node Valkey 9.1 replication group (GCRA counters)
- TLS in transit and KMS encryption at rest (FedRAMP SC-8/SC-13)
- Security groups for EKS, Auto Mode, and bastion ingress
- Gated by enable_rate_limit_redis (default: true)

Wire the module into regional-cluster config, ECS bootstrap
(cluster secret annotation + REDIS_ENDPOINT env var), and
rendered pipeline/ApplicationSet templates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Platform API Helm chart changes:
- Deployment: RATE_LIMIT_ENABLED, RATE_LIMIT_CONFIG_FILE, REDIS_ENDPOINT
  env vars; rate-limits ConfigMap volume mount
- ConfigMap: per-route GCRA rates (clusters, nodepools, trusted-actions)
- ServiceMonitor: Prometheus scraping for rate limit metrics

Alerting (PrometheusRule):
- RateLimitValkeyDown: Valkey connectivity failure (5m)
- RateLimitHighDenialRatio: aggregated >50% denial across pods (10m)
- RateLimitPodHighDenialRatio: per-pod >70% denial (5m)
- promtool unit tests for all three alerts

Documentation:
- ADR: rate limiting architecture with security section
  (TLS in transit, KMS encryption at rest)
- CLAUDE.md: rate limiting key files reference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename RateLimitValkeyDown → RateLimitFailOpenActive with
  percentage-based threshold (>20% aggregated, 5m for duration)
- Add denominator guards (and ... > 0) to all three alerts to
  prevent NaN on zero traffic
- Add explicit redisTimeout: 20ms in rate limit config
- Fix image reference to match main branch
- Update promtool tests for renamed alert with new threshold cases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add explicit KMS key policy scoping usage to elasticache.amazonaws.com
  service principal (CKV2_AWS_64) instead of relying on the implicit
  default account-root policy. Follows pattern from eks-cluster/kms.tf.
- Remove unrestricted 0.0.0.0/0 egress on Valkey security group —
  ElastiCache never initiates outbound connections; response traffic
  is handled by stateful SG connection tracking.
- Update CLAUDE.md rate limiting table to reference the new
  elasticache-valkey module paths (hyperfleet-infrastructure was deleted).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The 2>/dev/null was swallowing the actual AWS error (e.g. expired
SAML session, missing CLI subcommand, access denied), making it
impossible to debug ephemeral-provision failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
provision-infra-rc.sh reads individual keys from terraform.json and
exports them as TF_VAR_* env vars, but hyperfleet_db_deletion_protection
was never wired. This caused Terraform to always use the module default
(true), ignoring the ephemeral environment setting of false, which
blocked RDS cluster teardown.
Critical alerts page the incident commander on integration, which is
too aggressive for a fail-open rate limiter. All three rate limit
alerts are now warning severity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…leet-db-deletion-protection

ROSAENG-60886: fix: wire hyperfleet_db_deletion_protection to Terraform in CI
Delete the CLM Observability dashboard (clm.json + dashboard-clm.yaml)
which tracked Sentinel metrics from the old architecture. Remove "clm"
from the RC Health namespace filter and "Maestro" from the RDS dashboard
description.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ROSAENG-61608: Add per-account rate limiting for Platform API
openshift-merge-bot Bot and others added 27 commits July 29, 2026 19:47
…-logs-force-destroy

ROSAENG-60886: fix: add force_destroy to SRE ALB access logs S3 bucket
…or_swallow

ROSAENG-62981: fix teardown swallowing pipeline failures and collecting wrong logs
…nvironments

The regional_oidc S3 bucket had force_destroy=false, causing ephemeral
teardown to fail with BucketNotEmpty when HyperShift OIDC discovery
documents were present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ROSAENG-63020: Enable force_destroy on OIDC S3 bucket for ephemeral teardown
Add response_templates block to the aws_api_gateway_gateway_response.default_4xx
resource. AWS API Gateway automatically sets a default response template on
DEFAULT_4XX responses, causing Terraform to detect drift on every plan/apply
and attempt to remove it. This pins the template explicitly, matching the
pattern already used by the unauthorized and access_denied gateway responses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The collect-logs tooling was renamed to dump-env in PR openshift-online#715 (merged),
which also added DB state collection. These .spec/ files still
referenced the old name.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The fork repo name was derived from the source repo
(self.source_repo.split("/")[-1]), which breaks when the PR comes from
a fork with a non-standard name (e.g. openshift-online_rosa-regional-platform
instead of rosa-hyperfleet). Use a constant for the upstream repo name
instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update platform-api image tag to include test removal (openshift-online#231) and compactor fix (openshift-online#234)
- Switch hyperfleet chart source from typeid/hyperfleet-operator to openshift-online/rosa-hyperfleet-api
- Pin chart targetRevision to merge commit SHA
- Update hyperfleet-operator image tag to match

Co-Authored-By: Chai Bot <ship-help-github@redhat.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ate-spec-refs-2026-07-31

[docs-agent] Update .spec/ references: collect-logs → dump-env
…ult-4xx-response-template-drift

NO-JIRA: Fix DEFAULT_4XX response_templates drift in API Gateway module
…-api-image-tag

NO-JIRA: Bump platform-api image to 4712cf8 (remove flaky ratelimit test)
…k-repo-name

NO-JIRA: Fix ephemeral provider pushing to wrong fork repo name
Maestro (MQTT/IoT Core resource distribution) has been fully replaced by
kube-applier-aws (DynamoDB-based), and the CLM stack (hyperfleet-api,
hyperfleet-sentinel, hyperfleet-adapter, hyperfleet-broker) has been
replaced by hyperfleet-operator (postgres-based controller-runtime).

Updates ~37 files across docs, terraform configs, ArgoCD configs, and
agent/bot definitions. Deletes the superseded maestro design doc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…up-maestro-clm

ROSAENG-62353: docs: replace stale Maestro/CLM references with current architecture
…c and checksum verification (openshift-online#734)

* fix: add SHA-256 checksum verification for Helm installation

* fix: improve Helm download reliability with retry logic and direct checksum verification

Replace get-helm-3 script (which lacks retry logic) with direct download
using curl retry parameters. This matches the pattern used for Terraform
and other tools, ensuring transient network failures don't break CI builds.

- Add architecture detection (amd64/arm64) for multi-arch support
- Download Helm tarball and SHA-256 checksum with retry/timeout settings
- Verify checksum before extraction (fails build on mismatch)
- Add helm version verification step at end

* change the version of helm

* adding same retry logic to Dockerfile

* fix: add retry logic to all curl commands in platform-image Dockerfile

Apply the same retry pattern (3 retries, 2s delay, 300s timeout) that was
added to Helm downloads across all remaining curl commands: AWS CLI, kubectl,
k9s, stern, yq, oc, and Terraform downloads. This improves build reliability
when downloading tools from external sources.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: improve platform-image Dockerfile error handling and curl retry configuration

- Consolidate CURL_RETRY, CURL_RETRY_DELAY, and CURL_MAX_TIME ARG declarations at the top with default values (3, 2, 300) to eliminate redundant redeclarations across 7 install blocks
- Add `set -euo pipefail` to k9s, stern, and oc download RUN blocks so piped curl | tar commands fail fast on network errors instead of silently continuing with empty input
- Improves build reliability by ensuring all curl commands use consistent retry behavior and download failures halt the build immediately

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: force fresh base image pull in platform-image build to invalidate stale cache

Add --pull flag to docker/podman build command to ensure the base image
is always pulled fresh. This invalidates Docker's layer cache from the
FROM instruction forward, preventing builds from using stale ARG layers
from previous Dockerfile versions.

Root cause: commit de123bb declared CURL_RETRY* ARGs before each RUN
block without defaults. When those were refactored to single top-level
declarations with defaults (40dfb26), cached layers with empty ARG
values persisted, causing "curl: option --retry: expected a proper
numerical parameter" failures.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace "Maestro MQTT distribution" with "kube-applier DynamoDB-backed
resource distribution" to reflect the current architecture. Maestro was
replaced by kube-applier in the platform redesign (PR openshift-online#717).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…-stale-maestro-ref-2026-08-07

[docs-agent] Fix stale Maestro reference in testing strategy doc
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Documents the hyperfleet-operator + hyperfleet-db architecture:
controller-runtime reconciliation backed by PostgreSQL instead of etcd.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…-store

ROSAENG-64794: feat: Add AVP PolicyTemplate permissions to frontend API role
…hitecture

ROSAENG-63138: Add regional control plane architecture design doc
Clarify that hash4 uniqueness per cluster_alias is enforced by the
platform-api at creation time, derived from the cluster UUID.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ROSAENG-1089: update DNS architecture doc for hash4 uniqueness
…scan (openshift-online#740)

* fix: preserve base ephemeral config when applying .ephemeral-env/ overrides

_inject_ephemeral_config deleted and replaced every file in
config/ephemeral/, including defaults.yaml, when an override directory
was supplied. Since overrides are typically partial, any base
environment setting they didn't include (e.g. dns.domain) silently
disappeared from the config used to provision the environment.

Scope the delete-and-replace behavior to region YAML files only, and
deep-merge defaults.yaml with the override instead of replacing it,
reusing the same load_and_merge utility already used by
_apply_provision_overrides elsewhere in this file.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: don't treat Go template keywords in escaped strings as Jinja variables

scan_template_variables() flagged if/else/end as undocumented context
variables when they appeared inside an escaped Go template string
(e.g. {{ '{{ if .foo }}X{{ else }}Y{{ end }}' }} — used to emit literal
Go template syntax into rendered output). Add a regex that identifies
these escaped spans and skip any variable match whose position falls
inside one, so only real Jinja2 variables are reported.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* refactor: hoist _is_inside_escaped_go_template out of the per-template loop

It was redefined as a closure on every iteration of scan_template_variables'
outer loop, needlessly capturing skip_ranges. Take skip_ranges as an
explicit parameter and define the helper once at module scope instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
@rrp-bot
rrp-bot force-pushed the worktree-argocd-refresh-script branch from 46d2cea to 1c79ab2 Compare August 12, 2026 05:34
Adds a refresh-app.sh shell script to the platform (bastion) image that
allows operators to trigger a hard ArgoCD refresh on any application via
kubectl annotation from within an ECS Exec session.

The root app is always refreshed first before the target app (unless the
target is root itself), ensuring generated child apps are up-to-date before
the specific application is re-synced.

- terraform/modules/platform-image/scripts/refresh-app.sh: new script
- terraform/modules/platform-image/Dockerfile: COPY scripts into
  /opt/platform/scripts and add to PATH so refresh-app is directly callable

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@rrp-bot
rrp-bot force-pushed the worktree-argocd-refresh-script branch from 1c79ab2 to 6c19f34 Compare August 12, 2026 09:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants