package config import ( "errors" "os" "gopkg.in/yaml.v3" ) func Load(path string) (Config, error) { var cfg Config data, err := os.ReadFile(path) if err != nil { return cfg, err } if err := yaml.Unmarshal(data, &cfg); err != nil { return cfg, err } return cfg, Validate(cfg) } func Save(path string, cfg Config) error { if err := Validate(cfg); err != nil { return err } data, err := yaml.Marshal(cfg) if err != nil { return err } return os.WriteFile(path, data, 0644) } func Validate(cfg Config) error { if cfg.WorkspaceDir == "" { return errors.New("workspaceDir is required") } if cfg.GitHub.Org == "" { return errors.New("github.org is required") } if cfg.Flux.RepoName == "" || cfg.Flux.ClusterPath == "" { return errors.New("flux repoName and clusterPath are required") } if cfg.Talos.RepoURL == "" || cfg.Talos.RepoDirName == "" { return errors.New("talos repoUrl and repoDirName are required") } if cfg.Talos.TerraformDir == "" || cfg.Talos.GeneratedDir == "" || cfg.Talos.ConfigFileName == "" { return errors.New("talos terraformDir, generatedDir, and configFileName are required") } if cfg.Talos.Proxmox.APIURL == "" || cfg.Talos.Proxmox.APIToken == "" { return errors.New("talos proxmox apiUrl and apiToken are required") } if cfg.Talos.Cluster.Name == "" || cfg.Talos.Cluster.Domain == "" { return errors.New("talos cluster name and domain are required") } if cfg.Talos.Image.FactorySchematicID == "" || cfg.Talos.Image.TalosVersion == "" || cfg.Talos.Image.TalosISOFile == "" { return errors.New("talos image pins are required") } if cfg.Talos.Image.UpdateMode != "" && cfg.Talos.Image.UpdateMode != "manual" && cfg.Talos.Image.UpdateMode != "download" { return errors.New("talos image updateMode must be manual or download") } if len(cfg.Talos.Nodes) == 0 { return errors.New("at least one talos node is required") } return nil }