@@ -20,17 +20,20 @@ import (
20
20
"context"
21
21
"errors"
22
22
"fmt"
23
+
24
+ "github.com/aws/smithy-go"
23
25
"math/rand"
24
26
"os"
25
27
"time"
26
28
27
- "github.com/aws/aws-sdk-go/aws"
28
- "github.com/aws/aws-sdk-go/aws/awserr"
29
- "github.com/aws/aws-sdk-go/aws/credentials/stscreds"
30
- "github.com/aws/aws-sdk-go/aws/ec2metadata"
31
- "github.com/aws/aws-sdk-go/aws/request"
32
- "github.com/aws/aws-sdk-go/aws/session"
33
- "github.com/aws/aws-sdk-go/service/efs"
29
+ "github.com/aws/aws-sdk-go-v2/aws"
30
+ "github.com/aws/aws-sdk-go-v2/config"
31
+ "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
32
+ "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
33
+ "github.com/aws/aws-sdk-go-v2/service/efs"
34
+ "github.com/aws/aws-sdk-go-v2/service/efs/types"
35
+ "github.com/aws/aws-sdk-go-v2/service/sts"
36
+
34
37
"k8s.io/klog/v2"
35
38
)
36
39
@@ -88,11 +91,11 @@ type MountTarget struct {
88
91
89
92
// Efs abstracts efs client(https://docs.aws.amazon.com/sdk-for-go/api/service/efs/)
90
93
type Efs interface {
91
- CreateAccessPointWithContext (aws .Context , * efs.CreateAccessPointInput , ... request. Option ) (* efs.CreateAccessPointOutput , error )
92
- DeleteAccessPointWithContext (aws .Context , * efs.DeleteAccessPointInput , ... request. Option ) (* efs.DeleteAccessPointOutput , error )
93
- DescribeAccessPointsWithContext (aws .Context , * efs.DescribeAccessPointsInput , ... request. Option ) (* efs.DescribeAccessPointsOutput , error )
94
- DescribeFileSystemsWithContext (aws .Context , * efs.DescribeFileSystemsInput , ... request. Option ) (* efs.DescribeFileSystemsOutput , error )
95
- DescribeMountTargetsWithContext (aws .Context , * efs.DescribeMountTargetsInput , ... request. Option ) (* efs.DescribeMountTargetsOutput , error )
94
+ CreateAccessPoint (context .Context , * efs.CreateAccessPointInput , ... func ( * efs. Options ) ) (* efs.CreateAccessPointOutput , error )
95
+ DeleteAccessPoint (context .Context , * efs.DeleteAccessPointInput , ... func ( * efs. Options ) ) (* efs.DeleteAccessPointOutput , error )
96
+ DescribeAccessPoints (context .Context , * efs.DescribeAccessPointsInput , ... func ( * efs. Options ) ) (* efs.DescribeAccessPointsOutput , error )
97
+ DescribeFileSystems (context .Context , * efs.DescribeFileSystemsInput , ... func ( * efs. Options ) ) (* efs.DescribeFileSystemsOutput , error )
98
+ DescribeMountTargets (context .Context , * efs.DescribeMountTargetsInput , ... func ( * efs. Options ) ) (* efs.DescribeMountTargetsOutput , error )
96
99
}
97
100
98
101
type Cloud interface {
@@ -124,16 +127,18 @@ func NewCloudWithRole(awsRoleArn string) (Cloud, error) {
124
127
}
125
128
126
129
func createCloud (awsRoleArn string ) (Cloud , error ) {
127
- sess := session .Must (session .NewSession (& aws.Config {}))
128
- svc := ec2metadata .New (sess )
130
+ cfg , err := config .LoadDefaultConfig (context .TODO ())
131
+ if err != nil {
132
+ klog .Warningf ("Could not load config: %v" , err )
133
+ }
134
+
135
+ svc := imds .NewFromConfig (cfg )
129
136
api , err := DefaultKubernetesAPIClient ()
130
137
131
138
if err != nil && ! isDriverBootedInECS () {
132
139
klog .Warningf ("Could not create Kubernetes Client: %v" , err )
133
140
}
134
-
135
141
metadataProvider , err := GetNewMetadataProvider (svc , api )
136
-
137
142
if err != nil {
138
143
return nil , fmt .Errorf ("error creating MetadataProvider: %v" , err )
139
144
}
@@ -144,21 +149,23 @@ func createCloud(awsRoleArn string) (Cloud, error) {
144
149
return nil , fmt .Errorf ("could not get metadata: %v" , err )
145
150
}
146
151
147
- efs_client := createEfsClient (awsRoleArn , metadata , sess )
148
- klog .V (5 ).Infof ("EFS Client created using the following endpoint: %+v" , efs_client .( * efs. EFS ). Client . ClientInfo . Endpoint )
152
+ efs_client := createEfsClient (awsRoleArn , metadata )
153
+ klog .V (5 ).Infof ("EFS Client created using the following endpoint: %+v" , cfg . BaseEndpoint )
149
154
150
155
return & cloud {
151
156
metadata : metadata ,
152
157
efs : efs_client ,
153
158
}, nil
154
159
}
155
160
156
- func createEfsClient (awsRoleArn string , metadata MetadataService , sess * session. Session ) Efs {
157
- config := aws . NewConfig () .WithRegion (metadata .GetRegion ())
161
+ func createEfsClient (awsRoleArn string , metadata MetadataService ) Efs {
162
+ cfg , _ := config . LoadDefaultConfig ( context . TODO (), config .WithRegion (metadata .GetRegion () ))
158
163
if awsRoleArn != "" {
159
- config = config .WithCredentials (stscreds .NewCredentials (sess , awsRoleArn ))
164
+ stsClient := sts .NewFromConfig (cfg )
165
+ roleProvider := stscreds .NewAssumeRoleProvider (stsClient , awsRoleArn )
166
+ cfg .Credentials = aws .NewCredentialsCache (roleProvider )
160
167
}
161
- return efs .New ( session . Must ( session . NewSession ( config )) )
168
+ return efs .NewFromConfig ( cfg )
162
169
}
163
170
164
171
func (c * cloud ) GetMetadata () MetadataService {
@@ -170,12 +177,12 @@ func (c *cloud) CreateAccessPoint(ctx context.Context, clientToken string, acces
170
177
createAPInput := & efs.CreateAccessPointInput {
171
178
ClientToken : & clientToken ,
172
179
FileSystemId : & accessPointOpts .FileSystemId ,
173
- PosixUser : & efs .PosixUser {
180
+ PosixUser : & types .PosixUser {
174
181
Gid : & accessPointOpts .Gid ,
175
182
Uid : & accessPointOpts .Uid ,
176
183
},
177
- RootDirectory : & efs .RootDirectory {
178
- CreationInfo : & efs .CreationInfo {
184
+ RootDirectory : & types .RootDirectory {
185
+ CreationInfo : & types .CreationInfo {
179
186
OwnerGid : & accessPointOpts .Gid ,
180
187
OwnerUid : & accessPointOpts .Uid ,
181
188
Permissions : & accessPointOpts .DirectoryPerms ,
@@ -186,7 +193,7 @@ func (c *cloud) CreateAccessPoint(ctx context.Context, clientToken string, acces
186
193
}
187
194
188
195
klog .V (5 ).Infof ("Calling Create AP with input: %+v" , * createAPInput )
189
- res , err := c .efs .CreateAccessPointWithContext (ctx , createAPInput )
196
+ res , err := c .efs .CreateAccessPoint (ctx , createAPInput )
190
197
if err != nil {
191
198
if isAccessDenied (err ) {
192
199
return nil , ErrAccessDenied
@@ -204,7 +211,7 @@ func (c *cloud) CreateAccessPoint(ctx context.Context, clientToken string, acces
204
211
205
212
func (c * cloud ) DeleteAccessPoint (ctx context.Context , accessPointId string ) (err error ) {
206
213
deleteAccessPointInput := & efs.DeleteAccessPointInput {AccessPointId : & accessPointId }
207
- _ , err = c .efs .DeleteAccessPointWithContext (ctx , deleteAccessPointInput )
214
+ _ , err = c .efs .DeleteAccessPoint (ctx , deleteAccessPointInput )
208
215
if err != nil {
209
216
if isAccessDenied (err ) {
210
217
return ErrAccessDenied
@@ -222,7 +229,7 @@ func (c *cloud) DescribeAccessPoint(ctx context.Context, accessPointId string) (
222
229
describeAPInput := & efs.DescribeAccessPointsInput {
223
230
AccessPointId : & accessPointId ,
224
231
}
225
- res , err := c .efs .DescribeAccessPointsWithContext (ctx , describeAPInput )
232
+ res , err := c .efs .DescribeAccessPoints (ctx , describeAPInput )
226
233
if err != nil {
227
234
if isAccessDenied (err ) {
228
235
return nil , ErrAccessDenied
@@ -250,9 +257,9 @@ func (c *cloud) FindAccessPointByClientToken(ctx context.Context, clientToken, f
250
257
klog .V (2 ).Infof ("ClientToken to find AP : %s" , clientToken )
251
258
describeAPInput := & efs.DescribeAccessPointsInput {
252
259
FileSystemId : & fileSystemId ,
253
- MaxResults : aws .Int64 (AccessPointPerFsLimit ),
260
+ MaxResults : aws .Int32 (AccessPointPerFsLimit ),
254
261
}
255
- res , err := c .efs .DescribeAccessPointsWithContext (ctx , describeAPInput )
262
+ res , err := c .efs .DescribeAccessPoints (ctx , describeAPInput )
256
263
if err != nil {
257
264
if isAccessDenied (err ) {
258
265
return nil , ErrAccessDenied
@@ -265,7 +272,7 @@ func (c *cloud) FindAccessPointByClientToken(ctx context.Context, clientToken, f
265
272
}
266
273
for _ , ap := range res .AccessPoints {
267
274
// check if AP exists with same client token
268
- if aws . StringValue ( ap .ClientToken ) == clientToken {
275
+ if * ap .ClientToken == clientToken {
269
276
return & AccessPoint {
270
277
AccessPointId : * ap .AccessPointId ,
271
278
FileSystemId : * ap .FileSystemId ,
@@ -280,9 +287,9 @@ func (c *cloud) FindAccessPointByClientToken(ctx context.Context, clientToken, f
280
287
func (c * cloud ) ListAccessPoints (ctx context.Context , fileSystemId string ) (accessPoints []* AccessPoint , err error ) {
281
288
describeAPInput := & efs.DescribeAccessPointsInput {
282
289
FileSystemId : & fileSystemId ,
283
- MaxResults : aws .Int64 (AccessPointPerFsLimit ),
290
+ MaxResults : aws .Int32 (AccessPointPerFsLimit ),
284
291
}
285
- res , err := c .efs .DescribeAccessPointsWithContext (ctx , describeAPInput )
292
+ res , err := c .efs .DescribeAccessPoints (ctx , describeAPInput )
286
293
if err != nil {
287
294
if isAccessDenied (err ) {
288
295
return nil , ErrAccessDenied
@@ -318,7 +325,7 @@ func (c *cloud) ListAccessPoints(ctx context.Context, fileSystemId string) (acce
318
325
func (c * cloud ) DescribeFileSystem (ctx context.Context , fileSystemId string ) (fs * FileSystem , err error ) {
319
326
describeFsInput := & efs.DescribeFileSystemsInput {FileSystemId : & fileSystemId }
320
327
klog .V (5 ).Infof ("Calling DescribeFileSystems with input: %+v" , * describeFsInput )
321
- res , err := c .efs .DescribeFileSystemsWithContext (ctx , describeFsInput )
328
+ res , err := c .efs .DescribeFileSystems (ctx , describeFsInput )
322
329
if err != nil {
323
330
if isAccessDenied (err ) {
324
331
return nil , ErrAccessDenied
@@ -341,7 +348,7 @@ func (c *cloud) DescribeFileSystem(ctx context.Context, fileSystemId string) (fs
341
348
func (c * cloud ) DescribeMountTargets (ctx context.Context , fileSystemId , azName string ) (fs * MountTarget , err error ) {
342
349
describeMtInput := & efs.DescribeMountTargetsInput {FileSystemId : & fileSystemId }
343
350
klog .V (5 ).Infof ("Calling DescribeMountTargets with input: %+v" , * describeMtInput )
344
- res , err := c .efs .DescribeMountTargetsWithContext (ctx , describeMtInput )
351
+ res , err := c .efs .DescribeMountTargets (ctx , describeMtInput )
345
352
if err != nil {
346
353
if isAccessDenied (err ) {
347
354
return nil , ErrAccessDenied
@@ -363,7 +370,7 @@ func (c *cloud) DescribeMountTargets(ctx context.Context, fileSystemId, azName s
363
370
return nil , fmt .Errorf ("No mount target for file system %v is in available state. Please retry in 5 minutes." , fileSystemId )
364
371
}
365
372
366
- var mountTarget * efs .MountTargetDescription
373
+ var mountTarget * types .MountTargetDescription
367
374
if azName != "" {
368
375
mountTarget = getMountTargetForAz (availableMountTargets , azName )
369
376
}
@@ -373,7 +380,7 @@ func (c *cloud) DescribeMountTargets(ctx context.Context, fileSystemId, azName s
373
380
if mountTarget == nil {
374
381
klog .Infof ("Picking a random mount target from available mount target" )
375
382
rand .Seed (time .Now ().Unix ())
376
- mountTarget = availableMountTargets [rand .Intn (len (availableMountTargets ))]
383
+ mountTarget = & availableMountTargets [rand .Intn (len (availableMountTargets ))]
377
384
}
378
385
379
386
return & MountTarget {
@@ -385,26 +392,25 @@ func (c *cloud) DescribeMountTargets(ctx context.Context, fileSystemId, azName s
385
392
}
386
393
387
394
func isFileSystemNotFound (err error ) bool {
388
- if awsErr , ok := err .(awserr.Error ); ok {
389
- if awsErr .Code () == efs .ErrCodeFileSystemNotFound {
390
- return true
391
- }
395
+ var FileSystemNotFoundErr * types.FileSystemNotFound
396
+ if errors .As (err , & FileSystemNotFoundErr ) {
397
+ return true
392
398
}
393
399
return false
394
400
}
395
401
396
402
func isAccessPointNotFound (err error ) bool {
397
- if awsErr , ok := err .(awserr.Error ); ok {
398
- if awsErr .Code () == efs .ErrCodeAccessPointNotFound {
399
- return true
400
- }
403
+ var AccessPointNotFoundErr * types.AccessPointNotFound
404
+ if errors .As (err , & AccessPointNotFoundErr ) {
405
+ return true
401
406
}
402
407
return false
403
408
}
404
409
405
410
func isAccessDenied (err error ) bool {
406
- if awsErr , ok := err .(awserr.Error ); ok {
407
- if awsErr .Code () == AccessDeniedException {
411
+ var apiErr smithy.APIError
412
+ if errors .As (err , & apiErr ) {
413
+ if apiErr .ErrorCode () == AccessDeniedException {
408
414
return true
409
415
}
410
416
}
@@ -416,34 +422,34 @@ func isDriverBootedInECS() bool {
416
422
return ecsContainerMetadataUri != ""
417
423
}
418
424
419
- func parseEfsTags (tagMap map [string ]string ) []* efs .Tag {
420
- efsTags := []* efs .Tag {}
425
+ func parseEfsTags (tagMap map [string ]string ) []types .Tag {
426
+ efsTags := []types .Tag {}
421
427
for k , v := range tagMap {
422
428
key := k
423
429
value := v
424
- efsTags = append (efsTags , & efs .Tag {
430
+ efsTags = append (efsTags , types .Tag {
425
431
Key : & key ,
426
432
Value : & value ,
427
433
})
428
434
}
429
435
return efsTags
430
436
}
431
437
432
- func getAvailableMountTargets (mountTargets []* efs .MountTargetDescription ) []* efs .MountTargetDescription {
433
- availableMountTargets := []* efs .MountTargetDescription {}
438
+ func getAvailableMountTargets (mountTargets []types .MountTargetDescription ) []types .MountTargetDescription {
439
+ availableMountTargets := []types .MountTargetDescription {}
434
440
for _ , mt := range mountTargets {
435
- if * mt .LifeCycleState == "available" {
441
+ if mt .LifeCycleState == "available" {
436
442
availableMountTargets = append (availableMountTargets , mt )
437
443
}
438
444
}
439
445
440
446
return availableMountTargets
441
447
}
442
448
443
- func getMountTargetForAz (mountTargets []* efs .MountTargetDescription , azName string ) * efs .MountTargetDescription {
449
+ func getMountTargetForAz (mountTargets []types .MountTargetDescription , azName string ) * types .MountTargetDescription {
444
450
for _ , mt := range mountTargets {
445
451
if * mt .AvailabilityZoneName == azName {
446
- return mt
452
+ return & mt
447
453
}
448
454
}
449
455
klog .Infof ("There is no mount target match %v" , azName )
0 commit comments