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 ¶
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 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 ¶
FuncTask adapta uma funcao a interface Task, para os casos em que um tipo proprio seria cerimonia sem ganho.
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.
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) MustRegister ¶
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.
type Task ¶
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. |