orchestrator

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Mar 4, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrVMPoolFull = errors.New("vm pool at capacity")

ErrVMPoolFull is returned when the VM pool is at capacity and overflow is "reject".

Functions

This section is empty.

Types

type Event

type Event struct {
	ID        string          `json:"id"`
	Type      EventType       `json:"type"`
	SandboxID string          `json:"sandbox_id,omitempty"`
	Timestamp time.Time       `json:"timestamp"`
	Data      json.RawMessage `json:"data,omitempty"`
}

type EventBus

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

EventBus is an in-process pub/sub system with ring buffer history.

func NewEventBus

func NewEventBus() *EventBus

func (*EventBus) History

func (eb *EventBus) History(limit int) []Event

History returns the most recent events up to limit.

func (*EventBus) Publish

func (eb *EventBus) Publish(evt Event)

Publish sends an event to all subscribers (non-blocking).

func (*EventBus) Subscribe

func (eb *EventBus) Subscribe(id string) <-chan Event

Subscribe creates a new subscription and returns a channel + unsubscribe key.

func (*EventBus) Unsubscribe

func (eb *EventBus) Unsubscribe(id string)

Unsubscribe removes a subscription.

type EventType

type EventType string
const (
	EventSandboxCreated   EventType = "sandbox.created"
	EventSandboxRunning   EventType = "sandbox.running"
	EventSandboxDestroyed EventType = "sandbox.destroyed"
	EventSandboxError     EventType = "sandbox.error"
	EventExecStarted      EventType = "exec.started"
	EventExecCompleted    EventType = "exec.completed"
	EventFileWritten      EventType = "file.written"
	EventFileRead         EventType = "file.read"
)

type ExecRequest

type ExecRequest struct {
	Command string            `json:"command"`
	Args    []string          `json:"args,omitempty"`
	Env     map[string]string `json:"env,omitempty"`
	WorkDir string            `json:"workdir,omitempty"`
	Timeout string            `json:"timeout,omitempty"`
	Stream  bool              `json:"stream,omitempty"`
}

type ExecResult

type ExecResult struct {
	ExitCode int    `json:"exit_code"`
	Stdout   string `json:"stdout"`
	Stderr   string `json:"stderr"`
	Duration string `json:"duration"`
}

type FileChmodRequest

type FileChmodRequest struct {
	Path string `json:"path"`
	Mode string `json:"mode"`
}

type FileDeleteRequest

type FileDeleteRequest struct {
	Path      string `json:"path"`
	Recursive bool   `json:"recursive"`
}

type FileInfo

type FileInfo struct {
	Path    string `json:"path"`
	Size    int64  `json:"size"`
	Mode    string `json:"mode"`
	IsDir   bool   `json:"is_dir"`
	ModTime string `json:"mod_time"`
}

type FileMoveRequest

type FileMoveRequest struct {
	OldPath string `json:"old_path"`
	NewPath string `json:"new_path"`
}

type FileWriteRequest

type FileWriteRequest struct {
	Path    string `json:"path"`
	Content string `json:"content"`
	Mode    string `json:"mode,omitempty"`
}

type Manager

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

func NewManager

func NewManager(registry *providers.Registry, st store.Store, events *EventBus, logger zerolog.Logger, cfg ManagerConfig) *Manager

func (*Manager) ChmodFile

func (m *Manager) ChmodFile(ctx context.Context, sandboxID string, req FileChmodRequest) error

func (*Manager) ConsoleLog

func (m *Manager) ConsoleLog(ctx context.Context, sandboxID string, lines int) ([]string, error)

func (*Manager) CountByProvider

func (m *Manager) CountByProvider(_ context.Context, provider string) int

func (*Manager) DeleteFile

func (m *Manager) DeleteFile(ctx context.Context, sandboxID string, req FileDeleteRequest) error

func (*Manager) Destroy

func (m *Manager) Destroy(ctx context.Context, id string) error

func (*Manager) Exec

func (m *Manager) Exec(ctx context.Context, sandboxID string, req ExecRequest) (*ExecResult, error)

func (*Manager) ExecStream

func (m *Manager) ExecStream(ctx context.Context, sandboxID string, req ExecRequest) (<-chan providers.StreamChunk, error)

func (*Manager) ExtendTTL

func (m *Manager) ExtendTTL(ctx context.Context, id string, extra time.Duration) (*Sandbox, error)

func (*Manager) Get

func (m *Manager) Get(ctx context.Context, id string) (*Sandbox, error)

