Ir al contenido

Fase 4 — Desmontaje

La Fase 4 elimina todos los objetos creados durante el ejercicio en orden inverso de dependencia. Esta fase requiere confirmación humana explícita antes de cualquier operación destructiva.

Elimine los objetos en orden inverso de creación — elimine primero los objetos que dependen de otros objetos:

  1. Dominios mitigados — elimine todos los dominios mitigados de CSD creados en la Fase 3
  2. Balanceador de carga HTTPS (${F5XC_LB_NAME}-https) — reduzca al esqueleto (preserve el certificado Let’s Encrypt); DELETE completo si NAMESPACE_CREATED=true o bajo solicitud explícita
  3. Balanceador de carga HTTP (${F5XC_LB_NAME}-http) — depende del grupo de origen
  4. Grupo de origen — depende del control de estado (si fue creado)
  5. Limpieza de zona DNS — el esqueleto del LB HTTPS retiene sus registros A administrados y ACME (esto es deseable — mantiene el certificado válido). Los registros administrados del LB HTTP se limpian automáticamente al eliminarlo. Los registros manuales en default_rr_set_group requieren limpieza manual mediante PUT
  6. Control de estado — solo si fue creado en la Fase 1 Paso 1
  7. Dominio protegido — elimine el registro de dominio protegido de CSD
  8. Namespace — solo si fue creado durante la Fase 1 Paso 0 (NAMESPACE_CREATED=true)

Si la Fase 3 fue ejecutada, elimine todos los dominios mitigados antes de eliminar los objetos de infraestructura. La simulación estándar crea 6 dominios mitigados:

Ventana de terminal
for domain in cdn.jsdelivr.net esm.sh unpkg.com ga.jspm.io httpbin.org jsonplaceholder.typicode.com; do
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/$domain"
done

Verifique: Liste los dominios mitigados para confirmar que el recuento es 0 (o 1 — consulte la nota a continuación):

Ventana de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

El comportamiento del desmontaje del LB HTTPS depende de si el namespace fue creado durante esta sesión de demostración (variable NAMESPACE_CREATED de la Fase 1 Paso 0):

  • NAMESPACE_CREATED=false (namespace preexistente) — reduzca al estado de esqueleto, preservando el certificado Let’s Encrypt para su reutilización
  • NAMESPACE_CREATED=true (namespace creado durante la demostración) — DELETE completo, ya que el namespace en sí será eliminado y el certificado no puede preservarse

Ruta A: Reducir al esqueleto (namespace preexistente)

Sección titulada «Ruta A: Reducir al esqueleto (namespace preexistente)»

Cuando el namespace es preexistente, reduzca el LB HTTPS a un estado de esqueleto — elimine la referencia al grupo de origen y la configuración de CSD mientras preserva el enlace de dominio, la configuración https_auto_cert y el certificado Let’s Encrypt. Esto evita activar una nueva solicitud de certificado en la próxima ejecución de demostración (Let’s Encrypt aplica un límite de 5 certificados duplicados por conjunto de identificadores exactos cada 7 días).

Paso 1 — Obtenga la configuración actual del LB HTTPS:

Ventana de terminal
HTTPS_LB_JSON=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")

Paso 2 — Reduzca al esqueleto mediante jq y aplique con PUT:

Ventana de terminal
echo "$HTTPS_LB_JSON" | jq '{
metadata: .metadata,
spec: (.spec | del(.client_side_defense) | .disable_client_side_defense = {} | .default_route_pools = [])
}' | curl -s -X PUT \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d @- \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq .

El filtro jq preserva toda la especificación (dominios, https_auto_cert, advertise_on_public_default_vip y todos los indicadores de funciones deshabilitadas) mientras elimina client_side_defense (reemplazado por disable_client_side_defense: {}) y vacía default_route_pools en un array vacío. El certificado y los enlaces DNS permanecen intactos.

Verifique que el LB HTTPS ahora es un esqueleto:

