Skip to content

Commit ed1b259

Browse files
feat: apply similar 404 check to every applicable resource type
1 parent 2326ba3 commit ed1b259

42 files changed

Lines changed: 343 additions & 80 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

stackit/internal/services/alb/applicationloadbalancer/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,11 @@ func (r *applicationLoadBalancerResource) Delete(ctx context.Context, req resour
13421342
// Delete Application Load Balancer
13431343
_, err := r.client.DeleteLoadBalancer(ctx, projectId, region, name).Execute()
13441344
if err != nil {
1345+
var oapiErr *oapierror.GenericOpenAPIError
1346+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
1347+
resp.State.RemoveResource(ctx)
1348+
return
1349+
}
13451350
errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err)
13461351
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Application Load Balancer", fmt.Sprintf("Calling API for delete: %v", errStr))
13471352
return

stackit/internal/services/authorization/roleassignments/resource.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"net/http"
78
"strings"
89
"time"
910

@@ -15,6 +16,7 @@ import (
1516
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1617
"github.com/hashicorp/terraform-plugin-framework/types"
1718
"github.com/hashicorp/terraform-plugin-log/tflog"
19+
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1820
"github.com/stackitcloud/stackit-sdk-go/services/authorization"
1921
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
2022
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
@@ -315,6 +317,11 @@ func (r *roleAssignmentResource) Delete(ctx context.Context, req resource.Delete
315317
// Delete existing project role assignment
316318
_, err := r.authorizationClient.RemoveMembers(ctx, model.ResourceId.ValueString()).RemoveMembersPayload(payload).Execute()
317319
if err != nil {
320+
var oapiErr *oapierror.GenericOpenAPIError
321+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
322+
resp.State.RemoveResource(ctx)
323+
return
324+
}
318325
core.LogAndAddError(ctx, &resp.Diagnostics, fmt.Sprintf("Error deleting %s role assignment", r.apiName), fmt.Sprintf("Calling API: %v", err))
319326
}
320327

stackit/internal/services/cdn/customdomain/resource.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,13 @@ func (r *customDomainResource) Delete(ctx context.Context, req resource.DeleteRe
371371

372372
_, err := r.client.DeleteCustomDomain(ctx, projectId, distributionId, name).Execute()
373373
if err != nil {
374+
var oapiErr *oapierror.GenericOpenAPIError
375+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
376+
resp.State.RemoveResource(ctx)
377+
return
378+
}
374379
core.LogAndAddError(ctx, &resp.Diagnostics, "Delete CDN custom domain", fmt.Sprintf("Delete custom domain: %v", err))
380+
return
375381
}
376382

377383
ctx = core.LogResponse(ctx)

stackit/internal/services/dns/recordset/resource.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dns
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/http"
78
"strings"
@@ -280,6 +281,11 @@ func (r *recordSetResource) Read(ctx context.Context, req resource.ReadRequest,
280281

281282
recordSetResp, err := r.client.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute()
282283
if err != nil {
284+
var oapiErr *oapierror.GenericOpenAPIError
285+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
286+
resp.State.RemoveResource(ctx)
287+
return
288+
}
283289
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading record set", fmt.Sprintf("Calling API: %v", err))
284290
return
285291
}
@@ -381,8 +387,8 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque
381387
// Delete existing record set
382388
_, err := r.client.DeleteRecordSet(ctx, projectId, zoneId, recordSetId).Execute()
383389
if err != nil {
384-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
385-
if ok && oapiErr.StatusCode == http.StatusNotFound {
390+
var oapiErr *oapierror.GenericOpenAPIError
391+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
386392
return
387393
}
388394
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting record set", fmt.Sprintf("Calling API: %v", err))

stackit/internal/services/dns/zone/resource.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package dns
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"math"
8+
"net/http"
79
"regexp"
810
"strings"
911

@@ -22,6 +24,7 @@ import (
2224
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
2325
"github.com/hashicorp/terraform-plugin-framework/types"
2426
"github.com/hashicorp/terraform-plugin-log/tflog"
27+
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
2528
"github.com/stackitcloud/stackit-sdk-go/services/dns"
2629
"github.com/stackitcloud/stackit-sdk-go/services/dns/wait"
2730
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
@@ -365,6 +368,11 @@ func (r *zoneResource) Read(ctx context.Context, req resource.ReadRequest, resp
365368

366369
zoneResp, err := r.client.GetZone(ctx, projectId, zoneId).Execute()
367370
if err != nil {
371+
var oapiErr *oapierror.GenericOpenAPIError
372+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
373+
resp.State.RemoveResource(ctx)
374+
return
375+
}
368376
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading zone", fmt.Sprintf("Calling API: %v", err))
369377
return
370378
}
@@ -462,6 +470,11 @@ func (r *zoneResource) Delete(ctx context.Context, req resource.DeleteRequest, r
462470
// Delete existing zone
463471
_, err := r.client.DeleteZone(ctx, projectId, zoneId).Execute()
464472
if err != nil {
473+
var oapiErr *oapierror.GenericOpenAPIError
474+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
475+
resp.State.RemoveResource(ctx)
476+
return
477+
}
465478
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting zone", fmt.Sprintf("Calling API: %v", err))
466479
return
467480
}

stackit/internal/services/iaas/affinitygroup/resource.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package affinitygroup
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/http"
78
"regexp"
@@ -259,8 +260,8 @@ func (r *affinityGroupResource) Read(ctx context.Context, req resource.ReadReque
259260

260261
affinityGroupResp, err := r.client.GetAffinityGroupExecute(ctx, projectId, region, affinityGroupId)
261262
if err != nil {
262-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
263-
if ok && oapiErr.StatusCode == http.StatusNotFound {
263+
var oapiErr *oapierror.GenericOpenAPIError
264+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
264265
resp.State.RemoveResource(ctx)
265266
return
266267
}
@@ -310,6 +311,11 @@ func (r *affinityGroupResource) Delete(ctx context.Context, req resource.DeleteR
310311
// Delete existing affinity group
311312
err := r.client.DeleteAffinityGroupExecute(ctx, projectId, region, affinityGroupId)
312313
if err != nil {
314+
var oapiErr *oapierror.GenericOpenAPIError
315+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
316+
resp.State.RemoveResource(ctx)
317+
return
318+
}
313319
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting affinity group", fmt.Sprintf("Calling API: %v", err))
314320
return
315321
}

stackit/internal/services/iaas/image/resource.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package image
33
import (
44
"bufio"
55
"context"
6+
"errors"
67
"fmt"
78
"net/http"
89
"os"
@@ -523,8 +524,8 @@ func (r *imageResource) Read(ctx context.Context, req resource.ReadRequest, resp
523524

524525
imageResp, err := r.client.GetImage(ctx, projectId, region, imageId).Execute()
525526
if err != nil {
526-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
527-
if ok && oapiErr.StatusCode == http.StatusNotFound {
527+
var oapiErr *oapierror.GenericOpenAPIError
528+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
528529
resp.State.RemoveResource(ctx)
529530
return
530531
}
@@ -627,6 +628,11 @@ func (r *imageResource) Delete(ctx context.Context, req resource.DeleteRequest,
627628
// Delete existing image
628629
err := r.client.DeleteImage(ctx, projectId, region, imageId).Execute()
629630
if err != nil {
631+
var oapiErr *oapierror.GenericOpenAPIError
632+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
633+
resp.State.RemoveResource(ctx)
634+
return
635+
}
630636
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting image", fmt.Sprintf("Calling API: %v", err))
631637
return
632638
}

stackit/internal/services/iaas/keypair/resource.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package keypair
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/http"
78
"strings"
@@ -199,8 +200,8 @@ func (r *keyPairResource) Read(ctx context.Context, req resource.ReadRequest, re
199200

200201
keyPairResp, err := r.client.GetKeyPair(ctx, name).Execute()
201202
if err != nil {
202-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
203-
if ok && oapiErr.StatusCode == http.StatusNotFound {
203+
var oapiErr *oapierror.GenericOpenAPIError
204+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
204205
resp.State.RemoveResource(ctx)
205206
return
206207
}
@@ -295,6 +296,11 @@ func (r *keyPairResource) Delete(ctx context.Context, req resource.DeleteRequest
295296
// Delete existing key pair
296297
err := r.client.DeleteKeyPair(ctx, name).Execute()
297298
if err != nil {
299+
var oapiErr *oapierror.GenericOpenAPIError
300+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
301+
resp.State.RemoveResource(ctx)
302+
return
303+
}
298304
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting key pair", fmt.Sprintf("Calling API: %v", err))
299305
return
300306
}

stackit/internal/services/iaas/network/resource.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package network
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net"
78
"net/http"
@@ -467,8 +468,8 @@ func (r *networkResource) Read(ctx context.Context, req resource.ReadRequest, re
467468

468469
networkResp, err := r.client.GetNetwork(ctx, projectId, region, networkId).Execute()
469470
if err != nil {
470-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
471-
if ok && oapiErr.StatusCode == http.StatusNotFound {
471+
var oapiErr *oapierror.GenericOpenAPIError
472+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
472473
resp.State.RemoveResource(ctx)
473474
return
474475
}
@@ -574,6 +575,11 @@ func (r *networkResource) Delete(ctx context.Context, req resource.DeleteRequest
574575
// Delete existing network
575576
err := r.client.DeleteNetwork(ctx, projectId, region, networkId).Execute()
576577
if err != nil {
578+
var oapiErr *oapierror.GenericOpenAPIError
579+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
580+
resp.State.RemoveResource(ctx)
581+
return
582+
}
577583
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network", fmt.Sprintf("Calling API: %v", err))
578584
return
579585
}

stackit/internal/services/iaas/networkarea/resource.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,7 @@ func (r *networkAreaResource) Read(ctx context.Context, req resource.ReadRequest
457457
networkAreaResp, err := r.client.GetNetworkArea(ctx, organizationId, networkAreaId).Execute()
458458
if err != nil {
459459
var oapiErr *oapierror.GenericOpenAPIError
460-
ok := errors.As(err, &oapiErr)
461-
if ok && oapiErr.StatusCode == http.StatusNotFound {
460+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
462461
resp.State.RemoveResource(ctx)
463462
return
464463
}
@@ -483,8 +482,7 @@ func (r *networkAreaResource) Read(ctx context.Context, req resource.ReadRequest
483482
networkAreaRegionResp, err := r.client.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, "eu01").Execute()
484483
if err != nil {
485484
var oapiErr *oapierror.GenericOpenAPIError
486-
ok := errors.As(err, &oapiErr)
487-
if !(ok && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest)) { // TODO: iaas api returns http 400 in case network area region is not found
485+
if !(errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest)) { // TODO: iaas api returns http 400 in case network area region is not found
488486
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading network area region", fmt.Sprintf("Calling API: %v", err))
489487
return
490488
}
@@ -610,8 +608,7 @@ func (r *networkAreaResource) Update(ctx context.Context, req resource.UpdateReq
610608
networkAreaRegionResp, err := r.client.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, "eu01").Execute()
611609
if err != nil {
612610
var oapiErr *oapierror.GenericOpenAPIError
613-
ok := errors.As(err, &oapiErr)
614-
if ok && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest) { // TODO: iaas api returns http 400 in case network area region is not found
611+
if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest) { // TODO: iaas api returns http 400 in case network area region is not found
615612
return
616613
}
617614
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading network area region", fmt.Sprintf("Calling API: %v", err))
@@ -661,13 +658,23 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq
661658

662659
_, err := wait.ReadyForNetworkAreaDeletionWaitHandler(ctx, r.client, r.resourceManagerClient, organizationId, networkAreaId).WaitWithContext(ctx)
663660
if err != nil {
661+
var oapiErr *oapierror.GenericOpenAPIError
662+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
663+
resp.State.RemoveResource(ctx)
664+
return
665+
}
664666
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area", fmt.Sprintf("Network area ready for deletion waiting: %v", err))
665667
return
666668
}
667669

668670
// Get all configured regions so we can delete them one by one before deleting the network area
669671
regionsListResp, err := r.client.ListNetworkAreaRegions(ctx, organizationId, networkAreaId).Execute()
670672
if err != nil {
673+
var oapiErr *oapierror.GenericOpenAPIError
674+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
675+
resp.State.RemoveResource(ctx)
676+
return
677+
}
671678
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area region", fmt.Sprintf("Calling API to list configured regions: %v", err))
672679
return
673680
}
@@ -676,6 +683,10 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq
676683
for region := range *regionsListResp.Regions {
677684
err = r.client.DeleteNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute()
678685
if err != nil {
686+
var oapiErr *oapierror.GenericOpenAPIError
687+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
688+
continue
689+
}
679690
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area region", fmt.Sprintf("Calling API: %v", err))
680691
return
681692
}
@@ -690,6 +701,11 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq
690701
// Delete existing network area
691702
err = r.client.DeleteNetworkArea(ctx, organizationId, networkAreaId).Execute()
692703
if err != nil {
704+
var oapiErr *oapierror.GenericOpenAPIError
705+
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
706+
resp.State.RemoveResource(ctx)
707+
return
708+
}
693709
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area", fmt.Sprintf("Calling API: %v", err))
694710
return
695711
}

0 commit comments

Comments
 (0)