Skip to content

Commit 9653e35

Browse files
committed
aws sdk go v2 migration
1 parent a3014ec commit 9653e35

38 files changed

+3938
-2653
lines changed

THIRD-PARTY-LICENSES

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ Copyright © 2015 Steve Francia <[email protected]>
180180

181181
-----
182182

183-
** aws/aws-sdk-go; version 1.15.7 -- https://github.com/aws/aws-sdk-go/
183+
** aws/aws-sdk-go-v2; version 1.24.4 -- https://github.com/aws/aws-sdk-go-v2/
184184
** Etcd; version v3.1.0-alpha.1 -- https://github.com/coreos/etcd/tree/v3.1.0-alpha.1
185185
** github.com/coreos/go-semver; version 0.2 -- https://github.com/coreos/go-semver
186186
** github.com/coreos/go-systemd/; version 10 -- https://github.com/coreos/go-systemd/
@@ -412,9 +412,9 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
412412
See the License for the specific language governing permissions and
413413
limitations under the License.
414414

415-
* For aws/aws-sdk-go see also this required NOTICE:
415+
* For aws/aws-sdk-go-v2 see also this required NOTICE:
416416
AWS SDK for Go
417-
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
417+
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
418418
Copyright 2014-2015 Stripe, Inc.
419419
* For Etcd see also this required NOTICE:
420420
CoreOS Project

