execution

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: 7 Imported by: 0

Documentation

Overview

Package execution define o contrato de execucao de tasks.

A interface e a da secao 13 do plano, com uma diferenca: `Execute` devolve um canal de eventos em vez de bloquear. Um pod que roda por vinte minutos precisa reportar progresso antes de terminar, e o mesmo vale para um processo local que escreve em stdout.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Renderizar

func Renderizar(comando string, params map[string]string) (string, error)

Renderizar substitui os params na linha de comando de um passo.

`text/template` da stdlib, com `missingkey=error`: um param com erro de digitacao no YAML falha AQUI, com o nome do que faltou, em vez de virar string vazia e produzir um comando silenciosamente errado — `--select ` sem alvo, ou `--date` sem data.

So o comando e renderizado. `image:` NAO e templatavel de proposito: quem dispara um run escolheria a imagem que o pod roda, o que e escolher o codigo que executa.

Types

type Event

type Event struct {
	Kind     EventKind
	NodeID   string
	Message  string
	Stream   string // "stdout" | "stderr"
	ExitCode int
	Err      error
}

Event e uma ocorrencia durante a execucao. `Stream` distingue stdout de stderr: juntar os dois perde a informacao de onde a mensagem veio, e foi exatamente isso que fez o resumo final do dbt aparecer como erro no Leoflow.

type EventKind

type EventKind string

EventKind classifica o que o executor reporta.

const (
	EventStarted   EventKind = "started"
	EventLog       EventKind = "log"
	EventSucceeded EventKind = "succeeded"
	EventFailed    EventKind = "failed"
)

type Executor

type Executor interface {
	Name() string
	Execute(ctx context.Context, t TaskExec) (<-chan Event, error)
	Cancel(ctx context.Context, execID string) error
}

Executor roda uma task e reporta o que acontece.

type FuncTask

type FuncTask struct {
	Nome string
	Fn   func(ctx context.Context, in Input) error
}

FuncTask adapta uma funcao a interface Task, para os casos em que um tipo proprio seria cerimonia sem ganho.

func (FuncTask) Name

func (f FuncTask) Name() string

func (FuncTask) Run

func (f FuncTask) Run(ctx context.Context, in Input) error

type Input

type Input struct {
	NodeID string
	With   map[string]any

	// Log emite uma linha para o fluxo de eventos. Existe para que a task
	// reporte progresso sem conhecer canais nem o executor.
	Log func(msg string)
}

Input e o que a task recebe.

func (Input) Texto

func (i Input) Texto(chave string) (string, error)

Texto le um parametro obrigatorio de `with`. Conveniencia com erro util: uma task que faz a asserção de tipo na mao repete a mesma mensagem ruim.

type Registry

type Registry struct {
	// contains filtered or unexported fields
}

Registry guarda as tasks disponiveis. Seguro para uso concorrente porque o dispatcher consulta de varias goroutines.

func NewRegistry

func NewRegistry() *Registry

func (*Registry) Get

func (r *Registry) Get(nome string) (Task, bool)

Get busca uma task pelo nome.

func (*Registry) MustRegister

func (r *Registry) MustRegister(t Task)

MustRegister registra e entra em panico se falhar.

Para uso em `init()` ou no boot: um registro invalido e erro de programacao, e falhar no start e melhor que descobrir na primeira execucao agendada.

func (*Registry) Nomes

func (r *Registry) Nomes() []string

Nomes lista o que esta registrado, ordenado. Serve ao erro de task desconhecida: dizer o que existe economiza uma ida a documentacao.

func (*Registry) Register

func (r *Registry) Register(t Task) error

Register adiciona uma task.

Recusa nome duplicado em vez de sobrescrever: registro silenciosamente substituido e um bug que so aparece em producao, quando a task errada roda.

type Task

type Task interface {
	Name() string
	Run(ctx context.Context, in Input) error
}

Task e uma unidade de trabalho escrita em Go, compilada junto com o binario.

A secao 14 do plano e categorica: "Nao executar codigo arbitrario recebido pela API. Tasks locais devem ser compiladas e registradas no runtime". O registry existe para tornar isso estrutural — o YAML so pode citar o NOME de algo que ja esta no binario, nunca fornecer o codigo.

type TaskExec

type TaskExec struct {
	ExecutionID string
	NodeID      string

	// Workflow, RunID e Tentativa nao mudam a execucao — identificam-na. Em
	// Kubernetes viram rotulos do pod, e sao eles que permitem achar "os pods
	// daquela run" sem procurar por nome.
	Workflow string
	RunID    string

	// Tentativa do PASSO, dentro de uma execucao do run.
	Tentativa int

	// TentativaDoRun e a do RUN, contada pelo dispatcher. As duas entram no
	// nome do pod: sem a segunda, um retry do dispatcher recria o run do zero
	// (passo na tentativa 0 de novo) e reencontra o pod anterior.
	TentativaDoRun int

	Command string // shell, para o ProcessExecutor
	Action  string // nome no registry, para o GoExecutor
	With    map[string]any

	// Image e o runtime deste passo. Vazia no modo local (o comando roda na
	// propria instancia); obrigatoria em Kubernetes, onde ela E o pod.
	Image string

	// Shell decide entre `sh -c "linha"` e argv direto. Importa para imagem
	// distroless, que nao tem shell nenhum.
	Shell bool

	// Recursos do pod, no formato do Kubernetes. Ignorados no modo local, onde
	// o limite de um processo e o da maquina.
	CPU, Memoria       string
	CPUMax, MemoriaMax string

	WorkDir string
	Env     map[string]string

	// Secrets sao variaveis cujo valor o motor NAO carrega: o mapa e
	// nome-da-variavel -> `nome-do-secret/chave`, e quem resolve e o executor.
	//
	// Ficam separadas de Env por isso mesmo. Se o valor viesse resolvido aqui,
	// ele passaria pelo dispatcher, pelo log de montagem da task e por
	// qualquer dump de TaskExec que alguem escrever depois.
	Secrets map[string]string

	// Timeout zero significa sem limite. A secao 37 pede timeout na PHASE 3;
	// deixar o padrao aberto e deliberado — impor um limite arbitrario mataria
	// tasks legitimamente longas.
	Timeout time.Duration
}

TaskExec e o que se pede para executar. Deliberadamente pobre: o executor nao conhece workflow, dependencia nem agenda.

`Command` e `Action` sao exclusivos: o primeiro vai para o ProcessExecutor, o segundo resolve no registry de tasks Go. Quem escolhe o executor e o runner, nao o executor.

Directories

Path Synopsis
Package kubernetes executa cada passo de um workflow como um POD proprio.
Package kubernetes executa cada passo de um workflow como um POD proprio.
Package local implementa a execucao de processos no host.
Package local implementa a execucao de processos no host.

Jump to

Keyboard shortcuts

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