workflow

package
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 6, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package workflow e o modelo de dominio de um fluxo e seu grafo.

O dominio nao sabe o que e YAML. A traducao do arquivo para estas structs vive em internal/application/workflow — assim o formato de arquivo pode mudar sem tocar as invariantes.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Edge

type Edge struct {
	From string
	To   string
}

Edge liga dois nos: From roda antes de To.

type Kind

type Kind string

Kind distingue como o grafo foi declarado. `chain` e acucar sintatico: o parser o converte em arestas antes de chegar aqui, entao o motor de execucao so conhece DAG. Um motor so, dois jeitos de escrever.

const (
	KindChain Kind = "chain"
	KindDAG   Kind = "dag"
)

type Node

type Node struct {
	ID     string
	Run    string
	Action string
	With   map[string]any

	// Image sobrescreve a do workflow. Vazio = herda.
	Image string

	// Resources dimensiona o pod deste passo. O ganho de separar por passo e
	// concreto: um fetcher em Go cabe em 64Mi enquanto o dbt ao lado pede 1Gi, e
	// numa imagem unica os dois pagariam o maior dos dois.
	Resources Resources

	// Shell decide como o comando entra no container. Nulo = com shell, que e o
	// que `run:` sugere ("python fetch.py"). Falso passa o argv direto, para
	// imagem distroless — onde `sh -c` falharia com "no such file or directory",
	// erro que nao diz nada sobre a causa.
	Shell *bool

	// Env sao variaveis de ambiente deste passo, com valor literal no arquivo.
	// Sobrescrevem as do workflow, nome a nome.
	//
	//	env:
	//	  BREVIS_LOG_LEVEL: info
	Env map[string]string

	// Secrets sao variaveis cujo VALOR nunca aparece no arquivo. A chave e o
	// nome da variavel; o valor e onde encontra-la, no formato `secret/chave`.
	//
	//	secrets:
	//	  GABRIEL_SESSION_COOKIE: gabriel-session/cookie
	//
	// Sao duas chaves e nao uma de proposito. Com uma so, o caminho mais curto
	// para fazer funcionar seria colar o segredo no YAML — e o YAML esta no
	// git. `env:` aceita literal, `secrets:` nao aceita.
	//
	// Onde a coordenada resolve depende do executor, e a assimetria e
	// deliberada:
	//
	//   Kubernetes  valueFrom.secretKeyRef{name: gabriel-session, key: cookie}
	//   local       a variavel de mesmo nome no ambiente do proprio motor,
	//               e ausente e ERRO — nao string vazia
	//
	// Em qualquer um dos dois o motor repassa sem ler: o valor nao entra em
	// log, nem no banco, nem no comando renderizado.
	Secrets map[string]string
}

Node e uma unidade de trabalho. Exatamente uma forma de execucao deve estar preenchida — `Run` (comando) ou `Action` (acao tipada com parametros).

func (Node) UsaShell

func (n Node) UsaShell() bool

UsaShell diz se o comando entra por `sh -c`.

type Param

type Param struct {
	Nome      string
	Tipo      TipoParam
	Padrao    string
	Descricao string

	// Enum restringe os valores aceitos. Vazio = qualquer um que passe no tipo.
	Enum []string

	// Pattern e uma expressao regular que o valor precisa casar. Existe para o
	// autor AMPLIAR o que o tipo `string` aceita por padrao — ver `seguro`.
	Pattern string
}

Param e um parametro de execucao: o que muda entre dois disparos do MESMO workflow sem editar o arquivo.

Era a maior distancia entre este motor e o Kestra/Leoflow. Sem params nao ha backfill (`load_full=true`) nem reprocessamento de janela, e oito dos 51 flows do repositorio de dados sequer podiam ser convertidos — o comando deles carrega `{{ inputs.start_date }}` e afins.

func (Param) Aceita

func (p Param) Aceita(valor string) error

Aceita valida um VALOR contra a declaracao.

func (Param) Validar

func (p Param) Validar() error

Validar confere a declaracao do param, nao o valor.

type Resources

type Resources struct {
	CPU         string
	Memory      string
	CPULimit    string
	MemoryLimit string
}

