From c4c16bbceaa109720e327f7bd4c9b0e909cc27b3 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Mon, 15 Dec 2025 18:41:01 +0200 Subject: [PATCH 01/15] debug azure --- pkg/dto/storage_azure.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/dto/storage_azure.go b/pkg/dto/storage_azure.go index 89aaa8c5d..66f57b97e 100644 --- a/pkg/dto/storage_azure.go +++ b/pkg/dto/storage_azure.go @@ -3,6 +3,7 @@ package dto import ( "errors" "fmt" + "log/slog" "slices" "github.com/aerospike/aerospike-backup-service/v3/pkg/model" @@ -88,20 +89,26 @@ func (a *AzureStorage) toModel(config *model.Config) (model.Storage, error) { func getAzureAuth(a *AzureStorage) model.AzureAuth { if a.AccountName != "" && a.AccountKey != "" { - return model.AzureSharedKeyAuth{ + auth := model.AzureSharedKeyAuth{ AccountName: a.AccountName, AccountKey: a.AccountKey, } + slog.Info("Using Azure Account name", slog.Any("auth", auth)) + return auth } if a.TenantID != "" && a.ClientID != "" && a.ClientSecret != "" { - return model.AzureADAuth{ + auth := model.AzureADAuth{ TenantID: a.TenantID, ClientID: a.ClientID, ClientSecret: a.ClientSecret, } + slog.Info("Using Azure Active Directory authentication", slog.Any("auth", auth)) + return auth } + slog.Info("Using default") + return nil } From 0aff255fe21d04e2f2f58ef6b982b81b1f3b8ba0 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Mon, 15 Dec 2025 19:10:31 +0200 Subject: [PATCH 02/15] get account info before creating --- pkg/service/storage/azure.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index 7e0eebc74..1d33b15ce 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -3,6 +3,8 @@ package storage import ( "context" "fmt" + "log/slog" + "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" @@ -75,6 +77,7 @@ func getAzureClient(_ context.Context, a *model.AzureStorage) (*azblob.Client, e func clientFromSharedKey( endpoint string, auth model.AzureSharedKeyAuth, sa *model.SecretAgent, ) (*azblob.Client, error) { + slog.Info("Using Shared key Azure credentials", slog.Any("auth", auth)) accountKey, err := sa.Read(auth.AccountKey) if err != nil { return nil, fmt.Errorf("failed to retrieve account key from secret agent: %w", err) @@ -89,10 +92,19 @@ func clientFromSharedKey( return nil, fmt.Errorf("failed to create Azure Blob client with shared key: %w", err) } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + _, err = client.ServiceClient().GetAccountInfo(ctx, nil) + if err != nil { + return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) + } + return client, nil } func clientFromAD(endpoint string, auth model.AzureADAuth, sa *model.SecretAgent) (*azblob.Client, error) { + slog.Info("Using AD Azure credentials", slog.Any("auth", auth)) clientSecret, err := sa.Read(auth.ClientSecret) if err != nil { return nil, fmt.Errorf("failed to retrieve client-secret from secret agent: %w", err) @@ -123,10 +135,19 @@ func clientFromAD(endpoint string, auth model.AzureADAuth, sa *model.SecretAgent return nil, fmt.Errorf("failed to create Azure Blob client with AAD: %w", err) } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + _, err = client.ServiceClient().GetAccountInfo(ctx, nil) + if err != nil { + return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) + } + return client, nil } func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { + slog.Info("Using default Azure credentials", slog.String("endpoint", endpoint)) cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, fmt.Errorf("failed to obtain default Azure credentials: %w", err) @@ -137,5 +158,13 @@ func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { return nil, fmt.Errorf("failed to create Azure Blob client with default credentials: %w", err) } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + _, err = client.ServiceClient().GetAccountInfo(ctx, nil) + if err != nil { + return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) + } + return client, nil } From c47de44650471d0c01a2cfe9d14b911af0805282 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Tue, 16 Dec 2025 15:44:06 +0200 Subject: [PATCH 03/15] check status of storage --- pkg/service/storage/azure.go | 65 +++++++----- pkg/service/storage/constants.go | 5 + pkg/service/storage/gcp.go | 16 +++ pkg/service/storage/s3.go | 20 ++++ pkg/service/storage/storage_test.go | 152 ++++++++++++++++++++++++++++ 5 files changed, 234 insertions(+), 24 deletions(-) create mode 100644 pkg/service/storage/constants.go create mode 100644 pkg/service/storage/storage_test.go diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index 1d33b15ce..9258f4f88 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "log/slog" - "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" @@ -63,7 +62,21 @@ func init() { registerAccessor(NewAzureStorageAccessor()) } -func getAzureClient(_ context.Context, a *model.AzureStorage) (*azblob.Client, error) { +func getAzureClient(ctx context.Context, a *model.AzureStorage) (*azblob.Client, error) { + client, err := createAzureClient(a) + + if err != nil { + return nil, err + } + + if err := checkAzureConnectivity(ctx, client); err != nil { + return nil, err + } + + return client, nil +} + +func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { switch auth := a.Auth.(type) { case model.AzureSharedKeyAuth: return clientFromSharedKey(a.Endpoint, auth, a.SecretAgent) @@ -87,19 +100,19 @@ func clientFromSharedKey( return nil, fmt.Errorf("failed to create Azure shared key credentials: %w", err) } - client, err := azblob.NewClientWithSharedKeyCredential(endpoint, cred, nil) + client, err := azblob.NewClientWithSharedKeyCredential(endpoint, cred, &azblob.ClientOptions{ + ClientOptions: azcore.ClientOptions{ + Retry: policy.RetryOptions{ + MaxRetries: int32(model.StorageRetryPolicy.MaxRetries), + RetryDelay: model.StorageRetryPolicy.BaseTimeout, + MaxRetryDelay: model.StorageRetryPolicy.MaxBackoffDuration, + }, + }, + }) if err != nil { return nil, fmt.Errorf("failed to create Azure Blob client with shared key: %w", err) } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - _, err = client.ServiceClient().GetAccountInfo(ctx, nil) - if err != nil { - return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) - } - return client, nil } @@ -135,14 +148,6 @@ func clientFromAD(endpoint string, auth model.AzureADAuth, sa *model.SecretAgent return nil, fmt.Errorf("failed to create Azure Blob client with AAD: %w", err) } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - _, err = client.ServiceClient().GetAccountInfo(ctx, nil) - if err != nil { - return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) - } - return client, nil } @@ -153,18 +158,30 @@ func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { return nil, fmt.Errorf("failed to obtain default Azure credentials: %w", err) } - client, err := azblob.NewClient(endpoint, cred, nil) + client, err := azblob.NewClient(endpoint, cred, &azblob.ClientOptions{ + ClientOptions: azcore.ClientOptions{ + Retry: policy.RetryOptions{ + MaxRetries: int32(model.StorageRetryPolicy.MaxRetries), + RetryDelay: model.StorageRetryPolicy.BaseTimeout, + MaxRetryDelay: model.StorageRetryPolicy.MaxBackoffDuration, + }, + }, + }) if err != nil { return nil, fmt.Errorf("failed to create Azure Blob client with default credentials: %w", err) } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + return client, nil +} + +func checkAzureConnectivity(ctx context.Context, client *azblob.Client) error { + ctx, cancel := context.WithTimeout(ctx, connectivityTimeout) defer cancel() - _, err = client.ServiceClient().GetAccountInfo(ctx, nil) + _, err := client.ServiceClient().GetAccountInfo(ctx, nil) if err != nil { - return nil, fmt.Errorf("azure blob storage connectivity check failed: %w", err) + return fmt.Errorf("azure blob storage connectivity check failed: %w", err) } - return client, nil + return nil } diff --git a/pkg/service/storage/constants.go b/pkg/service/storage/constants.go new file mode 100644 index 000000000..367444997 --- /dev/null +++ b/pkg/service/storage/constants.go @@ -0,0 +1,5 @@ +package storage + +import "time" + +var connectivityTimeout = 5 * time.Second diff --git a/pkg/service/storage/gcp.go b/pkg/service/storage/gcp.go index 510976454..72800c6f5 100644 --- a/pkg/service/storage/gcp.go +++ b/pkg/service/storage/gcp.go @@ -103,5 +103,21 @@ func getGcpClient(ctx context.Context, g *model.GcpStorage) (*storage.Client, er // TODO: replace with runtime.AddCleanup when upgrading to go1.24 runtime.SetFinalizer(client, (*storage.Client).Close) + if err := checkGcpConnectivity(ctx, client, g.BucketName); err != nil { + return nil, err + } + return client, nil } + +func checkGcpConnectivity(ctx context.Context, client *storage.Client, bucket string) error { + ctx, cancel := context.WithTimeout(ctx, connectivityTimeout) + defer cancel() + + _, err := client.Bucket(bucket).Attrs(ctx) + if err != nil { + return fmt.Errorf("gcp storage connectivity check failed: %w", err) + } + + return nil +} diff --git a/pkg/service/storage/s3.go b/pkg/service/storage/s3.go index 758ac25ba..8825a649d 100644 --- a/pkg/service/storage/s3.go +++ b/pkg/service/storage/s3.go @@ -2,6 +2,7 @@ package storage import ( "context" + "fmt" "net" "net/http" "time" @@ -129,6 +130,10 @@ func getS3Client(ctx context.Context, s *model.S3Storage) (*awsS3.Client, error) } }) + if err := checkS3Connectivity(ctx, client, s.Bucket); err != nil { + return nil, err + } + return client, nil } @@ -150,3 +155,18 @@ func withCredentialsProvider(a *model.S3Authentication) (config.LoadOptionsFunc, }, }), nil } + +func checkS3Connectivity(ctx context.Context, client *awsS3.Client, bucket string) error { + ctx, cancel := context.WithTimeout(ctx, connectivityTimeout) + defer cancel() + + _, err := client.HeadBucket(ctx, &awsS3.HeadBucketInput{ + Bucket: aws.String(bucket), + }) + + if err != nil { + return fmt.Errorf("s3 storage connectivity check failed: %w", err) + } + + return nil +} diff --git a/pkg/service/storage/storage_test.go b/pkg/service/storage/storage_test.go new file mode 100644 index 000000000..724b67ec6 --- /dev/null +++ b/pkg/service/storage/storage_test.go @@ -0,0 +1,152 @@ +package storage + +import ( + "encoding/base64" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/aerospike/aerospike-backup-service/v3/pkg/model" + "github.com/aerospike/aerospike-backup-service/v3/pkg/util/ptr" + "github.com/stretchr/testify/assert" +) + +func init() { + connectivityTimeout = 100 * time.Millisecond +} + +func TestGetS3Client_Connectivity(t *testing.T) { + t.Parallel() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "HEAD" && r.URL.Path == "/test-bucket" { + w.WriteHeader(http.StatusOK) + return + } + w.WriteHeader(http.StatusNotFound) + })) + defer ts.Close() + + // Success case + s3Config := &model.S3Storage{ + Bucket: "test-bucket", + S3Region: "us-east-1", + S3EndpointOverride: ptr.Of(ts.URL), + } + + client, err := getS3Client(t.Context(), s3Config) + assert.NoError(t, err) + assert.NotNil(t, client) + + // Failure case + failServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + defer failServer.Close() + + s3ConfigFail := &model.S3Storage{ + Bucket: "test-bucket", + S3Region: "us-east-1", + S3EndpointOverride: ptr.Of(failServer.URL), + } + + clientFail, err := getS3Client(t.Context(), s3ConfigFail) + assert.Error(t, err) + assert.Nil(t, clientFail) + assert.Contains(t, err.Error(), "s3 storage connectivity check failed") +} + +func TestGetGcpClient_Connectivity(t *testing.T) { + t.Parallel() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && r.URL.Path == "/b/test-bucket" { + w.WriteHeader(http.StatusOK) + _ = json.NewEncoder(w).Encode(map[string]string{"name": "test-bucket"}) + return + } + w.WriteHeader(http.StatusNotFound) + })) + defer ts.Close() + + // Success case + gcpConfig := &model.GcpStorage{ + BucketName: "test-bucket", + Endpoint: ts.URL, + } + + client, err := getGcpClient(t.Context(), gcpConfig) + assert.NoError(t, err) + assert.NotNil(t, client) + + // Failure case + failServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + defer failServer.Close() + + gcpConfigFail := &model.GcpStorage{ + BucketName: "test-bucket", + Endpoint: failServer.URL, + } + + clientFail, err := getGcpClient(t.Context(), gcpConfigFail) + assert.Error(t, err) + assert.Nil(t, clientFail) + assert.Contains(t, err.Error(), "gcp storage connectivity check failed") +} + +func TestGetAzureClient_Connectivity(t *testing.T) { + t.Logf("Connectivity timeout: %v", connectivityTimeout) + t.Parallel() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && r.URL.Query().Get("comp") == "properties" && r.URL.Query().Get("restype") == "account" { + w.Header().Set("x-ms-request-id", "req-id") + w.Header().Set("x-ms-version", "2019-12-12") + w.Header().Set("x-ms-sku-name", "Standard_LRS") + w.Header().Set("x-ms-account-kind", "StorageV2") + w.WriteHeader(http.StatusOK) + return + } + w.WriteHeader(http.StatusBadRequest) + })) + defer ts.Close() + + // Create a valid base64 key + key := base64.StdEncoding.EncodeToString([]byte("dummy-key")) + + // Success case + azureConfig := &model.AzureStorage{ + Endpoint: ts.URL, + Auth: model.AzureSharedKeyAuth{ + AccountName: "testaccount", + AccountKey: key, + }, + } + + client, err := getAzureClient(t.Context(), azureConfig) + assert.NoError(t, err) + assert.NotNil(t, client) + + // Failure case + failServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + })) + defer failServer.Close() + + azureConfigFail := &model.AzureStorage{ + Endpoint: failServer.URL, + Auth: model.AzureSharedKeyAuth{ + AccountName: "testaccount", + AccountKey: key, + }, + } + client, err = getAzureClient(t.Context(), azureConfigFail) + + assert.Error(t, err) + assert.Nil(t, client) + assert.Contains(t, err.Error(), "azure blob storage connectivity check failed") +} From 0d6bc7b38fc097262b6de56b60fe19653bb43cae Mon Sep 17 00:00:00 2001 From: akorotkov Date: Tue, 16 Dec 2025 16:17:55 +0200 Subject: [PATCH 04/15] check status of storage --- go.mod | 4 ++-- go.sum | 4 ++++ pkg/service/storage/azure.go | 7 ++++--- pkg/service/storage/storage_test.go | 5 ++++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 37cc80f0b..dd98593db 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( cloud.google.com/go/storage v1.57.2 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 github.com/aerospike/aerospike-client-go/v8 v8.5.0 github.com/aerospike/aerospike-management-lib v1.8.0 @@ -43,7 +43,7 @@ require ( cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect diff --git a/go.sum b/go.sum index 72d408944..e201673d3 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16AP github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 h1:KpMC6LFL7mqpExyMC9jVOYRiVhLmamjeZfRsUpB7l4s= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= @@ -36,6 +38,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 h1:XkkQbfMyuH2jTSjQjSoihryI8GINRcs4xp8lNawg0FI= github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index 9258f4f88..ebb0c5cf2 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -69,7 +69,7 @@ func getAzureClient(ctx context.Context, a *model.AzureStorage) (*azblob.Client, return nil, err } - if err := checkAzureConnectivity(ctx, client); err != nil { + if err := checkAzureConnectivity(ctx, client, a.ContainerName); err != nil { return nil, err } @@ -174,11 +174,12 @@ func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { return client, nil } -func checkAzureConnectivity(ctx context.Context, client *azblob.Client) error { +func checkAzureConnectivity(ctx context.Context, client *azblob.Client, container string) error { ctx, cancel := context.WithTimeout(ctx, connectivityTimeout) defer cancel() - _, err := client.ServiceClient().GetAccountInfo(ctx, nil) + cc := client.ServiceClient().NewContainerClient(container) + _, err := cc.GetProperties(ctx, nil) if err != nil { return fmt.Errorf("azure blob storage connectivity check failed: %w", err) } diff --git a/pkg/service/storage/storage_test.go b/pkg/service/storage/storage_test.go index 724b67ec6..c990d30c7 100644 --- a/pkg/service/storage/storage_test.go +++ b/pkg/service/storage/storage_test.go @@ -103,7 +103,10 @@ func TestGetAzureClient_Connectivity(t *testing.T) { t.Parallel() ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" && r.URL.Query().Get("comp") == "properties" && r.URL.Query().Get("restype") == "account" { + isAccountCheck := r.URL.Query().Get("comp") == "properties" && r.URL.Query().Get("restype") == "account" + isContainerCheck := r.URL.Query().Get("restype") == "container" + + if r.Method == "GET" && (isAccountCheck || isContainerCheck) { w.Header().Set("x-ms-request-id", "req-id") w.Header().Set("x-ms-version", "2019-12-12") w.Header().Set("x-ms-sku-name", "Standard_LRS") From 6294a6d91344875d14031433ac51fa148c3e1bf7 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Tue, 16 Dec 2025 18:50:38 +0200 Subject: [PATCH 05/15] longer timeout --- pkg/service/storage/azure.go | 2 ++ pkg/service/storage/constants.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index ebb0c5cf2..fa5693784 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -184,5 +184,7 @@ func checkAzureConnectivity(ctx context.Context, client *azblob.Client, containe return fmt.Errorf("azure blob storage connectivity check failed: %w", err) } + slog.Info("Azure connectivity check succeeded") + return nil } diff --git a/pkg/service/storage/constants.go b/pkg/service/storage/constants.go index 367444997..7ecd0c3cb 100644 --- a/pkg/service/storage/constants.go +++ b/pkg/service/storage/constants.go @@ -2,4 +2,4 @@ package storage import "time" -var connectivityTimeout = 5 * time.Second +var connectivityTimeout = 15 * time.Second From 293f7a7d0e068f7c854016e3aa07aa0119678888 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 10:13:16 +0200 Subject: [PATCH 06/15] add logs --- pkg/service/storage/azure.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index fa5693784..230c762c6 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -66,7 +66,7 @@ func getAzureClient(ctx context.Context, a *model.AzureStorage) (*azblob.Client, client, err := createAzureClient(a) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create Azure Blob client: %w", err) } if err := checkAzureConnectivity(ctx, client, a.ContainerName); err != nil { @@ -83,6 +83,7 @@ func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { case model.AzureADAuth: return clientFromAD(a.Endpoint, auth, a.SecretAgent) default: + slog.Info("Using default Azure credentials", slog.Any("auth", auth)) return clientWithDefaultCredential(a.Endpoint) } } From 2bee3dbf30bf09d00325e88f81b17623b2fc575b Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 11:15:23 +0200 Subject: [PATCH 07/15] update Azure auth --- pkg/dto/storage_azure.go | 8 ++++---- pkg/model/storage_azure.go | 4 ++-- pkg/service/storage/azure.go | 8 ++++---- pkg/service/storage/storage_test.go | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/dto/storage_azure.go b/pkg/dto/storage_azure.go index 66f57b97e..b962b3071 100644 --- a/pkg/dto/storage_azure.go +++ b/pkg/dto/storage_azure.go @@ -94,7 +94,7 @@ func getAzureAuth(a *AzureStorage) model.AzureAuth { AccountKey: a.AccountKey, } slog.Info("Using Azure Account name", slog.Any("auth", auth)) - return auth + return &auth } if a.TenantID != "" && a.ClientID != "" && a.ClientSecret != "" { @@ -104,7 +104,7 @@ func getAzureAuth(a *AzureStorage) model.AzureAuth { ClientSecret: a.ClientSecret, } slog.Info("Using Azure Active Directory authentication", slog.Any("auth", auth)) - return auth + return &auth } slog.Info("Using default") @@ -123,10 +123,10 @@ func newAzureStorageFromModel(s *model.AzureStorage, config *model.BackupConfig) } switch auth := s.Auth.(type) { - case model.AzureSharedKeyAuth: + case *model.AzureSharedKeyAuth: azureStorage.AccountName = auth.AccountName azureStorage.AccountKey = auth.AccountKey - case model.AzureADAuth: + case *model.AzureADAuth: azureStorage.TenantID = auth.TenantID azureStorage.ClientID = auth.ClientID azureStorage.ClientSecret = auth.ClientSecret diff --git a/pkg/model/storage_azure.go b/pkg/model/storage_azure.go index 27095147d..3daa7e5b3 100644 --- a/pkg/model/storage_azure.go +++ b/pkg/model/storage_azure.go @@ -43,7 +43,7 @@ type AzureSharedKeyAuth struct { AccountKey string } -func (AzureSharedKeyAuth) azureAuth() {} +func (*AzureSharedKeyAuth) azureAuth() {} // AzureADAuth represents Azure Active Directory authentication for Azure Blob storage. type AzureADAuth struct { @@ -55,7 +55,7 @@ type AzureADAuth struct { ClientSecret string } -func (AzureADAuth) azureAuth() {} +func (*AzureADAuth) azureAuth() {} func (s *AzureStorage) GetStorageClass() StorageClass { if s.StorageClass == nil { diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index 230c762c6..1e8ac2545 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -78,9 +78,9 @@ func getAzureClient(ctx context.Context, a *model.AzureStorage) (*azblob.Client, func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { switch auth := a.Auth.(type) { - case model.AzureSharedKeyAuth: + case *model.AzureSharedKeyAuth: return clientFromSharedKey(a.Endpoint, auth, a.SecretAgent) - case model.AzureADAuth: + case *model.AzureADAuth: return clientFromAD(a.Endpoint, auth, a.SecretAgent) default: slog.Info("Using default Azure credentials", slog.Any("auth", auth)) @@ -89,7 +89,7 @@ func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { } func clientFromSharedKey( - endpoint string, auth model.AzureSharedKeyAuth, sa *model.SecretAgent, + endpoint string, auth *model.AzureSharedKeyAuth, sa *model.SecretAgent, ) (*azblob.Client, error) { slog.Info("Using Shared key Azure credentials", slog.Any("auth", auth)) accountKey, err := sa.Read(auth.AccountKey) @@ -117,7 +117,7 @@ func clientFromSharedKey( return client, nil } -func clientFromAD(endpoint string, auth model.AzureADAuth, sa *model.SecretAgent) (*azblob.Client, error) { +func clientFromAD(endpoint string, auth *model.AzureADAuth, sa *model.SecretAgent) (*azblob.Client, error) { slog.Info("Using AD Azure credentials", slog.Any("auth", auth)) clientSecret, err := sa.Read(auth.ClientSecret) if err != nil { diff --git a/pkg/service/storage/storage_test.go b/pkg/service/storage/storage_test.go index c990d30c7..4efb3e877 100644 --- a/pkg/service/storage/storage_test.go +++ b/pkg/service/storage/storage_test.go @@ -124,7 +124,7 @@ func TestGetAzureClient_Connectivity(t *testing.T) { // Success case azureConfig := &model.AzureStorage{ Endpoint: ts.URL, - Auth: model.AzureSharedKeyAuth{ + Auth: &model.AzureSharedKeyAuth{ AccountName: "testaccount", AccountKey: key, }, @@ -142,7 +142,7 @@ func TestGetAzureClient_Connectivity(t *testing.T) { azureConfigFail := &model.AzureStorage{ Endpoint: failServer.URL, - Auth: model.AzureSharedKeyAuth{ + Auth: &model.AzureSharedKeyAuth{ AccountName: "testaccount", AccountKey: key, }, From 3a14e954ea28307577bc4ac32ef842de81ab32ff Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 11:52:19 +0200 Subject: [PATCH 08/15] update Azure auth --- pkg/dto/storage_azure.go | 4 +++- pkg/service/storage/azure.go | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkg/dto/storage_azure.go b/pkg/dto/storage_azure.go index b962b3071..cf389ec4d 100644 --- a/pkg/dto/storage_azure.go +++ b/pkg/dto/storage_azure.go @@ -107,7 +107,9 @@ func getAzureAuth(a *AzureStorage) model.AzureAuth { return &auth } - slog.Info("Using default") + slog.Info("Using default Azure credentials (unknown type)", + slog.Any("a_type", fmt.Sprintf("%T", a)), + slog.Any("a", a)) return nil } diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index 1e8ac2545..daf4e7799 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -83,7 +83,9 @@ func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { case *model.AzureADAuth: return clientFromAD(a.Endpoint, auth, a.SecretAgent) default: - slog.Info("Using default Azure credentials", slog.Any("auth", auth)) + slog.Info("Using default Azure credentials (unknown type)", + slog.Any("auth_type", fmt.Sprintf("%T", auth)), + slog.Any("auth", auth)) return clientWithDefaultCredential(a.Endpoint) } } From c4543f97e96a6033c7d0c3732f26dc5efd475cd3 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 13:28:36 +0200 Subject: [PATCH 09/15] remove logs --- pkg/dto/storage_azure.go | 13 ++----------- pkg/service/storage/azure.go | 9 --------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/pkg/dto/storage_azure.go b/pkg/dto/storage_azure.go index cf389ec4d..da814d1fb 100644 --- a/pkg/dto/storage_azure.go +++ b/pkg/dto/storage_azure.go @@ -3,7 +3,6 @@ package dto import ( "errors" "fmt" - "log/slog" "slices" "github.com/aerospike/aerospike-backup-service/v3/pkg/model" @@ -89,28 +88,20 @@ func (a *AzureStorage) toModel(config *model.Config) (model.Storage, error) { func getAzureAuth(a *AzureStorage) model.AzureAuth { if a.AccountName != "" && a.AccountKey != "" { - auth := model.AzureSharedKeyAuth{ + return &model.AzureSharedKeyAuth{ AccountName: a.AccountName, AccountKey: a.AccountKey, } - slog.Info("Using Azure Account name", slog.Any("auth", auth)) - return &auth } if a.TenantID != "" && a.ClientID != "" && a.ClientSecret != "" { - auth := model.AzureADAuth{ + return &model.AzureADAuth{ TenantID: a.TenantID, ClientID: a.ClientID, ClientSecret: a.ClientSecret, } - slog.Info("Using Azure Active Directory authentication", slog.Any("auth", auth)) - return &auth } - slog.Info("Using default Azure credentials (unknown type)", - slog.Any("a_type", fmt.Sprintf("%T", a)), - slog.Any("a", a)) - return nil } diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index daf4e7799..eef9d5d98 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -3,7 +3,6 @@ package storage import ( "context" "fmt" - "log/slog" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" @@ -83,9 +82,6 @@ func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { case *model.AzureADAuth: return clientFromAD(a.Endpoint, auth, a.SecretAgent) default: - slog.Info("Using default Azure credentials (unknown type)", - slog.Any("auth_type", fmt.Sprintf("%T", auth)), - slog.Any("auth", auth)) return clientWithDefaultCredential(a.Endpoint) } } @@ -93,7 +89,6 @@ func createAzureClient(a *model.AzureStorage) (*azblob.Client, error) { func clientFromSharedKey( endpoint string, auth *model.AzureSharedKeyAuth, sa *model.SecretAgent, ) (*azblob.Client, error) { - slog.Info("Using Shared key Azure credentials", slog.Any("auth", auth)) accountKey, err := sa.Read(auth.AccountKey) if err != nil { return nil, fmt.Errorf("failed to retrieve account key from secret agent: %w", err) @@ -120,7 +115,6 @@ func clientFromSharedKey( } func clientFromAD(endpoint string, auth *model.AzureADAuth, sa *model.SecretAgent) (*azblob.Client, error) { - slog.Info("Using AD Azure credentials", slog.Any("auth", auth)) clientSecret, err := sa.Read(auth.ClientSecret) if err != nil { return nil, fmt.Errorf("failed to retrieve client-secret from secret agent: %w", err) @@ -155,7 +149,6 @@ func clientFromAD(endpoint string, auth *model.AzureADAuth, sa *model.SecretAgen } func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { - slog.Info("Using default Azure credentials", slog.String("endpoint", endpoint)) cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { return nil, fmt.Errorf("failed to obtain default Azure credentials: %w", err) @@ -187,7 +180,5 @@ func checkAzureConnectivity(ctx context.Context, client *azblob.Client, containe return fmt.Errorf("azure blob storage connectivity check failed: %w", err) } - slog.Info("Azure connectivity check succeeded") - return nil } From 4a1d011336f19d8c0b26deee66e641ba64511f0c Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 13:30:30 +0200 Subject: [PATCH 10/15] remove constants.go --- pkg/service/storage/constants.go | 5 ----- pkg/service/storage/operations.go | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 pkg/service/storage/constants.go diff --git a/pkg/service/storage/constants.go b/pkg/service/storage/constants.go deleted file mode 100644 index 7ecd0c3cb..000000000 --- a/pkg/service/storage/constants.go +++ /dev/null @@ -1,5 +0,0 @@ -package storage - -import "time" - -var connectivityTimeout = 15 * time.Second diff --git a/pkg/service/storage/operations.go b/pkg/service/storage/operations.go index e9147c6fd..16806ae74 100644 --- a/pkg/service/storage/operations.go +++ b/pkg/service/storage/operations.go @@ -16,6 +16,8 @@ import ( "github.com/aerospike/backup-go/models" ) +var connectivityTimeout = 15 * time.Second + // CreateFileReader creates a reader for a file in the specified storage. func CreateFileReader( ctx context.Context, From 40982b3043d0af87dd981dde50288ad5b3099b85 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 13:31:23 +0200 Subject: [PATCH 11/15] go mod tidy --- go.sum | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go.sum b/go.sum index e201673d3..21852a5f3 100644 --- a/go.sum +++ b/go.sum @@ -22,8 +22,6 @@ cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4 cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 h1:KpMC6LFL7mqpExyMC9jVOYRiVhLmamjeZfRsUpB7l4s= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= @@ -36,8 +34,6 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 h1:ZJJNFaQ86GVKQ9ehw github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3/go.mod h1:URuDvhmATVKqHBH9/0nOiNKk0+YcwfQ3WkK5PqHKxc8= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 h1:XkkQbfMyuH2jTSjQjSoihryI8GINRcs4xp8lNawg0FI= -github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= From 3bb0a1c1a1c694a859ccc3bdcaf7ef2b371195ba Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 13:42:33 +0200 Subject: [PATCH 12/15] remove log print --- pkg/service/storage/storage_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/service/storage/storage_test.go b/pkg/service/storage/storage_test.go index 4efb3e877..1e6f7b599 100644 --- a/pkg/service/storage/storage_test.go +++ b/pkg/service/storage/storage_test.go @@ -99,7 +99,6 @@ func TestGetGcpClient_Connectivity(t *testing.T) { } func TestGetAzureClient_Connectivity(t *testing.T) { - t.Logf("Connectivity timeout: %v", connectivityTimeout) t.Parallel() ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { From a111db6effa4c8ea518a2b9e57680470d9e7be93 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 13:52:46 +0200 Subject: [PATCH 13/15] remove log try add auth for s3 --- pkg/service/storage/storage_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/service/storage/storage_test.go b/pkg/service/storage/storage_test.go index 1e6f7b599..42e92a046 100644 --- a/pkg/service/storage/storage_test.go +++ b/pkg/service/storage/storage_test.go @@ -34,6 +34,10 @@ func TestGetS3Client_Connectivity(t *testing.T) { Bucket: "test-bucket", S3Region: "us-east-1", S3EndpointOverride: ptr.Of(ts.URL), + Auth: &model.S3Authentication{ + KeyIDSecret: "key", + AccessKeySecret: "secret", + }, } client, err := getS3Client(t.Context(), s3Config) @@ -50,6 +54,10 @@ func TestGetS3Client_Connectivity(t *testing.T) { Bucket: "test-bucket", S3Region: "us-east-1", S3EndpointOverride: ptr.Of(failServer.URL), + Auth: &model.S3Authentication{ + KeyIDSecret: "key", + AccessKeySecret: "secret", + }, } clientFail, err := getS3Client(t.Context(), s3ConfigFail) From a9f1a31d8dd4895b0ce913a26c8ad565074c8cea Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 15:35:58 +0200 Subject: [PATCH 14/15] merge --- go.mod | 50 +++++++++++++------------- go.sum | 108 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index 5d375799c..936aca4f9 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,17 @@ module github.com/aerospike/aerospike-backup-service/v3 go 1.24.0 require ( - cloud.google.com/go/storage v1.57.2 + cloud.google.com/go/storage v1.58.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 github.com/aerospike/aerospike-client-go/v8 v8.5.0 github.com/aerospike/aerospike-management-lib v1.8.0 github.com/aerospike/backup-go v0.8.1-0.20251209104025-56157828021b - github.com/aws/aws-sdk-go-v2 v1.40.1 - github.com/aws/aws-sdk-go-v2/config v1.32.3 - github.com/aws/aws-sdk-go-v2/credentials v1.19.3 - github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0 + github.com/aws/aws-sdk-go-v2 v1.41.0 + github.com/aws/aws-sdk-go-v2/config v1.32.6 + github.com/aws/aws-sdk-go-v2/credentials v1.19.6 + github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 github.com/aws/smithy-go v1.24.0 github.com/go-logr/logr v1.4.3 github.com/googleapis/gax-go/v2 v2.15.0 @@ -34,32 +34,32 @@ require ( require ( cel.dev/expr v0.24.0 // indirect - cloud.google.com/go v0.121.6 // indirect + cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth v0.17.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect @@ -105,7 +105,7 @@ require ( github.com/yuin/gopher-lua v1.1.1 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect @@ -118,8 +118,8 @@ require ( golang.org/x/oauth2 v0.33.0 // indirect golang.org/x/sys v0.38.0 // indirect golang.org/x/text v0.31.0 // indirect - google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect + google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect google.golang.org/grpc v1.77.0 // indirect google.golang.org/protobuf v1.36.10 // indirect diff --git a/go.sum b/go.sum index 678c5efb7..a2ecb24dc 100644 --- a/go.sum +++ b/go.sum @@ -1,29 +1,29 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= -cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= -cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= -cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= -cloud.google.com/go/storage v1.57.2 h1:sVlym3cHGYhrp6XZKkKb+92I1V42ks2qKKpB0CF5Mb4= -cloud.google.com/go/storage v1.57.2/go.mod h1:n5ijg4yiRXXpCu0sJTD6k+eMf7GRrJmPyr9YxLXGHOk= +cloud.google.com/go/storage v1.58.0 h1:PflFXlmFJjG/nBeR9B7pKddLQWaFaRWx4uUi/LyNxxo= +cloud.google.com/go/storage v1.58.0/go.mod h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 h1:KpMC6LFL7mqpExyMC9jVOYRiVhLmamjeZfRsUpB7l4s= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= @@ -34,16 +34,16 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 h1:ZJJNFaQ86GVKQ9ehw github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3/go.mod h1:URuDvhmATVKqHBH9/0nOiNKk0+YcwfQ3WkK5PqHKxc8= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 h1:XkkQbfMyuH2jTSjQjSoihryI8GINRcs4xp8lNawg0FI= -github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0 h1:lhhYARPUu3LmHysQ/igznQphfzynnqI3D75oUyw1HXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.54.0/go.mod h1:l9rva3ApbBpEJxSNYnwT9N4CDLrWgtq3u8736C5hyJw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0 h1:xfK3bbi6F2RDtaZFtUdKO3osOBIhNb+xTs8lFW6yx9o= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.54.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0 h1:s0WlVbf9qpvkh1c/uDAPElam0WrL7fHRIidgZJ7UqZI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.54.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= @@ -54,42 +54,42 @@ github.com/aerospike/aerospike-management-lib v1.8.0 h1:oXxuXqCpMD0f8KXXOaCdIZof github.com/aerospike/aerospike-management-lib v1.8.0/go.mod h1:RNKlkSnppiaBaLEdAiCeBv68M+odPR5JR+ziO0NfaHQ= github.com/aerospike/backup-go v0.8.1-0.20251209104025-56157828021b h1:qyeq5umg0/fo962YZMwfduRNwFTrHY4QcldoJ3Y2t3s= github.com/aerospike/backup-go v0.8.1-0.20251209104025-56157828021b/go.mod h1:4p2uac3YTnw97y/GX7PxxlBKgQJhbMZ5arhFu6agJ9g= -github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc= -github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= +github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4= +github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4= -github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU= -github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA= +github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8= +github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI= +github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15 h1:NLYTEyZmVZo0Qh183sC8nC+ydJXOOeIL/qI/sS3PdLY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.15/go.mod h1:Z803iB3B0bc8oJV8zH2PERLRfQUJ2n2BXISpsA4+O1M= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 h1:CjMzUs78RDDv4ROu3JnJn/Ig1r6ZD7/T2DXLLRpejic= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16/go.mod h1:uVW4OLBqbJXSHJYA9svT9BluSvvwbzLQ2Crf6UPzR3c= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6 h1:P1MU/SuhadGvg2jtviDXPEejU3jBNhoeeAlRadHzvHI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.6/go.mod h1:5KYaMG6wmVKMFBSfWoyG/zH8pWwzQFnKgpoSRlXHKdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15 h1:wsSQ4SVz5YE1crz0Ap7VBZrV4nNqZt4CIBBT8mnwoNc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.15/go.mod h1:I7sditnFGtYMIqPRU1QoHZAUrXkGp4SczmlLwrNPlD0= -github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0 h1:IrbE3B8O9pm3lsg96AXIN5MXX4pECEuExh/A0Du3AuI= -github.com/aws/aws-sdk-go-v2/service/s3 v1.93.0/go.mod h1:/sJLzHtiiZvs6C1RbxS/anSAFwZD6oC6M/kotQzOiLw= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 h1:DIBqIrJ7hv+e4CmIk2z3pyKT+3B6qVMgRsawHiR3qso= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7/go.mod h1:vLm00xmBke75UmpNvOcZQ/Q30ZFjbczeLFqGx5urmGo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A= +github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 h1:SWTxh/EcUCDVqi/0s26V6pVUq0BBG7kx0tDTmF/hCgA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk= github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -238,14 +238,14 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= @@ -306,10 +306,10 @@ gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA= google.golang.org/api v0.257.0/go.mod h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9 h1:LvZVVaPE0JSqL+ZWb6ErZfnEOKIqqFWUJE2D0fObSmc= +google.golang.org/genproto v0.0.0-20250922171735-9219d122eba9/go.mod h1:QFOrLhdAe2PsTp3vQY4quuLKTi9j3XG3r6JPPaw7MSc= +google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4= +google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U= google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk= google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= From 282ffb603cfd00319f215460237633e9e595f9f2 Mon Sep 17 00:00:00 2001 From: akorotkov Date: Wed, 17 Dec 2025 17:56:24 +0200 Subject: [PATCH 15/15] extract options func --- pkg/service/storage/azure.go | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/pkg/service/storage/azure.go b/pkg/service/storage/azure.go index eef9d5d98..4cca02aa3 100644 --- a/pkg/service/storage/azure.go +++ b/pkg/service/storage/azure.go @@ -98,15 +98,7 @@ func clientFromSharedKey( return nil, fmt.Errorf("failed to create Azure shared key credentials: %w", err) } - client, err := azblob.NewClientWithSharedKeyCredential(endpoint, cred, &azblob.ClientOptions{ - ClientOptions: azcore.ClientOptions{ - Retry: policy.RetryOptions{ - MaxRetries: int32(model.StorageRetryPolicy.MaxRetries), - RetryDelay: model.StorageRetryPolicy.BaseTimeout, - MaxRetryDelay: model.StorageRetryPolicy.MaxBackoffDuration, - }, - }, - }) + client, err := azblob.NewClientWithSharedKeyCredential(endpoint, cred, azureOptions()) if err != nil { return nil, fmt.Errorf("failed to create Azure Blob client with shared key: %w", err) } @@ -132,15 +124,7 @@ func clientFromAD(endpoint string, auth *model.AzureADAuth, sa *model.SecretAgen return nil, fmt.Errorf("failed to create Azure AAD credentials: %w", err) } - client, err := azblob.NewClient(endpoint, cred, &azblob.ClientOptions{ - ClientOptions: azcore.ClientOptions{ - Retry: policy.RetryOptions{ - MaxRetries: int32(model.StorageRetryPolicy.MaxRetries), - RetryDelay: model.StorageRetryPolicy.BaseTimeout, - MaxRetryDelay: model.StorageRetryPolicy.MaxBackoffDuration, - }, - }, - }) + client, err := azblob.NewClient(endpoint, cred, azureOptions()) if err != nil { return nil, fmt.Errorf("failed to create Azure Blob client with AAD: %w", err) } @@ -154,7 +138,16 @@ func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { return nil, fmt.Errorf("failed to obtain default Azure credentials: %w", err) } - client, err := azblob.NewClient(endpoint, cred, &azblob.ClientOptions{ + client, err := azblob.NewClient(endpoint, cred, azureOptions()) + if err != nil { + return nil, fmt.Errorf("failed to create Azure Blob client with default credentials: %w", err) + } + + return client, nil +} + +func azureOptions() *azblob.ClientOptions { + return &azblob.ClientOptions{ ClientOptions: azcore.ClientOptions{ Retry: policy.RetryOptions{ MaxRetries: int32(model.StorageRetryPolicy.MaxRetries), @@ -162,12 +155,7 @@ func clientWithDefaultCredential(endpoint string) (*azblob.Client, error) { MaxRetryDelay: model.StorageRetryPolicy.MaxBackoffDuration, }, }, - }) - if err != nil { - return nil, fmt.Errorf("failed to create Azure Blob client with default credentials: %w", err) } - - return client, nil } func checkAzureConnectivity(ctx context.Context, client *azblob.Client, container string) error {