Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Test Environment Service - Guía Completa de Uso

Versión: 1.0.0 Fecha: 2025-10-06 Estado: Producción


Índice

  1. Introducción
  2. Requerimientos
  3. Configuración Inicial
  4. Guía de Uso Rápido
  5. Tipos de Entornos
  6. Comandos Detallados
  7. Topologías y Templates
  8. Casos de Uso Prácticos
  9. Integración CI/CD
  10. Troubleshooting

Introducción

El Test Environment Service es un sistema de testing containerizado integrado en el orquestador que permite probar:

  • Taskservs individuales - Test aislado de un servicio
  • Servidores completos - Simulación de servidor con múltiples taskservs
  • Clusters multi-nodo - Topologías distribuidas (Kubernetes, etcd, etc.)

¿Por qué usar Test Environments?

  • Sin gestión manual de Docker - Todo automatizado
  • Entornos aislados - Redes dedicadas, sin interferencias
  • Realista - Simula configuraciones de producción
  • Rápido - Un comando para crear, probar y limpiar
  • CI/CD Ready - Fácil integración en pipelines

Requerimientos

Obligatorios

1. Docker

Versión mínima: Docker 20.10+

# Verificar instalación
docker --version

# Verificar que funciona
docker ps

# Verificar recursos disponibles
docker info | grep -E "CPUs|Total Memory"

Instalación según OS:

macOS:

# Opción 1: Docker Desktop
brew install --cask docker

# Opción 2: OrbStack (más ligero)
brew install orbstack

Linux (Ubuntu/Debian):

# Instalar Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Añadir usuario al grupo docker
sudo usermod -aG docker $USER
newgrp docker

# Verificar
docker ps

Linux (Fedora):

sudo dnf install docker
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

2. Orchestrator

Puerto por defecto: 8080

# Verificar que el orquestador está corriendo
curl http://localhost:9090/health

# Si no está corriendo, iniciarlo
cd provisioning/platform/orchestrator
./scripts/start-orchestrator.nu --background

# Verificar logs
tail -f ./data/orchestrator.log

3. Nushell

Versión mínima: 0.107.1+

# Verificar versión
nu --version

Recursos Recomendados

Tipo de TestCPUMemoriaDisk
Single taskserv2 cores4 GB10 GB
Server simulation4 cores8 GB20 GB
Cluster 3-nodos8 cores16 GB40 GB

Verificar recursos disponibles:

# En el sistema
docker info | grep -E "CPUs|Total Memory"

# Recursos usados actualmente
docker stats --no-stream

Opcional pero Recomendado

  • jq - Para procesar JSON: brew install jq / apt install jq
  • glow - Para visualizar docs: brew install glow
  • k9s - Para gestionar K8s tests: brew install k9s

Configuración Inicial

1. Iniciar el Orquestador

# Navegar al directorio del orquestador
cd provisioning/platform/orchestrator

# Opción 1: Iniciar en background (recomendado)
./scripts/start-orchestrator.nu --background

# Opción 2: Iniciar en foreground (para debug)
cargo run --release

# Verificar que está corriendo
curl http://localhost:9090/health
# Respuesta esperada: {"success":true,"data":"Orchestrator is healthy"}

2. Verificar Docker

# Test básico de Docker
docker run --rm hello-world

# Verificar que hay imágenes base (se descargan automáticamente)
docker images | grep ubuntu

3. Configurar Variables de Entorno (opcional)

# Añadir a tu ~/.bashrc o ~/.zshrc
export PROVISIONING_ORCHESTRATOR="http://localhost:9090"
export PROVISIONING_PATH="/ruta/a/provisioning"

4. Verificar Instalación

# Test completo del sistema
provisioning test quick redis

# Debe mostrar:
# 🧪 Quick test for redis
# ✅ Environment ready, running tests...
# ✅ Quick test completed

Guía de Uso Rápido

Test Rápido (Recomendado para empezar)

# Un solo comando: crea, prueba, limpia
provisioning test quick <taskserv>

# Ejemplos
provisioning test quick kubernetes
provisioning test quick postgres
provisioning test quick redis

Flujo Completo Paso a Paso

