takod

package
v0.9.1 Latest Latest
Warning

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

Go to latest
Published: Jul 11, 2026 License: MIT Imports: 41 Imported by: 0

Documentation

Index

Constants

View Source
const (
	HealthStateHealthy   = "healthy"
	HealthStateStarting  = "starting"
	HealthStateUnhealthy = "unhealthy"
)

Docker health-check states surfaced in actual state and status rows.

View Source
const (
	BackupDir        = "/var/lib/tako/backups"
	DefaultRetention = 7
)
View Source
const (
	BackupStorageProviderS3           = "s3"
	BackupStorageProviderR2           = "r2"
	BackupStorageProviderS3Compatible = "s3-compatible"
)
View Source
const (
	ExecModeAttach = "attach"
	ExecModeOneOff = "oneoff"
)

Exec modes: attach runs the command inside a running replica via `docker exec`; oneoff runs it in a fresh `docker run --rm` container from the service's current image.

View Source
const (
	JobRunStatusSucceeded = "succeeded"
	JobRunStatusFailed    = "failed"
	JobRunStatusTimeout   = "timeout"
	JobRunStatusSkipped   = "skipped"
)

Job run statuses.

View Source
const (
	JobTriggerSchedule = "schedule"
	JobTriggerManual   = "manual"
)

Job run triggers.

View Source
const CapabilityContainerArgvV1 = "container.argv-v1"

CapabilityContainerArgvV1 means reconcile and job payloads preserve the container command/entrypoint argv fields introduced with config exec form.

View Source
const CapabilityContainerRuntimeControlsV1 = "container.runtime-controls-v1"

CapabilityContainerRuntimeControlsV1 covers user/workdir/stop/init/hosts, ulimits, and shm-size fields on service and job payloads.

View Source
const CapabilityExecOneOffControlsV1 = "exec.oneoff-controls-v1"

CapabilityExecOneOffControlsV1 covers pull auth, entrypoint, labels, and runtime controls on deploy-time one-off exec requests.

View Source
const CapabilityImageBuildOptionsV1 = "image.build-options-v1"

CapabilityImageBuildOptionsV1 means the streamed image builder consumes buildArgs and target from the request preamble.

View Source
const CapabilityServiceFilesV1 = "service.files-v1"

CapabilityServiceFilesV1 means reconcile, jobs, and one-off execution can atomically publish request-scoped operator file bundles and bind mount them.

View Source
const DefaultBuildCacheKeepStorage = "20GB"
View Source
const (
	DefaultBuildCachePruneInterval = 24 * time.Hour
)
View Source
const DefaultServiceFilesRoot = "/var/lib/tako/files"
View Source
const ExecContainerMarker = "__TAKO_EXEC_CONTAINER__:"

ExecContainerMarker precedes the resolved-container frame emitted at the start of an exec stream, on its own line.

View Source
const ExecExitMarker = "__TAKO_EXEC_EXIT__:"

ExecExitMarker precedes the terminal frame of an exec stream, on its own line, carrying the remote command's exit code.

View Source
const (
	PortAllocationKindMeshUpstream = "mesh-upstream"
)
View Source
const RegistryAuthFailedMarker = "registry authentication failed"

RegistryAuthFailedMarker prefixes auth-classified docker failures so the CLI can raise a typed error distinct from image-not-found.

Variables

This section is empty.

Functions

func CheckServiceFiles added in v0.9.0

func CheckServiceFiles(request ServiceFilesCheckRequest) error

func CleanupBackupObjects added in v0.5.4

func CleanupBackupObjects(ctx context.Context, storage BackupStorageConfig, retention BackupObjectRetention) error

func DeleteVolumeBackup

func DeleteVolumeBackup(ctx context.Context, req BackupRequest) error

func ExportImage

func ExportImage(ctx context.Context, image string, w io.Writer) error

func MergeHealthStates added in v0.9.1

func MergeHealthStates(existing string, incoming string) string

MergeHealthStates aggregates two health-check states with worst-wins semantics: unhealthy > starting > healthy > unknown (empty).

func ParseContainerHealth added in v0.9.1

func ParseContainerHealth(dockerStatus string) string

ParseContainerHealth extracts the docker health-check state from a `docker ps` status column value such as "Up 5 minutes (healthy)". Containers without a health check report no parenthesized state and yield the empty string.

func PublishServiceFiles added in v0.9.0

func PublishServiceFiles(ctx context.Context, request ServiceFilesRequest) error

func ReadMeshStatus

func ReadMeshStatus(ctx context.Context, interfaceName string) (*mesh.Status, error)

func RefreshActualStateDocuments

func RefreshActualStateDocuments(ctx context.Context, dataDir string, node string) (int, error)

func ReleaseProjectPortAllocations

func ReleaseProjectPortAllocations(ctx context.Context, dataDir string, project string, environment string) error

func ReleaseServicePortAllocations

func ReleaseServicePortAllocations(ctx context.Context, dataDir string, project string, environment string, service string) error

func ReleaseServicePortAllocationsExceptRevision added in v0.5.4

func ReleaseServicePortAllocationsExceptRevision(ctx context.Context, dataDir string, project string, environment string, service string, keepRevision string) error

func RestoreVolumeBackup

func RestoreVolumeBackup(ctx context.Context, req BackupRequest) error

func RunExecStream added in v0.8.1

func RunExecStream(ctx context.Context, req ExecRequest, reader io.Reader, writer io.Writer) error

RunExecStream runs one interactive (optionally PTY-backed) exec session over an upgraded frame stream: container frame first, output frames until the process ends, then a terminal exit frame. It handles stdin/resize frames from the client, enforces absolute and idle timeouts, and cleans up the docker process (and oneoff container) when the client disconnects.

