From 157e989740c0621810fce53601592bc8879c91e5 Mon Sep 17 00:00:00 2001 From: Dean Huynh Date: Fri, 4 Apr 2025 17:35:04 -0700 Subject: [PATCH 1/2] Handle 404s during reads --- internal/provider/destination_filter_resource.go | 6 ++++++ internal/provider/destination_resource.go | 6 ++++++ internal/provider/destination_subscription_resource.go | 6 ++++++ internal/provider/function_resource.go | 6 ++++++ internal/provider/insert_function_instance_resource.go | 6 ++++++ internal/provider/label_resource.go | 5 +---- internal/provider/profiles_warehouse_resource.go | 7 +++---- internal/provider/reverse_etl_model_resource.go | 6 ++++++ internal/provider/source_resource.go | 6 ++++++ .../provider/source_tracking_plan_connection_resource.go | 6 ++++++ internal/provider/source_warehouse_connection_resource.go | 6 ++++++ internal/provider/tracking_plan_resource.go | 6 ++++++ internal/provider/transformation_resource.go | 6 ++++++ internal/provider/user_group_resource.go | 6 ++++++ internal/provider/user_resource.go | 6 ++++++ internal/provider/warehouse_resource.go | 6 ++++++ 16 files changed, 88 insertions(+), 8 deletions(-) diff --git a/internal/provider/destination_filter_resource.go b/internal/provider/destination_filter_resource.go index 09b9680..ebcbf6a 100644 --- a/internal/provider/destination_filter_resource.go +++ b/internal/provider/destination_filter_resource.go @@ -201,6 +201,12 @@ func (r *destinationFilterResource) Read(ctx context.Context, req resource.ReadR defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Destination Filter (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/destination_resource.go b/internal/provider/destination_resource.go index 137716e..8f2d045 100644 --- a/internal/provider/destination_resource.go +++ b/internal/provider/destination_resource.go @@ -587,6 +587,12 @@ func (r *destinationResource) Read(ctx context.Context, req resource.ReadRequest defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Destination (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/destination_subscription_resource.go b/internal/provider/destination_subscription_resource.go index 72392a9..978a6b7 100644 --- a/internal/provider/destination_subscription_resource.go +++ b/internal/provider/destination_subscription_resource.go @@ -228,6 +228,12 @@ func (r *destinationSubscriptionResource) Read(ctx context.Context, req resource defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Destination subscription (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/function_resource.go b/internal/provider/function_resource.go index c5f8fa8..70eb172 100644 --- a/internal/provider/function_resource.go +++ b/internal/provider/function_resource.go @@ -189,6 +189,12 @@ func (r *functionResource) Read(ctx context.Context, req resource.ReadRequest, r defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Function (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/insert_function_instance_resource.go b/internal/provider/insert_function_instance_resource.go index d39aa2f..db9b27c 100644 --- a/internal/provider/insert_function_instance_resource.go +++ b/internal/provider/insert_function_instance_resource.go @@ -159,6 +159,12 @@ func (r *insertFunctionInstanceResource) Read(ctx context.Context, req resource. defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Insert Function instance (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/label_resource.go b/internal/provider/label_resource.go index 3aee3bf..5b4edd3 100644 --- a/internal/provider/label_resource.go +++ b/internal/provider/label_resource.go @@ -163,10 +163,7 @@ func (r *labelResource) Read(ctx context.Context, req resource.ReadRequest, resp } if label == nil { - resp.Diagnostics.AddError( - "Unable to find Label", - fmt.Sprintf("Unable to find Label with key: %q and value: %q", state.Key, state.Value), - ) + resp.State.RemoveResource(ctx) return } diff --git a/internal/provider/profiles_warehouse_resource.go b/internal/provider/profiles_warehouse_resource.go index ae3fc88..bf9d47a 100644 --- a/internal/provider/profiles_warehouse_resource.go +++ b/internal/provider/profiles_warehouse_resource.go @@ -167,6 +167,8 @@ func (r *profilesWarehouseResource) Read(ctx context.Context, req resource.ReadR warehouse, err := findProfileWarehouse(r.authContext, r.client, previousState.ID.ValueString(), previousState.SpaceID.ValueString()) if err != nil { + resp.State.RemoveResource(ctx) + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Profiles Warehouse (ID: %s)", previousState.ID.ValueString()), err.Error(), @@ -176,10 +178,7 @@ func (r *profilesWarehouseResource) Read(ctx context.Context, req resource.ReadR } if warehouse == nil { - resp.Diagnostics.AddError( - "Unable to find Profile Warehouse", - fmt.Sprintf("Profile Warehouse with id '%s' and space id '%s' not found", previousState.ID.ValueString(), previousState.SpaceID.ValueString()), - ) + resp.State.RemoveResource(ctx) return } diff --git a/internal/provider/reverse_etl_model_resource.go b/internal/provider/reverse_etl_model_resource.go index eccfea9..f1d54d8 100644 --- a/internal/provider/reverse_etl_model_resource.go +++ b/internal/provider/reverse_etl_model_resource.go @@ -160,6 +160,12 @@ func (r *reverseETLModelResource) Read(ctx context.Context, req resource.ReadReq defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Reverse ETL model (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/source_resource.go b/internal/provider/source_resource.go index 138c713..db6a194 100644 --- a/internal/provider/source_resource.go +++ b/internal/provider/source_resource.go @@ -387,6 +387,12 @@ func (r *sourceResource) Read(ctx context.Context, req resource.ReadRequest, res defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Source (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/source_tracking_plan_connection_resource.go b/internal/provider/source_tracking_plan_connection_resource.go index eb869f8..ebed02a 100644 --- a/internal/provider/source_tracking_plan_connection_resource.go +++ b/internal/provider/source_tracking_plan_connection_resource.go @@ -255,6 +255,12 @@ func (r *sourceTrackingPlanConnectionResource) Read(ctx context.Context, req res defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Source (ID: %s)", previousState.SourceID.ValueString()), getError(err, body), diff --git a/internal/provider/source_warehouse_connection_resource.go b/internal/provider/source_warehouse_connection_resource.go index 69901ab..a45f4cc 100644 --- a/internal/provider/source_warehouse_connection_resource.go +++ b/internal/provider/source_warehouse_connection_resource.go @@ -126,6 +126,12 @@ func (r *sourceWarehouseConnectionResource) Read(ctx context.Context, req resour defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( "Unable to read Source-Warehouse connection", getError(err, body), diff --git a/internal/provider/tracking_plan_resource.go b/internal/provider/tracking_plan_resource.go index e6c6184..48bc61a 100644 --- a/internal/provider/tracking_plan_resource.go +++ b/internal/provider/tracking_plan_resource.go @@ -227,6 +227,12 @@ func (r *trackingPlanResource) Read(ctx context.Context, req resource.ReadReques defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Tracking Plan (ID: %s)", config.ID.ValueString()), getError(err, body), diff --git a/internal/provider/transformation_resource.go b/internal/provider/transformation_resource.go index 9740171..0c8f72e 100644 --- a/internal/provider/transformation_resource.go +++ b/internal/provider/transformation_resource.go @@ -206,6 +206,12 @@ func (r *transformationResource) Read(ctx context.Context, req resource.ReadRequ defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 || body.StatusCode == 403 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Transformation (ID: %s)", previousState.ID.ValueString()), getError(err, body), diff --git a/internal/provider/user_group_resource.go b/internal/provider/user_group_resource.go index fe01ca0..335f1e3 100644 --- a/internal/provider/user_group_resource.go +++ b/internal/provider/user_group_resource.go @@ -238,6 +238,12 @@ func (r *userGroupResource) Read(ctx context.Context, req resource.ReadRequest, defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read User Group (ID: %s)", config.ID.ValueString()), getError(err, body), diff --git a/internal/provider/user_resource.go b/internal/provider/user_resource.go index f1737df..4b234d2 100644 --- a/internal/provider/user_resource.go +++ b/internal/provider/user_resource.go @@ -259,6 +259,12 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read user (ID: %s)", state.ID.ValueString()), getError(err, body), diff --git a/internal/provider/warehouse_resource.go b/internal/provider/warehouse_resource.go index 1bd6a25..472331a 100644 --- a/internal/provider/warehouse_resource.go +++ b/internal/provider/warehouse_resource.go @@ -288,6 +288,12 @@ func (r *warehouseResource) Read(ctx context.Context, req resource.ReadRequest, defer body.Body.Close() } if err != nil { + if body.StatusCode == 404 { + resp.State.RemoveResource(ctx) + + return + } + resp.Diagnostics.AddError( fmt.Sprintf("Unable to read Warehouse (ID: %s)", previousState.ID.ValueString()), getError(err, body), From 7b94c22f1c6ffb6497391b5fd00547ef4108fdda Mon Sep 17 00:00:00 2001 From: Dean Huynh Date: Mon, 7 Apr 2025 10:24:26 -0700 Subject: [PATCH 2/2] Fix lint errors --- .golangci.yml | 2 +- internal/provider/destination_filter_resource.go | 3 ++- internal/provider/destination_resource.go | 3 ++- internal/provider/destination_subscription_resource.go | 3 ++- internal/provider/function_resource.go | 3 ++- internal/provider/insert_function_instance_resource.go | 3 ++- internal/provider/reverse_etl_model_resource.go | 3 ++- internal/provider/source_resource.go | 3 ++- internal/provider/source_tracking_plan_connection_resource.go | 3 ++- internal/provider/source_warehouse_connection_resource.go | 3 ++- internal/provider/tracking_plan_resource.go | 3 ++- internal/provider/transformation_resource.go | 3 ++- internal/provider/user_group_resource.go | 3 ++- internal/provider/user_resource.go | 3 ++- internal/provider/warehouse_resource.go | 3 ++- 15 files changed, 29 insertions(+), 15 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 1a120fc..c39dc78 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -26,7 +26,7 @@ linters: - predeclared - revive - staticcheck - - tenv + - usetesting - unconvert - unparam - unused diff --git a/internal/provider/destination_filter_resource.go b/internal/provider/destination_filter_resource.go index ebcbf6a..34a4fd8 100644 --- a/internal/provider/destination_filter_resource.go +++ b/internal/provider/destination_filter_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "regexp" "strings" @@ -201,7 +202,7 @@ func (r *destinationFilterResource) Read(ctx context.Context, req resource.ReadR defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/destination_resource.go b/internal/provider/destination_resource.go index 8f2d045..4dd8210 100644 --- a/internal/provider/destination_resource.go +++ b/internal/provider/destination_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/listplanmodifier" @@ -587,7 +588,7 @@ func (r *destinationResource) Read(ctx context.Context, req resource.ReadRequest defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/destination_subscription_resource.go b/internal/provider/destination_subscription_resource.go index 978a6b7..be2bf95 100644 --- a/internal/provider/destination_subscription_resource.go +++ b/internal/provider/destination_subscription_resource.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "strings" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" @@ -228,7 +229,7 @@ func (r *destinationSubscriptionResource) Read(ctx context.Context, req resource defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/function_resource.go b/internal/provider/function_resource.go index 70eb172..00dd481 100644 --- a/internal/provider/function_resource.go +++ b/internal/provider/function_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "regexp" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" @@ -189,7 +190,7 @@ func (r *functionResource) Read(ctx context.Context, req resource.ReadRequest, r defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/insert_function_instance_resource.go b/internal/provider/insert_function_instance_resource.go index db9b27c..823da51 100644 --- a/internal/provider/insert_function_instance_resource.go +++ b/internal/provider/insert_function_instance_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "strings" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" @@ -159,7 +160,7 @@ func (r *insertFunctionInstanceResource) Read(ctx context.Context, req resource. defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/reverse_etl_model_resource.go b/internal/provider/reverse_etl_model_resource.go index f1d54d8..b922757 100644 --- a/internal/provider/reverse_etl_model_resource.go +++ b/internal/provider/reverse_etl_model_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" "github.com/segmentio/terraform-provider-segment/internal/provider/models" @@ -160,7 +161,7 @@ func (r *reverseETLModelResource) Read(ctx context.Context, req resource.ReadReq defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/source_resource.go b/internal/provider/source_resource.go index db6a194..7a47e08 100644 --- a/internal/provider/source_resource.go +++ b/internal/provider/source_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" "github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier" @@ -387,7 +388,7 @@ func (r *sourceResource) Read(ctx context.Context, req resource.ReadRequest, res defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/source_tracking_plan_connection_resource.go b/internal/provider/source_tracking_plan_connection_resource.go index ebed02a..0dbc6cd 100644 --- a/internal/provider/source_tracking_plan_connection_resource.go +++ b/internal/provider/source_tracking_plan_connection_resource.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "net/http" "strings" "github.com/avast/retry-go/v4" @@ -255,7 +256,7 @@ func (r *sourceTrackingPlanConnectionResource) Read(ctx context.Context, req res defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/source_warehouse_connection_resource.go b/internal/provider/source_warehouse_connection_resource.go index a45f4cc..c75e276 100644 --- a/internal/provider/source_warehouse_connection_resource.go +++ b/internal/provider/source_warehouse_connection_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -126,7 +127,7 @@ func (r *sourceWarehouseConnectionResource) Read(ctx context.Context, req resour defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/tracking_plan_resource.go b/internal/provider/tracking_plan_resource.go index 48bc61a..003f58b 100644 --- a/internal/provider/tracking_plan_resource.go +++ b/internal/provider/tracking_plan_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" "github.com/segmentio/terraform-provider-segment/internal/provider/models" @@ -227,7 +228,7 @@ func (r *trackingPlanResource) Read(ctx context.Context, req resource.ReadReques defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/transformation_resource.go b/internal/provider/transformation_resource.go index 0c8f72e..d23c813 100644 --- a/internal/provider/transformation_resource.go +++ b/internal/provider/transformation_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" "github.com/segmentio/terraform-provider-segment/internal/provider/models" @@ -206,7 +207,7 @@ func (r *transformationResource) Read(ctx context.Context, req resource.ReadRequ defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 || body.StatusCode == 403 { + if body.StatusCode == http.StatusNotFound || body.StatusCode == http.StatusForbidden { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/user_group_resource.go b/internal/provider/user_group_resource.go index 335f1e3..efa7af8 100644 --- a/internal/provider/user_group_resource.go +++ b/internal/provider/user_group_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "regexp" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" @@ -238,7 +239,7 @@ func (r *userGroupResource) Read(ctx context.Context, req resource.ReadRequest, defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/user_resource.go b/internal/provider/user_resource.go index 4b234d2..2e72bbc 100644 --- a/internal/provider/user_resource.go +++ b/internal/provider/user_resource.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "net/http" "regexp" "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" @@ -259,7 +260,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return diff --git a/internal/provider/warehouse_resource.go b/internal/provider/warehouse_resource.go index 472331a..77b9fae 100644 --- a/internal/provider/warehouse_resource.go +++ b/internal/provider/warehouse_resource.go @@ -3,6 +3,7 @@ package provider import ( "context" "fmt" + "net/http" "github.com/segmentio/terraform-provider-segment/internal/provider/docs" "github.com/segmentio/terraform-provider-segment/internal/provider/models" @@ -288,7 +289,7 @@ func (r *warehouseResource) Read(ctx context.Context, req resource.ReadRequest, defer body.Body.Close() } if err != nil { - if body.StatusCode == 404 { + if body.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) return