# 1. Crear entorno
provisioning test env single kubernetes --auto-start

# Retorna: environment_id = "abc-123-def-456"

# 2. Listar entornos
provisioning test env list

# 3. Ver status
provisioning test env status abc-123-def-456

# 4. Ver logs
provisioning test env logs abc-123-def-456

# 5. Limpiar
provisioning test env cleanup abc-123-def-456

Con Auto-Cleanup

# Se limpia automáticamente al terminar
provisioning test env single redis \
  --auto-start \
  --auto-cleanup

Tipos de Entornos

1. Single Taskserv

Test de un solo taskserv en container aislado.

Cuándo usar:

  • Desarrollo de nuevo taskserv
  • Validación de configuración
  • Debug de problemas específicos

Comando:

provisioning test env single <taskserv> [opciones]

# Opciones
--cpu <millicores>        # Default: 1000 (1 core)
--memory <MB>             # Default: 2048 (2GB)
--base-image <imagen>     # Default: ubuntu:22.04
--infra <nombre>          # Contexto de infraestructura
--auto-start              # Ejecutar tests automáticamente
--auto-cleanup            # Limpiar al terminar

Ejemplos:

# Test básico
provisioning test env single kubernetes

# Con más recursos
provisioning test env single postgres --cpu 4000 --memory 8192

# Test completo automatizado
provisioning test env single redis --auto-start --auto-cleanup

# Con contexto de infra
provisioning test env single cilium --infra prod-cluster

2. Server Simulation

Simula servidor completo con múltiples taskservs.

Cuándo usar:

  • Test de integración entre taskservs
  • Validar dependencias
  • Simular servidor de producción

Comando:

provisioning test env server <nombre> <taskservs> [opciones]

# taskservs: lista entre corchetes [ts1 ts2 ts3]

Ejemplos:

# Server con stack de aplicación
provisioning test env server app-01 [containerd kubernetes cilium]

# Server de base de datos
provisioning test env server db-01 [postgres redis]

# Con auto-resolución de dependencias
provisioning test env server web-01 [kubernetes] --auto-start
# Automáticamente incluye: containerd, etcd (dependencias de k8s)

3. Cluster Topology

Cluster multi-nodo con topología definida.

Cuándo usar:

  • Test de clusters distribuidos
  • Validar HA (High Availability)
  • Test de failover
  • Simular producción real

Comando:

# Desde template predefinido
provisioning test topology load <template> | test env cluster <tipo> [opciones]

Ejemplos:

# Cluster Kubernetes 3 nodos (1 CP + 2 workers)
provisioning test topology load kubernetes_3node | \
  test env cluster kubernetes --auto-start

# Cluster etcd 3 miembros
provisioning test topology load etcd_cluster | \
  test env cluster etcd

# Cluster K8s single-node
provisioning test topology load kubernetes_single | \
  test env cluster kubernetes

Comandos Detallados

Gestión de Entornos

test env create

Crear entorno desde configuración custom.

provisioning test env create <config> [opciones]

# Opciones
--infra <nombre>      # Infraestructura context
--auto-start          # Iniciar tests automáticamente
--auto-cleanup        # Limpiar al finalizar

test env list

Listar todos los entornos activos.

provisioning test env list

# Salida ejemplo:
# id                    env_type          status    containers
# abc-123               single_taskserv   ready     1
# def-456               cluster_topology  running   3

test env get

Obtener detalles completos de un entorno.

provisioning test env get <env-id>

# Retorna JSON con:
# - Configuración completa
# - Estados de containers
# - IPs asignadas
# - Resultados de tests
# - Logs

test env status

Ver status resumido de un entorno.

provisioning test env status <env-id>

# Muestra:
# - ID y tipo
# - Status actual
# - Containers y sus IPs
# - Resultados de tests

test env run

Ejecutar tests en un entorno.

provisioning test env run <env-id> [opciones]

# Opciones
--tests [test1 test2]   # Tests específicos (default: todos)
--timeout <segundos>    # Timeout para tests

Ejemplo:

# Ejecutar todos los tests
provisioning test env run abc-123

# Tests específicos
provisioning test env run abc-123 --tests [connectivity health]