func ServiceFileBundlePath added in v0.9.0

func ServiceFileBundlePath(project, environment, service, setID, bundle string) string

func StreamExec added in v0.8.0

func StreamExec(ctx context.Context, req ExecRequest, writer io.Writer) error

StreamExec runs the requested command and streams its combined output to writer, followed by a terminal ExecExitMarker line with the exit code. It returns an error only for failures before any output is streamed (validation, container/image resolution); run-phase failures surface in the stream and the exit marker instead.

func StreamProxyAccessLogs

func StreamProxyAccessLogs(ctx context.Context, tail int, follow bool, writer io.Writer) error

func StreamServiceLogs

func StreamServiceLogs(ctx context.Context, req LogsRequest, writer io.Writer) error

func ValidateBackupStorage added in v0.5.4

func ValidateBackupStorage(storage BackupStorageConfig) error

Types

type ActualRefreshTarget

type ActualRefreshTarget struct {
	Project     string
	Environment string
}

func ListActualRefreshTargets

func ListActualRefreshTargets(dataDir string) ([]ActualRefreshTarget, error)

type ActualService

type ActualService struct {
	Name              string            `json:"name"`
	Image             string            `json:"image,omitempty"`
	RevisionImages    map[string]string `json:"revisionImages,omitempty"`
	Replicas          int               `json:"replicas"`
	Containers        []string          `json:"containers,omitempty"`
	ConfigHash        string            `json:"configHash,omitempty"`
	RuntimeID         string            `json:"runtimeId,omitempty"`
	Persistent        bool              `json:"persistent,omitempty"`
	CurrentRevision   string            `json:"currentRevision,omitempty"`
	PreviousRevision  string            `json:"previousRevision,omitempty"`
	WarmingRevisions  []string          `json:"warmingRevisions,omitempty"`
	DeployStrategy    string            `json:"deployStrategy,omitempty"`
	ActiveContainers  []string          `json:"activeContainers,omitempty"`
	WarmingContainers []string          `json:"warmingContainers,omitempty"`
	// Health aggregates the docker health-check state of the service's
	// active containers (worst wins: unhealthy > starting > healthy).
	// Empty when no active container defines a health check, or when the
	// reporting node agent predates health capture.
	Health string `json:"health,omitempty"`
}

type ActualStateResponse

type ActualStateResponse struct {
	Project     string                    `json:"project"`
	Environment string                    `json:"environment"`
	Services    map[string]*ActualService `json:"services"`
	// Jobs carries the node's scheduled jobs: kind:job services have no
	// long-running containers, so their actual state is the cron schedule.
	Jobs map[string]*JobStatus `json:"jobs,omitempty"`
}

func GatherActualState

func GatherActualState(ctx context.Context, project string, environment string) (*ActualStateResponse, error)

func ParseActualState

func ParseActualState(project string, environment string, dockerPSOutput string) *ActualStateResponse

type BackupCleanupResponse

type BackupCleanupResponse struct {
	Deleted int `json:"deleted"`
}

func CleanupOldBackups

func CleanupOldBackups(ctx context.Context, req BackupRequest) (*BackupCleanupResponse, error)

type BackupInfo

type BackupInfo struct {
	ID          string            `json:"id"`
	Service     string            `json:"service,omitempty"`
	Volume      string            `json:"volume"`
	Size        int64             `json:"size"`
	CreatedAt   time.Time         `json:"createdAt"`
	Path        string            `json:"path"`
	Compression string            `json:"compression"`
	Remote      *BackupRemoteInfo `json:"remote,omitempty"`
	Warnings    []string          `json:"warnings,omitempty"`
}

func CreateVolumeBackup

func CreateVolumeBackup(ctx context.Context, req BackupRequest) (*BackupInfo, error)

type BackupListResponse

type BackupListResponse struct {
	Backups []BackupInfo `json:"backups"`
}

func ListVolumeBackups

func ListVolumeBackups(ctx context.Context, req BackupRequest) (*BackupListResponse, error)

type BackupObject added in v0.5.4

type BackupObject struct {
	Project     string
	Environment string
	Volume      string
	BackupID    string
	Path        string
	CreatedAt   time.Time
}

type BackupObjectRetention added in v0.5.4

type BackupObjectRetention struct {
	Project       string
	Environment   string
	Volume        string
	RetentionDays int
}

type BackupRemoteInfo added in v0.5.4

type BackupRemoteInfo struct {
	Provider string `json:"provider"`
	Bucket   string `json:"bucket"`
	Key      string `json:"key"`
	Endpoint string `json:"endpoint,omitempty"`
}

func UploadBackupObject added in v0.5.4

func UploadBackupObject(ctx context.Context, storage BackupStorageConfig, object BackupObject) (*BackupRemoteInfo, error)

type BackupRequest

type BackupRequest struct {
	Project        string               `json:"project"`
	Environment    string               `json:"environment"`
	Volume         string               `json:"volume,omitempty"`
	DockerVolume   string               `json:"dockerVolume,omitempty"`
	ExternalVolume bool                 `json:"externalVolume,omitempty"`
	BackupID       string               `json:"backupId,omitempty"`
	RetentionDays  int                  `json:"retentionDays,omitempty"`
	Storage        *BackupStorageConfig `json:"storage,omitempty"`
}

type BackupScheduleRequest added in v0.5.4

type BackupScheduleRequest struct {
	Project       string                 `json:"project"`
	Environment   string                 `json:"environment"`
	Service       string                 `json:"service"`
	Schedule      string                 `json:"schedule"`
	RetentionDays int                    `json:"retentionDays,omitempty"`
	Volumes       []BackupScheduleVolume `json:"volumes"`
	Storage       *BackupStorageConfig   `json:"storage,omitempty"`
}

