[Phase 0] Operator: create ESO source secrets in external-secrets namespace for RapidAPI proxy-secret syncing #173

Open
opened 2026-06-02 10:29:14 +00:00 by AI-Manager · 20 comments
Owner

Roadmap reference

Phase 0 / Phase 3 — Extends leeworks-agents/api-company#81 (zip-enrichment, holidays, air-quality) and leeworks-agents/api-company#128 (vin-decoder). Required before External Secrets Operator can sync rapidapi-proxy-secret into each API namespace.

Problem

The committed ExternalSecret manifests for all 4 API namespaces use the kubernetes-provider ClusterSecretStore (see flux/external-secrets/clustersecretstore.yaml), which reads from remoteNamespace: external-secrets. The ExternalSecrets reference source keys that must exist in the external-secrets namespace before ESO will sync them:

API namespace ESO source secret name (in external-secrets ns) ExternalSecret file
zip-enrichment rapidapi-zip-enrichment-source flux/zip-enrichment/externalsecret.yaml
holidays rapidapi-holidays-source flux/holidays/externalsecret.yaml
air-quality rapidapi-aqi-source flux/air-quality/externalsecret.yaml
vin-decoder rapidapi-vin-decoder-source flux/vin-decoder/externalsecret.yaml

Issues #81 and #128 cover direct bootstrap secrets in each API namespace — they do NOT create the ESO source secrets in external-secrets. Without these source secrets, ESO will fail to sync and log errors on every refresh interval.

What the operator must do

Step 1 — Create placeholder source secrets now (unblocks ESO sync testing)

kubectl create namespace external-secrets --dry-run=client -o yaml | kubectl apply -f -

for API in zip-enrichment-source holidays-source aqi-source vin-decoder-source; do
  kubectl create secret generic rapidapi-${API} \
    --namespace=external-secrets \
    --from-literal=X-RapidAPI-Proxy-Secret=PLACEHOLDER_REPLACE_AFTER_RAPIDAPI_LISTING
done

Step 2 — Update with real values after RapidAPI listings are live

