From a84021e40d50f955186e6486fd06e497505511b1 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Wed, 21 Oct 2020 09:05:22 +0900 Subject: [PATCH] Try recovering from panics to make the provider more reliable --- pkg/helmfile/provider.go | 2 +- pkg/helmfile/resource_release.go | 46 ++++++++++++++++++++++++---- pkg/helmfile/resource_release_set.go | 43 ++++++++++++++++++++++---- 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/pkg/helmfile/provider.go b/pkg/helmfile/provider.go index 531e22a..80ef451 100644 --- a/pkg/helmfile/provider.go +++ b/pkg/helmfile/provider.go @@ -22,7 +22,7 @@ func Provider() terraform.ResourceProvider { }, }, ResourcesMap: map[string]*schema.Resource{ - "helmfile_release_set": resourceShellHelmfileReleaseSet(), + "helmfile_release_set": resourceHelmfileReleaseSet(), "helmfile_release": resourceHelmfileRelease(), "helmfile_embedding_example": resourceHelmfileEmbeddingExample(), }, diff --git a/pkg/helmfile/resource_release.go b/pkg/helmfile/resource_release.go index 88320d5..308fccc 100644 --- a/pkg/helmfile/resource_release.go +++ b/pkg/helmfile/resource_release.go @@ -5,7 +5,9 @@ import ( "encoding/json" "fmt" "github.com/rs/xid" + "golang.org/x/xerrors" "io/ioutil" + "runtime/debug" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) @@ -150,7 +152,13 @@ func resourceHelmfileRelease() *schema.Resource { } //helpers to unwravel the recursive bits by adding a base condition -func resourceHelmfileReleaseCreate(d *schema.ResourceData, meta interface{}) error { +func resourceHelmfileReleaseCreate(d *schema.ResourceData, _ interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + rs, err := NewReleaseSetWithSingleRelease(d) if err != nil { return err @@ -168,7 +176,13 @@ func resourceHelmfileReleaseCreate(d *schema.ResourceData, meta interface{}) err return nil } -func resourceHelmfileReleaseRead(d *schema.ResourceData, meta interface{}) error { +func resourceHelmfileReleaseRead(d *schema.ResourceData, _ interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + rs, err := NewReleaseSetWithSingleRelease(d) if err != nil { return err @@ -177,7 +191,13 @@ func resourceHelmfileReleaseRead(d *schema.ResourceData, meta interface{}) error return ReadReleaseSet(rs, d) } -func resourceHelmfileReleaseUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceHelmfileReleaseUpdate(d *schema.ResourceData, _ interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + rs, err := NewReleaseSetWithSingleRelease(d) if err != nil { return err @@ -186,7 +206,13 @@ func resourceHelmfileReleaseUpdate(d *schema.ResourceData, meta interface{}) err return UpdateReleaseSet(rs, d) } -func resourceHelmfileReleaseDiff(d *schema.ResourceDiff, meta interface{}) error { +func resourceHelmfileReleaseDiff(d *schema.ResourceDiff, _ interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + rs, err := NewReleaseSetWithSingleRelease(d) if err != nil { return err @@ -198,13 +224,21 @@ func resourceHelmfileReleaseDiff(d *schema.ResourceDiff, meta interface{}) error } if diff != "" { - d.SetNewComputed(KeyApplyOutput) + if err := d.SetNewComputed(KeyApplyOutput); err != nil { + return xerrors.Errorf("setting new computed %s: %w", KeyApplyOutput, err) + } } return nil } -func resourceHelmfileReleaseDelete(d *schema.ResourceData, meta interface{}) error { +func resourceHelmfileReleaseDelete(d *schema.ResourceData, _ interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + rs, err := NewReleaseSetWithSingleRelease(d) if err != nil { return err diff --git a/pkg/helmfile/resource_release_set.go b/pkg/helmfile/resource_release_set.go index 5b278e7..6c9cfd0 100644 --- a/pkg/helmfile/resource_release_set.go +++ b/pkg/helmfile/resource_release_set.go @@ -6,6 +6,7 @@ import ( "github.com/rs/xid" "log" "os" + "runtime/debug" "strings" ) @@ -142,7 +143,7 @@ var ReleaseSetSchema = map[string]*schema.Schema{ }, } -func resourceShellHelmfileReleaseSet() *schema.Resource { +func resourceHelmfileReleaseSet() *schema.Resource { return &schema.Resource{ Create: resourceReleaseSetCreate, Delete: resourceReleaseSetDelete, @@ -157,7 +158,13 @@ func resourceShellHelmfileReleaseSet() *schema.Resource { } //helpers to unwravel the recursive bits by adding a base condition -func resourceReleaseSetCreate(d *schema.ResourceData, meta interface{}) error { +func resourceReleaseSetCreate(d *schema.ResourceData, meta interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + fs, err := NewReleaseSet(d) if err != nil { return err @@ -181,7 +188,13 @@ func newId() string { return id } -func resourceReleaseSetRead(d *schema.ResourceData, meta interface{}) error { +func resourceReleaseSetRead(d *schema.ResourceData, meta interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + fs, err := NewReleaseSet(d) if err != nil { return err @@ -194,7 +207,13 @@ func resourceReleaseSetRead(d *schema.ResourceData, meta interface{}) error { return nil } -func resourceReleaseSetDiff(d *schema.ResourceDiff, meta interface{}) error { +func resourceReleaseSetDiff(d *schema.ResourceDiff, meta interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + old, new := d.GetChange(KeyWorkingDirectory) log.Printf("Getting old and new working directories for id %q: old = %v, new = %v, got = %v", d.Id(), old, new, d.Get(KeyWorkingDirectory)) @@ -249,7 +268,13 @@ func resourceReleaseSetDiff(d *schema.ResourceDiff, meta interface{}) error { return nil } -func resourceReleaseSetUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceReleaseSetUpdate(d *schema.ResourceData, meta interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + fs, err := NewReleaseSet(d) if err != nil { return err @@ -258,7 +283,13 @@ func resourceReleaseSetUpdate(d *schema.ResourceData, meta interface{}) error { return UpdateReleaseSet(fs, d) } -func resourceReleaseSetDelete(d *schema.ResourceData, meta interface{}) error { +func resourceReleaseSetDelete(d *schema.ResourceData, meta interface{}) (finalErr error) { + defer func() { + if err := recover(); err != nil { + finalErr = fmt.Errorf("unhandled error: %v\n%s", err, debug.Stack()) + } + }() + fs, err := NewReleaseSet(d) if err != nil { return err