type BackupScheduleResponse added in v0.5.4

type BackupScheduleResponse struct {
	Project     string    `json:"project"`
	Environment string    `json:"environment"`
	Service     string    `json:"service"`
	Scheduled   bool      `json:"scheduled"`
	UpdatedAt   time.Time `json:"updatedAt"`
}

type BackupScheduleVolume added in v0.5.4

type BackupScheduleVolume struct {
	Volume         string `json:"volume"`
	DockerVolume   string `json:"dockerVolume"`
	ExternalVolume bool   `json:"externalVolume,omitempty"`
}

type BackupScheduler added in v0.5.4

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

func NewBackupScheduler added in v0.5.4

func NewBackupScheduler(dataDir string) *BackupScheduler

func (*BackupScheduler) Delete added in v0.5.4

func (s *BackupScheduler) Delete(ctx context.Context, project string, environment string, service string) (*BackupScheduleResponse, error)

func (*BackupScheduler) Run added in v0.5.4

func (s *BackupScheduler) Run(ctx context.Context)

func (*BackupScheduler) Upsert added in v0.5.4

type BackupStorageConfig added in v0.5.4

type BackupStorageConfig struct {
	Provider        string `json:"provider,omitempty"`
	Bucket          string `json:"bucket,omitempty"`
	Region          string `json:"region,omitempty"`
	Endpoint        string `json:"endpoint,omitempty"`
	Prefix          string `json:"prefix,omitempty"`
	AccessKeyID     string `json:"accessKeyId,omitempty"`
	SecretAccessKey string `json:"secretAccessKey,omitempty"`
	SessionToken    string `json:"sessionToken,omitempty"`
	ForcePathStyle  bool   `json:"forcePathStyle,omitempty"`
}

type CleanupRequest

type CleanupRequest struct {
	Project                string   `json:"project"`
	Environment            string   `json:"environment,omitempty"`
	RemoveContainers       bool     `json:"removeContainers,omitempty"`
	RemoveImages           bool     `json:"removeImages,omitempty"`
	RemoveNetworks         bool     `json:"removeNetworks,omitempty"`
	RemoveDeployFiles      bool     `json:"removeDeployFiles,omitempty"`
	RemoveTakodState       bool     `json:"removeTakodState,omitempty"`
	ProxyFiles             []string `json:"proxyFiles,omitempty"`
	ExternalVolumes        []string `json:"externalVolumes,omitempty"`
	PruneDocker            bool     `json:"pruneDocker,omitempty"`
	ImageRepositories      []string `json:"imageRepositories,omitempty"`
	KeepImages             int      `json:"keepImages,omitempty"`
	CleanOldImages         bool     `json:"cleanOldImages,omitempty"`
	CleanStoppedContainers bool     `json:"cleanStoppedContainers,omitempty"`
	CleanDanglingImages    bool     `json:"cleanDanglingImages,omitempty"`
	CleanBuildCache        bool     `json:"cleanBuildCache,omitempty"`
	BuildCacheKeepStorage  string   `json:"buildCacheKeepStorage,omitempty"`
	CleanUnusedVolumes     bool     `json:"cleanUnusedVolumes,omitempty"`
	SecureLogPermissions   bool     `json:"secureLogPermissions,omitempty"`
}

type CleanupResponse

type CleanupResponse struct {
	Project               string   `json:"project"`
	Environment           string   `json:"environment,omitempty"`
	ContainersRemoved     int      `json:"containersRemoved,omitempty"`
	ImagesRemoved         int      `json:"imagesRemoved,omitempty"`
	NetworksRemoved       int      `json:"networksRemoved,omitempty"`
	JobsRemoved           int      `json:"jobsRemoved,omitempty"`
	ProxyFilesRemoved     int      `json:"proxyFilesRemoved,omitempty"`
	BuildCacheCleaned     bool     `json:"buildCacheCleaned,omitempty"`
	UnusedVolumesCleaned  bool     `json:"unusedVolumesCleaned,omitempty"`
	LogPermissionsSecured bool     `json:"logPermissionsSecured,omitempty"`
	InitialDiskUsage      string   `json:"initialDiskUsage,omitempty"`
	FinalDiskUsage        string   `json:"finalDiskUsage,omitempty"`
	DockerDiskUsage       string   `json:"dockerDiskUsage,omitempty"`
	Warnings              []string `json:"warnings,omitempty"`
}

func CleanupProject

func CleanupProject(ctx context.Context, req CleanupRequest) (*CleanupResponse, error)

type ContainerSpec

type ContainerSpec struct {
	Name           string            `json:"name"`
	NetworkAliases []string          `json:"networkAliases,omitempty"`
	Publishes      []string          `json:"publishes,omitempty"`
	Labels         map[string]string `json:"labels,omitempty"`
}

type ContainerStat

type ContainerStat struct {
	Name       string `json:"name"`
	CPUPercent string `json:"cpuPercent"`
	MemUsage   string `json:"memUsage"`
	MemPercent string `json:"memPercent"`
	NetIO      string `json:"netIO"`
	BlockIO    string `json:"blockIO"`
	PIDs       string `json:"pids"`
}

type EnvBundleRequest

type EnvBundleRequest struct {
	Project     string    `json:"project"`
	Environment string    `json:"environment"`
	Content     string    `json:"content,omitempty"`
	UpdatedAt   time.Time `json:"updatedAt,omitempty"`
}

type EnvBundleResponse

