@@ -32,6 +32,7 @@ import (
3232
3333 "github.com/fluxcd/pkg/auth"
3434 "github.com/fluxcd/pkg/auth/aws"
35+ "github.com/fluxcd/pkg/auth/generic"
3536)
3637
3738func TestProvider_NewControllerToken (t * testing.T ) {
@@ -536,3 +537,109 @@ func TestProvider_GetAccessTokenOptionsForCluster(t *testing.T) {
536537
537538 g .Expect (o .STSRegion ).To (Equal ("us-west-2" ))
538539}
540+
541+ func TestProvider_NewCodeCommitGitCredentials (t * testing.T ) {
542+ invalidToken := & generic.Token {Token : "invalid" , ExpiresAt : time .Now ().Add (time .Hour )}
543+ proxyUrl := url.URL {Scheme : "http" , Host : "proxy.example.com" }
544+ awsRegion := "us-east-1"
545+ for _ , tt := range []struct {
546+ name string
547+ gitURL string
548+ getAccessToken bool
549+ accessTokens []auth.Token
550+ expectedUsername string
551+ err string
552+ }{
553+ {
554+ name : "valid CodeCommit URL" ,
555+ gitURL : "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-repo" ,
556+ getAccessToken : true ,
557+ expectedUsername : "access-key-id%session-token" ,
558+ },
559+ {
560+ name : "valid CodeCommit FIPS URL" ,
561+ gitURL : "https://git-codecommit-fips.us-east-1.amazonaws.com/v1/repos/test-repo" ,
562+ getAccessToken : true ,
563+ expectedUsername : "access-key-id%session-token" ,
564+ },
565+ {
566+ name : "valid CodeCommit China URL" ,
567+ gitURL : "https://git-codecommit.cn-north-1.amazonaws.com.cn/v1/repos/test-repo" ,
568+ getAccessToken : true ,
569+ expectedUsername : "access-key-id%session-token" ,
570+ },
571+ {
572+ name : "missing Git URL" ,
573+ getAccessToken : true ,
574+ err : "Git URL must be specified for AWS CodeCommit authentication" ,
575+ },
576+ {
577+ name : "non HTTPS URL" ,
578+ gitURL : "http://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-repo" ,
579+ getAccessToken : true ,
580+ err : "AWS CodeCommit authentication requires an HTTPS Git URL" ,
581+ },
582+ {
583+ name : "invalid CodeCommit URL" ,
584+ gitURL : "https://github.com/org/repo" ,
585+ getAccessToken : true ,
586+ err : "invalid AWS CodeCommit Git URL: github.com" ,
587+ },
588+ {
589+ name : "missing access token" ,
590+ gitURL : "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-repo" ,
591+ getAccessToken : false ,
592+ accessTokens : []auth.Token {},
593+ err : `AWS access token is required for region "us-east-1"` ,
594+ },
595+ {
596+ name : "invalid access token type" ,
597+ gitURL : "https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-repo" ,
598+ getAccessToken : false ,
599+ accessTokens : []auth.Token {invalidToken },
600+ err : "failed to cast token to AWS token: *generic.Token" ,
601+ },
602+ } {
603+ t .Run (tt .name , func (t * testing.T ) {
604+ g := NewWithT (t )
605+
606+ impl := & mockImplementation {
607+ t : t ,
608+ argRegion : awsRegion ,
609+ argProxyURL : & proxyUrl ,
610+ returnCreds : awssdk.Credentials {AccessKeyID : "access-key-id" , SecretAccessKey : "secret-access-key" , SessionToken : "session-token" },
611+ }
612+
613+ opts := []auth.Option {}
614+ if tt .gitURL != "" {
615+ gitURL , err := url .Parse (tt .gitURL )
616+ g .Expect (err ).NotTo (HaveOccurred ())
617+ opts = append (opts , auth .WithGitURL (* gitURL ))
618+ }
619+
620+ provider := aws.Provider {Implementation : impl }
621+ accessTokens := tt .accessTokens
622+ if tt .getAccessToken {
623+ accessToken , err := auth .GetAccessToken (context .Background (), provider ,
624+ auth .WithSTSRegion (awsRegion ),
625+ auth .WithProxyURL (proxyUrl ),
626+ )
627+ g .Expect (err ).NotTo (HaveOccurred ())
628+ accessTokens = []auth.Token {accessToken }
629+ }
630+
631+ username , password , err := provider .NewCodeCommitGitCredentials (context .Background (), accessTokens , opts ... )
632+
633+ if tt .err == "" {
634+ g .Expect (err ).NotTo (HaveOccurred ())
635+ g .Expect (username ).To (Equal (tt .expectedUsername ))
636+ g .Expect (password ).To (MatchRegexp (`^[0-9]{8}T[0-9]{6}Z[0-9a-f]{64}$` ))
637+ } else {
638+ g .Expect (err ).To (HaveOccurred ())
639+ g .Expect (err .Error ()).To (Equal (tt .err ))
640+ g .Expect (username ).To (BeEmpty ())
641+ g .Expect (password ).To (BeEmpty ())
642+ }
643+ })
644+ }
645+ }
0 commit comments