# Con timeout
provisioning test env run abc-123 --timeout 300

test env logs

Ver logs del entorno.

provisioning test env logs <env-id>

# Muestra:
# - Logs de creación
# - Logs de containers
# - Logs de tests
# - Errores si los hay

test env cleanup

Limpiar y destruir entorno.

provisioning test env cleanup <env-id>

# Elimina:
# - Containers
# - Red dedicada
# - Volúmenes
# - Estado del orquestador

Topologías

test topology list

Listar templates disponibles.

provisioning test topology list

# Salida:
# name
# kubernetes_3node
# kubernetes_single
# etcd_cluster
# containerd_test
# postgres_redis

test topology load

Cargar configuración de template.

provisioning test topology load <nombre>

# Retorna configuración JSON/TOML
# Se puede usar con pipe para crear cluster

Quick Test

test quick

Test rápido todo-en-uno.

provisioning test quick <taskserv> [opciones]

# Hace:
# 1. Crea entorno single taskserv
# 2. Ejecuta tests
# 3. Muestra resultados
# 4. Limpia automáticamente

# Opciones
--infra <nombre>   # Contexto de infraestructura

Ejemplos:

# Test rápido de kubernetes
provisioning test quick kubernetes

# Con contexto
provisioning test quick postgres --infra prod-db

Topologías y Templates

Templates Predefinidos

El sistema incluye 5 templates listos para usar:

1. kubernetes_3node - Cluster K8s HA

# Configuración:
# - 1 Control Plane: etcd, kubernetes, containerd (2 cores, 4GB)
# - 2 Workers: kubernetes, containerd, cilium (2 cores, 2GB cada uno)
# - Red: 172.20.0.0/16

# Uso:
provisioning test topology load kubernetes_3node | \
  test env cluster kubernetes --auto-start

2. kubernetes_single - K8s All-in-One

# Configuración:
# - 1 Nodo: etcd, kubernetes, containerd, cilium (4 cores, 8GB)
# - Red: 172.22.0.0/16

# Uso:
provisioning test topology load kubernetes_single | \
  test env cluster kubernetes

3. etcd_cluster - Cluster etcd

# Configuración:
# - 3 Miembros etcd (1 core, 1GB cada uno)
# - Red: 172.21.0.0/16
# - Cluster configurado automáticamente

# Uso:
provisioning test topology load etcd_cluster | \
  test env cluster etcd --auto-start

4. containerd_test - Containerd standalone

# Configuración:
# - 1 Nodo: containerd (1 core, 2GB)
# - Red: 172.23.0.0/16

# Uso:
provisioning test topology load containerd_test | \
  test env cluster containerd

5. postgres_redis - Stack de DBs

# Configuración:
# - 1 PostgreSQL: (2 cores, 4GB)
# - 1 Redis: (1 core, 1GB)
# - Red: 172.24.0.0/16

# Uso:
provisioning test topology load postgres_redis | \
  test env cluster databases --auto-start

Crear Template Custom

  1. Crear archivo TOML:
# /path/to/my-topology.toml

[mi_cluster]
name = "Mi Cluster Custom"
description = "Descripción del cluster"
cluster_type = "custom"

[[mi_cluster.nodes]]
name = "node-01"
role = "primary"
taskservs = ["postgres", "redis"]
[mi_cluster.nodes.resources]
cpu_millicores = 2000
memory_mb = 4096
[mi_cluster.nodes.environment]
POSTGRES_PASSWORD = "secret"

[[mi_cluster.nodes]]
name = "node-02"
role = "replica"
taskservs = ["postgres"]
[mi_cluster.nodes.resources]
cpu_millicores = 1000
memory_mb = 2048

[mi_cluster.network]
subnet = "172.30.0.0/16"
dns_enabled = true
  1. Copiar a config:
cp my-topology.toml provisioning/config/test-topologies.toml
  1. Usar:
provisioning test topology load mi_cluster | \
  test env cluster custom --auto-start

Casos de Uso Prácticos

Desarrollo de Taskservs

Escenario: Desarrollando nuevo taskserv

# 1. Test inicial
provisioning test quick my-new-taskserv

