Skip to content

Commit

Permalink
Update terraform-exec version and consume WorkspaceNew
Browse files Browse the repository at this point in the history
- Update to latest commit of terraform-exec
- Add WorkspaceNew to terraformExec interface
- Convert terraformExec interface to use generated mocks. Update associated tests
- Update TerraformCLI client to consume terraform-exec’s WorkspaceNew() instead of temp hack
  • Loading branch information
lornasong committed Sep 1, 2020
1 parent a0c6794 commit 8578100
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 86 deletions.
49 changes: 12 additions & 37 deletions client/terraform_cli.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package client

import (
"bytes"
"context"
"errors"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"

Expand Down Expand Up @@ -66,12 +63,22 @@ func NewTerraformCLI(config *TerraformCLIConfig) (*TerraformCLI, error) {
return client, nil
}

// Init executes the cli command a `terraform init`
// Init initializes by executing the cli command `terraform init` and
// `terraform workspace new <name>`
func (t *TerraformCLI) Init(ctx context.Context) error {
if err := t.tf.Init(ctx); err != nil {
return err
}
return t.workspaceNew(ctx)

if err := t.tf.WorkspaceNew(ctx, t.workspace); err != nil {
var wsErr *tfexec.ErrWorkspaceExists
if errors.As(err, &wsErr) {
log.Printf("[DEBUG] (client.terraformcli) workspace already exists: '%s'", t.workspace)
return nil
}
return err
}
return nil
}

// Apply executes the cli command `terraform apply` for a given workspace
Expand Down Expand Up @@ -111,38 +118,6 @@ func (t *TerraformCLI) Plan(ctx context.Context) error {
return err
}

// workspaceNew make the `terraform workspace new` cli call. At the time of writing
// terraform-exec package does not support this cli command yet:
// https://github.com/hashicorp/terraform-exec/issues/4
// TODO: revisit this and replace with terraform-exec when ready
// and update TestTerraformCLIInit which is currently being skipped
func (t *TerraformCLI) workspaceNew(ctx context.Context) error {
// the args/env vars mimic the default ones set by terraform-exec
args := []string{"workspace", "new", t.workspace, "-no-color"}
workspaceEnv := fmt.Sprintf("%s=%s", workspaceEnv, t.workspace)
env := []string{workspaceEnv, "TF_IN_AUTOMATION=1", "TF_LOG=", "CHECKPOINT_DISABLE="}

cmd := exec.CommandContext(ctx, t.execPath, args...)
cmd.Env = env
cmd.Dir = t.workingDir

// log out stdout, capture stderr in buffer
cmd.Stdout = os.Stdout
var stderr bytes.Buffer
cmd.Stderr = &stderr

err := cmd.Run()
if err != nil {
errStr := string(stderr.Bytes())
if strings.Contains(errStr, "already exists") {
log.Printf("[DEBUG] (client.terraformcli) workspace already exists: '%s'", t.workspace)
return nil
}
return fmt.Errorf("Error creating workspace %s: %s: %s", t.workspace, err.Error(), errStr)
}
return nil
}

// GoString defines the printable version of this struct.
func (t *TerraformCLI) GoString() string {
if t == nil {
Expand Down
82 changes: 47 additions & 35 deletions client/terraform_cli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,29 @@ package client

import (
"context"
"errors"
"testing"

"github.com/hashicorp/terraform-exec/tfexec"
mocks "github.com/hashicorp/consul-nia/mocks/client"
"github.com/stretchr/testify/assert"
)

var _ terraformExec = (*mockTerraformExec)(nil)

type mockTerraformExec struct{}

func (m *mockTerraformExec) SetEnv(env map[string]string) error {
return nil
}

func (m *mockTerraformExec) Init(ctx context.Context, opts ...tfexec.InitOption) error {
return nil
}
"github.com/stretchr/testify/mock"

func (m *mockTerraformExec) Apply(ctx context.Context, opts ...tfexec.ApplyOption) error {
return nil
}

func (m *mockTerraformExec) Plan(ctx context.Context, opts ...tfexec.PlanOption) (bool, error) {
return true, nil
}
"github.com/hashicorp/terraform-exec/tfexec"
)

func NewTestTerraformCLI(config *TerraformCLIConfig, mock *mockTerraformExec) *TerraformCLI {
if mock == nil {
mock = &mockTerraformExec{}
func NewTestTerraformCLI(config *TerraformCLIConfig, tfMock *mocks.TerraformExec) *TerraformCLI {
if tfMock == nil {
m := new(mocks.TerraformExec)
m.On("SetEnv", mock.Anything).Return(nil)
m.On("Init", mock.Anything).Return(nil)
m.On("Apply", mock.Anything, mock.Anything).Return(nil)
m.On("Plan", mock.Anything).Return(true, nil)
m.On("WorkspaceNew", mock.Anything, mock.Anything).Return(nil)
tfMock = m
}

client := &TerraformCLI{
tf: mock,
tf: tfMock,
logLevel: "INFO",
workingDir: "test/working/dir",
workspace: "test-workspace",
Expand Down Expand Up @@ -108,26 +98,52 @@ func TestNewTerraformCLI(t *testing.T) {
}

func TestTerraformCLIInit(t *testing.T) {
t.Skip("skipping this test until terraform-exec implements WorkspaceNew")
t.Parallel()

cases := []struct {
name string
expectError bool
config *TerraformCLIConfig
tfMock *mockTerraformExec
initErr error
wsErr error
}{
{
"happy path",
false,
&TerraformCLIConfig{},
&mockTerraformExec{},
nil,
nil,
},
{
"init err",
true,
&TerraformCLIConfig{},
errors.New("init error"),
nil,
},
{
"workspace-new error: unknown error",
true,
&TerraformCLIConfig{},
nil,
errors.New("workspace-new error"),
},
{
"workspace-new: already exists",
false,
&TerraformCLIConfig{},
nil,
&tfexec.ErrWorkspaceExists{Name: "workspace-name"},
},
}

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
client := NewTestTerraformCLI(tc.config, tc.tfMock)
m := new(mocks.TerraformExec)
m.On("Init", mock.Anything).Return(tc.initErr)
m.On("WorkspaceNew", mock.Anything, mock.Anything).Return(tc.wsErr)

client := NewTestTerraformCLI(tc.config, m)
ctx := context.Background()
err := client.Init(ctx)

Expand All @@ -148,19 +164,17 @@ func TestTerraformCLIApply(t *testing.T) {
name string
expectError bool
config *TerraformCLIConfig
tfMock *mockTerraformExec
}{
{
"happy path",
false,
&TerraformCLIConfig{},
&mockTerraformExec{},
},
}

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
client := NewTestTerraformCLI(tc.config, tc.tfMock)
client := NewTestTerraformCLI(tc.config, nil)
ctx := context.Background()
err := client.Apply(ctx)

Expand All @@ -181,19 +195,17 @@ func TestTerraformCLIPlan(t *testing.T) {
name string
expectError bool
config *TerraformCLIConfig
tfMock *mockTerraformExec
}{
{
"happy path",
false,
&TerraformCLIConfig{},
&mockTerraformExec{},
},
}

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
client := NewTestTerraformCLI(tc.config, tc.tfMock)
client := NewTestTerraformCLI(tc.config, nil)
ctx := context.Background()
err := client.Plan(ctx)

Expand Down
3 changes: 3 additions & 0 deletions client/terraform_exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"github.com/hashicorp/terraform-exec/tfexec"
)

//go:generate mockery --name=terraformExec --structname=TerraformExec --output=../mocks/client

var _ terraformExec = (*tfexec.Terraform)(nil)

// terraformExec describes the interface for terraform-exec, the SDK for
Expand All @@ -15,4 +17,5 @@ type terraformExec interface {
Init(ctx context.Context, opts ...tfexec.InitOption) error
Apply(ctx context.Context, opts ...tfexec.ApplyOption) error
Plan(ctx context.Context, opts ...tfexec.PlanOption) (bool, error)
WorkspaceNew(ctx context.Context, workspace string, opts ...tfexec.WorkspaceNewCmdOption) error
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (
github.com/hashicorp/hcl/v2 v2.6.0
github.com/hashicorp/logutils v1.0.0
github.com/hashicorp/terraform v0.12.29
github.com/hashicorp/terraform-exec v0.8.0
github.com/hashicorp/terraform-exec v0.8.1-0.20200901123641-821c81e9f771
github.com/mitchellh/mapstructure v1.3.3
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.5.1
Expand Down
15 changes: 2 additions & 13 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -519,10 +519,8 @@ github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN
github.com/hashicorp/terraform v0.12.29 h1:UkuApT6qh6KONIT1Jz7HoV8f4B+x71db3bmGcBzjBB0=
github.com/hashicorp/terraform v0.12.29/go.mod h1:CBxNAiTW0pLap44/3GU4j7cYE2bMhkKZNlHPcr4P55U=
github.com/hashicorp/terraform-config-inspect v0.0.0-20191212124732-c6ae6269b9d7/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A=
github.com/hashicorp/terraform-exec v0.6.0 h1:M8S/Cs2rej7CiMsnf3OzKHHeyMWstAYzuqgMXPFyrUk=
github.com/hashicorp/terraform-exec v0.6.0/go.mod h1:fkVMi6NCKxBbnGaOgn5el3BnkZVatoFR+kfURdI+3YM=
github.com/hashicorp/terraform-exec v0.8.0 h1:JCJrJ3uWqZOd7FjaIx1iJTFnnoLmrG+SMLH4W+IgT0w=
github.com/hashicorp/terraform-exec v0.8.0/go.mod h1:dJpYMpKgtALCt3NG1lnQWXABqpGlEzVakO4IgXc+YO4=
github.com/hashicorp/terraform-exec v0.8.1-0.20200901123641-821c81e9f771 h1:o5xNUwDuyEFXYj9D5rDKLJN/ToFTOA9caxpEc8AJdds=
github.com/hashicorp/terraform-exec v0.8.1-0.20200901123641-821c81e9f771/go.mod h1:dJpYMpKgtALCt3NG1lnQWXABqpGlEzVakO4IgXc+YO4=
github.com/hashicorp/terraform-json v0.5.0 h1:7TV3/F3y7QVSuN4r9BEXqnWqrAyeOtON8f0wvREtyzs=
github.com/hashicorp/terraform-json v0.5.0/go.mod h1:eAbqb4w0pSlRmdvl8fOyHAi/+8jnkVYN28gJkSJrLhU=
github.com/hashicorp/terraform-svchost v0.0.0-20191011084731-65d371908596/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg=
Expand Down Expand Up @@ -847,7 +845,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
Expand Down Expand Up @@ -900,7 +897,6 @@ go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
Expand Down Expand Up @@ -1004,7 +1000,6 @@ golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
Expand All @@ -1021,7 +1016,6 @@ golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
Expand Down Expand Up @@ -1081,7 +1075,6 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down Expand Up @@ -1166,7 +1159,6 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt
google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
Expand All @@ -1183,7 +1175,6 @@ google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
Expand All @@ -1199,7 +1190,6 @@ google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRn
google.golang.org/genproto v0.0.0-20190513181449-d00d292a067c/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
Expand Down Expand Up @@ -1236,7 +1226,6 @@ google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
Expand Down
Loading

0 comments on commit 8578100

Please sign in to comment.