diff --git a/cern/resource_roger.go b/cern/resource_roger.go index 361249d..d039d52 100644 --- a/cern/resource_roger.go +++ b/cern/resource_roger.go @@ -131,7 +131,7 @@ func resourceRogerRead(ctx context.Context, d *schema.ResourceData, meta interfa log.Printf("[DEBUG] Creating roger read request for %s", hostname) resp, err := client.Get(ctx, hostname) if err != nil { - return diag.Errorf("Error reading roger state: %s", err) + return diag.FromErr(CheckDeleted(d, "Error reading roger state", err)) } if err := d.Set("hostname", hostname); err != nil { @@ -216,7 +216,7 @@ func resourceRogerDelete(ctx context.Context, d *schema.ResourceData, meta inter log.Printf("[DEBUG] Creating roger delete request for %s", hostname) _, err := client.Delete(ctx, hostname) if err != nil { - return diag.Errorf("Error deleting roger state: %s", err) + return diag.FromErr(CheckDeleted(d, "Error deleting roger state", err)) } return nil diff --git a/cern/resource_teigi_secret.go b/cern/resource_teigi_secret.go index 060292b..9a6cc5c 100644 --- a/cern/resource_teigi_secret.go +++ b/cern/resource_teigi_secret.go @@ -123,7 +123,7 @@ func resourceTeigiSecretRead(ctx context.Context, d *schema.ResourceData, meta i scope, entity, key) secretResponse, err := client.Get(ctx, scope, entity, key) if err != nil { - return diag.Errorf("Unable to get secret: %s", err) + return diag.FromErr(CheckDeleted(d, "Unable to get secret", err)) } if err := d.Set(scope, entity); err != nil { @@ -160,7 +160,7 @@ func resourceTeigiSecretDelete(ctx context.Context, d *schema.ResourceData, meta scope, entity, key) err = client.Delete(ctx, scope, entity, key) if err != nil { - return diag.Errorf("Unable to delete secret: %s", err) + return diag.FromErr(CheckDeleted(d, "Unable to delete secret", err)) } return nil diff --git a/cern/util_common.go b/cern/util_common.go index 05ccf43..6410d55 100644 --- a/cern/util_common.go +++ b/cern/util_common.go @@ -7,8 +7,40 @@ import ( "net/url" "strings" "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) +type HTTPError struct { + URL string + StatusCode int + RespBody string +} + +func (e HTTPError) Error() string { + return fmt.Sprintf( + "HTTP Error:{\n"+ + " url: [%s]\n"+ + " statusCode: [%d]\n"+ + " respBody: [%s]\n"+ + "}", + e.URL, + e.StatusCode, + e.RespBody, + ) +} + +// Taken from terraform-openstack-provider +// CheckDeleted checks the error to see if it's a 404 (Not Found) and, if so, +// sets the resource ID to the empty string instead of throwing an error. +func CheckDeleted(d *schema.ResourceData, prefix string, err error) error { + if httpError, ok := err.(HTTPError); ok && httpError.StatusCode == 404 { + d.SetId("") + return nil + } + + return fmt.Errorf("%s: %s", prefix, err) +} func resolveURL(u *url.URL) (*url.URL, error) { rand.Seed(time.Now().Unix()) // initialize global pseudo random generator // Take a url, extract the hostname, resolve to canonical diff --git a/cern/util_roger.go b/cern/util_roger.go index 4146cb0..703fb24 100644 --- a/cern/util_roger.go +++ b/cern/util_roger.go @@ -123,6 +123,11 @@ func (r Roger) do(ctx context.Context, rogerRequest RogerRequest, method string) if err != nil { return nil, err } + + if resp.StatusCode < 200 && resp.StatusCode >= 300 { + return nil, HTTPError{url, resp.StatusCode, string(body[:])} + } + if method != "POST" && method != "DELETE" && method != "PUT" { err = json.Unmarshal(body, &rogerResponse) if err != nil { diff --git a/cern/util_teigi.go b/cern/util_teigi.go index 81554e3..1841998 100644 --- a/cern/util_teigi.go +++ b/cern/util_teigi.go @@ -130,15 +130,15 @@ func (t Teigi) do(ctx context.Context, method string, scope string, entity strin } defer resp.Body.Close() - if resp.StatusCode < 200 && resp.StatusCode >= 300 { - return nil, fmt.Errorf("non 2xx error code (%d)", resp.StatusCode) - } - body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } + if resp.StatusCode < 200 && resp.StatusCode >= 300 { + return nil, HTTPError{url, resp.StatusCode, string(body[:])} + } + var secretResponse SecretResponse if method == "GET" { err = json.Unmarshal(body, &secretResponse)