Esquema de recetas
Las recetas OpenFactory usan JSON snake_case. El formato canónico tiene un sobre de nivel superior pequeño, un objeto os para configuración del sistema operativo y un array scenarios para verificación post-compilación.
La validación prueba que los campos reconocidos tienen formas aceptables. No prueba que exista todo paquete, que todo comportamiento solicitado estuviera representado ni que la imagen y las pruebas tendrán éxito. Los campos desconocidos pueden ignorarse por compatibilidad hacia atrás; inspecciona siempre la receta normalizada devuelta por el producto.
Sobre canónico
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Small Debian image with explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {},
"os": {},
"scenarios": [],
"publish_to": ["local"]
}No uses campos camelCase como baseImage o startupScripts. El validador de compatibilidad acepta algunas recetas planas antiguas, pero la salida normalizada anida campos OS bajo os. Las integraciones nuevas deben enviar el formato canónico.
Campos de nivel superior
| Field | Type | Required/default | Meaning |
|---|---|---|---|
name | string | Required; 3–100 characters | Stable internal recipe name |
display_name | string or null | Optional; 1–100 characters | Human-facing name |
description | string | "" | Intended outcome and boundary |
base_image | string | debian-trixie | Distribution/build target; use the current console list |
task | string or null | Optional | Operational goal |
executor | string or null | Optional | Technology expected to perform the task |
use_case | string | General | Primary use case |
hardware | object | Defaults shown below | Deployment requirements |
os | object | Empty/default object | OS packages, users, services, security, desktop, installer, and scripts |
scenarios | array | [] | Test topologies and objectives |
publish_to | string array | ["local"] | Requested output destinations |
delivery | object | {} | Additional declared delivery configuration |
community | boolean | false | Request community-marketplace visibility; publication policy still applies |
Existen campos avanzados específicos del destino para remasterización source-ISO, payloads guest Proxmox, procedencia de política e integraciones de entrega. Usa el editor o contrato API de la versión desplegada en lugar de copiar un ejemplo antiguo.
Hardware
{
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"gpu": null,
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
}
}platform es pc, phone o raspberry_pi; los valores de dispositivo admitidos son específicos del destino. architecture es x86_64 o aarch64. Los valores GPU nombran un vendor o combinación admitida. Son requisitos declarados, no prueba de que una imagen resultante se probó en hardware físico coincidente.
Objeto OS
Los campos habituales de os son:
| Field | Type | Purpose |
|---|---|---|
features | string array | Registered feature modules |
packages | string array | Native packages to request |
excluded_packages | string array | Packages that must remain absent after feature expansion |
custom_packages | array | Source repositories to package through the supported build path |
package_overrides | array | Explicit add, remove, or replace operations |
extra_repos | string array | Additional repositories; trust and key handling still require review |
services | array | Named service enablement and configuration |
users | array | Image-local accounts and groups |
security | object | Declared hardening, encryption, audit, SELinux, and fail2ban choices |
networking | object | Interface and network intent |
desktop_settings | object | Desktop appearance and behavior |
branding | object | Distribution identity and assets |
runtime | object | Init/service/package-manager identity |
boot | object | Kernel arguments and GRUB choices |
installer | object | Install-to-disk configuration |
persistence | object | Live persistence and zone policy |
integrity | object | Requested dm-verity, Secure Boot, and IMA/EVM settings |
file_attachments | array | Previously uploaded files identified by file_id |
startup_scripts | array | Bounded systemd one-shot scripts |
time_zone | string or null | Image time-zone setting |
La presencia de un campo de integridad o seguridad es intención de configuración. No es evidencia de que el mecanismo se produjo, se aplicó en runtime o se calificó para un régimen de cumplimiento. Exige evidencia de compilación y prueba acorde.
Users
{
"os": {
"users": [
{
"username": "deploy",
"full_name": "Deployment Operator",
"groups": ["sudo"],
"shell": "/bin/bash"
}
]
}
}Los nombres de usuario y grupo están limitados a caracteres seguros de cuenta Linux y longitud. Dejar password sin definir crea una cuenta bloqueada por contraseña para flujos solo con clave o credenciales en tiempo de despliegue. Evita credenciales en texto plano en recetas guardadas.
Services
{
"os": {
"services": [
{
"name": "ssh",
"enabled": true,
"config": {
"port": 22,
"disable_password_auth": true
}
}
]
}
}config es específico del servicio. Una clave sintácticamente válida puede ignorarse aún por un generador que no la implementa. Verifica la receta normalizada, configuración generada y comportamiento del guest.
Security and Installer
{
"os": {
"security": {
"hardening_level": "standard",
"disk_encryption": false,
"audit_logging": true,
"selinux": false,
"fail2ban": true
},
"installer": {
"enabled": false,
"type": "calamares",
"desktop_launcher": true,
"bootloader": "grub",
"delivery": [],
"user_setup": "build_time"
}
}
}Los tipos de instalador dependen del destino (calamares, anaconda o elster-mobile). Habilitar un instalador debe ir seguido de una prueba de instalación en disco desechable; un icono en un escritorio en vivo no prueba que la instalación funcione.
Startup Scripts
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local marker after networking is available.",
"command": "install -m 0644 /dev/null /var/lib/example-ready",
"packages": [],
"run_as": "root",
"after": "network.target"
}
]
}
}Se aceptan como máximo 32 scripts de arranque. Los comandos deben ser no vacíos y no pueden contener bytes NUL. Trátalos como código shell con capacidad root salvo que run_as indique lo contrario; revisa idempotencia, comillas, fallo de red y exposición de secretos.
Scenarios and Assertions
{
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"],
"custom_tests": [
{
"description": "Confirm SSH is enabled on the configured port.",
"assertions": [
{
"type": "service_enabled",
"description": "The SSH service starts at boot.",
"params": {"service": "ssh"}
},
{
"type": "port_listening",
"description": "The guest listens on TCP port 22.",
"params": {"port": 22}
}
]
}
]
}
]
}Un escenario también puede definir topology con VM y redes, pruebas en formato benchmark y ajustes CIS. Una topología omitida usa por defecto la ruta habitual de una sola VM. Las aserciones necesitan descripción legible y params específicos del tipo. Los tipos de aserción desconocidos pueden sobrevivir al parseo del esquema; confirma que el runner los admite antes de tratarlos como evidencia.
Complete Minimal Example
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Debian image with SSH, curl, and explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
},
"os": {
"features": ["ssh"],
"packages": ["curl"],
"users": [
{
"username": "deploy",
"groups": ["sudo"],
"shell": "/bin/bash"
}
],
"services": [
{
"name": "ssh",
"enabled": true,
"config": {"port": 22, "disable_password_auth": true}
}
],
"security": {
"hardening_level": "standard",
"audit_logging": true
},
"installer": {"enabled": false}
},
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"]
}
],
"publish_to": ["local"]
}Validation Workflow
- Valida el JSON mediante el editor de recetas actual, API o herramienta MCP
validate_recipe. - Compara la receta normalizada devuelta con la solicitud original.
- Trata campos desconocidos descartados como defecto de la receta, no como configuración exitosa.
- Compila solo después de que los requisitos explícitos estén representados.
- Inspecciona evidencia generada y ejecuta aserciones contra el guest resultante.
Consulta Tu primera compilación para orientación de recuperación ante fallos y descarga.