arcadia tiene como objetivo desarrollar un framework Go basado en Flow-Based Programming (FBP), diseñado para la automatización de tareas en los ámbitos de SysOps, DevOps y DevSecOps. Buscamos crear una plataforma robusta, flexible y escalable que permita definir, componer y ejecutar flujos de trabajo complejos utilizando un enfoque modular.
- Proporcionar un núcleo FBP eficiente y concurrente implementado en Go.
- Facilitar la creación de componentes reutilizables para tareas comunes (ej. ejecución de comandos remotos, manipulación de archivos, interacciones con APIs, escaneo de seguridad, etc).
- Permitir la definición de flujos de trabajo mediante una representación clara y legible (potencialmente con herramientas visuales en el futuro).
- Asegurar la resiliencia y observabilidad de los flujos de trabajo automatizados.
- Fomentar la colaboración entre equipos al proporcionar un lenguaje común para describir procesos de automatización.
Flow-Based Programming (FBP) es un paradigma de programación que define las aplicaciones como redes de “cajas negras” (procesos) que intercambian datos a través de conexiones predefinidas (canales). En lugar de la secuenciación tradicional de instrucciones, FBP se centra en el flujo de información a través de la red de procesos.
Conceptos clave de FBP:
- Procesos: Unidades de computación independientes que realizan una función específica. Actúan como “cajas negras” con puertos de entrada y salida definidos. No tienen conocimiento directo de la lógica interna de otros procesos.
- Paquetes de Información (IPs): Chunks de datos inmutables que viajan a través de las conexiones entre procesos. Representan la información que está siendo procesada.
- Puertos: Puntos de conexión en los procesos a través de los cuales los IPs entran o salen. Los puertos tienen nombres y tipos definidos.
- Conexiones: Canales con capacidad limitada que conectan los puertos de salida de un proceso con los puertos de entrada de otro. Las conexiones son direccionales y aseguran la entrega ordenada de los IPs.
- Red (Network): La definición global de cómo los procesos están conectados entre sí a través de las conexiones. La lógica de la aplicación reside en la estructura de la red, no en la lógica interna de los procesos individuales.
En FBP, los procesos se ejecutan de forma concurrente, activándose cuando hay IPs disponibles en sus puertos de entrada y pausándose si los canales de salida están llenos. La red define el flujo de datos, desacoplando la lógica de negocio de la secuenciación del control.
FBP ofrece varias ventajas que lo hacen particularmente adecuado para la automatización en estos dominios:
- Modularidad y Reusabilidad: Las tareas de SysOps, DevOps y DevSecOps a menudo implican una serie de pasos discretos (ej. conectar a un servidor, ejecutar un script, parsear la salida, tomar una decisión). Con FBP, cada uno de estos pasos puede encapsularse en un componente (proceso) reutilizable. Estos componentes pueden combinarse de diferentes maneras para crear nuevos flujos de trabajo sin modificar el código interno de los componentes. Esto reduce la duplicación y acelera el desarrollo de nuevas automatizaciones.
- Desacoplamiento: Los procesos en FBP están inherentemente desacoplados. Solo interactúan a través de sus puertos y los IPs que intercambian. Esto significa que la implementación interna de un componente puede cambiar sin afectar a otros componentes en la red, siempre y cuando la interfaz (puertos) permanezca constante. Esto es crucial en entornos donde las herramientas y tecnologías subyacentes cambian con frecuencia.
- Claridad y Visualización: La naturaleza basada en red de FBP facilita la representación visual de los flujos de trabajo. Un diagrama FBP puede mostrar claramente la secuencia de operaciones y cómo los datos fluyen a través del sistema, lo que mejora la comprensión, el mantenimiento y la comunicación entre los miembros del equipo (incluyendo perfiles no técnicos).
- Concurrencia Natural: FBP promueve la concurrencia al permitir que los procesos se ejecuten de forma independiente. Esto es beneficioso para tareas de automatización que pueden implicar operaciones que esperan (ej. esperando la respuesta de una API o la finalización de un comando remoto), permitiendo que otros procesos continúen trabajando. La implementación en Go, con sus goroutines y canales, se alinea perfectamente con este paradigma.
- Flexibilidad y Adaptabilidad: Los flujos de trabajo de automatización a menudo necesitan ser adaptados para diferentes entornos o casos de uso. Con FBP, esto se logra reconfigurando la red de componentes existentes en lugar de escribir nuevo código monolítico. Esto permite una mayor agilidad y respuesta a los cambios en los requisitos operativos o de seguridad.
- Testing Simplificado: Dado que los componentes son unidades independientes con interfaces bien definidas, pueden ser probados de forma aislada. Además, las redes FBP pueden ser probadas inyectando datos de prueba en los puertos de entrada y verificando la salida en los puertos correspondientes.
En resumen, la adopción de FBP para la automatización de SysOps, DevOps y DevSecOps puede llevar a sistemas de automatización más mantenibles, flexibles, comprensibles y robustos, facilitando la construcción de pipelines complejos para despliegue, monitoreo, respuesta a incidentes, análisis de seguridad y más.
(Aquí se podría añadir información sobre el estado actual del proyecto, si está en fases iniciales, si ya hay componentes básicos implementados, etc. Este es un marcador de posición).
(Aquí se podría añadir información sobre cómo empezar a usar el framework, cómo instalarlo, cómo crear un primer flujo simple, etc. Este es un marcador de posición).
Para facilitar un desarrollo modular, mantenible y extensible, se propone organizar el código en paquetes separados por responsabilidad:
cmd/– Contendrá las aplicaciones ejecutables (command-line interface y servidor). Por ejemplo:cmd/arcadia/main.goes la entrada para la herramienta CLI (operaciones de ejecución de flujos, listar, etc.).cmd/arcadiad/main.goes la entrada para el modo servidor (daemon).
internal/– Módulos internos del framework (no expuestos como API pública), separados por dominios:internal/graph/: Definición de las estructuras fundamentales FBP – Nodo, Puerto, Conexión, Grafo – y lógica relacionada (construcción de grafos, validación). Por ejemplo, los archivosnode.go,graph.go,connection.go, con las definiciones y métodos asociados, se encuentran en este directorio.internal/engine/: Implementación delEnginey posiblemente subcomponentes de ejecución. Aquí viviránengine.go(orquestador principal) y subcomponentes comoscheduler.go(con la interfazSchedulery una o más implementaciones: local, etc.), así como gestión de ejecuciones en curso. Si en el futuro se añade clusterización, podría haber archivos comocluster.goo un subpaqueteengine/clusterpara la lógica de coordinación.internal/plugin/: Código relacionado con la carga de pluginsLua/WASM. Dentro de este existen dos subdirectorios:internal/plugin/lua/: integraciones específicas con Lua (por ejemplo, inicialización de la VM Lua, adaptación de tipos Go <-> Lua, definiciones de LuaNode).internal/plugin/wasm/: similar para WASM (inicializar runtime WASM comoWazero, cargar módulos, adaptadores de WasmNode). Alternativamente, si la lógica no es muy extensa,plugin_manager.gopodría residir eninternal/pluginy contener internamente el manejo para ambos.
internal/nodes/: Implementaciones de nodos built-in en Go para funciones comunes de SysOps. Por ejemplo,execnode.go(un nodo que ejecuta comandos del sistema),httpnode.go(un nodo que realiza peticiones HTTP),filternode.go(un nodo que filtra datos), etc.internal/trigger/: Implementaciones de distintos triggers. Contiene archivos comocron_trigger.go,http_trigger.go. Este paquete define la interfazTriggery contiene los triggers disponibles.internal/cluster/(Opcional): Módulo encargado de la comunicación entre instancias. Se definen mensajes o servicios para enviar trabajos al cluster, o el protocolo de comunicación y sincronización utilizado. Este paquete podría contener estructuras comoWorkerNode(agente remoto) y controladores para sincronización. En esta fase inicial este paquete permanecerá vacío.
pkg/– Las partes del framework expuestas como biblioteca para otros programas (embedding del motor o creación de flujos programáticamente).configs/– (Opcional) Archivos de configuración como definiciones de flujos o scripts Lua/WASM entregados con el framework.scripts/– (Opcional) Scripts de automatización (ej. para construir imágenes, instalar el servicio, etc.).docs/– Documentación del proyecto.plugins/– Este es un directorio en tiempo de ejecución (no de código) donde se ubican los plugins externos. Por ejemplo:plugins/lua/contendrá los archivos.luaque implementan nodos personalizados yplugins/wasm/los binarios.wasm. El framework (PluginManager) lee de aquí para cargar los módulos de extensión.
Con esta estructura se trata de separar conceptos: el núcleo FBP (grafo, nodos, conexiones) está aislado de los detalles de Engine/Triggers, y las integraciones de lenguajes (Lua/WASM) están encapsuladas en su módulo. De esta forma se pretende facilitar el mantenimiento y la extensión del framework.
(Aquí se añadiría información sobre cómo la gente puede contribuir al proyecto, guidelines, etc. Este es un marcador de posición).