Ventana de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{
name: .metadata.name,
domains: .spec.domains,
has_origin_pools: ((.spec.default_route_pools // []) | length > 0),
has_csd: (.spec.client_side_defense != null),
cert_state: .spec.cert_state
}'

Esperado: has_origin_pools: false, has_csd: false, domains aún poblado, cert_state sin cambios (por ejemplo, CertificateValid).

Ruta B: DELETE completo (namespace creado durante la demostración)

Sección titulada «Ruta B: DELETE completo (namespace creado durante la demostración)»

Cuando el namespace fue creado durante esta sesión de demostración, el LB HTTPS debe eliminarse completamente — la preservación del esqueleto es innecesaria porque el namespace en sí será eliminado al final del desmontaje.

Ventana de terminal
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https"

Verifique: GET /api/config/namespaces/\{namespace\}/http_loadbalancers no debe contener ${F5XC_LB_NAME}-https.

Elimine el LB HTTP principal:

Ventana de terminal
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http"

Verifique: GET /api/config/namespaces/\{namespace\}/http_loadbalancers no debe contener ${F5XC_LB_NAME}-http. Si el objeto aún aparece en la lista después de que DELETE devolvió 200, espere 30 segundos y vuelva a verificar una vez. Si aún está presente tras la segunda verificación, informe al operador — no proceda.

Ventana de terminal
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx"

Verifique: GET /api/config/namespaces/\{namespace\}/origin_pools no debe contener el nombre del grupo. Si el objeto aún aparece en la lista después de que DELETE devolvió 200, espere 30 segundos y vuelva a verificar una vez. Si aún está presente tras la segunda verificación, informe al operador.

Ventana de terminal
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx"

Verifique: GET /api/config/namespaces/\{namespace\}/healthchecks no debe contener el nombre del control de estado. Si el objeto aún aparece en la lista después de que DELETE devolvió 200, espere 30 segundos y vuelva a verificar una vez. Si aún está presente tras la segunda verificación, informe al operador.

Elimine el registro de dominio protegido de CSD. El dominio protegido está en el ámbito del tenant (no del namespace), pero es un objeto de configuración de CSD vinculado a este despliegue — no es infraestructura compartida como la zona DNS.

Ventana de terminal
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains/xF5XC_ROOT_DOMAINx"

Verifique: Liste los dominios protegidos para confirmar que el dominio ya no está registrado:

Ventana de terminal
curl -s -X GET \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items // [] | map(.metadata.name)'

Este paso se ejecuta únicamente si el namespace fue creado durante la Fase 1 Paso 0 (NAMESPACE_CREATED=true). Si el namespace era preexistente (NAMESPACE_CREATED=false), omita este paso completamente — el namespace es infraestructura compartida que no debe eliminarse.

Ventana de terminal
if [ "$NAMESPACE_CREATED" = "true" ]; then
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"name": "xF5XC_NAMESPACEx"}' \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx/cascade_delete" | jq .
fi

Verifique: Confirme que el namespace ya no existe:

Ventana de terminal
curl -s -o /dev/null -w '%\{http_code\}' \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"

Esperado: 404 si NAMESPACE_CREATED=true, 200 si NAMESPACE_CREATED=false.

ObjetoEstado de eliminaciónEstado de verificación
Dominios mitigados (6)Todos 200 (vacío \{\}) u omitidos si la Fase 3 no fue ejecutadaRecuento 0 (o 1 fantasma) — APROBADO
Balanceador de carga HTTPS (-https)200 (PUT de esqueleto) o 200 (DELETE completo si NAMESPACE_CREATED=true)Esqueleto verificado o no en la lista — APROBADO
Balanceador de carga HTTP (-http)200 (vacío \{\})No en la lista — APROBADO
Grupo de origen200 (vacío \{\})No en la lista — APROBADO
Control de estado200 (vacío \{\}) u omitidoNo en la lista — APROBADO
Dominio protegido200 (vacío \{\})No en la lista — APROBADO
Zona DNSNO eliminada (infraestructura compartida)La zona aún existe — APROBADO
Namespace200 (eliminación en cascada) si NAMESPACE_CREATED=true, omitido en caso contrario404 si fue eliminado, 200 si fue preservado — APROBADO

Desmontaje completo. Cuando el namespace era preexistente (NAMESPACE_CREATED=false), todos los objetos del despliegue han sido eliminados excepto el esqueleto del LB HTTPS, que preserva el certificado Let’s Encrypt y el enlace de dominio para la próxima ejecución de demostración. Cuando el namespace fue creado durante la demostración (NAMESPACE_CREATED=true), todos los objetos, incluido el LB HTTPS y el namespace, han sido eliminados completamente. La zona DNS y sus registros no administrados permanecen intactos en ambos casos.