# 2. Si falla, debug con logs
provisioning test env single my-new-taskserv --auto-start
ENV_ID=$(provisioning test env list | tail -1 | awk '{print $1}')
provisioning test env logs $ENV_ID

# 3. Iterar hasta que funcione

# 4. Cleanup
provisioning test env cleanup $ENV_ID

Validación Pre-Despliegue

Escenario: Validar taskserv antes de producción

# 1. Test con configuración de producción
provisioning test env single kubernetes \
  --cpu 4000 \
  --memory 8192 \
  --infra prod-cluster \
  --auto-start

# 2. Revisar resultados
provisioning test env status <env-id>

# 3. Si pasa, desplegar a producción
provisioning taskserv create kubernetes --infra prod-cluster

Test de Integración

Escenario: Validar stack completo

# Test server con stack de aplicación
provisioning test env server app-stack [nginx postgres redis] \
  --cpu 6000 \
  --memory 12288 \
  --auto-start \
  --auto-cleanup

# El sistema:
# 1. Resuelve dependencias automáticamente
# 2. Crea containers con recursos especificados
# 3. Configura red aislada
# 4. Ejecuta tests de integración
# 5. Limpia todo al terminar

Test de Clusters HA

Escenario: Validar cluster Kubernetes

# 1. Crear cluster 3-nodos
provisioning test topology load kubernetes_3node | \
  test env cluster kubernetes --auto-start

# 2. Obtener env-id
ENV_ID=$(provisioning test env list | grep kubernetes | awk '{print $1}')

# 3. Ver status del cluster
provisioning test env status $ENV_ID

# 4. Ejecutar tests específicos
provisioning test env run $ENV_ID --tests [cluster-health node-ready]

# 5. Logs si hay problemas
provisioning test env logs $ENV_ID

# 6. Cleanup
provisioning test env cleanup $ENV_ID

Troubleshooting de Producción

Escenario: Reproducir issue de producción

# 1. Crear entorno idéntico a producción
# Copiar config de prod a topology custom

# 2. Cargar y ejecutar
provisioning test topology load prod-replica | \
  test env cluster app --auto-start

# 3. Reproducir el issue

# 4. Debug con logs detallados
provisioning test env logs <env-id>

# 5. Fix y re-test

# 6. Cleanup
provisioning test env cleanup <env-id>

Integración CI/CD

GitLab CI

# .gitlab-ci.yml

stages:
  - test
  - deploy

variables:
  ORCHESTRATOR_URL: "http://orchestrator:9090"

# Test stage
test-taskservs:
  stage: test
  image: nushell:latest
  services:
    - docker:dind
  before_script:
    - cd provisioning/platform/orchestrator
    - ./scripts/start-orchestrator.nu --background
    - sleep 5  # Wait for orchestrator
  script:
    # Quick tests
    - provisioning test quick kubernetes
    - provisioning test quick postgres
    - provisioning test quick redis
    # Cluster test
    - provisioning test topology load kubernetes_3node | test env cluster kubernetes --auto-start --auto-cleanup
  after_script:
    # Cleanup any remaining environments
    - provisioning test env list | tail -n +2 | awk '{print $1}' | xargs -I {} provisioning test env cleanup {}

# Integration test
test-integration:
  stage: test
  script:
    - provisioning test env server app-stack [nginx postgres redis] --auto-start --auto-cleanup

# Deploy only if tests pass
deploy-production:
  stage: deploy
  script:
    - provisioning taskserv create kubernetes --infra production
  only:
    - main
  dependencies:
    - test-taskservs
    - test-integration

GitHub Actions

# .github/workflows/test.yml

name: Test Infrastructure

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test-taskservs:
    runs-on: ubuntu-latest

    services:
      docker:
        image: docker:dind

    steps:
      - uses: actions/checkout@v3

      - name: Setup Nushell
        run: |
          cargo install nu

      - name: Start Orchestrator
        run: |
          cd provisioning/platform/orchestrator
          cargo build --release
          ./target/release/provisioning-orchestrator &
          sleep 5
          curl http://localhost:9090/health

      - name: Run Quick Tests
        run: |
          provisioning test quick kubernetes
          provisioning test quick postgres
          provisioning test quick redis

      - name: Run Cluster Test
        run: |
          provisioning test topology load kubernetes_3node | \
            test env cluster kubernetes --auto-start --auto-cleanup

      - name: Cleanup
        if: always()
        run: |
          for env in $(provisioning test env list | tail -n +2 | awk '{print $1}'); do
            provisioning test env cleanup $env
          done