Resources sao pedidos e limites de um pod, no formato do Kubernetes ("200m", "1Gi"). Texto e nao numero de proposito: o formato e do Kubernetes, e converter para uma unidade nossa so criaria um segundo vocabulario para a mesma coisa.

func (Resources) ComPadrao

func (r Resources) ComPadrao(p Resources) Resources

ComPadrao preenche o que o passo nao declarou com o do workflow. Herdar campo a campo, e nao o bloco inteiro, permite um passo pedir so mais memoria sem perder a CPU do padrao.

func (Resources) Vazio

func (r Resources) Vazio() bool

Vazio diz se nada foi declarado — o pod entao sobe sem `resources`, herdando o LimitRange do namespace.

type TipoParam

type TipoParam string
const (
	ParamTexto   TipoParam = "string"
	ParamBool    TipoParam = "boolean"
	ParamInteiro TipoParam = "integer"
)

type Workflow

type Workflow struct {
	Slug     string
	Name     string
	Kind     Kind
	Schedule string // cron; vazio = so disparo manual

	// Tags classificam o workflow para busca e filtro na UI. Sao rotulos livres
	// do autor do YAML, nao dominio: nada no motor depende delas.
	Tags []string

	// Image e o runtime padrao dos passos. Em Kubernetes CADA passo vira um pod,
	// e a imagem e o que define o que aquele pod sabe fazer: um passo de dbt
	// sobe a imagem de dbt, um binario Go sobe uma imagem de 10 MB. Declarar
	// aqui evita repetir a mesma linha em dez passos; o passo sobrescreve quando
	// precisa de outro runtime.
	Image string

	// Resources e o pedido padrao de CPU e memoria, pela mesma razao.
	Resources Resources

	// Env sao variaveis de ambiente que todo passo recebe. Valor literal, e
	// por isso NAO servem para segredo: o YAML esta no git.
	Env map[string]string

	// Secrets sao variaveis cujo valor o motor nao ve nem guarda. Ver Node.
	Secrets map[string]string

	// Params sao os valores que mudam entre dois disparos do mesmo workflow —
	// `load_full`, uma janela de datas, um limite. Ver param.go.
	Params []Param

	// MaxAtivos limita execucoes simultaneas DESTE workflow. Zero = sem limite.
	//
	// E diferente do teto global de passos: aquele protege o CLUSTER, este
	// protege o DADO. Um `*/15` que leva 20 minutos se sobrepoe a si mesmo, e
	// dois `dbt build` no mesmo modelo ao mesmo tempo disputam a mesma tabela.
	MaxAtivos int

	Nodes []Node
	Edges []Edge
}

Workflow e a definicao de um fluxo. Imutavel depois de publicado: a secao 22 do plano exige que uma Run guarde o snapshot da versao que a originou.

func (Workflow) EnvDe

func (w Workflow) EnvDe(n Node) map[string]string

EnvDe resolve as variaveis literais efetivas de um passo: as do workflow, com as do passo por cima.

func (Workflow) ImagemDe

func (w Workflow) ImagemDe(n Node) string

ImagemDe resolve a imagem efetiva de um passo.

func (Workflow) RecursosDe

func (w Workflow) RecursosDe(n Node) Resources

RecursosDe resolve os recursos efetivos de um passo.

func (Workflow) Resolver

func (w Workflow) Resolver(informados map[string]string) (map[string]string, error)

Resolver mistura os valores informados com os padroes e valida tudo.

Chave desconhecida e ERRO, nao silencio: `--param lod_full=true` com typo rodaria o workflow com o padrao e ninguem perceberia que o backfill nao aconteceu.

func (Workflow) SecretsDe

func (w Workflow) SecretsDe(n Node) map[string]string

SecretsDe resolve os segredos efetivos de um passo, pela mesma regra.

func (Workflow) Validate

func (w Workflow) Validate() error

Validate aplica as invariantes que a secao 5 do plano exige antes de salvar. A ordem importa: IDs duplicados e dependencias ausentes sao verificados antes do ciclo, porque um grafo com aresta pendurada nao pode ser percorrido.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL