8000 feat: load variables from tfvars files by mtojek · Pull Request #11549 · coder/coder · GitHub
[go: up one dir, main page]

Skip to content

feat: load variables from tfvars files #11549

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jan 12, 2024
Prev Previous commit
Next Next commit
Consider stdin
  • Loading branch information
mtojek committed Jan 10, 2024
commit 9076dd699cd1023a26f14ada5970e6feb93f1c48
6 changes: 6 additions & 0 deletions cli/templatecreate.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ func (r *RootCmd) templateCreate() *c 10000 libase.Cmd {

message := uploadFlags.templateMessage(inv)

varsFiles, err := DiscoverVarsFiles(uploadFlags.stdin(), uploadFlags.directory)
if err != nil {
return err
}

// Confirm upload of the directory.
resp, err := uploadFlags.upload(inv, client)
if err != nil {
Expand All @@ -119,6 +124,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
}

userVariableValues, err := ParseUserVariableValues(
varsFiles,
variablesFile,
commandLineVariables)
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions cli/templatepush.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ func (r *RootCmd) templatePush() *clibase.Cmd {

message := uploadFlags.templateMessage(inv)

varsFiles, err := DiscoverVarsFiles(uploadFlags.stdin(), uploadFlags.directory)
if err != nil {
return err
}

resp, err := uploadFlags.upload(inv, client)
if err != nil {
return err
Expand All @@ -89,6 +94,7 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
}

userVariableValues, err := ParseUserVariableValues(
varsFiles,
variablesFile,
commandLineVariables)
if err != nil {
Expand Down
62 changes: 30 additions & 32 deletions cli/templatevariables.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,50 +11,29 @@ import (
"github.com/coder/coder/v2/codersdk"
)

func ParseUserVariableValues(workDir string, variablesFile string, commandLineVariables []string) ([]codersdk.VariableValue, error) {
varsFiles, err := discoverVarsFiles(workDir)
if err != nil {
return nil, err
}

fromVars, err := parseTerraformVarsFromFiles(varsFiles)
if err != nil {
return nil, err
}

fromFile, err := parseVariableValuesFromFile(variablesFile)
if err != nil {
return nil, err
}

fromCommandLine, err := parseVariableValuesFromCommandLine(commandLineVariables)
if err != nil {
return nil, err
}

return combineVariableValues(fromVars, fromFile, fromCommandLine), nil
}

/**
* discoverVarsFiles function loads vars files in a predefined order:
* DiscoverVarsFiles function loads vars files in a predefined order:
* 1. terraform.tfvars
* 2. terraform.tfvars.json
* 3. *.auto.tfvars
* 4. *.auto.tfvars.json
*/
func discoverVarsFiles(workDir string) ([]string, error) {
func DiscoverVarsFiles(stdin bool, workDir string) ([]string, error) {
var found []string
if stdin {
return found, nil // it is not possible to define multiple files in the stdin mode
}

fi, err := os.Stat(filepath.Join(workDir, "terraform.tfvars"))
if err == nil {
found = append(found, fi.Name())
found = append(found, filepath.Join(workDir, fi.Name()))
} else if !os.IsNotExist(err) {
return nil, err
}

fi, err = os.Stat(filepath.Join(workDir, "terraform.tfvars.json"))
if err == nil {
found = append(found, fi.Name())
found = append(found, filepath.Join(workDir, fi.Name()))
} else if !os.IsNotExist(err) {
return nil, err
}
Expand All @@ -66,21 +45,40 @@ func discoverVarsFiles(workDir string) ([]string, error) {

for _, dirEntry := range dirEntries {
if strings.HasSuffix(dirEntry.Name(), ".auto.tfvars") || strings.HasSuffix(dirEntry.Name(), ".auto.tfvars.json") {
found = append(found, dirEntry.Name())
found = append(found, filepath.Join(workDir, dirEntry.Name()))
}
}
return found, nil
}

func parseTerraformVarsFromFiles(varsFiles []string) ([]codersdk.VariableValue, error) {
func ParseUserVariableValues(varsFiles []string, variablesFile string, commandLineVariables []string) ([]codersdk.VariableValue, error) {
fromVars, err := parseVariableValuesFromVarsFiles(varsFiles)
if err != nil {
return nil, err
}

fromFile, err := parseVariableValuesFromFile(variablesFile)
if err != nil {
return nil, err
}

fromCommandLine, err := parseVariableValuesFromCommandLine(commandLineVariables)
if err != nil {
return nil, err
}

return combineVariableValues(fromVars, fromFile, fromCommandLine), nil
}

func parseVariableValuesFromVarsFiles(varsFiles []string) ([]codersdk.VariableValue, error) {
panic("not implemented yet")
}

func parseTerraformVarsFromHCL(hcl string) ([]codersdk.VariableValue, error) {
func parseVariableValuesFromHCL(hcl string) ([]codersdk.VariableValue, error) {
panic("not implemented yet")
}

func parseTerraformVarsFromJSON(json string) ([]codersdk.VariableValue, error) {
func parseVariableValuesFromJSON(json string) ([]codersdk.VariableValue, error) {
panic("not implemented yet")
}

Expand Down
0