kcreate-scaffolding-gcp-script 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env bash
2
+ # Etapa: Pre requisitos — paso 1.
3
+ # Crea (o localiza, si ya existe de una corrida anterior) el archivo de
4
+ # configuración de esta ejecución, autodetectando lo que se pueda desde
5
+ # SOURCE_ENV.
6
+ #
7
+ # Uso: 01_init_config.sh <SOURCE_ENV> <NEW_ENV>
8
+ #
9
+ # Salidas (código de salida, no solo texto — para que el agente no tenga
10
+ # que interpretar el mensaje):
11
+ # 0 CONFIG_READY — no quedan campos __PENDIENTE__, se puede continuar.
12
+ # 2 CONFIG_PENDING — faltan campos por llenar; se listan por nombre.
13
+ # 1 error de uso/validación (SOURCE_ENV no existe, NEW_ENV ya existe, etc.)
14
+
15
+ set -euo pipefail
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ # shellcheck source=lib/common.sh
19
+ source "$SCRIPT_DIR/lib/common.sh"
20
+
21
+ SOURCE_ENV="${1:-}"
22
+ NEW_ENV="${2:-}"
23
+ [[ -n "$SOURCE_ENV" && -n "$NEW_ENV" ]] || ksc_die "uso: 01_init_config.sh <SOURCE_ENV> <NEW_ENV>"
24
+
25
+ REPO_ROOT="$(ksc_repo_root)"
26
+ SOURCE_DIR="$REPO_ROOT/live/$SOURCE_ENV"
27
+ NEW_DIR="$REPO_ROOT/live/$NEW_ENV"
28
+
29
+ [[ -f "$SOURCE_DIR/project/terragrunt.hcl" ]] || ksc_die \
30
+ "SOURCE_ENV '$SOURCE_ENV' no existe (no se encontró $SOURCE_DIR/project/terragrunt.hcl)"
31
+ [[ "$NEW_ENV" =~ ^[a-z0-9]+-(qa|prod)$ ]] || ksc_die \
32
+ "NEW_ENV '$NEW_ENV' no cumple el patrón <app>-<entorno>, minúsculas, entorno = qa|prod"
33
+
34
+ CONFIG_FILE="$(ksc_config_path "$REPO_ROOT" "$NEW_ENV")"
35
+ mkdir -p "$(dirname "$CONFIG_FILE")"
36
+
37
+ # Si live/<NEW_ENV>/ ya existe PERO el config de esta ejecución todavía
38
+ # no, puede ser (a) una colisión real (otra cosa ocupa ese nombre) o (b)
39
+ # un rescate legítimo cuyo config se perdió — ej. alguien corrió
40
+ # `uninstall.sh --clean-gitignore`, que borra `.kcreate-scaffolding/`
41
+ # completa, con un build a medias todavía en `live/` (Review V3, P-2:
42
+ # antes esto SIEMPRE moría como colisión, incluso cuando era claramente
43
+ # un rescate, y no había forma automática de recuperarlo). Se distinguen
44
+ # por una firma mínima: si `project.hcl` existe y su `project_id` es
45
+ # exactamente `NEW_ENV`, es la huella que este mismo skill deja siempre
46
+ # (ver build_project_hcl) — se trata como rescate (regenerar el config
47
+ # desde cero) en vez de colisión. Cualquier otra cosa sí se trata como
48
+ # colisión real y se detiene.
49
+ if [[ -d "$NEW_DIR" && ! -f "$CONFIG_FILE" ]]; then
50
+ RESCUE_PROJECT_ID=""
51
+ [[ -f "$NEW_DIR/project.hcl" ]] && RESCUE_PROJECT_ID="$(ksc_hcl_get "$NEW_DIR/project.hcl" project_id)"
52
+ if [[ "$RESCUE_PROJECT_ID" == "$NEW_ENV" ]]; then
53
+ ksc_info "$NEW_DIR ya existe sin config (se perdió, ej. por un uninstall --clean-gitignore) pero tiene la firma de haber sido generado por este skill (project.hcl con project_id=\"$NEW_ENV\") — se trata como rescate: regenerando el config desde cero."
54
+ else
55
+ ksc_die "NEW_ENV '$NEW_ENV' ya existe en $NEW_DIR pero no hay un config de este skill para esa ejecución ($CONFIG_FILE no existe), y $NEW_DIR/project.hcl no tiene la firma de haber sido generado por este skill — parece una colisión real con otra cosa, no se sobreescribe. Si es intencional, bórralo tú mismo primero (este skill nunca borra)."
56
+ fi
57
+ fi
58
+ if [[ -d "$NEW_DIR" && -f "$CONFIG_FILE" ]]; then
59
+ ksc_info "$NEW_DIR ya existe (reintento de una corrida anterior) — no es un error, continuando con el config existente."
60
+ fi
61
+
62
+ GITIGNORE="$REPO_ROOT/.gitignore"
63
+ if ! grep -qxF '.kcreate-scaffolding/' "$GITIGNORE" 2>/dev/null; then
64
+ printf '\n# kcreate-scaffolding-gcp-script: configuracion de ejecucion, no comitear\n.kcreate-scaffolding/\n' >> "$GITIGNORE"
65
+ ksc_info "agregado .kcreate-scaffolding/ a $GITIGNORE"
66
+ fi
67
+
68
+ if [[ -f "$CONFIG_FILE" ]]; then
69
+ ksc_info "ya existe un archivo de configuración de una corrida anterior: $CONFIG_FILE"
70
+ ksc_info "no se vuelve a generar (reanudación) — usa 02_print_config.sh para revisarlo."
71
+ else
72
+ ksc_info "generando $CONFIG_FILE desde la plantilla y autodetectando valores de $SOURCE_ENV ..."
73
+
74
+ sed -e "s/__SOURCE_ENV__/$SOURCE_ENV/" -e "s/__NEW_ENV__/$NEW_ENV/" \
75
+ "$SCRIPT_DIR/../templates/scaffolding.config.template" > "$CONFIG_FILE"
76
+
77
+ PROJECT_NAME_GUESS="$(ksc_infer_project_name "$NEW_ENV")"
78
+ sed -i "s/^PROJECT_NAME=\"__PENDIENTE__\"/PROJECT_NAME=\"$PROJECT_NAME_GUESS\"/" "$CONFIG_FILE"
79
+
80
+ ORG_ID="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" org_id)"
81
+ ORG_BILLING_ACCOUNT="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" org_billing_account)"
82
+ REGION="$(ksc_hcl_get "$SOURCE_DIR/project.hcl" region)"
83
+ ZONE="$(ksc_hcl_get "$SOURCE_DIR/project.hcl" zone)"
84
+ LABEL_OWNER="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" owner)"
85
+ GITHUB_ORG="$(ksc_hcl_get "$SOURCE_DIR/github_workload_identity/terragrunt.hcl" github_organization)"
86
+ GKE_VERSION="$(ksc_hcl_get "$SOURCE_DIR/gke_private/terragrunt.hcl" gke_version)"
87
+ DB_VERSION="$(ksc_hcl_get "$SOURCE_DIR/sql_postgres/terragrunt.hcl" database_version)"
88
+
89
+ # authorized_networks fijos (todo lo que NO empiece con "dev-"): se extraen
90
+ # de entradas en una sola línea como
91
+ # `{ name = "cloudadmin", address = "1.2.3.4/32" },` (formato real de
92
+ # todos los entornos existentes). Portable (grep+sed), sin depender de
93
+ # extensiones de gawk.
94
+ FIXED_NETWORKS=""
95
+ if [[ -f "$SOURCE_DIR/sql_postgres/terragrunt.hcl" ]]; then
96
+ while IFS= read -r line; do
97
+ name="$(printf '%s' "$line" | grep -oE 'name[[:space:]]*=[[:space:]]*"[^"]*"' | sed -E 's/.*"([^"]*)"/\1/')"
98
+ addr="$(printf '%s' "$line" | grep -oE 'address[[:space:]]*=[[:space:]]*"[^"]*"' | sed -E 's/.*"([^"]*)"/\1/')"
99
+ [[ -n "$name" && -n "$addr" ]] || continue
100
+ [[ "$name" == dev-* ]] && continue
101
+ FIXED_NETWORKS="${FIXED_NETWORKS}${FIXED_NETWORKS:+;}${name}=${addr}"
102
+ done < <(grep -E '\{[[:space:]]*name[[:space:]]*=' "$SOURCE_DIR/sql_postgres/terragrunt.hcl")
103
+ fi
104
+
105
+ # SI hay una mayoría CLARA (>mitad de los entornos reales) para una IP
106
+ # fija y SOURCE_ENV tiene un valor distinto para ese mismo nombre,
107
+ # preferir el valor mayoritario en vez de propagar lo que probablemente
108
+ # sea un typo (Review V2, N-6: antes el doctor avisaba del typo de
109
+ # xoloshop-qa pero el config igual terminaba con el valor roto).
110
+ BEST_NET=""; BEST_N=0; TOTAL_REAL_ENVS=0
111
+ read -r BEST_NET BEST_N TOTAL_REAL_ENVS < <(ksc_majority_fixed_network "$REPO_ROOT")
112
+ if [[ -n "$BEST_NET" && "$BEST_N" -gt $((TOTAL_REAL_ENVS / 2)) ]]; then
113
+ BEST_NAME="${BEST_NET%%=*}"
114
+ SOURCE_VALUE_FOR_NAME="$(tr ';' '\n' <<<"$FIXED_NETWORKS" | grep "^${BEST_NAME}=" || true)"
115
+ if [[ -n "$SOURCE_VALUE_FOR_NAME" && "$SOURCE_VALUE_FOR_NAME" != "$BEST_NET" ]]; then
116
+ FIXED_NETWORKS="$(tr ';' '\n' <<<"$FIXED_NETWORKS" | { grep -v "^${BEST_NAME}=" || true; } | paste -sd ';' -)"
117
+ FIXED_NETWORKS="${FIXED_NETWORKS}${FIXED_NETWORKS:+;}${BEST_NET}"
118
+ ksc_warn "$SOURCE_ENV tiene '$SOURCE_VALUE_FOR_NAME' pero $BEST_N/$TOTAL_REAL_ENVS entornos reales usan '$BEST_NET' — se adoptó el valor mayoritario en FIXED_ADMIN_NETWORKS en vez del de $SOURCE_ENV (probable typo, ver lessons-learned.md A4). Corrígelo a mano en el config si el valor de $SOURCE_ENV era el correcto a propósito."
119
+ fi
120
+ fi
121
+
122
+ for pair in "ORG_ID:$ORG_ID" "ORG_BILLING_ACCOUNT:$ORG_BILLING_ACCOUNT" \
123
+ "REGION:$REGION" "ZONE:$ZONE" "LABEL_OWNER:$LABEL_OWNER" \
124
+ "GITHUB_ORGANIZATION:$GITHUB_ORG" \
125
+ "GKE_VERSION_NEEDS_VERIFICATION:$GKE_VERSION" \
126
+ "DATABASE_VERSION_NEEDS_VERIFICATION:$DB_VERSION" \
127
+ "FIXED_ADMIN_NETWORKS:$FIXED_NETWORKS"; do
128
+ key="${pair%%:*}"; val="${pair#*:}"
129
+ if [[ -n "$val" ]]; then
130
+ val_escaped="$(printf '%s' "$val" | sed -e 's/[\/&]/\\&/g')"
131
+ sed -i "s/^${key}=\"__PENDIENTE__\"/${key}=\"${val_escaped}\"/" "$CONFIG_FILE"
132
+ else
133
+ ksc_warn "no se pudo autodetectar $key desde $SOURCE_ENV — queda __PENDIENTE__"
134
+ fi
135
+ done
136
+
137
+ ksc_ok "config generado en $CONFIG_FILE"
138
+ fi
139
+
140
+ PENDING=$(ksc_config_pending_fields "$CONFIG_FILE" || true)
141
+ if [[ -n "$PENDING" ]]; then
142
+ echo
143
+ ksc_warn "CONFIG_PENDING — faltan estos campos en $CONFIG_FILE:"
144
+ echo "$PENDING" | sed 's/^/ - /'
145
+ echo
146
+ echo "Llénalos y vuelve a correr este mismo script para confirmar que ya quedó completo."
147
+ exit 2
148
+ fi
149
+
150
+ ksc_ok "CONFIG_READY — $CONFIG_FILE no tiene campos pendientes."
151
+ echo "$CONFIG_FILE"
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ # Etapa: Pre requisitos — paso 2.
3
+ # Solo imprime el contenido completo del archivo de configuración para que
4
+ # el agente lo muestre al humano y pida confirmación explícita antes de
5
+ # construir nada. Este script NUNCA decide por sí mismo si los datos son
6
+ # correctos — esa es una pregunta que el agente debe hacerle al humano
7
+ # textualmente, y detenerse si la respuesta es "no".
8
+ #
9
+ # Uso: 02_print_config.sh <NEW_ENV>
10
+
11
+ set -euo pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ # shellcheck source=lib/common.sh
15
+ source "$SCRIPT_DIR/lib/common.sh"
16
+
17
+ NEW_ENV="${1:-}"
18
+ [[ -n "$NEW_ENV" ]] || ksc_die "uso: 02_print_config.sh <NEW_ENV>"
19
+
20
+ REPO_ROOT="$(ksc_repo_root)"
21
+ CONFIG_FILE="$(ksc_config_path "$REPO_ROOT" "$NEW_ENV")"
22
+ [[ -f "$CONFIG_FILE" ]] || ksc_die \
23
+ "no existe $CONFIG_FILE — corre primero 01_init_config.sh <SOURCE_ENV> $NEW_ENV"
24
+
25
+ PENDING=$(ksc_config_pending_fields "$CONFIG_FILE" || true)
26
+ if [[ -n "$PENDING" ]]; then
27
+ ksc_die "este archivo todavía tiene campos __PENDIENTE__ — no se puede confirmar así. Corre 01_init_config.sh de nuevo después de llenarlos."
28
+ fi
29
+
30
+ # shellcheck disable=SC1090
31
+ source "$CONFIG_FILE"
32
+
33
+ # Persistir también los WARN del doctor (no solo los de la Construcción):
34
+ # si la sesión muere entre este paso y 10_build_components.sh, no se
35
+ # pierden (Review V2, N-5). Se trunca aquí porque cada corrida de 02
36
+ # vuelve a mostrar el estado completo desde cero; 10_build_components.sh
37
+ # hace APPEND sobre este mismo archivo, nunca lo trunca, para no perder
38
+ # lo que el doctor ya escribió.
39
+ export KSC_WARNINGS_FILE="$(ksc_warnings_file_path "$REPO_ROOT" "$NEW_ENV")"
40
+ : > "$KSC_WARNINGS_FILE"
41
+
42
+ # "Doctor" de SOURCE_ENV (ver lib/common.sh:ksc_check_source_health):
43
+ # avisa ANTES de que el humano confirme si SOURCE_ENV le falta algo que
44
+ # el entorno más reciente/mayoritario de live/ ya tiene (API de
45
+ # project_services, entradas de org_policies, IP fija de cloudadmin).
46
+ ksc_check_source_health "$REPO_ROOT" "$SOURCE_ENV"
47
+ echo
48
+
49
+ echo "=================================================================="
50
+ echo " Configuración completa para NEW_ENV=$NEW_ENV"
51
+ echo " Archivo: $CONFIG_FILE"
52
+ echo "=================================================================="
53
+ cat "$CONFIG_FILE"
54
+ echo "=================================================================="
55
+ echo
56
+ echo "AGENTE: muestra este contenido completo al humano tal cual y"
57
+ echo "pregúntale explícitamente si los datos son correctos. Si dice que"
58
+ echo "NO, DETENTE por completo — no corrijas nada por tu cuenta, no sigas"
59
+ echo "a la etapa de Construcción. Si dice que SÍ, continúa con"
60
+ echo "10_build_components.sh."