type EnvBundleResponse struct {
	Found     bool      `json:"found"`
	Content   string    `json:"content,omitempty"`
	Path      string    `json:"path,omitempty"`
	UpdatedAt time.Time `json:"updatedAt,omitempty"`
}

func ReadEnvBundle

func ReadEnvBundle(ctx context.Context, dataDir string, req EnvBundleRequest) (*EnvBundleResponse, error)

func WriteEnvBundle

func WriteEnvBundle(ctx context.Context, dataDir string, req EnvBundleRequest) (*EnvBundleResponse, error)

type ExecRequest added in v0.8.0

type ExecRequest struct {
	Project     string   `json:"project"`
	Environment string   `json:"environment"`
	Service     string   `json:"service"`
	Mode        string   `json:"mode"`
	Command     []string `json:"command"`
	// Replica selects the 1-based running replica for attach mode
	// (containers sorted by name); 0 means the first.
	Replica int `json:"replica,omitempty"`
	// Env adds KEY=VALUE pairs on top of EnvFileContent.
	Env []string `json:"env,omitempty"`
	// EnvFileContent carries the service's env/secrets for oneoff mode;
	// it is written to a 0600 temp file and passed via --env-file.
	EnvFileContent string `json:"envFileContent,omitempty"`
	// Image overrides the oneoff image; default is the service's current
	// image from actual state.
	Image         string         `json:"image,omitempty"`
	PullImage     bool           `json:"pullImage,omitempty"`
	RegistryAuths []RegistryAuth `json:"registryAuths,omitempty"`
	// Network attaches the oneoff container; default tako_<project>_<env>.
	Network string `json:"network,omitempty"`
	// Mounts adds --mount specs to oneoff containers (volumes opt-in).
	Mounts             []string                       `json:"mounts,omitempty"`
	ExternalVolumes    []string                       `json:"externalVolumes,omitempty"`
	Files              []ServiceFileBundle            `json:"files,omitempty"`
	FileSetID          string                         `json:"fileSetId,omitempty"`
	CleanupFiles       bool                           `json:"cleanupFiles,omitempty"`
	Entrypoint         []string                       `json:"entrypoint,omitempty"`
	Labels             map[string]string              `json:"labels,omitempty"`
	User               string                         `json:"user,omitempty"`
	WorkingDir         string                         `json:"workingDir,omitempty"`
	StopTimeoutSeconds int                            `json:"stopTimeoutSeconds,omitempty"`
	Init               bool                           `json:"init,omitempty"`
	ExtraHosts         []string                       `json:"extraHosts,omitempty"`
	Ulimits            map[string]config.UlimitConfig `json:"ulimits,omitempty"`
	ShmSize            string                         `json:"shmSize,omitempty"`
	MemoryLimit        string                         `json:"memoryLimit,omitempty"`
	CPULimit           string                         `json:"cpuLimit,omitempty"`
	TimeoutSeconds     int                            `json:"timeoutSeconds,omitempty"`
	// Interactive attaches the caller's stdin over the hijacked frame
	// stream (docker exec/run -i). Requires the Upgrade handshake.
	Interactive bool `json:"interactive,omitempty"`
	// PTY allocates a server-side pseudo-terminal around the docker
	// process (implies Interactive). Cols/Rows set the initial size;
	// resize frames adjust it live.
	PTY  bool `json:"pty,omitempty"`
	Cols int  `json:"cols,omitempty"`
	Rows int  `json:"rows,omitempty"`
	// IdleTimeoutSeconds ends an interactive session after this long
	// without input or output; 0 uses the default.
	IdleTimeoutSeconds int `json:"idleTimeoutSeconds,omitempty"`
}

ExecRequest asks takod to run a command in the context of a service.

type ExportDiscoveryRecord added in v0.4.35

type ExportDiscoveryRecord struct {
	Network     string `json:"network"`
	Project     string `json:"project"`
	Environment string `json:"environment"`
	Service     string `json:"service"`
	Alias       string `json:"alias"`
	Runtime     string `json:"runtime,omitempty"`
}

type ExportDiscoveryResponse added in v0.4.35

type ExportDiscoveryResponse struct {
	Exports []ExportDiscoveryRecord `json:"exports"`
}

func ListExportDiscovery added in v0.4.35

func ListExportDiscovery(ctx context.Context, environment string) (*ExportDiscoveryResponse, error)

type HealthSpec

type HealthSpec struct {
	Command             string `json:"command,omitempty"`
	Path                string `json:"path,omitempty"`
	Port                int    `json:"port,omitempty"`
	Scheme              string `json:"scheme,omitempty"`
	Interval            string `json:"interval,omitempty"`
	Timeout             string `json:"timeout,omitempty"`
	Retries             int    `json:"retries,omitempty"`
	StartPeriod         string `json:"startPeriod,omitempty"`
	WaitAttempts        int    `json:"waitAttempts,omitempty"`
	SmokePath           string `json:"smokePath,omitempty"`
	SmokePort           int    `json:"smokePort,omitempty"`
	SmokeExpectedStatus int    `json:"smokeExpectedStatus,omitempty"`
}

type ImageBuildOptions

type ImageBuildOptions struct {
	Dockerfile string
	BuildArgs  map[string]string
	Target     string
}

type ImageBuildResponse

type ImageBuildResponse struct {
	Image   string             `json:"image"`
	Output  string             `json:"output,omitempty"`
	Timings *ImageBuildTimings `json:"timings,omitempty"`
}

func BuildImage

func BuildImage(ctx context.Context, image string, r io.Reader, dockerfile ...string) (*ImageBuildResponse, error)

func BuildImageWithAuth added in v0.8.0