cmd/ecr-credential-provider/main.go

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ import (
2727
"strings"
2828
"time"
2929

30-
"github.com/aws/aws-sdk-go/aws"
31-
"github.com/aws/aws-sdk-go/aws/session"
32-
"github.com/aws/aws-sdk-go/service/ecr"
33-
"github.com/aws/aws-sdk-go/service/ecrpublic"
30+
"github.com/aws/aws-sdk-go-v2/aws"
31+
"github.com/aws/aws-sdk-go-v2/config"
32+
"github.com/aws/aws-sdk-go-v2/service/ecr"
33+
"github.com/aws/aws-sdk-go-v2/service/ecrpublic"
3434
"github.com/spf13/cobra"
3535

3636
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -46,67 +46,60 @@ var ecrPrivateHostPattern = regexp.MustCompile(`^(\d{12})\.dkr[\.\-]ecr(\-fips)?
4646

4747
// ECR abstracts the calls we make to aws-sdk for testing purposes
4848
type ECR interface {
49-
GetAuthorizationToken(input *ecr.GetAuthorizationTokenInput) (*ecr.GetAuthorizationTokenOutput, error)
49+
GetAuthorizationToken(ctx context.Context, input *ecr.GetAuthorizationTokenInput, optFns ...func(*ecr.Options)) (*ecr.GetAuthorizationTokenOutput, error)
5050
}
5151

5252
// ECRPublic abstracts the calls we make to aws-sdk for testing purposes
5353
type ECRPublic interface {
54-
GetAuthorizationToken(input *ecrpublic.GetAuthorizationTokenInput) (*ecrpublic.GetAuthorizationTokenOutput, error)
54+
GetAuthorizationToken(ctx context.Context, input *ecrpublic.GetAuthorizationTokenInput, optFns ...func(*ecrpublic.Options)) (*ecrpublic.GetAuthorizationTokenOutput, error)
5555
}
5656

5757
type ecrPlugin struct {
5858
ecr ECR
5959
ecrPublic ECRPublic
6060
}
6161

62-
func defaultECRProvider(region string) (*ecr.ECR, error) {
63-
cfg := aws.Config{}
64-
if region != "" {
65-
klog.Warningf("No region found in the image reference, the default region will be used. Please refer to AWS SDK documentation for configuration purpose.")
66-
cfg.Region = aws.String(region)
67-
}
68-
sess, err := session.NewSessionWithOptions(session.Options{
69-
Config: cfg,
70-
SharedConfigState: session.SharedConfigEnable,
71-
})
62+
func defaultECRProvider(ctx context.Context, region string) (*ecr.Client, error) {
63+
cfg, err := config.LoadDefaultConfig(ctx)
7264
if err != nil {
7365
return nil, err
7466
}
67+
if region != "" {
68+
klog.Warningf("No region found in the image reference, the default region will be used. Please refer to AWS SDK documentation for configuration purpose.")
69+
cfg.Region = region
70+
}
7571

76-
return ecr.New(sess), nil
72+
return ecr.NewFromConfig(cfg), nil
7773
}
7874

79-
func publicECRProvider() (*ecrpublic.ECRPublic, error) {
75+
func publicECRProvider(ctx context.Context) (*ecrpublic.Client, error) {
8076
// ECR public registries are only in one region and only accessible from regions
8177
// in the "aws" partition.
82-
sess, err := session.NewSessionWithOptions(session.Options{
83-
Config: aws.Config{Region: aws.String(ecrPublicRegion)},
84-
SharedConfigState: session.SharedConfigEnable,
85-
})
78+
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(ecrPublicRegion))
8679
if err != nil {
8780
return nil, err
8881
}
8982

90-
return ecrpublic.New(sess), nil
83+
return ecrpublic.NewFromConfig(cfg), nil
9184
}
9285

9386
type credsData struct {
9487
authToken *string
9588
expiresAt *time.Time
9689
}
9790

98-
func (e *ecrPlugin) getPublicCredsData() (*credsData, error) {
91+
func (e *ecrPlugin) getPublicCredsData(ctx context.Context) (*credsData, error) {
9992
klog.Infof("Getting creds for public registry")
10093
var err error
10194

10295
if e.ecrPublic == nil {
103-
e.ecrPublic, err = publicECRProvider()
96+
e.ecrPublic, err = publicECRProvider(ctx)
10497
}
10598
if err != nil {
10699
return nil, err
107100
}
108101

109-
output, err := e.ecrPublic.GetAuthorizationToken(&ecrpublic.GetAuthorizationTokenInput{})
102+
output, err := e.ecrPublic.GetAuthorizationToken(ctx, &ecrpublic.GetAuthorizationTokenInput{})
110103
if err != nil {
111104
return nil, err
112105
}
@@ -125,18 +118,18 @@ func (e *ecrPlugin) getPublicCredsData() (*credsData, error) {
125118
}, nil
126119
}
127120

128-
func (e *ecrPlugin) getPrivateCredsData(imageHost string, image string) (*credsData, error) {
121+
func (e *ecrPlugin) getPrivateCredsData(ctx context.Context, imageHost string, image string) (*credsData, error) {
129122
klog.Infof("Getting creds for private image %s", image)
130123
var err error
131124

132125
if e.ecr == nil {
133126
region := parseRegionFromECRPrivateHost(imageHost)
134-
e.ecr, err = defaultECRProvider(region)
127+
e.ecr, err = defaultECRProvider(ctx, region)
135128
if err != nil {
136129
return nil, err
137130
}
138131
}
139-
output, err := e.ecr.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{})
132+
output, err := e.ecr.GetAuthorizationToken(ctx, &ecr.GetAuthorizationTokenInput{})
140133
if err != nil {
141134
return nil, err
142135
}
@@ -162,9 +155,9 @@ func (e *ecrPlugin) GetCredentials(ctx context.Context, image string, args []str
162155
}
163156

164157
if imageHost == ecrPublicHost {
165-
creds, err = e.getPublicCredsData()
158+
creds, err = e.getPublicCredsData(ctx)
166159
} else {
167-
creds, err = e.getPrivateCredsData(imageHost, image)
160+
creds, err = e.getPrivateCredsData(ctx, imageHost, image)
168161
}
169162

170163
if err != nil {
@@ -175,7 +168,7 @@ func (e *ecrPlugin) GetCredentials(ctx context.Context, image string, args []str
175168
return nil, errors.New("authorization token in response was nil")
176169
}
177170

178-
decodedToken, err := base64.StdEncoding.DecodeString(aws.StringValue(creds.authToken))
171+
decodedToken, err := base64.StdEncoding.DecodeString(aws.ToString(creds.authToken))
179172
if err != nil {
180173
return nil, err
181174
}

cmd/ecr-credential-provider/main_test.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import (
2424
"testing"
2525
"time"
2626

27-
"github.com/aws/aws-sdk-go/aws"
28-
"github.com/aws/aws-sdk-go/service/ecr"
29-
"github.com/aws/aws-sdk-go/service/ecrpublic"
27+
"github.com/aws/aws-sdk-go-v2/aws"
28+
"github.com/aws/aws-sdk-go-v2/service/ecr"
29+
ecrtypes "github.com/aws/aws-sdk-go-v2/service/ecr/types"
30+
"github.com/aws/aws-sdk-go-v2/service/ecrpublic"
31+
ecrpublictypes "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types"
3032
"github.com/golang/mock/gomock"
3133
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3234
"k8s.io/cloud-provider-aws/pkg/mocks"
@@ -35,13 +37,13 @@ import (
3537

3638
func generatePrivateGetAuthorizationTokenOutput(user string, password string, proxy string, expiration *time.Time) *ecr.GetAuthorizationTokenOutput {
3739
creds := []byte(fmt.Sprintf("%s:%s", user, password))
38-
data := &ecr.AuthorizationData{
40+
data := &ecrtypes.AuthorizationData{
3941
AuthorizationToken: aws.String(base64.StdEncoding.EncodeToString(creds)),
4042
ExpiresAt: expiration,
4143
ProxyEndpoint: aws.String(proxy),
4244
}
4345
output := &ecr.GetAuthorizationTokenOutput{
44-
AuthorizationData: []*ecr.AuthorizationData{data},
46+
AuthorizationData: []ecrtypes.AuthorizationData{*data},
4547
}
4648
return output
4749
}
@@ -109,7 +111,7 @@ func Test_GetCredentials_Private(t *testing.T) {
109111
{
110112
name: "empty authorization token",
111113
image: "123456789123.dkr.ecr.us-west-2.amazonaws.com",
112-
getAuthorizationTokenOutput: &ecr.GetAuthorizationTokenOutput{AuthorizationData: []*ecr.AuthorizationData{{}}},
114+
getAuthorizationTokenOutput: &ecr.GetAuthorizationTokenOutput{AuthorizationData: []ecrtypes.AuthorizationData{{}}},
113115
getAuthorizationTokenError: nil,
114116
expectedError: errors.New("authorization token in response was nil"),
115117
},
@@ -124,7 +126,7 @@ func Test_GetCredentials_Private(t *testing.T) {
124126
name: "invalid authorization token",
125127
image: "123456789123.dkr.ecr.us-west-2.amazonaws.com",
126128
getAuthorizationTokenOutput: &ecr.GetAuthorizationTokenOutput{
127-
AuthorizationData: []*ecr.AuthorizationData{
129+
AuthorizationData: []ecrtypes.AuthorizationData{
128130
{AuthorizationToken: aws.String(base64.StdEncoding.EncodeToString([]byte(fmt.Sprint("foo"))))},
129131
},
130132
},
@@ -136,7 +138,7 @@ func Test_GetCredentials_Private(t *testing.T) {
136138
for _, testcase := range testcases {
137139
t.Run(testcase.name, func(t *testing.T) {
138140
p := &ecrPlugin{ecr: mockECR}
139-
mockECR.EXPECT().GetAuthorizationToken(gomock.Any()).Return(testcase.getAuthorizationTokenOutput, testcase.getAuthorizationTokenError)
141+
mockECR.EXPECT().GetAuthorizationToken(gomock.Any(), gomock.Any()).Return(testcase.getAuthorizationTokenOutput, testcase.getAuthorizationTokenError)
140142

141143
creds, err := p.GetCredentials(context.TODO(), testcase.image, testcase.args)
142144

@@ -163,7 +165,7 @@ func Test_GetCredentials_Private(t *testing.T) {
163165

164166
func generatePublicGetAuthorizationTokenOutput(user string, password string, proxy string, expiration *time.Time) *ecrpublic.GetAuthorizationTokenOutput {
165167
creds := []byte(fmt.Sprintf("%s:%s", user, password))
166-
data := &ecrpublic.AuthorizationData{
168+
data := &ecrpublictypes.AuthorizationData{
167169
AuthorizationToken: aws.String(base64.StdEncoding.EncodeToString(creds)),
168170
ExpiresAt: expiration,
169171
}
@@ -211,7 +213,7 @@ func Test_GetCredentials_Public(t *testing.T) {
211213
{
212214
name: "empty authorization token",
213215
image: "public.ecr.aws",
214-
getAuthorizationTokenOutput: &ecrpublic.GetAuthorizationTokenOutput{AuthorizationData: &ecrpublic.AuthorizationData{}},
216+
getAuthorizationTokenOutput: &ecrpublic.GetAuthorizationTokenOutput{AuthorizationData: &ecrpublictypes.AuthorizationData{}},
215217
getAuthorizationTokenError: nil,
216218
expectedError: errors.New("authorization token in response was nil"),
217219
},
@@ -226,7 +228,7 @@ func Test_GetCredentials_Public(t *testing.T) {
226228
name: "invalid authorization token",
227229
image: "public.ecr.aws",
228230
getAuthorizationTokenOutput: &ecrpublic.GetAuthorizationTokenOutput{
229-
AuthorizationData: &ecrpublic.AuthorizationData{
231+
AuthorizationData: &ecrpublictypes.AuthorizationData{
230232
AuthorizationToken: aws.String(base64.StdEncoding.EncodeToString([]byte(fmt.Sprint("foo")))),
231233
},
232234
},
@@ -238,7 +240,7 @@ func Test_GetCredentials_Public(t *testing.T) {
238240
for _, testcase := range testcases {
239241
t.Run(testcase.name, func(t *testing.T) {
240242
p := &ecrPlugin{ecrPublic: mockECRPublic}
241-
mockECRPublic.EXPECT().GetAuthorizationToken(gomock.Any()).Return(testcase.getAuthorizationTokenOutput, testcase.getAuthorizationTokenError)
243+
mockECRPublic.EXPECT().GetAuthorizationToken(gomock.Any(), gomock.Any()).Return(testcase.getAuthorizationTokenOutput, testcase.getAuthorizationTokenError)
242244

243245
creds, err := p.GetCredentials(context.TODO(), testcase.image, testcase.args)
244246

go.mod

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ module k8s.io/cloud-provider-aws
33
go 1.24.4
44

55
require (
6-
github.com/aws/aws-sdk-go v1.54.6
6+
github.com/aws/aws-sdk-go-v2 v1.36.5
7+
github.com/aws/aws-sdk-go-v2/config v1.29.14
8+
github.com/aws/aws-sdk-go-v2/service/autoscaling v1.53.3
9+
github.com/aws/aws-sdk-go-v2/service/ecr v1.45.1
10+
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.2
11+
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.29.3
12+
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.45.2
13+
github.com/aws/aws-sdk-go-v2/service/kms v1.41.0
714
github.com/golang/mock v1.6.0
8-
github.com/spf13/cobra v1.7.0
15+
github.com/spf13/cobra v1.8.1
916
github.com/spf13/pflag v1.0.5
10-
github.com/stretchr/testify v1.8.4
17+
github.com/stretchr/testify v1.10.0
1118
golang.org/x/time v0.3.0
1219
gopkg.in/gcfg.v1 v1.2.3
1320
k8s.io/api v0.29.5
@@ -23,11 +30,28 @@ require (
2330
k8s.io/utils v0.0.0-20230726121419-3b25d923346b
2431
)
2532

33+
require (
34+
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
35+
github.com/onsi/ginkgo/v2 v2.23.0 // indirect
36+
github.com/onsi/gomega v1.36.2 // indirect
37+
)
38+
2639
require (
2740
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
2841
github.com/NYTimes/gziphandler v1.1.1 // indirect
2942
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230321174746-8dcc6526cfb1 // indirect
30-
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
43+
github.com/aws/aws-sdk-go-v2/credentials v1.17.67
44+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31
45+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect
46+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect
47+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
48+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.218.0
49+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
50+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect
51+
github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect
52+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect
53+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19
54+
github.com/aws/smithy-go v1.22.4
3155
github.com/beorn7/perks v1.0.1 // indirect
3256
github.com/blang/semver/v4 v4.0.0 // indirect
3357
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
@@ -39,7 +63,7 @@ require (
3963
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
4064
github.com/felixge/httpsnoop v1.0.4 // indirect
4165
github.com/fsnotify/fsnotify v1.7.0 // indirect
42-
github.com/go-logr/logr v1.3.0 // indirect
66+
github.com/go-logr/logr v1.4.2 // indirect
4367
github.com/go-logr/stdr v1.2.2 // indirect
4468
github.com/go-openapi/jsonpointer v0.19.6 // indirect
4569
github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -56,7 +80,6 @@ require (
5680
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
5781
github.com/imdario/mergo v0.3.15 // indirect
5882
github.com/inconshreveable/mousetrap v1.1.0 // indirect
59-
github.com/jmespath/go-jmespath v0.4.0 // indirect
6083
github.com/josharian/intern v1.0.0 // indirect
6184
github.com/json-iterator/go v1.1.12 // indirect
6285
github.com/mailru/easyjson v0.7.7 // indirect
@@ -72,7 +95,7 @@ require (
7295
github.com/prometheus/common v0.44.0 // indirect
7396
github.com/prometheus/procfs v0.10.1 // indirect
7497
github.com/stoewer/go-strcase v1.3.0 // indirect
75-
github.com/stretchr/objx v0.5.0 // indirect
98+
github.com/stretchr/objx v0.5.2 // indirect
7699
go.etcd.io/etcd/api/v3 v3.5.10 // indirect
77100
go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect
78101
go.etcd.io/etcd/client/v3 v3.5.10 // indirect
@@ -88,22 +111,22 @@ require (
88111
go.uber.org/atomic v1.10.0 // indirect
89112
go.uber.org/multierr v1.11.0 // indirect
90113
go.uber.org/zap v1.24.0 // indirect
91-
golang.org/x/crypto v0.21.0 // indirect
114+
golang.org/x/crypto v0.33.0 // indirect
92115
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
93-
golang.org/x/mod v0.14.0 // indirect
94-
golang.org/x/net v0.23.0 // indirect
116+
golang.org/x/mod v0.23.0 // indirect
117+
golang.org/x/net v0.35.0 // indirect
95118
golang.org/x/oauth2 v0.11.0 // indirect
96-
golang.org/x/sync v0.5.0 // indirect
97-
golang.org/x/sys v0.18.0 // indirect
98-
golang.org/x/term v0.18.0 // indirect
99-
golang.org/x/text v0.14.0 // indirect
100-
golang.org/x/tools v0.16.1 // indirect
119+
golang.org/x/sync v0.11.0 // indirect
120+
golang.org/x/sys v0.30.0 // indirect
121+
golang.org/x/term v0.29.0 // indirect
122+
golang.org/x/text v0.22.0 // indirect
123+
golang.org/x/tools v0.30.0 // indirect
101124
google.golang.org/appengine v1.6.7 // indirect
102125
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect
103126
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
104127
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
105128
google.golang.org/grpc v1.59.0 // indirect
106-
google.golang.org/protobuf v1.33.0 // indirect
129+
google.golang.org/protobuf v1.36.1 // indirect
107130
gopkg.in/inf.v0 v0.9.1 // indirect
108131
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
109132
gopkg.in/warnings.v0 v0.1.2 // indirect

0 commit comments

Comments
 (0)