Skip to content
This repository was archived by the owner on Jan 9, 2023. It is now read-only.

Commit 3d32f45

Browse files
authored
Merge pull request #495 from dippynark/490-terraform-debug-shell-error
Add Terraform debug shell error when binary version is incompatible
2 parents 6b3c17c + 98264bf commit 3d32f45

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

Gopkg.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/tarmak/terraform.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22
package tarmak
33

44
import (
5+
"bufio"
6+
"bytes"
57
"context"
68
"errors"
79
"fmt"
10+
"os"
11+
"os/exec"
12+
"strings"
813

14+
"github.com/blang/semver"
15+
terraformVersion "github.com/hashicorp/terraform/version"
916
"github.com/jetstack/tarmak/pkg/tarmak/interfaces"
1017
)
1118

@@ -114,6 +121,11 @@ func (t *Tarmak) CmdTerraformDestroy(args []string, ctx context.Context) error {
114121
}
115122

116123
func (t *Tarmak) CmdTerraformShell(args []string) error {
124+
125+
if err := t.verifyTerraformBinaryVersion(); err != nil {
126+
return err
127+
}
128+
117129
if err := t.writeSSHConfigForClusterHosts(); err != nil {
118130
return err
119131
}
@@ -122,6 +134,47 @@ func (t *Tarmak) CmdTerraformShell(args []string) error {
122134
if err != nil {
123135
return err
124136
}
137+
138+
return nil
139+
}
140+
141+
func (t *Tarmak) verifyTerraformBinaryVersion() error {
142+
143+
cmd := exec.Command("terraform", "version")
144+
cmd.Env = os.Environ()
145+
cmdOutput := &bytes.Buffer{}
146+
cmd.Stdout = cmdOutput
147+
148+
err := cmd.Run()
149+
if err != nil {
150+
return fmt.Errorf("failed to run 'terraform version': %s. Please make sure that Terraform is installed", err)
151+
}
152+
153+
reader := bufio.NewReader(cmdOutput)
154+
versionLine, _, err := reader.ReadLine()
155+
if err != nil {
156+
return fmt.Errorf("failed to read 'terraform version' output: %s", err)
157+
}
158+
159+
terraformBinaryVersion := strings.TrimPrefix(string(versionLine), "Terraform v")
160+
terraformVendoredVersion := terraformVersion.Version
161+
162+
terraformBinaryVersionSemver, err := semver.Make(terraformBinaryVersion)
163+
if err != nil {
164+
return fmt.Errorf("failed to parse Terraform binary version: %s", err)
165+
}
166+
terraformVendoredVersionSemver, err := semver.Make(terraformVendoredVersion)
167+
if err != nil {
168+
return fmt.Errorf("failed to parse Terraform vendored version: %s", err)
169+
}
170+
171+
// we need binary version == vendored version
172+
if terraformBinaryVersionSemver.GT(terraformVendoredVersionSemver) {
173+
return fmt.Errorf("Terraform binary version (%s) is greater than vendored version (%s). Please downgrade binary version to %s", terraformBinaryVersion, terraformVendoredVersion, terraformVendoredVersion)
174+
} else if terraformBinaryVersionSemver.LT(terraformVendoredVersionSemver) {
175+
return fmt.Errorf("Terraform binary version (%s) is less than vendored version (%s). Please upgrade binary version to %s", terraformBinaryVersion, terraformVendoredVersion, terraformVendoredVersion)
176+
}
177+
125178
return nil
126179
}
127180

0 commit comments

Comments
 (0)