func BuildImageWithAuth(ctx context.Context, image string, r io.Reader, auths []RegistryAuth, dockerfile ...string) (*ImageBuildResponse, error)

BuildImageWithAuth builds like BuildImage; auths feed an ephemeral DOCKER_CONFIG so the daemon can pull private base images during FROM.

func BuildImageWithOptions

func BuildImageWithOptions(ctx context.Context, image string, r io.Reader, auths []RegistryAuth, options ImageBuildOptions) (*ImageBuildResponse, error)

BuildImageWithOptions builds an uploaded context with validated target and build args. Values arrive in the request body preamble, never the URL.

type ImageBuildTimings added in v0.5.4

type ImageBuildTimings struct {
	ExtractMS     int64 `json:"extractMs,omitempty"`
	DockerBuildMS int64 `json:"dockerBuildMs,omitempty"`
	TotalMS       int64 `json:"totalMs,omitempty"`
}

type ImageExistsResponse

type ImageExistsResponse struct {
	Image  string `json:"image"`
	Exists bool   `json:"exists"`
}

func ImageExists

func ImageExists(ctx context.Context, image string) (*ImageExistsResponse, error)

type ImageImportResponse

type ImageImportResponse struct {
	Image  string `json:"image"`
	Output string `json:"output,omitempty"`
}

func ImportImage

func ImportImage(ctx context.Context, image string, r io.Reader) (*ImageImportResponse, error)

type JobRunRecord added in v0.8.0

type JobRunRecord struct {
	Project     string    `json:"project"`
	Environment string    `json:"environment"`
	Job         string    `json:"job"`
	Trigger     string    `json:"trigger"`
	Container   string    `json:"container,omitempty"`
	StartedAt   time.Time `json:"startedAt"`
	FinishedAt  time.Time `json:"finishedAt"`
	DurationMs  int64     `json:"durationMs"`
	ExitCode    int       `json:"exitCode"`
	Status      string    `json:"status"`
	// Output is the bounded tail of the run's combined output.
	Output string `json:"output,omitempty"`
}

JobRunRecord is one completed (or skipped) run in a job's history.

type JobScheduler added in v0.8.0

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

JobScheduler fires job specs with a local cron, mirroring BackupScheduler: specs persist as JSON under the data dir and are reloaded on start.

func NewJobScheduler added in v0.8.0

func NewJobScheduler(dataDir string) *JobScheduler

func (*JobScheduler) Apply added in v0.8.0

Apply reconciles this node's job set for one project/environment.

func (*JobScheduler) List added in v0.8.0

func (s *JobScheduler) List(project string, environment string) []JobStatus

List reports scheduled jobs, optionally filtered by project/environment.

func (*JobScheduler) RemoveProject added in v0.8.0

func (s *JobScheduler) RemoveProject(project string, environment string) ([]string, error)

RemoveProject unschedules every job for a project (one environment, or all when environment is empty) and deletes its specs and run history.

func (*JobScheduler) Run added in v0.8.0

func (s *JobScheduler) Run(ctx context.Context)

Run loads persisted specs, starts the cron, and blocks until ctx ends.

func (*JobScheduler) Runs added in v0.8.0

func (s *JobScheduler) Runs(project string, environment string, job string) ([]JobRunRecord, error)

Runs returns run history for one job, or every job in the environment when job is empty, newest first.

func (*JobScheduler) Trigger added in v0.8.0

func (s *JobScheduler) Trigger(ctx context.Context, project string, environment string, job string, stream io.Writer) error

Trigger runs a scheduled job immediately, streaming raw output framed by the exec markers to stream. An overlapping run surfaces as an error before any bytes are streamed.

type JobSpec added in v0.8.0

type JobSpec struct {
	Project     string            `json:"project"`
	Environment string            `json:"environment"`
	Name        string            `json:"name"`
	Schedule    string            `json:"schedule"`
	Timezone    string            `json:"timezone,omitempty"`
	Image       string            `json:"image"`
	Command     []string          `json:"command"`
	Entrypoint  []string          `json:"entrypoint,omitempty"`
	Labels      map[string]string `json:"labels,omitempty"`
	// EnvFileContent carries the job's env/secrets; it is written to a 0600
	// temp file per run and passed via --env-file.
	EnvFileContent string   `json:"envFileContent,omitempty"`
	Env            []string `json:"env,omitempty"`
	// Network attaches run containers; default tako_<project>_<env>.
	Network            string                         `json:"network,omitempty"`
	Mounts             []string                       `json:"mounts,omitempty"`
	Files              []ServiceFileBundle            `json:"files,omitempty"`
	FileSetID          string                         `json:"fileSetId,omitempty"`
	MemoryLimit        string                         `json:"memoryLimit,omitempty"`
	CPULimit           string                         `json:"cpuLimit,omitempty"`
	User               string                         `json:"user,omitempty"`
	WorkingDir         string                         `json:"workingDir,omitempty"`
	StopTimeoutSeconds int                            `json:"stopTimeoutSeconds,omitempty"`
	Init               bool                           `json:"init,omitempty"`
	ExtraHosts         []string                       `json:"extraHosts,omitempty"`
	Ulimits            map[string]config.UlimitConfig `json:"ulimits,omitempty"`
	ShmSize            string                         `json:"shmSize,omitempty"`
	TimeoutSeconds     int                            `json:"timeoutSeconds,omitempty"`
	// ConfigHash is the deployer's fingerprint of the job's service config,
	// reported back through actual state for drift/plan comparison.
	ConfigHash string `json:"configHash,omitempty"`
}

JobSpec declares one scheduled job on this node. The owning node receives the spec at deploy time via /v1/jobs/apply and fires it with its local cron; each run is a fresh one-off container from Image.

