From ceefb39d615a125d52732a6914a55626ef4e0777 Mon Sep 17 00:00:00 2001 From: "marcin.suterski" Date: Mon, 8 May 2017 11:40:14 -0400 Subject: [PATCH] Add init command for TF 0.9.x --- main.go | 11 +++++++---- plugin.go | 58 +++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/main.go b/main.go index 6f609e0..0ab0b30 100644 --- a/main.go +++ b/main.go @@ -29,9 +29,9 @@ func main() { EnvVar: "PLUGIN_PLAN", }, cli.StringFlag{ - Name: "remote", - Usage: "contains the configuration for the Terraform remote state tracking", - EnvVar: "PLUGIN_REMOTE", + Name: "init_options", + Usage: "options for the init command. See https://www.terraform.io/docs/commands/init.html", + EnvVar: "PLUGIN_INIT_OPTIONS", }, cli.StringFlag{ Name: "vars", @@ -111,12 +111,15 @@ func run(c *cli.Context) error { } } + initOptions := InitOptions{} + json.Unmarshal([]byte(c.String("init_options")), &initOptions) + plugin := Plugin{ Config: Config{ - Remote: remote, Plan: c.Bool("plan"), Vars: vars, Secrets: secrets, + InitOptions: initOptions, Cacert: c.String("ca_cert"), Sensitive: c.Bool("sensitive"), RoleARN: c.String("role_arn_to_assume"), diff --git a/plugin.go b/plugin.go index b90d39e..49fdd5e 100644 --- a/plugin.go +++ b/plugin.go @@ -2,24 +2,25 @@ package main import ( "fmt" - "github.com/Sirupsen/logrus" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/sts" "io/ioutil" "os" "os/exec" "strings" "time" + + "github.com/Sirupsen/logrus" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/credentials/stscreds" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/sts" ) type ( Config struct { - Remote Remote Plan bool Vars map[string]string Secrets map[string]string + InitOptions InitOptions Cacert string Sensitive bool RoleARN string @@ -33,6 +34,12 @@ type ( Config map[string]string `json:"config"` } + InitOptions struct { + BackendConfig string `json:"backend_config"` + Lock *bool `json:"lock_state"` + LockTimeout string `json:"lock_timeout"` + } + Plugin struct { Config Config } @@ -49,14 +56,14 @@ func (p Plugin) Exec() error { exportSecrets(p.Config.Secrets) } - remote := p.Config.Remote if p.Config.Cacert != "" { commands = append(commands, installCaCert(p.Config.Cacert)) } - if remote.Backend != "" { - commands = append(commands, deleteCache()) - commands = append(commands, remoteConfigCommand(remote)) - } + + commands = append(commands, deleteCache()) + + commands = append(commands, initCommand(p.Config.InitOptions)) + commands = append(commands, getModules()) commands = append(commands, validateCommand()) commands = append(commands, planCommand(p.Config.Vars, p.Config.Secrets, p.Config.Parallelism, p.Config.Targets)) @@ -81,6 +88,10 @@ func (p Plugin) Exec() error { trace(c) } + logrus.WithFields(logrus.Fields{ + "command": c.Args, + }).Debug("Running") + err := c.Run() if err != nil { logrus.WithFields(logrus.Fields{ @@ -114,15 +125,28 @@ func deleteCache() *exec.Cmd { ) } -func remoteConfigCommand(config Remote) *exec.Cmd { +func initCommand(config InitOptions) *exec.Cmd { args := []string{ - "remote", - "config", - fmt.Sprintf("-backend=%s", config.Backend), + "init", } - for k, v := range config.Config { - args = append(args, fmt.Sprintf("-backend-config=%s=%s", k, v)) + + if config.BackendConfig != "" { + args = append(args, fmt.Sprintf("-backend-config=%s", config.BackendConfig)) } + + // Fasle is default + if config.Lock != nil { + args = append(args, fmt.Sprintf("-lock=%t", *config.Lock)) + } + + // "0s" is default + if config.LockTimeout != "" { + args = append(args, fmt.Sprintf("-lock-timeout=%s", config.LockTimeout)) + } + + // Fail Terraform execution on prompt + args = append(args, "-input=false") + return exec.Command( "terraform", args...,