func (*Manager) GlobFiles

func (m *Manager) GlobFiles(ctx context.Context, sandboxID string, pattern string) ([]string, error)

func (*Manager) InitVMPool

func (m *Manager) InitVMPool()

InitVMPool initializes the VM pool manager if pool mode is enabled.

func (*Manager) List

func (m *Manager) List(ctx context.Context) ([]*Sandbox, error)

func (*Manager) ListFiles

func (m *Manager) ListFiles(ctx context.Context, sandboxID string, path string) ([]FileInfo, error)

func (*Manager) MoveFile

func (m *Manager) MoveFile(ctx context.Context, sandboxID string, req FileMoveRequest) error

func (*Manager) Prune

func (m *Manager) Prune(ctx context.Context) (int, error)

func (*Manager) ReadFile

func (m *Manager) ReadFile(ctx context.Context, sandboxID string, path string) ([]byte, error)

func (*Manager) Spawn

func (m *Manager) Spawn(ctx context.Context, req SpawnRequest) (*Sandbox, error)

func (*Manager) Start

func (m *Manager) Start()

Start launches the TTL reaper goroutine.

func (*Manager) StatFile

func (m *Manager) StatFile(ctx context.Context, sandboxID string, path string) (*FileInfo, error)

func (*Manager) Stop

func (m *Manager) Stop()

Stop cancels the reaper and cleans up.

func (*Manager) VMPoolStatus

func (m *Manager) VMPoolStatus() *VMPoolStatus

VMPoolStatus returns the current VM pool status. Returns nil if pool is disabled.

func (*Manager) WriteFile

func (m *Manager) WriteFile(ctx context.Context, sandboxID string, req FileWriteRequest) error

type ManagerConfig

type ManagerConfig struct {
	DefaultTTL    time.Duration
	DefaultImage  string
	DefaultMemory int
	DefaultVCPUs  int
	Pool          config.PoolConfig
}

type PoolManager

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

PoolManager maintains pre-warmed sandbox pools per template.

func NewPoolManager

func NewPoolManager(mgr *Manager, registry *TemplateRegistry, logger zerolog.Logger) *PoolManager

func (*PoolManager) Acquire

func (pm *PoolManager) Acquire(templateName string) string

Acquire takes a pre-warmed sandbox from the pool. Returns empty string if none available.

func (*PoolManager) Configure

func (pm *PoolManager) Configure(templateName string, size int)

Configure sets the pool size for a template.

func (*PoolManager) Start

func (pm *PoolManager) Start()

Start begins the background refill goroutine.

func (*PoolManager) Status

func (pm *PoolManager) Status() map[string]PoolStatus

Status returns pool stats for all templates.

func (*PoolManager) Stop

func (pm *PoolManager) Stop()

Stop halts the pool manager.

type PoolStatus

type PoolStatus struct {
	TemplateName string `json:"template_name"`
	TargetSize   int    `json:"target_size"`
	CurrentSize  int    `json:"current_size"`
}

PoolStatus represents the state of a template's pool.

type Sandbox

type Sandbox struct {
	ID        string            `json:"id"`
	State     SandboxState      `json:"state"`
	Provider  string            `json:"provider"`
	Image     string            `json:"image"`
	MemoryMB  int               `json:"memory_mb"`
	VCPUs     int               `json:"vcpus"`
	OwnerID   string            `json:"owner_id,omitempty"`
	VMID      string            `json:"vm_id,omitempty"`
	CreatedAt time.Time         `json:"created_at"`
	ExpiresAt time.Time         `json:"expires_at"`
	Metadata  map[string]string `json:"metadata,omitempty"`
}

type SandboxInfo

type SandboxInfo struct {
	ID        string            `json:"id"`
	State     SandboxState      `json:"state"`
	Provider  string            `json:"provider"`
	Image     string            `json:"image"`
	MemoryMB  int               `json:"memory_mb"`
	VCPUs     int               `json:"vcpus"`
	CreatedAt string            `json:"created_at"`
	ExpiresAt string            `json:"expires_at"`
	Metadata  map[string]string `json:"metadata,omitempty"`
	ExecCount int               `json:"exec_count"`
	FileCount int               `json:"file_count"`
}

type SandboxState

type SandboxState string
const (
	StateCreating  SandboxState = "creating"
	StateRunning   SandboxState = "running"
	StateIdle      SandboxState = "idle"
	StateDestroyed SandboxState = "destroyed"
	StateError     SandboxState = "error"
)