type JobStatus added in v0.8.0

type JobStatus struct {
	Project        string        `json:"project"`
	Environment    string        `json:"environment"`
	Name           string        `json:"name"`
	Schedule       string        `json:"schedule"`
	Timezone       string        `json:"timezone,omitempty"`
	Image          string        `json:"image"`
	Command        []string      `json:"command"`
	TimeoutSeconds int           `json:"timeoutSeconds,omitempty"`
	ConfigHash     string        `json:"configHash,omitempty"`
	NextRun        *time.Time    `json:"nextRun,omitempty"`
	LastRun        *JobRunRecord `json:"lastRun,omitempty"`
}

JobStatus describes a scheduled job without its env-file content, which must never leave the node through list responses.

type JobTriggerRequest added in v0.8.0

type JobTriggerRequest struct {
	Project     string `json:"project"`
	Environment string `json:"environment"`
	Job         string `json:"job"`
}

JobTriggerRequest asks for one immediate run of a scheduled job.

type JobsApplyRequest added in v0.8.0

type JobsApplyRequest struct {
	Project     string    `json:"project"`
	Environment string    `json:"environment"`
	Jobs        []JobSpec `json:"jobs"`
}

JobsApplyRequest declaratively replaces this node's job set for one project/environment: listed jobs are scheduled, absent ones unscheduled.

type JobsApplyResponse added in v0.8.0

type JobsApplyResponse struct {
	Project     string    `json:"project"`
	Environment string    `json:"environment"`
	Applied     []string  `json:"applied,omitempty"`
	Removed     []string  `json:"removed,omitempty"`
	Warnings    []string  `json:"warnings,omitempty"`
	UpdatedAt   time.Time `json:"updatedAt"`
}

JobsApplyResponse reports the applied and removed job names.

type LeaseInfo

type LeaseInfo struct {
	ID          string    `json:"id"`
	ProjectName string    `json:"projectName"`
	Environment string    `json:"environment"`
	Operation   string    `json:"operation"`
	Who         string    `json:"who"`
	PID         int       `json:"pid"`
	CreatedAt   time.Time `json:"createdAt"`
	ExpiresAt   time.Time `json:"expiresAt"`
}

type LeaseRequest

type LeaseRequest struct {
	Project     string `json:"project"`
	Environment string `json:"environment"`
	ID          string `json:"id,omitempty"`
	Operation   string `json:"operation,omitempty"`
	Who         string `json:"who,omitempty"`
	PID         int    `json:"pid,omitempty"`
	TTLSeconds  int64  `json:"ttlSeconds,omitempty"`
	Renew       bool   `json:"renew,omitempty"`
}

type LeaseResponse

type LeaseResponse struct {
	Acquired bool       `json:"acquired"`
	Found    bool       `json:"found"`
	Lease    *LeaseInfo `json:"lease,omitempty"`
	Message  string     `json:"message,omitempty"`
}

func AcquireLease

func AcquireLease(ctx context.Context, dataDir string, req LeaseRequest) (*LeaseResponse, error)

func ReadLease

func ReadLease(ctx context.Context, dataDir string, req LeaseRequest) (*LeaseResponse, error)

func ReleaseLease

func ReleaseLease(ctx context.Context, dataDir string, req LeaseRequest) (*LeaseResponse, error)

type LogsRequest

type LogsRequest struct {
	Project     string `json:"project"`
	Environment string `json:"environment"`
	Service     string `json:"service"`
	Tail        int    `json:"tail,omitempty"`
	Follow      bool   `json:"follow,omitempty"`
}

type MeshApplyRequest

type MeshApplyRequest struct {
	Config mesh.WireGuardConfig `json:"config"`
	Node   mesh.Node            `json:"node"`
	Peers  []mesh.Node          `json:"peers,omitempty"`
}

type MeshApplyResponse

type MeshApplyResponse struct {
	Applied bool         `json:"applied"`
	Status  *mesh.Status `json:"status,omitempty"`
}

func ReconcileMesh

func ReconcileMesh(ctx context.Context, request MeshApplyRequest) (*MeshApplyResponse, error)

type MeshKeyResponse

type MeshKeyResponse struct {
	PublicKey string `json:"publicKey"`
}

func EnsureMeshKey

func EnsureMeshKey(ctx context.Context) (*MeshKeyResponse, error)

type MetadataRequest

type MetadataRequest struct {
	Node  any `json:"node,omitempty"`
	Peers any `json:"peers,omitempty"`
}

type MetadataResponse

type MetadataResponse struct {
	NodePath  string `json:"nodePath,omitempty"`
	PeersPath string `json:"peersPath,omitempty"`
}

func WriteMetadata

func WriteMetadata(ctx context.Context, dataDir string, req MetadataRequest) (*MetadataResponse, error)

type MetricsResponse

type MetricsResponse struct {
	Collected bool            `json:"collected"`
	Metrics   json.RawMessage `json:"metrics"`
}

func ReadNodeMetrics

func ReadNodeMetrics(ctx context.Context, collect bool) (*MetricsResponse, error)

type NetworkAttachmentSpec added in v0.4.12

type NetworkAttachmentSpec struct {
	Network string            `json:"network"`
	Aliases []string          `json:"aliases,omitempty"`
	Create  bool              `json:"create,omitempty"`
	Labels  map[string]string `json:"labels,omitempty"`
}

type PortAllocationRequest