Jenkins Pipeline

// Jenkinsfile

pipeline {
    agent any

    environment {
        ORCHESTRATOR_URL = 'http://localhost:9090'
    }

    stages {
        stage('Setup') {
            steps {
                sh '''
                    cd provisioning/platform/orchestrator
                    ./scripts/start-orchestrator.nu --background
                    sleep 5
                '''
            }
        }

        stage('Quick Tests') {
            parallel {
                stage('Kubernetes') {
                    steps {
                        sh 'provisioning test quick kubernetes'
                    }
                }
                stage('PostgreSQL') {
                    steps {
                        sh 'provisioning test quick postgres'
                    }
                }
                stage('Redis') {
                    steps {
                        sh 'provisioning test quick redis'
                    }
                }
            }
        }

        stage('Integration Test') {
            steps {
                sh '''
                    provisioning test env server app-stack [nginx postgres redis] \
                      --auto-start --auto-cleanup
                '''
            }
        }

        stage('Cluster Test') {
            steps {
                sh '''
                    provisioning test topology load kubernetes_3node | \
                      test env cluster kubernetes --auto-start --auto-cleanup
                '''
            }
        }
    }

    post {
        always {
            sh '''
                # Cleanup all test environments
                provisioning test env list | tail -n +2 | awk '{print $1}' | \
                  xargs -I {} provisioning test env cleanup {}
            '''
        }
    }
}

Troubleshooting

Problemas Comunes

1. “Failed to connect to Docker”

Error:

Error: Failed to connect to Docker daemon

Solución:

# Verificar que Docker está corriendo
docker ps

# Si no funciona, iniciar Docker
# macOS
open -a Docker

# Linux
sudo systemctl start docker

# Verificar que tu usuario está en el grupo docker
groups | grep docker
sudo usermod -aG docker $USER
newgrp docker

2. “Connection refused (port 8080)”

Error:

Error: Connection refused

Solución:

# Verificar orquestador
curl http://localhost:9090/health

# Si no responde, iniciar
cd provisioning/platform/orchestrator
./scripts/start-orchestrator.nu --background

# Verificar logs
tail -f ./data/orchestrator.log

# Verificar que el puerto no está ocupado
lsof -i :9090

3. “Out of memory / resources”

Error:

Error: Cannot allocate memory

Solución:

# Verificar recursos disponibles
docker info | grep -E "CPUs|Total Memory"
docker stats --no-stream

# Limpiar containers antiguos
docker container prune -f

# Limpiar imágenes no usadas
docker image prune -a -f

# Limpiar todo el sistema
docker system prune -af --volumes

# Ajustar límites de Docker (Docker Desktop)
# Settings → Resources → Aumentar Memory/CPU

4. “Network already exists”

Error:

Error: Network test-net-xxx already exists

Solución:

# Listar redes
docker network ls | grep test

# Eliminar red específica
docker network rm test-net-xxx

# Eliminar todas las redes de test
docker network ls | grep test | awk '{print $1}' | xargs docker network rm

5. “Image pull failed”

Error:

Error: Failed to pull image ubuntu:22.04

Solución:

# Verificar conexión a internet
ping docker.io

# Pull manual
docker pull ubuntu:22.04

# Si persiste, usar mirror
# Editar /etc/docker/daemon.json
{
  "registry-mirrors": ["https://mirror.gcr.io"]
}

# Reiniciar Docker
sudo systemctl restart docker

6. “Environment not found”

Error:

Error: Environment abc-123 not found

Solución:

# Listar entornos activos
provisioning test env list

# Verificar logs del orquestador
tail -f provisioning/platform/orchestrator/data/orchestrator.log

