From c29ac38ee223eb20076fefd2748675389708cc08 Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Tue, 7 Feb 2023 16:24:49 +0100 Subject: [PATCH 1/6] Ignore Go workspace files Relative paths in the go.work file are likely machine specific and won't work on other systems. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1521c8b7..1bfef83a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ dist +go.work* \ No newline at end of file From 56e052e9baedc49f6cb886e5699fc3b667462ec5 Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Tue, 7 Feb 2023 17:42:25 +0100 Subject: [PATCH 2/6] Add `metadata functions -json` command --- tfexec/metadata_functions.go | 39 ++++++++++++++++++++++++++++++++++++ tfexec/version.go | 1 + 2 files changed, 40 insertions(+) create mode 100644 tfexec/metadata_functions.go diff --git a/tfexec/metadata_functions.go b/tfexec/metadata_functions.go new file mode 100644 index 00000000..eee7809f --- /dev/null +++ b/tfexec/metadata_functions.go @@ -0,0 +1,39 @@ +package tfexec + +import ( + "context" + "fmt" + "os/exec" + + tfjson "github.com/hashicorp/terraform-json" +) + +// MetadataFunctions represents the terraform metadata functions -json subcommand. +func (tf *Terraform) MetadataFunctions(ctx context.Context) (*tfjson.MetadataFunctions, error) { + err := tf.compatible(ctx, tf1_4_0, nil) + if err != nil { + return nil, fmt.Errorf("terraform metadata functions was added in 1.4.0: %w", err) + } + + functionsCmd := tf.metadataFunctionsCmd(ctx) + + var ret tfjson.MetadataFunctions + err = tf.runTerraformCmdJSON(ctx, functionsCmd, &ret) + if err != nil { + return nil, err + } + + err = ret.Validate() + if err != nil { + return nil, err + } + + return &ret, nil +} + +func (tf *Terraform) metadataFunctionsCmd(ctx context.Context, args ...string) *exec.Cmd { + allArgs := []string{"metadata", "functions", "-json"} + allArgs = append(allArgs, args...) + + return tf.buildTerraformCmd(ctx, nil, allArgs...) +} diff --git a/tfexec/version.go b/tfexec/version.go index 37825b53..a2e97368 100644 --- a/tfexec/version.go +++ b/tfexec/version.go @@ -27,6 +27,7 @@ var ( tf0_15_2 = version.Must(version.NewVersion("0.15.2")) tf0_15_3 = version.Must(version.NewVersion("0.15.3")) tf1_1_0 = version.Must(version.NewVersion("1.1.0")) + tf1_4_0 = version.Must(version.NewVersion("1.4.0")) ) // Version returns structured output from the terraform version command including both the Terraform CLI version From d4499281a9ad697ef9ef11d1dc07e2f73de37256 Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Tue, 7 Feb 2023 17:43:43 +0100 Subject: [PATCH 3/6] Add metadata functions unit test --- tfexec/metadata_functions_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tfexec/metadata_functions_test.go diff --git a/tfexec/metadata_functions_test.go b/tfexec/metadata_functions_test.go new file mode 100644 index 00000000..c259d7ec --- /dev/null +++ b/tfexec/metadata_functions_test.go @@ -0,0 +1,29 @@ +package tfexec + +import ( + "context" + "testing" + + "github.com/hashicorp/terraform-exec/tfexec/internal/testutil" +) + +func TestMetadataFunctionsCmd(t *testing.T) { + td := t.TempDir() + + tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1_1)) + // tf, err := NewTerraform(td, tfVersion(t, testutil.Latest_v1_4)) // TODO! enable after 1.4 release + if err != nil { + t.Fatal(err) + } + + // empty env, to avoid environ mismatch in testing + tf.SetEnv(map[string]string{}) + + functionsCmd := tf.metadataFunctionsCmd(context.Background()) + + assertCmd(t, []string{ + "metadata", + "functions", + "-json", + }, nil, functionsCmd) +} From bb68e3a495186ecb751447ea4a84a67872a5421a Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Tue, 14 Feb 2023 18:04:44 +0100 Subject: [PATCH 4/6] Add e2e test --- .../e2etest/metadata_functions_test.go | 23 +++++++++++++++++++ tfexec/internal/e2etest/util_test.go | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 tfexec/internal/e2etest/metadata_functions_test.go diff --git a/tfexec/internal/e2etest/metadata_functions_test.go b/tfexec/internal/e2etest/metadata_functions_test.go new file mode 100644 index 00000000..f8610a69 --- /dev/null +++ b/tfexec/internal/e2etest/metadata_functions_test.go @@ -0,0 +1,23 @@ +package e2etest + +import ( + "context" + "testing" + + "github.com/hashicorp/go-version" + + "github.com/hashicorp/terraform-exec/tfexec" +) + +func TestMetadataFunctions(t *testing.T) { + runTest(t, "basic", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) { + if tfv.LessThan(metadataFunctionsMinVersion) { + t.Skip("metadata functions command is not available in this Terraform version") + } + + _, err := tf.MetadataFunctions(context.Background()) + if err != nil { + t.Fatalf("error running MetadataFunctions: %s", err) + } + }) +} diff --git a/tfexec/internal/e2etest/util_test.go b/tfexec/internal/e2etest/util_test.go index 66800d57..01fd25a9 100644 --- a/tfexec/internal/e2etest/util_test.go +++ b/tfexec/internal/e2etest/util_test.go @@ -24,6 +24,8 @@ var ( showMinVersion = version.Must(version.NewVersion("0.12.0")) providerAddressMinVersion = version.Must(version.NewVersion("0.13.0")) + + metadataFunctionsMinVersion = version.Must(version.NewVersion("1.4.0")) ) func runTest(t *testing.T, fixtureName string, cb func(t *testing.T, tfVersion *version.Version, tf *tfexec.Terraform)) { From 026374d61596fa77ed6945bf3a4e61b9908272a8 Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Wed, 15 Feb 2023 18:55:42 +0100 Subject: [PATCH 5/6] Update tfexec/metadata_functions.go Co-authored-by: Radek Simko --- tfexec/metadata_functions.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tfexec/metadata_functions.go b/tfexec/metadata_functions.go index eee7809f..ca0e8aaf 100644 --- a/tfexec/metadata_functions.go +++ b/tfexec/metadata_functions.go @@ -23,10 +23,6 @@ func (tf *Terraform) MetadataFunctions(ctx context.Context) (*tfjson.MetadataFun return nil, err } - err = ret.Validate() - if err != nil { - return nil, err - } return &ret, nil } From 24a8d73e7746e483ffeb5a62f3f940df0a747a5e Mon Sep 17 00:00:00 2001 From: Daniel Banck Date: Wed, 15 Feb 2023 18:57:11 +0100 Subject: [PATCH 6/6] Remove newline --- tfexec/metadata_functions.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tfexec/metadata_functions.go b/tfexec/metadata_functions.go index ca0e8aaf..4577e062 100644 --- a/tfexec/metadata_functions.go +++ b/tfexec/metadata_functions.go @@ -23,7 +23,6 @@ func (tf *Terraform) MetadataFunctions(ctx context.Context) (*tfjson.MetadataFun return nil, err } - return &ret, nil }