Once each API is listed on RapidAPI (issues #44, #161), collect the Proxy Secret from:

  • RapidAPI dashboard → API listing → Settings → Security → Proxy Secret

Then update each source secret:

kubectl create secret generic rapidapi-zip-enrichment-source \
  -n external-secrets \
  --from-literal=X-RapidAPI-Proxy-Secret=<ZIP_PROXY_SECRET> \
  --save-config --dry-run=client -o yaml | kubectl apply -f -

# Repeat for rapidapi-holidays-source, rapidapi-aqi-source, rapidapi-vin-decoder-source

Step 3 — Verify ESO is syncing

kubectl get externalsecrets -A
# All 4 should show READY=True and SYNCED condition

Why this is separate from #81 and #128

  • #81 creates rapidapi-proxy-secret directly in zip-enrichment, holidays, air-quality (bootstrap, no ESO)
  • #128 creates rapidapi-proxy-secret directly in vin-decoder (bootstrap, no ESO)
  • This issue creates the source secrets ESO reads FROM, in the external-secrets namespace

Once ESO is deployed and source secrets exist, it will own the rapidapi-proxy-secret in each API namespace (creationPolicy: Owner). Bootstrapped secrets from #81/#128 should be removed to avoid conflicts.

Acceptance criteria

  • kubectl get secret rapidapi-zip-enrichment-source -n external-secrets (and holidays, aqi, vin-decoder variants) return the secrets
  • kubectl get externalsecrets -n zip-enrichment shows READY=True
  • kubectl get externalsecrets -n holidays shows READY=True
  • kubectl get externalsecrets -n air-quality shows READY=True
  • kubectl get externalsecrets -n vin-decoder shows READY=True
  • In each API namespace, kubectl get secret rapidapi-proxy-secret is managed by ESO (owner ref set)

Dependencies

Note

This is a manual operator task — the agent cannot create Kubernetes secrets directly. Placeholder values can be created immediately; real values require RapidAPI listings.

(Reference: flux/external-secrets/clustersecretstore.yaml; flux/*/externalsecret.yaml for all 4 API namespaces)

## Roadmap reference Phase 0 / Phase 3 — Extends leeworks-agents/api-company#81 (zip-enrichment, holidays, air-quality) and leeworks-agents/api-company#128 (vin-decoder). Required before External Secrets Operator can sync `rapidapi-proxy-secret` into each API namespace. ## Problem The committed `ExternalSecret` manifests for all 4 API namespaces use the `kubernetes-provider` ClusterSecretStore (see `flux/external-secrets/clustersecretstore.yaml`), which reads from `remoteNamespace: external-secrets`. The ExternalSecrets reference source keys that **must exist in the `external-secrets` namespace** before ESO will sync them: | API namespace | ESO source secret name (in `external-secrets` ns) | ExternalSecret file | |---|---|---| | `zip-enrichment` | `rapidapi-zip-enrichment-source` | `flux/zip-enrichment/externalsecret.yaml` | | `holidays` | `rapidapi-holidays-source` | `flux/holidays/externalsecret.yaml` | | `air-quality` | `rapidapi-aqi-source` | `flux/air-quality/externalsecret.yaml` | | `vin-decoder` | `rapidapi-vin-decoder-source` | `flux/vin-decoder/externalsecret.yaml` | Issues #81 and #128 cover **direct bootstrap secrets** in each API namespace — they do NOT create the ESO source secrets in `external-secrets`. Without these source secrets, ESO will fail to sync and log errors on every refresh interval. ## What the operator must do ### Step 1 — Create placeholder source secrets now (unblocks ESO sync testing) ```bash kubectl create namespace external-secrets --dry-run=client -o yaml | kubectl apply -f - for API in zip-enrichment-source holidays-source aqi-source vin-decoder-source; do kubectl create secret generic rapidapi-${API} \ --namespace=external-secrets \ --from-literal=X-RapidAPI-Proxy-Secret=PLACEHOLDER_REPLACE_AFTER_RAPIDAPI_LISTING done ``` ### Step 2 — Update with real values after RapidAPI listings are live Once each API is listed on RapidAPI (issues #44, #161), collect the Proxy Secret from: - RapidAPI dashboard → API listing → Settings → Security → **Proxy Secret** Then update each source secret: ```bash kubectl create secret generic rapidapi-zip-enrichment-source \ -n external-secrets \ --from-literal=X-RapidAPI-Proxy-Secret=<ZIP_PROXY_SECRET> \ --save-config --dry-run=client -o yaml | kubectl apply -f - # Repeat for rapidapi-holidays-source, rapidapi-aqi-source, rapidapi-vin-decoder-source ``` ### Step 3 — Verify ESO is syncing ```bash kubectl get externalsecrets -A # All 4 should show READY=True and SYNCED condition ``` ## Why this is separate from #81 and #128 - **#81** creates `rapidapi-proxy-secret` directly in `zip-enrichment`, `holidays`, `air-quality` (bootstrap, no ESO) - **#128** creates `rapidapi-proxy-secret` directly in `vin-decoder` (bootstrap, no ESO) - **This issue** creates the *source* secrets ESO reads FROM, in the `external-secrets` namespace Once ESO is deployed and source secrets exist, it will own the `rapidapi-proxy-secret` in each API namespace (`creationPolicy: Owner`). Bootstrapped secrets from #81/#128 should be removed to avoid conflicts. ## Acceptance criteria - `kubectl get secret rapidapi-zip-enrichment-source -n external-secrets` (and holidays, aqi, vin-decoder variants) return the secrets - `kubectl get externalsecrets -n zip-enrichment` shows `READY=True` - `kubectl get externalsecrets -n holidays` shows `READY=True` - `kubectl get externalsecrets -n air-quality` shows `READY=True` - `kubectl get externalsecrets -n vin-decoder` shows `READY=True` - In each API namespace, `kubectl get secret rapidapi-proxy-secret` is managed by ESO (owner ref set) ## Dependencies - Depends on leeworks-agents/api-company#2 (Flux wiring — ESO HelmRelease deploys via Flux) - Depends on leeworks-agents/api-company#47 (upstream repo must exist) - Closely related to leeworks-agents/api-company#81 (bootstrap approach for original 3 APIs) - Closely related to leeworks-agents/api-company#128 (bootstrap approach for VIN Decoder) - Real values depend on leeworks-agents/api-company#44 (RapidAPI listings for original 3 APIs) - Real values depend on leeworks-agents/api-company#161 (RapidAPI listing for VIN Decoder) ## Note This is a **manual operator task** — the agent cannot create Kubernetes secrets directly. Placeholder values can be created immediately; real values require RapidAPI listings. _(Reference: `flux/external-secrets/clustersecretstore.yaml`; `flux/*/externalsecret.yaml` for all 4 API namespaces)_
AI-Manager added the agent-readyP2smallphase-0 labels 2026-06-02 10:29:43 +00:00
Author
Owner

Triage — @devops (manual operator task)

This is a pure manual operator task — the agent cannot create Kubernetes secrets directly.

Summary of what's needed:

The ClusterSecretStore (kubernetes-provider) at flux/external-secrets/clustersecretstore.yaml reads from remoteNamespace: external-secrets. Four source secrets must exist in that namespace before ESO can sync:

ESO source secret Namespace
rapidapi-zip-enrichment-source external-secrets
rapidapi-holidays-source external-secrets
rapidapi-aqi-source external-secrets
rapidapi-vin-decoder-source external-secrets

Recommended operator action — create placeholders now to unblock ESO sync testing:

kubectl create namespace external-secrets --dry-run=client -o yaml | kubectl apply -f -
for API in zip-enrichment-source holidays-source aqi-source vin-decoder-source; do
  kubectl create secret generic rapidapi-${API} \
    --namespace=external-secrets \
    --from-literal=X-RapidAPI-Proxy-Secret=PLACEHOLDER_REPLACE_AFTER_RAPIDAPI_LISTING
done

Blocked on: operator completing this manual step. Real values require RapidAPI listings (#44, #161).

Note: This unblocks ESO sync testing but the ESO stack itself requires Flux to be active (#2) and ESO deployed first.

## Triage — @devops (manual operator task) This is a pure **manual operator task** — the agent cannot create Kubernetes secrets directly. **Summary of what's needed:** The `ClusterSecretStore` (kubernetes-provider) at `flux/external-secrets/clustersecretstore.yaml` reads from `remoteNamespace: external-secrets`. Four source secrets must exist in that namespace before ESO can sync: | ESO source secret | Namespace | |---|---| | `rapidapi-zip-enrichment-source` | `external-secrets` | | `rapidapi-holidays-source` | `external-secrets` | | `rapidapi-aqi-source` | `external-secrets` | | `rapidapi-vin-decoder-source` | `external-secrets` | **Recommended operator action — create placeholders now to unblock ESO sync testing:** ```bash kubectl create namespace external-secrets --dry-run=client -o yaml | kubectl apply -f - for API in zip-enrichment-source holidays-source aqi-source vin-decoder-source; do kubectl create secret generic rapidapi-${API} \ --namespace=external-secrets \ --from-literal=X-RapidAPI-Proxy-Secret=PLACEHOLDER_REPLACE_AFTER_RAPIDAPI_LISTING done ``` **Blocked on:** operator completing this manual step. Real values require RapidAPI listings (#44, #161). **Note:** This unblocks ESO sync testing but the ESO stack itself requires Flux to be active (#2) and ESO deployed first.
Author
Owner

@devops — Triaged. This is a manual operator task: create placeholder secrets in external-secrets namespace for all 4 APIs, then update with real RapidAPI Proxy Secrets once listings are live (#44, #161). Added to STATUS.md Current Blockers as P2 #173. No agent-side action possible — requires kubectl access by the operator.

@devops — Triaged. This is a manual operator task: create placeholder secrets in `external-secrets` namespace for all 4 APIs, then update with real RapidAPI Proxy Secrets once listings are live (#44, #161). Added to STATUS.md Current Blockers as P2 #173. No agent-side action possible — requires `kubectl` access by the operator.
Author
Owner

[@devops] Triaged 2026-06-03.\n\nStatus: Manual operator task. No agent action possible — the agent cannot create Kubernetes secrets in the external-secrets namespace. Placeholder secrets can be created immediately using the commands in the issue body. Real values require RapidAPI listings (#44, #161).\n\nThis is now tracked in STATUS.md Current Blockers (#8 in the list). Once operator confirms secrets are created, issue #178 (ESO sync validation) becomes unblocked.

[@devops] Triaged 2026-06-03.\n\n**Status:** Manual operator task. No agent action possible — the agent cannot create Kubernetes secrets in the `external-secrets` namespace. Placeholder secrets can be created immediately using the commands in the issue body. Real values require RapidAPI listings (#44, #161).\n\nThis is now tracked in STATUS.md Current Blockers (#8 in the list). Once operator confirms secrets are created, issue #178 (ESO sync validation) becomes unblocked.
Author
Owner

2026-06-04 sprint triage: Remains blocked on operator prerequisites (see issue dependencies). No agent-actionable work available this cycle. Status unchanged from previous triage.

**2026-06-04 sprint triage:** Remains blocked on operator prerequisites (see issue dependencies). No agent-actionable work available this cycle. Status unchanged from previous triage.
Author
Owner

Status check 2026-06-04 — @devops

This is a manual operator task. No change from last cycle. Prerequisites:

  1. Flux active (upstream Talos PR #14 merged)
  2. ESO HelmRelease reconciled

Operator must create 4 source secrets in external-secrets namespace as documented in the issue body.

**Status check 2026-06-04** — @devops This is a manual operator task. No change from last cycle. Prerequisites: 1. Flux active (upstream Talos PR #14 merged) 2. ESO HelmRelease reconciled Operator must create 4 source secrets in `external-secrets` namespace as documented in the issue body.
Author
Owner

2026-06-05 Triage

Status: BLOCKED/PENDING (as of 2026-06-05) — No change from prior cycle. All agent-ready conditions are unmet pending operator completion of critical-path items: (1) create 0xWheatyz/api-company (#47), (2) merge upstream Talos PR #14 (#187) to activate Flux, (3) configure DNS (#33, #106, #150). See STATUS.md for full ordered blocker list. No agent action available today.

## 2026-06-05 Triage **Status: BLOCKED/PENDING** (as of 2026-06-05) — No change from prior cycle. All agent-ready conditions are unmet pending operator completion of critical-path items: (1) create `0xWheatyz/api-company` (#47), (2) merge upstream Talos PR #14 (#187) to activate Flux, (3) configure DNS (#33, #106, #150). See STATUS.md for full ordered blocker list. No agent action available today.
Author
Owner

@devops/@tech-writer status check (2026-06-05): This is a manual operator task — the agent cannot create Kubernetes secrets, Gitea Actions secrets, RapidAPI listings, DNS records, or social media posts. Issue remains open awaiting operator action. All prerequisites tracked in the issue body. No agent-side code changes required at this time.

@devops/@tech-writer status check (2026-06-05): This is a **manual operator task** — the agent cannot create Kubernetes secrets, Gitea Actions secrets, RapidAPI listings, DNS records, or social media posts. Issue remains open awaiting operator action. All prerequisites tracked in the issue body. No agent-side code changes required at this time.
AI-Manager added the blocked label 2026-06-05 05:32:30 +00:00
Author
Owner

2026-06-05 triage — Status unchanged. This issue remains blocked on operator actions or upstream dependencies. Critical path: operator must (1) create 0xWheatyz/api-company (#47), (2) merge upstream Talos PR #14 (#187) to activate Flux, (3) configure DNS (#33/#106/#150). No agent-actionable items beyond what is already committed. kustomize build flux/ = PASS .

**2026-06-05 triage** — Status unchanged. This issue remains blocked on operator actions or upstream dependencies. Critical path: operator must (1) create `0xWheatyz/api-company` (#47), (2) merge upstream Talos PR #14 (#187) to activate Flux, (3) configure DNS (#33/#106/#150). No agent-actionable items beyond what is already committed. `kustomize build flux/` = PASS ✅.
Author
Owner

@devops triage 2026-06-06: Manual operator task — agent cannot create Kubernetes secrets. Blocked until operator has cluster access and ESO is deployed via Flux (depends on #218). Placeholder secrets can be created immediately once cluster is accessible. All ESO manifests are committed and ready.

**@devops triage 2026-06-06:** Manual operator task — agent cannot create Kubernetes secrets. Blocked until operator has cluster access and ESO is deployed via Flux (depends on #218). Placeholder secrets can be created immediately once cluster is accessible. All ESO manifests are committed and ready.
Author
Owner

🔍 Triage review 2026-06-06 — Operator task or blocked on upstream operator actions. No agent-implementable change available this cycle. Root critical-path blocker: operator merge of 0xWheatyz/Talos PR #14 to activate Flux GitOps for api-company.

🔍 **Triage review 2026-06-06** — Operator task or blocked on upstream operator actions. No agent-implementable change available this cycle. Root critical-path blocker: operator merge of 0xWheatyz/Talos PR #14 to activate Flux GitOps for api-company.
Author
Owner

@devops — Triage 2026-06-07: Manual operator task — create ESO source secrets in external-secrets namespace. Agent-side manifests (flux/external-secrets/, flux/*/externalsecret.yaml) are all committed; kustomize build flux/ = PASS. Blocked on #218 (Flux activation) before ESO will sync. Status unchanged.

@devops — Triage 2026-06-07: Manual operator task — create ESO source secrets in `external-secrets` namespace. Agent-side manifests (`flux/external-secrets/`, `flux/*/externalsecret.yaml`) are all committed; `kustomize build flux/` = PASS. Blocked on #218 (Flux activation) before ESO will sync. Status unchanged.
Author
Owner

@devops / @qa-engineer triage — 2026-06-07

Status: BLOCKED — awaiting operator action

This issue remains blocked on the same critical-path operator prerequisites:

  1. #47 — Create 0xWheatyz/api-company upstream repo (highest priority)
  2. #218 — Operator merge 0xWheatyz/Talos PR #14 to activate Flux

All agent-side implementation work for this issue is complete. No agent action possible until cluster is live.

kustomize build flux/ = PASS — no manifest regressions.

## @devops / @qa-engineer triage — 2026-06-07 **Status: BLOCKED — awaiting operator action** This issue remains blocked on the same critical-path operator prerequisites: 1. **#47** — Create `0xWheatyz/api-company` upstream repo (highest priority) 2. **#218** — Operator merge `0xWheatyz/Talos` PR #14 to activate Flux All agent-side implementation work for this issue is complete. No agent action possible until cluster is live. **`kustomize build flux/` = PASS** — no manifest regressions.
Author
Owner

@devops triage (2026-06-08 — Cycle #233): Status unchanged — BLOCKED pending operator completing the critical-path prerequisites: (1) create 0xWheatyz/api-company repo (#47), (2) merge 0xWheatyz/Talos PR #14 to activate Flux (#218), (3) configure DNS for all 8 subdomains (#33/#106/#150). All agent-side code/manifests are committed. kustomize build flux/ passes. No agent action possible until cluster is live.

**@devops triage (2026-06-08 — Cycle #233):** Status unchanged — BLOCKED pending operator completing the critical-path prerequisites: (1) create `0xWheatyz/api-company` repo (#47), (2) merge `0xWheatyz/Talos` PR #14 to activate Flux (#218), (3) configure DNS for all 8 subdomains (#33/#106/#150). All agent-side code/manifests are committed. `kustomize build flux/` passes. No agent action possible until cluster is live.
Author
Owner

@devops / @qa-engineer triage (2026-06-08, cycle #237): This is a manual operator task — no agent-side work is possible. All manifests and code are committed. This issue remains BLOCKED awaiting the operator to complete the listed steps. Critical path: (1) create 0xWheatyz/api-company (#47), (2) merge 0xWheatyz/Talos PR #14 (#218), (3) configure DNS (#33, #106, #150). kustomize build flux/ = PASS.

@devops / @qa-engineer triage (2026-06-08, cycle #237): This is a **manual operator task** — no agent-side work is possible. All manifests and code are committed. This issue remains BLOCKED awaiting the operator to complete the listed steps. Critical path: (1) create `0xWheatyz/api-company` (#47), (2) merge `0xWheatyz/Talos` PR #14 (#218), (3) configure DNS (#33, #106, #150). `kustomize build flux/` = PASS.
Author
Owner

@devops triage 2026-06-08 (cycle #240):

Status: BLOCKED — manual operator task

Operator must create ESO source secrets in the external-secrets namespace. This cannot be done by the agent (no kubectl access). Steps are fully documented in the issue body. Waiting on operator to:

  1. Merge Talos PR #14 to activate Flux (#218)
  2. Create the 4 source secrets as documented

No agent action possible this cycle.

@devops triage 2026-06-08 (cycle #240): **Status: BLOCKED — manual operator task** Operator must create ESO source secrets in the `external-secrets` namespace. This cannot be done by the agent (no kubectl access). Steps are fully documented in the issue body. Waiting on operator to: 1. Merge Talos PR #14 to activate Flux (#218) 2. Create the 4 source secrets as documented No agent action possible this cycle.
Author
Owner

@devops review 2026-06-08 (cycle #241): Status unchanged — BLOCKED on operator actions (Talos PR #14 merge → #218, upstream repo creation → #47). kustomize build flux/ PASS. No open PRs. No agent-side work outstanding this cycle.

@devops review 2026-06-08 (cycle #241): Status unchanged — BLOCKED on operator actions (Talos PR #14 merge → #218, upstream repo creation → #47). `kustomize build flux/` ✅ PASS. No open PRs. No agent-side work outstanding this cycle.
Author
Owner

[@devops triage 2026-06-09] Blocked on Flux activation (#218 — operator must merge 0xWheatyz/Talos PR #14). All manifests validated: kustomize build flux/ passes. Awaiting operator action on root blocker before this step can proceed.

**[@devops triage 2026-06-09]** Blocked on Flux activation (#218 — operator must merge 0xWheatyz/Talos PR #14). All manifests validated: `kustomize build flux/` ✅ passes. Awaiting operator action on root blocker before this step can proceed.
Author
Owner

2026-06-15 triage cycle: still blocked on operator critical path (#47, #218, #33/#106/#150). No agent-implementable work; kustomize build flux/ = PASS. Status unchanged since cycle #240.

2026-06-15 triage cycle: still blocked on operator critical path (#47, #218, #33/#106/#150). No agent-implementable work; `kustomize build flux/` = PASS. Status unchanged since cycle #240.
Author
Owner

2026-07-24 triage cycle (@devops): no change. All 37 open agent-ready issues remain blocked on operator prerequisites — upstream repo 0xWheatyz/api-company (#47) still empty (verified via API), no live-cluster kubectl/flux access from workspace, RapidAPI listing not yet submitted (#44). Nothing agent-implementable in-repo this cycle. Re-triage next cycle.

2026-07-24 triage cycle (@devops): no change. All 37 open agent-ready issues remain blocked on operator prerequisites — upstream repo 0xWheatyz/api-company (#47) still empty (verified via API), no live-cluster kubectl/flux access from workspace, RapidAPI listing not yet submitted (#44). Nothing agent-implementable in-repo this cycle. Re-triage next cycle.
Author
Owner

Manager cycle triage (2026-07-24): still blocked — this is a manual operator task (or requires live Flux cluster). No agent-side action possible until the prerequisite is satisfied. Marking as reviewed; will re-check next cycle.

Manager cycle triage (2026-07-24): still blocked — this is a manual operator task (or requires live Flux cluster). No agent-side action possible until the prerequisite is satisfied. Marking as reviewed; will re-check next cycle.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: leeworks-agents/api-company#173