@@ -5,13 +5,14 @@ package backupentry
55
66import (
77 "context"
8+ "errors"
89 "fmt"
910
10- "github.com/aws/aws-sdk-go/aws"
11- "github.com/aws/aws-sdk-go/aws/awserr "
12- "github.com/aws/aws-sdk-go/aws /credentials"
13- "github.com/aws/aws-sdk-go/aws/session "
14- "github.com/aws/aws-sdk-go/service/s3"
11+ "github.com/aws/aws-sdk-go-v2 /aws"
12+ "github.com/aws/aws-sdk-go-v2/config "
13+ "github.com/aws/aws-sdk-go-v2 /credentials"
14+ "github.com/aws/aws-sdk-go-v2/service/s3 "
15+ s3types "github.com/aws/aws-sdk-go-v2 /service/s3/types "
1516 corev1 "k8s.io/api/core/v1"
1617
1718 "github.com/ironcore-dev/gardener-extension-provider-ironcore/pkg/ironcore"
@@ -20,53 +21,48 @@ import (
2021//go:generate $MOCKGEN -copyright_file ../../../hack/license-header.txt -package backupentry -destination=mock_backupentry.go -source backupentry.go S3ClientGetter,S3ObjectLister
2122
2223type s3ObjectLister interface {
23- ListObjectsPages (ctx aws .Context , s3Client * s3.S3 , input * s3.ListObjectsInput , bucketName string ) error
24+ ListObjectsPages (ctx context .Context , s3Client * s3.Client , input * s3.ListObjectsV2Input , bucketName string ) error
2425}
2526
2627type s3ObjectListerImpl struct {}
2728
2829var objectLister s3ObjectLister = s3ObjectListerImpl {}
2930
30- func (o s3ObjectListerImpl ) ListObjectsPages (ctx aws.Context , s3Client * s3.S3 , input * s3.ListObjectsInput , bucketName string ) error {
31- var delErr error
32- if err := s3Client .ListObjectsPagesWithContext (ctx , input , func (page * s3.ListObjectsOutput , lastPage bool ) bool {
33- objectIDs := make ([]* s3.ObjectIdentifier , 0 )
34- for _ , key := range page .Contents {
35- obj := & s3.ObjectIdentifier {
36- Key : key .Key ,
37- }
38- objectIDs = append (objectIDs , obj )
31+ func (o s3ObjectListerImpl ) ListObjectsPages (ctx context.Context , s3Client * s3.Client , input * s3.ListObjectsV2Input , bucketName string ) error {
32+ paginator := s3 .NewListObjectsV2Paginator (s3Client , input )
33+ for paginator .HasMorePages () {
34+ objectIDs := make ([]s3types.ObjectIdentifier , 0 )
35+ output , err := paginator .NextPage (ctx )
36+ if err != nil {
37+ return err
38+ }
39+ for _ , object := range output .Contents {
40+ identifier := s3types.ObjectIdentifier {Key : object .Key }
41+ objectIDs = append (objectIDs , identifier )
3942 }
40-
4143 if len (objectIDs ) != 0 {
42- if _ , delErr = s3Client .DeleteObjectsWithContext (ctx , & s3.DeleteObjectsInput {
44+ if _ , err = s3Client .DeleteObjects (ctx , & s3.DeleteObjectsInput {
4345 Bucket : aws .String (bucketName ),
44- Delete : & s3 .Delete {
46+ Delete : & s3types .Delete {
4547 Objects : objectIDs ,
4648 Quiet : aws .Bool (true ),
4749 },
48- }); delErr != nil {
49- return false
50+ }); err != nil {
51+ var nsk * s3types.NoSuchKey
52+ if errors .As (err , & nsk ) {
53+ return nil
54+ }
55+ return err
5056 }
5157 }
52- return ! lastPage
53- }); err != nil {
54- return fmt .Errorf ("error listing objects pages from bucket %s: %w" , bucketName , err )
55- }
56-
57- if delErr != nil {
58- if aerr , ok := delErr .(awserr.Error ); ok && aerr .Code () == s3 .ErrCodeNoSuchKey {
59- return nil
60- }
61- return delErr
6258 }
6359 return nil
6460}
6561
6662// DeleteObjectsWithPrefix deletes the s3 objects with the specific <prefix>
6763// from <bucket>. If it does not exist, no error is returned.
68- func DeleteObjectsWithPrefix (ctx context.Context , s3Client * s3.S3 , region , bucketName , prefix string ) error {
69- in := & s3.ListObjectsInput {
64+ func DeleteObjectsWithPrefix (ctx context.Context , s3Client * s3.Client , bucketName , prefix string ) error {
65+ in := & s3.ListObjectsV2Input {
7066 Bucket : aws .String (bucketName ),
7167 Prefix : aws .String (prefix ),
7268 }
@@ -80,7 +76,7 @@ func DeleteObjectsWithPrefix(ctx context.Context, s3Client *s3.S3, region, bucke
8076
8177// GetS3ClientFromS3ClientSecret creates s3Client from bucket access key ID
8278// and secret access key.
83- func GetS3ClientFromS3ClientSecret (secret * corev1.Secret ) (* s3.S3 , error ) {
79+ func GetS3ClientFromS3ClientSecret (ctx context. Context , secret * corev1.Secret ) (* s3.Client , error ) {
8480 if secret .Data == nil {
8581 return nil , fmt .Errorf ("secret does not contain any data" )
8682 }
@@ -100,18 +96,16 @@ func GetS3ClientFromS3ClientSecret(secret *corev1.Secret) (*s3.S3, error) {
10096 return nil , fmt .Errorf ("missing %q field in secret" , ironcore .Endpoint )
10197 }
10298
99+ awsCredentials := credentials .NewStaticCredentialsProvider (string (accessKeyID ), string (secretAccessKey ), "" )
103100 endpointStr := string (endpoint )
104- awsConfig := & aws.Config {
105- Credentials : credentials .NewStaticCredentials (string (accessKeyID ), string (secretAccessKey ), "" ),
106- Endpoint : & endpointStr ,
107- }
108101
109- s , err := session . NewSession ( awsConfig )
102+ cfg , err := config . LoadDefaultConfig ( ctx , config . WithCredentialsProvider ( awsCredentials ), config . WithBaseEndpoint ( endpointStr ) )
110103 if err != nil {
111- return nil , fmt .Errorf ("failed to create session : %w" , err )
104+ return nil , fmt .Errorf ("failed to create AWS config : %w" , err )
112105 }
113- config := & aws.Config {Region : aws .String ("region" )} //TODO: hardcoded the region for now, consider making it configurable if necessary
114- s3Client := s3 .New (s , config )
106+ s3Client := s3 .NewFromConfig (cfg , func (o * s3.Options ) {
107+ o .Region = "region" //TODO: hardcoded the region for now, consider making it configurable if necessary
108+ })
115109
116110 return s3Client , nil
117111}
0 commit comments