From 7f8bfd3a5c619c94b556e84cfb902358f0353c60 Mon Sep 17 00:00:00 2001 From: Tiger Kaovilai Date: Mon, 14 Oct 2024 10:05:08 -0500 Subject: [PATCH] Set hinting region to use for GetBucketRegion() in pkg/repository/config/aws.go Signed-off-by: Tiger Kaovilai --- pkg/repository/config/aws.go | 17 ++++++++++++++--- pkg/repository/config/config.go | 2 +- pkg/repository/provider/unified_repo.go | 2 +- pkg/repository/provider/unified_repo_test.go | 10 +++++----- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pkg/repository/config/aws.go b/pkg/repository/config/aws.go index 567fec54c3..40e52863cd 100644 --- a/pkg/repository/config/aws.go +++ b/pkg/repository/config/aws.go @@ -121,13 +121,24 @@ func GetS3Credentials(config map[string]string) (*aws.Credentials, error) { // GetAWSBucketRegion returns the AWS region that a bucket is in, or an error // if the region cannot be determined. -func GetAWSBucketRegion(bucket string) (string, error) { - cfg, err := awsconfig.LoadDefaultConfig(context.Background()) +// It will use us-east-1 as hinting server and requires config param to use as credentials +func GetAWSBucketRegion(bucket string, config map[string]string) (string, error) { + cfg, err := awsconfig.LoadDefaultConfig(context.Background(), awsconfig.WithCredentialsProvider( + aws.CredentialsProviderFunc( + func(context.Context) (aws.Credentials, error) { + s3creds, err := GetS3Credentials(config) + if s3creds == nil { + return aws.Credentials{}, err + } + return *s3creds, err + }, + ), + )) if err != nil { return "", errors.WithStack(err) } client := s3.NewFromConfig(cfg) - region, err := s3manager.GetBucketRegion(context.Background(), client, bucket) + region, err := s3manager.GetBucketRegion(context.Background(), client, bucket, func(o *s3.Options) { o.Region = "us-east-1" }) if err != nil { return "", errors.WithStack(err) } diff --git a/pkg/repository/config/config.go b/pkg/repository/config/config.go index c1ef8b906c..46a5478e67 100644 --- a/pkg/repository/config/config.go +++ b/pkg/repository/config/config.go @@ -72,7 +72,7 @@ func getRepoPrefix(location *velerov1api.BackupStorageLocation) (string, error) var err error region := location.Spec.Config["region"] if region == "" { - region, err = getAWSBucketRegion(bucket) + region, err = getAWSBucketRegion(bucket, location.Spec.Config) } if err != nil { return "", errors.Wrapf(err, "failed to detect the region via bucket: %s", bucket) diff --git a/pkg/repository/provider/unified_repo.go b/pkg/repository/provider/unified_repo.go index ac77e5b66e..6191c44528 100644 --- a/pkg/repository/provider/unified_repo.go +++ b/pkg/repository/provider/unified_repo.go @@ -529,7 +529,7 @@ func getStorageVariables(backupLocation *velerov1api.BackupStorageLocation, repo var err error if s3URL == "" { if region == "" { - region, err = getS3BucketRegion(bucket) + region, err = getS3BucketRegion(bucket, config) if err != nil { return map[string]string{}, errors.Wrap(err, "error get s3 bucket region") } diff --git a/pkg/repository/provider/unified_repo_test.go b/pkg/repository/provider/unified_repo_test.go index a5063bbbfa..6f87858489 100644 --- a/pkg/repository/provider/unified_repo_test.go +++ b/pkg/repository/provider/unified_repo_test.go @@ -222,7 +222,7 @@ func TestGetStorageVariables(t *testing.T) { repoName string repoBackend string repoConfig map[string]string - getS3BucketRegion func(string) (string, error) + getS3BucketRegion func(bucket string, config map[string]string) (string, error) expected map[string]string expectedErr string }{ @@ -291,7 +291,7 @@ func TestGetStorageVariables(t *testing.T) { }, }, }, - getS3BucketRegion: func(bucket string) (string, error) { + getS3BucketRegion: func(bucket string, config map[string]string) (string, error) { return "region from bucket: " + bucket, nil }, repoBackend: "fake-repo-type", @@ -313,7 +313,7 @@ func TestGetStorageVariables(t *testing.T) { Config: map[string]string{}, }, }, - getS3BucketRegion: func(bucket string) (string, error) { + getS3BucketRegion: func(bucket string, config map[string]string) (string, error) { return "", errors.New("fake error") }, expected: map[string]string{}, @@ -339,7 +339,7 @@ func TestGetStorageVariables(t *testing.T) { }, }, }, - getS3BucketRegion: func(bucket string) (string, error) { + getS3BucketRegion: func(bucket string, config map[string]string) (string, error) { return "region from bucket: " + bucket, nil }, repoBackend: "fake-repo-type", @@ -374,7 +374,7 @@ func TestGetStorageVariables(t *testing.T) { }, }, }, - getS3BucketRegion: func(bucket string) (string, error) { + getS3BucketRegion: func(bucket string, config map[string]string) (string, error) { return "region from bucket: " + bucket, nil }, repoBackend: "fake-repo-type",