From b6aa4631f19f4bae4cfce580a5d89cfa5447ae52 Mon Sep 17 00:00:00 2001 From: shreyas-goenka <88374338+shreyas-goenka@users.noreply.github.com> Date: Thu, 2 Nov 2023 12:00:30 +0100 Subject: [PATCH] Fix metadata computation for empty bundle (#939) ## Changes This PR fixes metadata computation for empty bundle. Before we would error because the `terraform.Load()` mutator errors on a empty / no state file. ## Tests Failing integration tests now pass. --- bundle/deploy/terraform/convert.go | 5 +++++ bundle/deploy/terraform/load.go | 22 ++++++++++++++++------ bundle/deploy/terraform/load_test.go | 2 +- cmd/bundle/run.go | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bundle/deploy/terraform/convert.go b/bundle/deploy/terraform/convert.go index 3bfc8b83..71385881 100644 --- a/bundle/deploy/terraform/convert.go +++ b/bundle/deploy/terraform/convert.go @@ -213,6 +213,11 @@ func BundleToTerraform(config *config.Root) *schema.Root { } func TerraformToBundle(state *tfjson.State, config *config.Root) error { + // This is a no-op if the state is empty. + if state.Values == nil || state.Values.RootModule == nil { + return nil + } + for _, resource := range state.Values.RootModule.Resources { // Limit to resources. if resource.Mode != tfjson.ManagedResourceMode { diff --git a/bundle/deploy/terraform/load.go b/bundle/deploy/terraform/load.go index 9fd68884..624bf7a5 100644 --- a/bundle/deploy/terraform/load.go +++ b/bundle/deploy/terraform/load.go @@ -3,13 +3,20 @@ package terraform import ( "context" "fmt" + "slices" "github.com/databricks/cli/bundle" "github.com/hashicorp/terraform-exec/tfexec" tfjson "github.com/hashicorp/terraform-json" ) -type load struct{} +type loadMode int + +const ErrorOnEmptyState loadMode = 0 + +type load struct { + modes []loadMode +} func (l *load) Name() string { return "terraform.Load" @@ -31,7 +38,7 @@ func (l *load) Apply(ctx context.Context, b *bundle.Bundle) error { return err } - err = ValidateState(state) + err = l.validateState(state) if err != nil { return err } @@ -45,9 +52,12 @@ func (l *load) Apply(ctx context.Context, b *bundle.Bundle) error { return nil } -func ValidateState(state *tfjson.State) error { +func (l *load) validateState(state *tfjson.State) error { if state.Values == nil { - return fmt.Errorf("no deployment state. Did you forget to run 'databricks bundle deploy'?") + if slices.Contains(l.modes, ErrorOnEmptyState) { + return fmt.Errorf("no deployment state. Did you forget to run 'databricks bundle deploy'?") + } + return nil } if state.Values.RootModule == nil { @@ -57,6 +67,6 @@ func ValidateState(state *tfjson.State) error { return nil } -func Load() bundle.Mutator { - return &load{} +func Load(modes ...loadMode) bundle.Mutator { + return &load{modes: modes} } diff --git a/bundle/deploy/terraform/load_test.go b/bundle/deploy/terraform/load_test.go index 1937ca8a..aeaffa14 100644 --- a/bundle/deploy/terraform/load_test.go +++ b/bundle/deploy/terraform/load_test.go @@ -34,7 +34,7 @@ func TestLoadWithNoState(t *testing.T) { err = bundle.Apply(context.Background(), b, bundle.Seq( Initialize(), - Load(), + Load(ErrorOnEmptyState), )) require.ErrorContains(t, err, "Did you forget to run 'databricks bundle deploy'") diff --git a/cmd/bundle/run.go b/cmd/bundle/run.go index b5a60ee1..b2766b20 100644 --- a/cmd/bundle/run.go +++ b/cmd/bundle/run.go @@ -38,7 +38,7 @@ func newRunCommand() *cobra.Command { terraform.Interpolate(), terraform.Write(), terraform.StatePull(), - terraform.Load(), + terraform.Load(terraform.ErrorOnEmptyState), )) if err != nil { return err