# Reiniciar orquestador si es necesario
cd provisioning/platform/orchestrator
./scripts/start-orchestrator.nu --stop
./scripts/start-orchestrator.nu --background

Debug Avanzado

Ver logs de container específico

# 1. Obtener environment
provisioning test env get <env-id>

# 2. Copiar container_id del output

# 3. Ver logs del container
docker logs <container-id>

# 4. Ver logs en tiempo real
docker logs -f <container-id>

Ejecutar comandos dentro del container

# Obtener container ID
CONTAINER_ID=$(provisioning test env get <env-id> | jq -r '.containers[0].container_id')

# Entrar al container
docker exec -it $CONTAINER_ID bash

# O ejecutar comando directo
docker exec $CONTAINER_ID ps aux
docker exec $CONTAINER_ID cat /etc/os-release

Inspeccionar red

# Obtener network ID
NETWORK_ID=$(provisioning test env get <env-id> | jq -r '.network_id')

# Inspeccionar red
docker network inspect $NETWORK_ID

# Ver containers conectados
docker network inspect $NETWORK_ID | jq '.[0].Containers'

Verificar recursos del container

# Stats de un container
docker stats <container-id> --no-stream

# Stats de todos los containers de test
docker stats $(docker ps --filter "label=type=test_container" -q) --no-stream

Mejores Prácticas

1. Siempre usar Auto-Cleanup en CI/CD

# ✅ Bueno
provisioning test quick kubernetes

# ✅ Bueno
provisioning test env single postgres --auto-start --auto-cleanup

# ❌ Malo (deja basura si falla el pipeline)
provisioning test env single postgres --auto-start

2. Ajustar Recursos según Necesidad

# Development: recursos mínimos
provisioning test env single redis --cpu 500 --memory 512

# Integration: recursos medios
provisioning test env single postgres --cpu 2000 --memory 4096

# Production-like: recursos completos
provisioning test env single kubernetes --cpu 4000 --memory 8192

3. Usar Templates para Clusters

# ✅ Bueno: reutilizable, documentado
provisioning test topology load kubernetes_3node | test env cluster kubernetes

# ❌ Malo: configuración manual, propenso a errores
# Crear config manual cada vez

4. Nombrar Entornos Descriptivamente

# Al crear custom configs, usar nombres claros
{
  "type": "server_simulation",
  "server_name": "prod-db-replica-test",  # ✅ Descriptivo
  ...
}

5. Limpiar Regularmente

# Script de limpieza (añadir a cron)
#!/usr/bin/env nu

# Limpiar entornos viejos (>1 hora)
provisioning test env list |
  where created_at < (date now | date subtract 1hr) |
  each {|env| provisioning test env cleanup $env.id }

# Limpiar Docker
docker system prune -f

Referencia Rápida

Comandos Esenciales

# Quick test
provisioning test quick <taskserv>

# Single taskserv
provisioning test env single <taskserv> [--auto-start] [--auto-cleanup]

# Server simulation
provisioning test env server <name> [taskservs]

# Cluster from template
provisioning test topology load <template> | test env cluster <type>

# List & manage
provisioning test env list
provisioning test env status <id>
provisioning test env logs <id>
provisioning test env cleanup <id>

REST API

# Create
curl -X POST http://localhost:9090/test/environments/create \
  -H "Content-Type: application/json" \
  -d @config.json

# List
curl http://localhost:9090/test/environments

# Status
curl http://localhost:9090/test/environments/{id}

# Run tests
curl -X POST http://localhost:9090/test/environments/{id}/run

# Logs
curl http://localhost:9090/test/environments/{id}/logs

# Cleanup
curl -X DELETE http://localhost:9090/test/environments/{id}

Recursos Adicionales

  • Documentación de Arquitectura: docs/architecture/test-environment-architecture.md
  • API Reference: docs/api/test-environment-api.md
  • Topologías: provisioning/config/test-topologies.toml
  • Código Fuente: provisioning/platform/orchestrator/src/test_*.rs

Soporte

Issues: https://github.com/tu-org/provisioning/issues Documentación: provisioning help test Logs: provisioning/platform/orchestrator/data/orchestrator.log


Versión del documento: 1.0.0 Última actualización: 2025-10-06