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
4 changes: 3 additions & 1 deletion pkg/stackit/client/iaas.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
34 changes: 34 additions & 0 deletions pkg/stackit/client/utils.go
Original file line number Diff line number Diff line change
@@ -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"
)

Expand All @@ -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
}