tfvars-atlantis-config/repocfg/repocfg.go
2024-02-26 12:44:50 +00:00

100 lines
2.5 KiB
Go

package repocfg
import (
"fmt"
"github.com/runatlantis/atlantis/server/core/config/raw"
"gopkg.in/yaml.v2"
)
var ErrNoExistingConfig = fmt.Errorf("no existing config found")
// Options represents the top-level configuration for a new Atlantis RepoCfg
type Options struct {
Automerge bool
Autoplan bool
DefaultTerraformVersion string
Parallel bool
MultiEnv bool
UseWorkspaces bool
}
// Component represents a Terraform component and its associated Terraform variable files
type Component struct {
Path string
VarFiles []string
}
// ExtRawRepoCfg is an embedded type for a raw.RepoCfg
type ExtRawRepoCfg struct {
raw.RepoCfg `yaml:",inline"`
}
// NewRepoCfg returns a new Atlantis RepoCfg from a slice of components
// and options.
//
// Reference: https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html
func NewRepoCfg(components []Component, opts Options) (*ExtRawRepoCfg, error) {
repoCfg := &ExtRawRepoCfg{
RepoCfg: raw.RepoCfg{
Version: ptr(3),
Automerge: &opts.Automerge,
ParallelPlan: &opts.Parallel,
ParallelApply: &opts.Parallel,
},
}
var projects []raw.Project
for _, c := range components {
generated, err := ProjectsFrom(c, opts)
if err != nil {
return nil, fmt.Errorf("failed while creating projects with component %+v: %w", c, err)
}
for _, p := range generated {
projects = append(projects, p.Project)
}
}
repoCfg.Projects = append(repoCfg.Projects, projects...)
workflows := map[string]raw.Workflow{}
for _, c := range components {
generated, err := WorkflowsFrom(c, opts)
if err != nil {
return nil, fmt.Errorf("failed while creating workflows with component %+v: %w", c, err)
}
for _, wf := range generated {
workflows[wf.Name] = wf.Workflow
}
}
repoCfg.Workflows = workflows
return repoCfg, nil
}
func (rc *ExtRawRepoCfg) MarshalYAML() (interface{}, error) {
m := yaml.MapSlice{
{Key: "version", Value: rc.Version},
{Key: "automerge", Value: rc.Automerge},
{Key: "parallel_plan", Value: rc.ParallelPlan},
{Key: "parallel_apply", Value: rc.ParallelApply},
{Key: "projects", Value: rc.Projects},
}
workflows := yaml.MapSlice{}
for name, wf := range rc.Workflows {
workflows = append(workflows, yaml.MapItem{
Key: name,
Value: yaml.MapSlice{
{Key: "plan", Value: wf.Plan},
{Key: "apply", Value: wf.Apply},
},
})
}
m = append(m, yaml.MapItem{Key: "workflows", Value: workflows})
return m, nil
}