agentikube/internal/config/config.go
2026-02-07 13:49:11 -05:00

102 lines
2.8 KiB
Go

package config
import (
"fmt"
"os"
"gopkg.in/yaml.v3"
)
// Config is the top-level configuration parsed from agentikube.yaml.
type Config struct {
Namespace string `yaml:"namespace"`
Compute ComputeConfig `yaml:"compute"`
Storage StorageConfig `yaml:"storage"`
Sandbox SandboxConfig `yaml:"sandbox"`
}
type ComputeConfig struct {
Type string `yaml:"type"` // karpenter | fargate
InstanceTypes []string `yaml:"instanceTypes"`
CapacityTypes []string `yaml:"capacityTypes"`
MaxCPU int `yaml:"maxCpu"`
MaxMemory string `yaml:"maxMemory"`
Consolidation bool `yaml:"consolidation"`
FargateSelectors []FargateSelector `yaml:"fargateSelectors"`
}
type FargateSelector struct {
Namespace string `yaml:"namespace"`
}
type StorageConfig struct {
Type string `yaml:"type"` // efs
FilesystemID string `yaml:"filesystemId"`
BasePath string `yaml:"basePath"`
UID int `yaml:"uid"`
GID int `yaml:"gid"`
ReclaimPolicy string `yaml:"reclaimPolicy"`
}
type SandboxConfig struct {
Image string `yaml:"image"`
Ports []int `yaml:"ports"`
MountPath string `yaml:"mountPath"`
Resources ResourcesConfig `yaml:"resources"`
Env map[string]string `yaml:"env"`
SecurityContext SecurityContext `yaml:"securityContext"`
Probes ProbesConfig `yaml:"probes"`
WarmPool WarmPoolConfig `yaml:"warmPool"`
NetworkPolicy NetworkPolicy `yaml:"networkPolicy"`
}
type ResourcesConfig struct {
Requests ResourceValues `yaml:"requests"`
Limits ResourceValues `yaml:"limits"`
}
type ResourceValues struct {
CPU string `yaml:"cpu"`
Memory string `yaml:"memory"`
}
type SecurityContext struct {
RunAsUser int `yaml:"runAsUser"`
RunAsGroup int `yaml:"runAsGroup"`
RunAsNonRoot bool `yaml:"runAsNonRoot"`
}
type ProbesConfig struct {
Port int `yaml:"port"`
StartupFailureThreshold int `yaml:"startupFailureThreshold"`
}
type WarmPoolConfig struct {
Enabled bool `yaml:"enabled"`
Size int `yaml:"size"`
TTLMinutes int `yaml:"ttlMinutes"`
}
type NetworkPolicy struct {
EgressAllowAll bool `yaml:"egressAllowAll"`
IngressPorts []int `yaml:"ingressPorts"`
}
// Load reads and parses the config file at the given path.
func Load(path string) (*Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("reading config file: %w", err)
}
var cfg Config
if err := yaml.Unmarshal(data, &cfg); err != nil {
return nil, fmt.Errorf("parsing config file: %w", err)
}
if err := Validate(&cfg); err != nil {
return nil, fmt.Errorf("validating config: %w", err)
}
return &cfg, nil
}