diff --git a/pkg/stackit/client/iaas.go b/pkg/stackit/client/iaas.go index 628f1a96..aa12b98b 100644 --- a/pkg/stackit/client/iaas.go +++ b/pkg/stackit/client/iaas.go @@ -152,7 +152,9 @@ func NewIaaSClient(region string, endpoints stackitv1alpha1.APIEndpoints, creden } func (c iaasClient) CreateIsolatedNetwork(ctx context.Context, payload iaas.CreateIsolatedNetworkPayload) (*iaas.Network, error) { - return c.Client.CreateIsolatedNetwork(ctx, c.projectID, c.region).CreateIsolatedNetworkPayload(payload).Execute() + return WithResponseID(ctx, func(ctx context.Context) (*iaas.Network, error) { + return c.Client.CreateIsolatedNetwork(ctx, c.projectID, c.region).CreateIsolatedNetworkPayload(payload).Execute() + }) } func (c iaasClient) DeleteNetwork(ctx context.Context, networkID string) error { diff --git a/pkg/stackit/client/utils.go b/pkg/stackit/client/utils.go index ad101b50..62025906 100644 --- a/pkg/stackit/client/utils.go +++ b/pkg/stackit/client/utils.go @@ -1,9 +1,14 @@ package client import ( + "context" + "fmt" + "net/http" "strings" gardenerutils "github.com/gardener/gardener/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/core/runtime" + sdkWait "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api/wait" utilvalidation "k8s.io/apimachinery/pkg/util/validation" ) @@ -29,3 +34,32 @@ func BuildResourceName(technicalID, resourceNameInfix, resourceName string) stri truncated := strings.TrimRight(resourceName[:budget], "-") return technicalID + resourceNameInfix + truncated + "-" + hash } + +// wrapErrorWithResponseID wraps the error with the X-Request-Id but only if the error is not nil +func wrapErrorWithResponseID(err error, reqID string) error { + if err == nil { + return nil + } + // if the request id is empty we don't wrap the error + if reqID == "" { + return err + } + return fmt.Errorf("[%s:%s]: %w", sdkWait.XRequestIDHeader, reqID, err) +} + +func WithResponseID[T any](ctx context.Context, call func(context.Context) (T, error)) (T, error) { + var httpResp *http.Response + ctx = runtime.WithCaptureHTTPResponse(ctx, &httpResp) + + resp, err := call(ctx) + if err != nil { + var zero T + if httpResp != nil { + reqID := httpResp.Header.Get(sdkWait.XRequestIDHeader) + return zero, wrapErrorWithResponseID(err, reqID) + } + return zero, err + } + + return resp, nil +}