type PortAllocationRequest struct {
	Kind          string `json:"kind"`
	Project       string `json:"project"`
	Environment   string `json:"environment"`
	Service       string `json:"service"`
	Revision      string `json:"revision,omitempty"`
	Slot          int    `json:"slot"`
	HostIP        string `json:"hostIp"`
	ContainerPort int    `json:"containerPort"`
	PreferredPort int    `json:"preferredPort"`
	MinPort       int    `json:"minPort"`
	MaxPort       int    `json:"maxPort"`
}

type PortAllocationResponse

type PortAllocationResponse struct {
	Kind          string `json:"kind"`
	Project       string `json:"project"`
	Environment   string `json:"environment"`
	Service       string `json:"service"`
	Revision      string `json:"revision,omitempty"`
	Slot          int    `json:"slot"`
	HostIP        string `json:"hostIp"`
	HostPort      int    `json:"hostPort"`
	ContainerPort int    `json:"containerPort"`
	Key           string `json:"key"`
}

func AllocatePort

func AllocatePort(ctx context.Context, dataDir string, req PortAllocationRequest) (*PortAllocationResponse, error)

type ProxyDynamicDomain added in v0.5.0

type ProxyDynamicDomain struct {
	AskURL string `json:"askUrl"`
}

type ProxyFileRequest

type ProxyFileRequest struct {
	Name    string `json:"name"`
	Content string `json:"content"`
}

type ProxyFileResponse

type ProxyFileResponse struct {
	Path string `json:"path"`
}

func RemoveProxyFile

func RemoveProxyFile(ctx context.Context, name string) (*ProxyFileResponse, error)

func WriteProxyFile

func WriteProxyFile(ctx context.Context, req ProxyFileRequest) (*ProxyFileResponse, error)

type ProxyRoute added in v0.5.0

type ProxyRoute struct {
	Service       string               `json:"service"`
	Revision      string               `json:"revision,omitempty"`
	Domains       []string             `json:"domains,omitempty"`
	RedirectFrom  []string             `json:"redirectFrom,omitempty"`
	Upstreams     []string             `json:"upstreams"`
	HealthCheck   *ProxyRouteHealth    `json:"healthCheck,omitempty"`
	Sticky        bool                 `json:"sticky,omitempty"`
	Priority      int                  `json:"priority,omitempty"`
	Visibility    string               `json:"visibility,omitempty"`
	DynamicDomain *ProxyDynamicDomain  `json:"dynamicDomain,omitempty"`
	BasicAuth     *ProxyRouteBasicAuth `json:"basicAuth,omitempty"`
	AllowIPs      []string             `json:"allowIps,omitempty"`
}

type ProxyRouteBasicAuth added in v0.8.1

type ProxyRouteBasicAuth struct {
	Username       string `json:"username"`
	PasswordBcrypt string `json:"passwordBcrypt"`
}

ProxyRouteBasicAuth protects a route's serving domains with HTTP basic auth. PasswordBcrypt is a pre-computed hash, never plaintext.

type ProxyRouteHealth added in v0.5.0

type ProxyRouteHealth struct {
	Path     string `json:"path,omitempty"`
	Interval string `json:"interval,omitempty"`
}

type ProxyRouteManifest added in v0.5.0

type ProxyRouteManifest struct {
	Version     int          `json:"version"`
	Project     string       `json:"project"`
	Environment string       `json:"environment"`
	Network     string       `json:"network,omitempty"`
	Routes      []ProxyRoute `json:"routes"`
}

func ParseProxyRouteManifest added in v0.5.0

func ParseProxyRouteManifest(content string) (*ProxyRouteManifest, error)

type ReconcileProxyRequest

type ReconcileProxyRequest struct {
	Network string `json:"network"`
	Email   string `json:"email,omitempty"`
	Image   string `json:"image,omitempty"`
}

type ReconcileProxyResponse

type ReconcileProxyResponse struct {
	Container string `json:"container"`
	Image     string `json:"image"`
}

type ReconcileServiceRequest

type ReconcileServiceRequest struct {
	Project            string                         `json:"project"`
	Environment        string                         `json:"environment"`
	Service            string                         `json:"service"`
	Revision           string                         `json:"revision,omitempty"`
	DeployStrategy     string                         `json:"deployStrategy,omitempty"`
	Image              string                         `json:"image"`
	PullImage          bool                           `json:"pullImage,omitempty"`
	Restart            string                         `json:"restart,omitempty"`
	Network            string                         `json:"network"`
	NetworkAlias       string                         `json:"networkAlias,omitempty"`
	NetworkAttachments []NetworkAttachmentSpec        `json:"networkAttachments,omitempty"`
	EnvFile            string                         `json:"envFile,omitempty"`
	EnvFileContent     string                         `json:"envFileContent,omitempty"`
	Labels             map[string]string              `json:"labels,omitempty"`
	Mounts             []string                       `json:"mounts,omitempty"`
	ExternalVolumes    []string                       `json:"externalVolumes,omitempty"`
	Files              []ServiceFileBundle            `json:"files,omitempty"`
	FileSetID          string                         `json:"fileSetId,omitempty"`
	Containers         []ContainerSpec                `json:"containers"`
	Health             *HealthSpec                    `json:"health,omitempty"`
	Command            config.StringOrList            `json:"command,omitempty,omitzero"`
	Entrypoint         config.StringOrList            `json:"entrypoint,omitempty,omitzero"`
	MemoryLimit        string                         `json:"memoryLimit,omitempty"`
	CPULimit           string                         `json:"cpuLimit,omitempty"`
	User               string                         `json:"user,omitempty"`
	WorkingDir         string                         `json:"workingDir,omitempty"`
	StopTimeoutSeconds int                            `json:"stopTimeoutSeconds,omitempty"`
	Init               bool                           `json:"init,omitempty"`
	ExtraHosts         []string                       `json:"extraHosts,omitempty"`
	Ulimits            map[string]config.UlimitConfig `json:"ulimits,omitempty"`
	ShmSize            string                         `json:"shmSize,omitempty"`
	// RegistryAuths carries request-scoped pull credentials; they feed an
	// ephemeral DOCKER_CONFIG for this reconcile only and are never
	// persisted (ADR 10).
	RegistryAuths []RegistryAuth `json:"registryAuths,omitempty"`
}

