diff --git a/DOCS.md b/DOCS.md index 93c63e8..5344204 100644 --- a/DOCS.md +++ b/DOCS.md @@ -8,7 +8,7 @@ logo: terraform.svg image: quay.io/agari/agari-drone-terraform --- -The Terraform plugin applies the infrastructure configuration contained within the repository. The below pipeline configuration demonstrates simple usage which will run a `validate`, `plan` and `apply`: +The Terraform plugin applies the infrastructure configuration contained within the repository. The below pipeline configuration demonstrates simple usage which will run a `validate`, `show`, `plan` and `apply`: ```yaml pipeline: @@ -33,9 +33,12 @@ Example of explicitly specifying `actions` to perform a dry run. pipeline: terraform: image: quay.io/agari/agari-drone-terraform:5 + planfile: "../planshare.out" + difffile: "../diff.out" + actions: + - validate + - plan ++ - show ``` Example configuration passing secrets to terraform. Please read diff --git a/main.go b/main.go index 62347f0..966c474 100644 --- a/main.go +++ b/main.go @@ -27,7 +27,7 @@ func main() { Name: "actions", Usage: "a list of actions to have terraform perform", EnvVar: "PLUGIN_ACTIONS", - Value: &cli.StringSlice{"validate", "plan", "apply"}, + Value: &cli.StringSlice{"validate", "plan", "show", "apply"}, }, cli.StringFlag{ Name: "ca_cert", @@ -43,6 +43,11 @@ func main() { Usage: "The absolute path to save the outfile eg: /tmp/myplan.tfout", EnvVar: "PLUGIN_PLANFILE", }, + cli.StringFlag{ + Name: "difffile", + Usage: "The absolute path to save the diff file to eg: /tmp/myplan.diff", + EnvVar: "PLUGIN_DIFFFILE", + }, cli.StringFlag{ Name: "init_options", Usage: "options for the init command. See https://www.terraform.io/docs/commands/init.html", @@ -152,6 +157,7 @@ func run(c *cli.Context) error { RootDir: c.String("root_dir"), Parallelism: c.Int("parallelism"), Planfile: c.String("planfile"), + Difffile: c.String("difffile"), Targets: c.StringSlice("targets"), VarFiles: c.StringSlice("var_files"), }, diff --git a/plugin.go b/plugin.go index 7d7d5fc..bc47394 100644 --- a/plugin.go +++ b/plugin.go @@ -29,6 +29,7 @@ type ( Sensitive bool RoleARN string Planfile string + Difffile string RootDir string Parallelism int Targets []string @@ -135,10 +136,12 @@ func (p Plugin) Exec() error { commands = append(commands, tfPlan(p.Config, true)) case "apply": commands = append(commands, tfApply(p.Config)) + case "show": + commands = append(commands, tfShow(p.Config)) case "destroy": commands = append(commands, tfDestroy(p.Config)) default: - return fmt.Errorf("valid actions are: validate, plan, apply, plan-destroy, destroy. You provided %s", action) + return fmt.Errorf("valid actions are: validate, plan, show, apply, plan-destroy, destroy. You provided %s", action) } } @@ -259,6 +262,20 @@ func trace(cmd *exec.Cmd) { fmt.Println("$", strings.Join(cmd.Args, " ")) } +func tfShow(config Config) *exec.Cmd { + args := []string{ + "show", + "-no-color", + } + if config.Difffile != "" { + args = append(args, config.Difffile) + } + return exec.Command( + "terraform", + args..., + ) +} + func tfApply(config Config) *exec.Cmd { args := []string{ "apply", diff --git a/plugin_test.go b/plugin_test.go index 431bb7f..d005bcc 100644 --- a/plugin_test.go +++ b/plugin_test.go @@ -27,6 +27,34 @@ func TestPlugin(t *testing.T) { }) }) + g.Describe("tfShow", func() { + g.It("Should return correct apply commands given the arguments", func() { + type args struct { + config Config + } + + tests := []struct { + name string + args args + want *exec.Cmd + }{ + { + "default", + args{config: Config{}}, + exec.Command("terraform", "show", "-no-color"), + }, + { + "with planfile", + args{config: Config{Difffile: "/tmp/plan.tfout"}}, + exec.Command("terraform", "show", "-no-color", "/tmp/plan.tfout"), + }, + } + for _, tt := range tests { + g.Assert(tfShow(tt.args.config)).Equal(tt.want) + } + }) + }) + g.Describe("tfApply", func() { g.It("Should return correct apply commands given the arguments", func() { type args struct {