Skip to content

Commit 94850ce

Browse files
fix: handle missing resource ID in Read and graceful delete for non-existing resources
1 parent 566c377 commit 94850ce

60 files changed

Lines changed: 387 additions & 1 deletion

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/authorization/customrole/resource.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,14 @@ func (r *customRoleResource) Read(ctx context.Context, req resource.ReadRequest,
212212

213213
ctx = r.annotateLogger(ctx, &model)
214214

215-
roleResp, err := r.client.GetRoleExecute(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString())
215+
roleId := model.RoleId.ValueString()
216+
if roleId == "" {
217+
// Resource not yet created; ID is unknown.
218+
resp.State.RemoveResource(ctx)
219+
return
220+
}
221+
222+
roleResp, err := r.client.GetRoleExecute(ctx, r.resourceType, model.ResourceId.ValueString(), roleId)
216223
if err != nil {
217224
var oapiErr *oapierror.GenericOpenAPIError
218225

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,11 @@ func (r *distributionResource) Read(ctx context.Context, req resource.ReadReques
479479

480480
projectId := model.ProjectId.ValueString()
481481
distributionId := model.DistributionId.ValueString()
482+
if distributionId == "" {
483+
// Resource not yet created; ID is unknown.
484+
resp.State.RemoveResource(ctx)
485+
return
486+
}
482487
ctx = tflog.SetField(ctx, "project_id", projectId)
483488
ctx = tflog.SetField(ctx, "distribution_id", distributionId)
484489

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dns
33
import (
44
"context"
55
"fmt"
6+
"net/http"
67
"strings"
78

89
"github.com/hashicorp/terraform-plugin-framework-validators/int64validator"
@@ -16,6 +17,7 @@ import (
1617
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1718
"github.com/hashicorp/terraform-plugin-framework/types"
1819
"github.com/hashicorp/terraform-plugin-log/tflog"
20+
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1921
"github.com/stackitcloud/stackit-sdk-go/services/dns"
2022
"github.com/stackitcloud/stackit-sdk-go/services/dns/wait"
2123
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
@@ -267,6 +269,11 @@ func (r *recordSetResource) Read(ctx context.Context, req resource.ReadRequest,
267269
projectId := model.ProjectId.ValueString()
268270
zoneId := model.ZoneId.ValueString()
269271
recordSetId := model.RecordSetId.ValueString()
272+
if recordSetId == "" {
273+
// Resource not yet created; ID is unknown.
274+
resp.State.RemoveResource(ctx)
275+
return
276+
}
270277
ctx = tflog.SetField(ctx, "project_id", projectId)
271278
ctx = tflog.SetField(ctx, "zone_id", zoneId)
272279
ctx = tflog.SetField(ctx, "record_set_id", recordSetId)
@@ -374,7 +381,12 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque
374381
// Delete existing record set
375382
_, err := r.client.DeleteRecordSet(ctx, projectId, zoneId, recordSetId).Execute()
376383
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 {
386+
return
387+
}
377388
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting record set", fmt.Sprintf("Calling API: %v", err))
389+
return
378390
}
379391

380392
ctx = core.LogResponse(ctx)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,11 @@ func (r *zoneResource) Read(ctx context.Context, req resource.ReadRequest, resp
355355

356356
projectId := model.ProjectId.ValueString()
357357
zoneId := model.ZoneId.ValueString()
358+
if zoneId == "" {
359+
// Resource not yet created; ID is unknown.
360+
resp.State.RemoveResource(ctx)
361+
return
362+
}
358363
ctx = tflog.SetField(ctx, "project_id", projectId)
359364
ctx = tflog.SetField(ctx, "zone_id", zoneId)
360365

stackit/internal/services/edgecloud/instance/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,11 @@ func (i *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r
321321
projectId := model.ProjectId.ValueString()
322322
region := i.providerData.GetRegionWithOverride(model.Region)
323323
instanceId := model.InstanceId.ValueString()
324+
if instanceId == "" {
325+
// Resource not yet created; ID is unknown.
326+
resp.State.RemoveResource(ctx)
327+
return
328+
}
324329
ctx = tflog.SetField(ctx, "project_id", projectId)
325330
ctx = tflog.SetField(ctx, "instance_id", instanceId)
326331
ctx = tflog.SetField(ctx, "region", region)

stackit/internal/services/git/instance/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,11 @@ func (g *gitResource) Read(ctx context.Context, req resource.ReadRequest, resp *
270270
// Extract the project ID and instance id of the model
271271
projectId := model.ProjectId.ValueString()
272272
instanceId := model.InstanceId.ValueString()
273+
if instanceId == "" {
274+
// Resource not yet created; ID is unknown.
275+
resp.State.RemoveResource(ctx)
276+
return
277+
}
273278

274279
// Read the current git instance via id
275280
gitInstanceResp, err := g.client.GetInstance(ctx, projectId, instanceId).Execute()

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,11 @@ func (r *affinityGroupResource) Read(ctx context.Context, req resource.ReadReque
245245
projectId := model.ProjectId.ValueString()
246246
region := r.providerData.GetRegionWithOverride(model.Region)
247247
affinityGroupId := model.AffinityGroupId.ValueString()
248+
if affinityGroupId == "" {
249+
// Resource not yet created; ID is unknown.
250+
resp.State.RemoveResource(ctx)
251+
return
252+
}
248253

249254
ctx = core.InitProviderContext(ctx)
250255

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,11 @@ func (r *imageResource) Read(ctx context.Context, req resource.ReadRequest, resp
509509
projectId := model.ProjectId.ValueString()
510510
region := r.providerData.GetRegionWithOverride(model.Region)
511511
imageId := model.ImageId.ValueString()
512+
if imageId == "" {
513+
// Resource not yet created; ID is unknown.
514+
resp.State.RemoveResource(ctx)
515+
return
516+
}
512517

513518
ctx = core.InitProviderContext(ctx)
514519

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,11 @@ func (r *networkResource) Read(ctx context.Context, req resource.ReadRequest, re
475475
}
476476
projectId := model.ProjectId.ValueString()
477477
networkId := model.NetworkId.ValueString()
478+
if networkId == "" {
479+
// Resource not yet created; ID is unknown.
480+
resp.State.RemoveResource(ctx)
481+
return
482+
}
478483
region := r.providerData.GetRegionWithOverride(model.Region)
479484
ctx = tflog.SetField(ctx, "project_id", projectId)
480485
ctx = tflog.SetField(ctx, "network_id", networkId)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,11 @@ func (r *networkAreaResource) Read(ctx context.Context, req resource.ReadRequest
443443

444444
organizationId := model.OrganizationId.ValueString()
445445
networkAreaId := model.NetworkAreaId.ValueString()
446+
if networkAreaId == "" {
447+
// Resource not yet created; ID is unknown.
448+
resp.State.RemoveResource(ctx)
449+
return
450+
}
446451

447452
ctx = core.InitProviderContext(ctx)
448453

0 commit comments

Comments
 (0)