type ReconcileServiceResponse

type ReconcileServiceResponse struct {
	Project           string   `json:"project"`
	Environment       string   `json:"environment"`
	Service           string   `json:"service"`
	Containers        []string `json:"containers"`
	RemovedContainers int      `json:"removedContainers,omitempty"`
}

type RegistryAuth

type RegistryAuth struct {
	Registry string `json:"registry"`
	Username string `json:"username"`
	Password string `json:"password"`
}

RegistryAuth carries request-scoped credentials for one registry host. Credentials ride the request body only: they are written to an ephemeral docker config dir for the single docker invocation and never persist to takod state, argv, query strings, or logs (ADR 10).

type RemoveServiceRequest

type RemoveServiceRequest struct {
	Project      string `json:"project"`
	Environment  string `json:"environment"`
	Service      string `json:"service"`
	KeepRevision string `json:"keepRevision,omitempty"`
}

type RemoveServiceResponse

type RemoveServiceResponse struct {
	Project           string `json:"project"`
	Environment       string `json:"environment"`
	Service           string `json:"service"`
	RemovedContainers int    `json:"removedContainers"`
}

type Server

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

func NewServer

func NewServer(socket string, dataDir string, version string) *Server

func NewServerWithOptions

func NewServerWithOptions(socket string, dataDir string, version string, opts ServerOptions) *Server

func (*Server) Run

func (s *Server) Run(ctx context.Context) error

func (*Server) Status

func (s *Server) Status() Status

type ServerOptions

type ServerOptions struct {
	NodeName                string
	ActualRefreshInterval   time.Duration
	BuildCachePruneInterval time.Duration
	BuildCacheKeepStorage   string
}

type ServiceFileBundle added in v0.9.0

type ServiceFileBundle struct {
	Name      string             `json:"name"`
	Target    string             `json:"target"`
	Directory bool               `json:"directory,omitempty"`
	Secret    bool               `json:"secret,omitempty"`
	UID       int                `json:"uid,omitempty"`
	GID       int                `json:"gid,omitempty"`
	Entries   []ServiceFileEntry `json:"entries"`
}

ServiceFileBundle is one operator-managed file or directory mounted into a container. Data is request-scoped and is never written to desired state.

type ServiceFileEntry added in v0.9.0

type ServiceFileEntry struct {
	Path      string `json:"path,omitempty"`
	Data      []byte `json:"data,omitempty"`
	Mode      uint32 `json:"mode"`
	Directory bool   `json:"directory,omitempty"`
}

type ServiceFilesCheckRequest added in v0.9.0

type ServiceFilesCheckRequest struct {
	Project     string `json:"project"`
	Environment string `json:"environment"`
	Service     string `json:"service"`
	FileSetID   string `json:"fileSetId"`
}

type ServiceFilesRequest added in v0.9.0

type ServiceFilesRequest struct {
	Project     string              `json:"project"`
	Environment string              `json:"environment"`
	Service     string              `json:"service"`
	FileSetID   string              `json:"fileSetId"`
	Files       []ServiceFileBundle `json:"files"`
}

type StateDocumentRequest

type StateDocumentRequest struct {
	Project     string `json:"project"`
	Environment string `json:"environment"`
	Document    string `json:"document"`
	Node        string `json:"node,omitempty"`
	RevisionID  string `json:"revisionId,omitempty"`
	Content     string `json:"content,omitempty"`
}

type StateDocumentResponse

type StateDocumentResponse struct {
	Found   bool   `json:"found"`
	Content string `json:"content,omitempty"`
	Path    string `json:"path,omitempty"`
}

func AppendStateEvent

func AppendStateEvent(ctx context.Context, dataDir string, req StateDocumentRequest) (*StateDocumentResponse, error)

func DeleteStateDocument added in v0.4.8

func DeleteStateDocument(ctx context.Context, dataDir string, req StateDocumentRequest) (*StateDocumentResponse, error)

func ReadStateDocument

func ReadStateDocument(ctx context.Context, dataDir string, req StateDocumentRequest) (*StateDocumentResponse, error)

func WriteStateDocument

func WriteStateDocument(ctx context.Context, dataDir string, req StateDocumentRequest) (*StateDocumentResponse, error)

type StatsRequest

type StatsRequest struct {
	Project     string `json:"project,omitempty"`
	Environment string `json:"environment,omitempty"`
	Service     string `json:"service,omitempty"`
	All         bool   `json:"all,omitempty"`
}

type StatsResponse

type StatsResponse struct {
	Stats []ContainerStat `json:"stats"`
}

func ReadContainerStats

func ReadContainerStats(ctx context.Context, req StatsRequest) (*StatsResponse, error)

type Status

type Status struct {
	Runtime      string         `json:"runtime"`
	Version      string         `json:"version"`
	Capabilities []string       `json:"capabilities,omitempty"`
	Hostname     string         `json:"hostname"`
	Socket       string         `json:"socket"`
	DataDir      string         `json:"dataDir"`
	StartedAt    time.Time      `json:"startedAt"`
	Now          time.Time      `json:"now"`
	Node         map[string]any `json:"node,omitempty"`
	Peers        map[string]any `json:"peers,omitempty"`
}

Jump to

Keyboard shortcuts

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