Saltar a contenido

Referencia del Schema

Schema Zod completo de pctl.yaml. Definido en src/lib/schema.ts.

Raiz

Campo Tipo Zod Obligatorio Default Descripcion
name z.string() Si - Nombre del stack. Prefijo para labels y nombres de recursos
resolver z.array(z.string()) No [] Modulos de resolvers personalizados. Se cargan despues de env, ssm, self, cfn
plugin z.array(z.string()) No [] Modulos de plugins. Se ejecutan en orden en el pipeline
custom z.record(z.string(), z.any()) No {} Almacen libre clave/valor. Accesible via ${self:custom.*}
services z.record(z.string(), ServiceSchema) Si - Mapa de servicios

Service

Campo Tipo Zod Obligatorio Default Descripcion
image z.string() Si - Ruta a Dockerfile (./) o nombre de imagen pre-construida
registry z.union([z.string(), RegistryObject]) No - Registry para push/pull. String para URL, objeto para URL con auth
command z.string() No - Sobreescribe el CMD del Dockerfile
env z.record(z.string(), z.string()) No - Variables de entorno para el contenedor
scale ScaleSchema Si - Escalado y recursos de computo
ports z.array(z.union([z.number(), z.string()])) No - Puertos a exponer
health HealthSchema No - Configuracion del probe de salud
volumes z.array(VolumeSchema) No - Puntos de montaje en el contenedor
provider ProviderSchema Si - Destino de despliegue

Registry (objeto)

Campo Tipo Zod Obligatorio Descripcion
url z.string() Si URL del registry
username z.string() No Usuario para autenticacion
password z.string() No Contrasena o token

Scale

Campo Tipo Zod Obligatorio Descripcion
replica z.union([z.number().int().min(0), z.tuple([z.number().int().min(0), z.number().int().min(1)])]) Si Replicas fijas o rango [min, max] para HPA
cpu z.string() No Limite de CPU (ej. 256m, 1)
memory z.string() No Limite de memoria (ej. 512Mi, 1Gi)

Health

Campo Tipo Zod Obligatorio Default Descripcion
interval z.number().int().min(1) Si - Segundos entre checks
command z.string() Si - Comando del health check
retries z.number().int().min(1) No 3 Fallos consecutivos antes de actuar
onfailure z.enum(["restart", "stop"]) No "restart" Accion ante fallo

Volume

Campo Tipo Zod Obligatorio Descripcion
path z.string() Si Ruta de montaje dentro del contenedor

Provider

Campo Tipo Zod Obligatorio Default Descripcion
name z.string() Si - Identificador del driver (aws, gcp, docker)
options z.record(z.string(), z.any()) No {} Configuracion especifica del proveedor

Validacion adicional

Ademas del schema Zod, el plugin validate verifica:

  • Si scale.replica es un array [min, max], min no puede ser mayor que max
Error: Service "api": scale.replica min (5) cannot exceed max (3)

Schema como codigo

import { z } from 'zod';

export default z.object({
    name: z.string(),
    resolver: z.array(z.string()).default([]),
    plugin: z.array(z.string()).default([]),
    custom: z.record(z.string(), z.any()).default({}),
    services: z.record(z.string(), z.object({
        image: z.string(),
        registry: z.union([
            z.string(),
            z.object({
                url: z.string(),
                username: z.string().optional(),
                password: z.string().optional(),
            }),
        ]).optional(),
        command: z.string().optional(),
        env: z.record(z.string(), z.string()).optional(),
        scale: z.object({
            replica: z.union([
                z.number().int().min(0),
                z.tuple([z.number().int().min(0), z.number().int().min(1)])
            ]),
            cpu: z.string().optional(),
            memory: z.string().optional(),
        }),
        ports: z.array(z.union([z.number(), z.string()])).optional(),
        health: z.object({
            interval: z.number().int().min(1),
            command: z.string(),
            retries: z.number().int().min(1).default(3),
            onfailure: z.enum(['restart', 'stop']).default('restart'),
        }).optional(),
        volumes: z.array(z.object({
            path: z.string(),
        })).optional(),
        provider: z.object({
            name: z.string(),
            options: z.record(z.string(), z.any()).default({}),
        }),
    })),
});