type SecretConfig

type SecretConfig struct {
	Name     string `json:"name" yaml:"name"`
	InjectAt string `json:"inject_at" yaml:"inject_at"`
}

SecretConfig defines a secret to inject into a sandbox.

type SpawnRequest

type SpawnRequest struct {
	Image    string            `json:"image"`
	Provider string            `json:"provider,omitempty"`
	MemoryMB int               `json:"memory_mb,omitempty"`
	VCPUs    int               `json:"vcpus,omitempty"`
	TTL      string            `json:"ttl,omitempty"`
	Template string            `json:"template,omitempty"`
	OwnerID  string            `json:"owner_id,omitempty"`
	Metadata map[string]string `json:"metadata,omitempty"`
}

type Template

type Template struct {
	Name         string            `json:"name" yaml:"name"`
	Version      int               `json:"version" yaml:"version"`
	Image        string            `json:"image" yaml:"image"`
	Description  string            `json:"description,omitempty" yaml:"description"`
	Setup        []string          `json:"setup,omitempty" yaml:"setup"`
	AllowedHosts []string          `json:"allowed_hosts,omitempty" yaml:"allowed_hosts"`
	MemoryMB     int               `json:"memory_mb" yaml:"memory_mb"`
	CPUCores     int               `json:"cpu_cores" yaml:"cpu_cores"`
	TTLSeconds   int               `json:"ttl_seconds" yaml:"ttl_seconds"`
	Env          map[string]string `json:"env,omitempty" yaml:"env"`
	Secrets      []SecretConfig    `json:"secrets,omitempty" yaml:"secrets"`
	PoolSize     int               `json:"pool_size" yaml:"pool_size"`
	CreatedAt    time.Time         `json:"created_at"`
	UpdatedAt    time.Time         `json:"updated_at"`
}

Template represents a reusable sandbox configuration.

type TemplateRegistry

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

TemplateRegistry manages sandbox templates via the store.

func NewTemplateRegistry

func NewTemplateRegistry(st store.Store) *TemplateRegistry

func (*TemplateRegistry) Create

func (r *TemplateRegistry) Create(ctx context.Context, t *Template) error

func (*TemplateRegistry) Delete

func (r *TemplateRegistry) Delete(ctx context.Context, name string) error

func (*TemplateRegistry) Get

func (r *TemplateRegistry) Get(ctx context.Context, name string) (*Template, error)

func (*TemplateRegistry) List

func (r *TemplateRegistry) List(ctx context.Context) ([]*Template, error)

func (*TemplateRegistry) ToSpawnRequest

func (r *TemplateRegistry) ToSpawnRequest(t *Template) SpawnRequest

ToSpawnRequest converts a template into a SpawnRequest.

func (*TemplateRegistry) Update

func (r *TemplateRegistry) Update(ctx context.Context, t *Template) error

type VMPoolManager

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

VMPoolManager handles multi-user VM pool scheduling.

func NewVMPoolManager

func NewVMPoolManager(cfg config.PoolConfig, spawnFn func(ctx context.Context, req SpawnRequest) (*Sandbox, error), logger zerolog.Logger) *VMPoolManager

NewVMPoolManager creates a VM pool manager. The spawnFn is called to create new VMs.

func (*VMPoolManager) Acquire

func (p *VMPoolManager) Acquire(ctx context.Context, sandboxID string) (string, error)

Acquire finds or creates a VM with capacity and returns the vmID.

func (*VMPoolManager) Release

func (p *VMPoolManager) Release(vmID, sandboxID string) bool

Release decrements the user count for a VM. Returns true if the VM is now empty and should be destroyed.

func (*VMPoolManager) Status

func (p *VMPoolManager) Status() VMPoolStatus

Status returns the current pool status.

type VMPoolStatus

type VMPoolStatus struct {
	Enabled       bool `json:"enabled"`
	VMs           int  `json:"vms"`
	MaxVMs        int  `json:"max_vms"`
	TotalUsers    int  `json:"total_users"`
	MaxUsersPerVM int  `json:"max_users_per_vm"`
}

VMPoolStatus is returned by the pool status endpoint.

type VMSlot

type VMSlot struct {
	VMID      string
	Provider  string
	Image     string
	UserCount int
	MaxUsers  int
	CreatedAt time.Time
}

VMSlot tracks a single VM in the pool.

Jump to

Keyboard shortcuts

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