Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,11 @@ func (r *applicationLoadBalancerResource) Delete(ctx context.Context, req resour
// Delete Application Load Balancer
_, err := r.client.DefaultAPI.DeleteLoadBalancer(ctx, projectId, region, name).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err)
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Application Load Balancer", fmt.Sprintf("Calling API for delete: %v", errStr))
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,14 @@ func (r *customRoleResource) Read(ctx context.Context, req resource.ReadRequest,

ctx = r.annotateLogger(ctx, &model)

roleResp, err := r.client.GetRoleExecute(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString())
roleId := model.RoleId.ValueString()
if roleId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}

roleResp, err := r.client.GetRoleExecute(ctx, r.resourceType, model.ResourceId.ValueString(), roleId)
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"net/http"
"strings"
"time"

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

Expand Down
6 changes: 6 additions & 0 deletions stackit/internal/services/cdn/customdomain/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,13 @@ func (r *customDomainResource) Delete(ctx context.Context, req resource.DeleteRe

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

ctx = core.LogResponse(ctx)
Expand Down
5 changes: 5 additions & 0 deletions stackit/internal/services/cdn/distribution/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,11 @@ func (r *distributionResource) Read(ctx context.Context, req resource.ReadReques

projectId := model.ProjectId.ValueString()
distributionId := model.DistributionId.ValueString()
if distributionId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "distribution_id", distributionId)

Expand Down
18 changes: 18 additions & 0 deletions stackit/internal/services/dns/recordset/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package dns

import (
"context"
"errors"
"fmt"
"net/http"
"strings"

"github.com/hashicorp/terraform-plugin-framework-validators/int32validator"
Expand All @@ -16,6 +18,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
"github.com/stackitcloud/stackit-sdk-go/services/dns/v1api/wait"
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
Expand Down Expand Up @@ -267,12 +270,22 @@ func (r *recordSetResource) Read(ctx context.Context, req resource.ReadRequest,
projectId := model.ProjectId.ValueString()
zoneId := model.ZoneId.ValueString()
recordSetId := model.RecordSetId.ValueString()
if recordSetId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "zone_id", zoneId)
ctx = tflog.SetField(ctx, "record_set_id", recordSetId)

recordSetResp, err := r.client.DefaultAPI.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading record set", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down Expand Up @@ -374,7 +387,12 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque
// Delete existing record set
_, err := r.client.DefaultAPI.DeleteRecordSet(ctx, projectId, zoneId, recordSetId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting record set", fmt.Sprintf("Calling API: %v", err))
return
}

ctx = core.LogResponse(ctx)
Expand Down
18 changes: 18 additions & 0 deletions stackit/internal/services/dns/zone/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package dns

import (
"context"
"errors"
"fmt"
"math"
"net/http"
"regexp"
"strings"

Expand All @@ -22,6 +24,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api"
"github.com/stackitcloud/stackit-sdk-go/services/dns/v1api/wait"
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
Expand Down Expand Up @@ -355,11 +358,21 @@ func (r *zoneResource) Read(ctx context.Context, req resource.ReadRequest, resp

projectId := model.ProjectId.ValueString()
zoneId := model.ZoneId.ValueString()
if zoneId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "zone_id", zoneId)

zoneResp, err := r.client.DefaultAPI.GetZone(ctx, projectId, zoneId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading zone", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down Expand Up @@ -457,6 +470,11 @@ func (r *zoneResource) Delete(ctx context.Context, req resource.DeleteRequest, r
// Delete existing zone
_, err := r.client.DefaultAPI.DeleteZone(ctx, projectId, zoneId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting zone", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down
5 changes: 5 additions & 0 deletions stackit/internal/services/edgecloud/instance/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,11 @@ func (i *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r
projectId := model.ProjectId.ValueString()
region := i.providerData.GetRegionWithOverride(model.Region)
instanceId := model.InstanceId.ValueString()
if instanceId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "instance_id", instanceId)
ctx = tflog.SetField(ctx, "region", region)
Expand Down
5 changes: 5 additions & 0 deletions stackit/internal/services/git/instance/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,11 @@ func (g *gitResource) Read(ctx context.Context, req resource.ReadRequest, resp *
// Extract the project ID and instance id of the model
projectId := model.ProjectId.ValueString()
instanceId := model.InstanceId.ValueString()
if instanceId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}

// Read the current git instance via id
gitInstanceResp, err := g.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute()
Expand Down
15 changes: 13 additions & 2 deletions stackit/internal/services/iaas/affinitygroup/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package affinitygroup

import (
"context"
"errors"
"fmt"
"net/http"
"regexp"
Expand Down Expand Up @@ -245,6 +246,11 @@ func (r *affinityGroupResource) Read(ctx context.Context, req resource.ReadReque
projectId := model.ProjectId.ValueString()
region := r.providerData.GetRegionWithOverride(model.Region)
affinityGroupId := model.AffinityGroupId.ValueString()
if affinityGroupId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}

ctx = core.InitProviderContext(ctx)

Expand All @@ -254,8 +260,8 @@ func (r *affinityGroupResource) Read(ctx context.Context, req resource.ReadReque

affinityGroupResp, err := r.client.GetAffinityGroupExecute(ctx, projectId, region, affinityGroupId)
if err != nil {
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
if ok && oapiErr.StatusCode == http.StatusNotFound {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
Expand Down Expand Up @@ -305,6 +311,11 @@ func (r *affinityGroupResource) Delete(ctx context.Context, req resource.DeleteR
// Delete existing affinity group
err := r.client.DeleteAffinityGroupExecute(ctx, projectId, region, affinityGroupId)
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting affinity group", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down
15 changes: 13 additions & 2 deletions stackit/internal/services/iaas/image/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package image
import (
"bufio"
"context"
"errors"
"fmt"
"net/http"
"os"
Expand Down Expand Up @@ -509,6 +510,11 @@ func (r *imageResource) Read(ctx context.Context, req resource.ReadRequest, resp
projectId := model.ProjectId.ValueString()
region := r.providerData.GetRegionWithOverride(model.Region)
imageId := model.ImageId.ValueString()
if imageId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}

ctx = core.InitProviderContext(ctx)

Expand All @@ -518,8 +524,8 @@ func (r *imageResource) Read(ctx context.Context, req resource.ReadRequest, resp

imageResp, err := r.client.GetImage(ctx, projectId, region, imageId).Execute()
if err != nil {
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
if ok && oapiErr.StatusCode == http.StatusNotFound {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
Expand Down Expand Up @@ -622,6 +628,11 @@ func (r *imageResource) Delete(ctx context.Context, req resource.DeleteRequest,
// Delete existing image
err := r.client.DeleteImage(ctx, projectId, region, imageId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting image", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down
10 changes: 8 additions & 2 deletions stackit/internal/services/iaas/keypair/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package keypair

import (
"context"
"errors"
"fmt"
"net/http"
"strings"
Expand Down Expand Up @@ -199,8 +200,8 @@ func (r *keyPairResource) Read(ctx context.Context, req resource.ReadRequest, re

keyPairResp, err := r.client.GetKeyPair(ctx, name).Execute()
if err != nil {
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
if ok && oapiErr.StatusCode == http.StatusNotFound {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
Expand Down Expand Up @@ -295,6 +296,11 @@ func (r *keyPairResource) Delete(ctx context.Context, req resource.DeleteRequest
// Delete existing key pair
err := r.client.DeleteKeyPair(ctx, name).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting key pair", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down
15 changes: 13 additions & 2 deletions stackit/internal/services/iaas/network/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package network

import (
"context"
"errors"
"fmt"
"net"
"net/http"
Expand Down Expand Up @@ -455,15 +456,20 @@ func (r *networkResource) Read(ctx context.Context, req resource.ReadRequest, re

projectId := model.ProjectId.ValueString()
networkId := model.NetworkId.ValueString()
if networkId == "" {
// Resource not yet created; ID is unknown.
resp.State.RemoveResource(ctx)
return
}
region := r.providerData.GetRegionWithOverride(model.Region)
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "network_id", networkId)
ctx = tflog.SetField(ctx, "region", region)

networkResp, err := r.client.GetNetwork(ctx, projectId, region, networkId).Execute()
if err != nil {
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
if ok && oapiErr.StatusCode == http.StatusNotFound {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
Expand Down Expand Up @@ -569,6 +575,11 @@ func (r *networkResource) Delete(ctx context.Context, req resource.DeleteRequest
// Delete existing network
err := r.client.DeleteNetwork(ctx, projectId, region, networkId).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound {
resp.State.RemoveResource(ctx)
return
}
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network", fmt.Sprintf("Calling API: %v", err))
return
}
Expand Down
Loading