Skip to content

OBJ-APPMANAGER-WETOPI3-001: app-manager en el cluster d

Objective ID: OBJ-APPMANAGER-WETOPI3-001 Status: active (fase DP — despliegue en d en curso) Drafted by: Lead (OWN) con el operador como Architect — Owned by: platform

Outcome (QUÉ éxito)

app-manager (rama wetopi3/app-manager-rke2) corre en el sandbox d desplegado por Argo CD, ejecutando las 26 operaciones de wepod contra la API de Kubernetes (sin Ansible), consumiendo eventos RabbitMQ y publicando …manager.event.done/…manager.error con el contrato externo intacto. El runtime de c (app-api + app-manager + broker en la red de c) queda sin impacto — convivencia indefinida.

Context (POR QUÉ)

  • app-manager 9.2.0 corre en Swarm c: worker headless que consume prod:c.manager.tasks y ejecuta playbooks Ansible por SSH contra hosts Swarm. Ancla productiva verificada: 9.2.0@sha256:79c6291b… (commit 1caeb58).
  • El cluster d (RKE2 v1.36.3) es la nueva plataforma: GitOps por Argo CD, secretos por Infisical, Cilium, registry sin desplegar (Zot PLANNED).
  • El operador fijó tres decisiones de estrategia (ver ADR-0021): d como sandbox de iteración, sin canary (revocado 2026-09-09), transición productiva de wepods c→d diferida a objetivo propio.

Decisions (resumen; el detalle vive en ADR-0021)

  • D1: sandbox-first — todo tipo de pruebas directamente sobre d.
  • D2: sin Ansible en d — adapter k8s nativo (StatefulSet/PVC/Secret vía API); dominio (get-playbook-config-command.js) intacto; contrato de eventos sin cambios.
  • D3: build = CI del repo (GitLab tags para c; GitHub Actions→GHCR para la línea k8s, base pública node:24.4-bookworm); despliegue = solo Git→Argo CD.
  • D4: secretos por Infisical (trío v1beta1 Connection+Auth+StaticSecret), valores solo en el vault; cero secretos en Git.
  • D5: consumirá prod:d.manager.tasks (prefijo por DC WETOPI_MANAGER_DOMAIN=d) y publicará errores en prod:d.manager.error — pendiente ruta de red d↔broker.

Acceptance criteria (DONE)

  1. Pod app-manager Running/Healthy en d (Argo Synced), imagen digest-pinned GHCR.
  2. Las 30 operaciones/eventos con specs de caracterización (DP-05) y ejecución real vía adapter k8s (DP-06) — suite verde por evento.
  3. E2E en d: evento controlado → consumido → efecto en un wepod de prueba (StatefulSet) → done/error correcto.
  4. c sin impacto: prod:c.manager.* con sus 3 consumers vivos (verificado 2026-09-10), app-api intacto.
  5. Sin Ansible/SSH en el runtime de d (limpieza post-DP-06).
  6. Documentation Impact Assessment cerrado: este OBJ + ADR-0021 + ficha SVC cuando el servicio sea operativo.

Verification contract

  • AC1: kubectl -n wetopi-prod get pods + Argo app Synced/Healthy + digest de la imagen = digest del build (evidencia en la tarjeta DP-03).
  • AC2: salida real de la suite Jasmine por evento (tarjeta DP-05/DP-06).
  • AC3: IDs de mensaje + estado del wepod de prueba (kubectl) + mensaje publicado.
  • AC4: recuento de consumers en prod:c.manager.tasks (=3, DP-00 probe).
  • AC5: grep Ansible en el Dockerfile/directorio server (cero referencias runtime).
  • AC6: PRs merged en wetopi-knowledge (this repo).

Constraints

  • Guardrails (8 puertas): toda opción que suba complejidad = DECISIÓN REQUERIDA.
  • No tocar las queues de c salvo lectura pasiva de verificación.
  • Merge de PRs: gate exclusivo del operador.
  • Secretos: solo por referencia (paths del vault), jamás valores.

Boundaries / Out of scope

  • Transición productiva de wepods c→d (objetivo propio futuro).
  • Migración del broker RabbitMQ a d (objetivo futuro declarado; el broker de c es TEMPORAL).
  • app-api permanece en c.
  • Retirada del runtime de c.

Promotion matrix

  • Al cierre (V-07): OBJ → completed; decisiones → ADR-0021 (accepted); ficha SVC-APP-MANAGER-D creada; REC final en records/; lecciones → skills.