diff --git a/pkg/controller/infrastructure/openstack/actuator_delete.go b/pkg/controller/infrastructure/openstack/actuator_delete.go index 68ac72ba..eeb5612d 100644 --- a/pkg/controller/infrastructure/openstack/actuator_delete.go +++ b/pkg/controller/infrastructure/openstack/actuator_delete.go @@ -10,6 +10,8 @@ import ( extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" "github.com/gardener/gardener/extensions/pkg/util" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + gardenerapihelper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/go-logr/logr" @@ -23,8 +25,13 @@ import ( // Delete the Infrastructure config. func (a *actuator) Delete(ctx context.Context, log logr.Logger, infra *extensionsv1alpha1.Infrastructure, cluster *extensionscontroller.Cluster) error { + err := a.delete(ctx, log, infra, cluster) + if openstackclient.IsConflict(err) { + return gardenerapihelper.NewErrorWithCodes(err, gardencorev1beta1.ErrorInfraDependencies) + } + return util.DetermineError( - a.delete(ctx, log, infra, cluster), + err, helper.KnownCodes, ) } diff --git a/pkg/controller/infrastructure/stackit/actuator_delete.go b/pkg/controller/infrastructure/stackit/actuator_delete.go index fb58913e..4019314a 100644 --- a/pkg/controller/infrastructure/stackit/actuator_delete.go +++ b/pkg/controller/infrastructure/stackit/actuator_delete.go @@ -10,6 +10,8 @@ import ( extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" "github.com/gardener/gardener/extensions/pkg/util" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + gardenerapihelper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/go-logr/logr" @@ -23,8 +25,13 @@ import ( // Delete the Infrastructure config. func (a *actuator) Delete(ctx context.Context, log logr.Logger, infra *extensionsv1alpha1.Infrastructure, cluster *extensionscontroller.Cluster) error { + err := a.delete(ctx, log, infra, cluster) + if stackitclient.IsConflict(err) { + return gardenerapihelper.NewErrorWithCodes(err, gardencorev1beta1.ErrorInfraDependencies) + } + return util.DetermineError( - a.delete(ctx, log, infra, cluster), + err, helper.KnownCodes, ) } diff --git a/pkg/openstack/client/errors.go b/pkg/openstack/client/errors.go new file mode 100644 index 00000000..d5584ad5 --- /dev/null +++ b/pkg/openstack/client/errors.go @@ -0,0 +1,24 @@ +package client + +import ( + "errors" + "net/http" +) + +// StatusCodeError is a common interface implemented by Error and the SDK's GenericOpenAPIError. +type StatusCodeError interface { + error + GetStatusCode() int +} + +// GetStatusCode returns the attached error code if the given error implements StatusCodeError or 0 otherwise. +func GetStatusCode(err error) int { + var statusCodeError StatusCodeError + if ok := errors.As(err, &statusCodeError); !ok { + return 0 + } + + return statusCodeError.GetStatusCode() +} + +func IsConflict(err error) bool { return GetStatusCode(err) == http.StatusConflict } diff --git a/pkg/stackit/client/errors.go b/pkg/stackit/client/errors.go index 2bda6833..5a4a15bb 100644 --- a/pkg/stackit/client/errors.go +++ b/pkg/stackit/client/errors.go @@ -51,6 +51,8 @@ func IsNotFound(err error) bool { return GetStatusCode(err) == http.StatusNotFound } +func IsConflict(err error) bool { return GetStatusCode(err) == http.StatusConflict } + // IgnoreNotFoundError ignore not found error func IgnoreNotFoundError(err error) error { if IsNotFound(err) {