@@ -45,6 +45,7 @@ import (
45
45
iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types"
46
46
"github.com/aws/aws-sdk-go-v2/service/sts"
47
47
"github.com/aws/aws-sdk-go/aws"
48
+ "github.com/aws/aws-sdk-go/aws/awserr"
48
49
"github.com/aws/aws-sdk-go/aws/client"
49
50
awscreds "github.com/aws/aws-sdk-go/aws/credentials"
50
51
"github.com/aws/aws-sdk-go/aws/session"
@@ -390,15 +391,24 @@ func NewAWSSessionRepoWithKey(accessKey *iamtypes.AccessKey) client.ConfigProvid
390
391
By ("Getting an AWS IAM session - from access key" )
391
392
Expect (accessKey .AccessKeyId ).NotTo (BeNil ())
392
393
Expect (accessKey .SecretAccessKey ).NotTo (BeNil ())
394
+
395
+ By (fmt .Sprintf ("NewAWSSessionRepoWithKey: Creating session with AccessKeyId: %s" , * accessKey .AccessKeyId ))
396
+ By ("NewAWSSessionRepoWithKey: Using region: us-east-1 (ECR Public requirement)" )
397
+
393
398
config := aws .NewConfig ().WithCredentialsChainVerboseErrors (true ).WithRegion ("us-east-1" )
394
399
config .Credentials = awscreds .NewStaticCredentials (* accessKey .AccessKeyId , * accessKey .SecretAccessKey , "" )
395
400
401
+ By ("NewAWSSessionRepoWithKey: Creating AWS session with static credentials" )
396
402
sess , err := session .NewSessionWithOptions (session.Options {
397
403
Config : * config ,
398
404
})
399
405
Expect (err ).NotTo (HaveOccurred ())
406
+
407
+ By ("NewAWSSessionRepoWithKey: Session created, validating credentials" )
400
408
_ , err = sess .Config .Credentials .Get ()
401
409
Expect (err ).NotTo (HaveOccurred ())
410
+
411
+ By ("NewAWSSessionRepoWithKey: Credentials validated successfully" )
402
412
return sess
403
413
}
404
414
@@ -774,11 +784,53 @@ func deleteCloudFormationStack(prov client.ConfigProvider, t *cfn_bootstrap.Temp
774
784
}
775
785
776
786
func ensureTestImageUploaded (e2eCtx * E2EContext ) error {
787
+ By ("ensureTestImageUploaded: Starting function" )
788
+
789
+ if e2eCtx .Environment .BootstrapAccessKey == nil {
790
+ return fmt .Errorf ("BootstrapAccessKey is nil" )
791
+ }
792
+
793
+ By (fmt .Sprintf ("ensureTestImageUploaded: BootstrapAccessKey - AccessKeyId: %s, Status: %s" ,
794
+ * e2eCtx .Environment .BootstrapAccessKey .AccessKeyId ,
795
+ e2eCtx .Environment .BootstrapAccessKey .Status ))
796
+
797
+ if e2eCtx .BootstrapUserAWSSession == nil {
798
+ return fmt .Errorf ("BootstrapUserAWSSession is nil" )
799
+ }
800
+
801
+ By ("ensureTestImageUploaded: Creating AWS session for ECR Public" )
777
802
sessionForRepo := NewAWSSessionRepoWithKey (e2eCtx .Environment .BootstrapAccessKey )
778
803
804
+ if sess , ok := sessionForRepo .(* session.Session ); ok {
805
+ creds , err := sess .Config .Credentials .Get ()
806
+ if err != nil {
807
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to get credentials from session: %v" , err ))
808
+ return fmt .Errorf ("failed to get credentials: %w" , err )
809
+ }
810
+ By (fmt .Sprintf ("ensureTestImageUploaded: Session credentials - AccessKeyId: %s, ProviderName: %s" ,
811
+ creds .AccessKeyID , creds .ProviderName ))
812
+ } else {
813
+ By ("ensureTestImageUploaded: WARNING: Session is not *session.Session type" )
814
+ }
815
+
816
+ By ("ensureTestImageUploaded: Creating ECR Public client" )
779
817
ecrSvc := ecrpublic .New (sessionForRepo )
818
+
819
+ By ("ensureTestImageUploaded: Testing ECR Public connection" )
820
+ _ , err := ecrSvc .DescribeRegistries (& ecrpublic.DescribeRegistriesInput {})
821
+ if err != nil {
822
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to connect to ECR Public: %v" , err ))
823
+ if awsErr , ok := err .(awserr.Error ); ok {
824
+ By (fmt .Sprintf ("ensureTestImageUploaded: AWS Error - Code: %s, Message: %s" ,
825
+ awsErr .Code (), awsErr .Message ()))
826
+ }
827
+ return fmt .Errorf ("failed to connect to ECR Public: %w" , err )
828
+ }
829
+ By ("ensureTestImageUploaded: Successfully connected to ECR Public" )
830
+
780
831
repoName := ""
781
832
if err := wait .WaitForWithRetryable (wait .NewBackoff (), func () (bool , error ) {
833
+ By ("ensureTestImageUploaded: Attempting to create ECR Public repository" )
782
834
output , err := ecrSvc .CreateRepository (& ecrpublic.CreateRepositoryInput {
783
835
RepositoryName : aws .String ("capa/update" ),
784
836
CatalogData : & ecrpublic.RepositoryCatalogDataInput {
@@ -788,10 +840,13 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
788
840
789
841
if err != nil {
790
842
if ! awserrors .IsRepositoryExists (err ) {
843
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to create repository: %v" , err ))
791
844
return false , err
792
845
}
846
+ By ("ensureTestImageUploaded: Repository already exists, describing it" )
793
847
out , err := ecrSvc .DescribeRepositories (& ecrpublic.DescribeRepositoriesInput {RepositoryNames : []* string {aws .String ("capa/update" )}})
794
848
if err != nil || len (out .Repositories ) == 0 {
849
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to describe existing repository: %v" , err ))
795
850
return false , err
796
851
}
797
852
repoName = aws .StringValue (out .Repositories [0 ].RepositoryUri )
@@ -801,28 +856,42 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
801
856
802
857
return true , nil
803
858
}, awserrors .UnrecognizedClientException ); err != nil {
859
+ By (fmt .Sprintf ("ensureTestImageUploaded: Repository creation failed: %v" , err ))
804
860
return err
805
861
}
806
862
863
+ By (fmt .Sprintf ("ensureTestImageUploaded: Repository ready - %s" , repoName ))
864
+
865
+ By ("ensureTestImageUploaded: Inspecting Docker image" )
807
866
cmd := exec .Command ("docker" , "inspect" , "--format='{{index .Id}}'" , "gcr.io/k8s-staging-cluster-api/capa-manager:e2e" )
808
867
var stdOut bytes.Buffer
809
868
cmd .Stdout = & stdOut
810
- err : = cmd .Run ()
869
+ err = cmd .Run ()
811
870
if err != nil {
871
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to inspect Docker image: %v" , err ))
812
872
return err
813
873
}
814
874
815
875
imageSha := strings .ReplaceAll (strings .TrimSuffix (stdOut .String (), "\n " ), "'" , "" )
876
+ By (fmt .Sprintf ("ensureTestImageUploaded: Docker image SHA: %s" , imageSha ))
816
877
817
878
ecrImageName := repoName + ":e2e"
879
+ By (fmt .Sprintf ("ensureTestImageUploaded: Tagging image as %s" , ecrImageName ))
818
880
cmd = exec .Command ("docker" , "tag" , imageSha , ecrImageName ) //nolint:gosec
819
881
err = cmd .Run ()
820
882
if err != nil {
883
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to tag Docker image: %v" , err ))
821
884
return err
822
885
}
823
886
887
+ By ("ensureTestImageUploaded: Getting ECR authorization token" )
824
888
outToken , err := ecrSvc .GetAuthorizationToken (& ecrpublic.GetAuthorizationTokenInput {})
825
889
if err != nil {
890
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to get authorization token: %v" , err ))
891
+ if awsErr , ok := err .(awserr.Error ); ok {
892
+ By (fmt .Sprintf ("ensureTestImageUploaded: AWS Error getting token - Code: %s, Message: %s" ,
893
+ awsErr .Code (), awsErr .Message ()))
894
+ }
826
895
return err
827
896
}
828
897
@@ -831,22 +900,31 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
831
900
832
901
strList := strings .Split (string (decodedUsernamePassword ), ":" )
833
902
if len (strList ) != 2 {
903
+ By ("ensureTestImageUploaded: Failed to decode ECR authentication token" )
834
904
return errors .New ("failed to decode ECR authentication token" )
835
905
}
836
906
907
+ By ("ensureTestImageUploaded: Logging into ECR Public" )
837
908
cmd = exec .Command ("docker" , "login" , "--username" , strList [0 ], "--password" , strList [1 ], "public.ecr.aws" ) //nolint:gosec
838
909
err = cmd .Run ()
839
910
if err != nil {
911
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to login to ECR Public: %v" , err ))
840
912
return err
841
913
}
842
914
915
+ By ("ensureTestImageUploaded: Pushing image to ECR Public" )
843
916
cmd = exec .Command ("docker" , "push" , ecrImageName )
844
917
err = cmd .Run ()
845
918
if err != nil {
919
+ By (fmt .Sprintf ("ensureTestImageUploaded: Failed to push image: %v" , err ))
846
920
return err
847
921
}
922
+
923
+ By ("ensureTestImageUploaded: Image pushed successfully" )
848
924
e2eCtx .E2EConfig .Variables ["CAPI_IMAGES_REGISTRY" ] = repoName
849
925
e2eCtx .E2EConfig .Variables ["E2E_IMAGE_TAG" ] = "e2e"
926
+
927
+ By ("ensureTestImageUploaded: Function completed successfully" )
850
928
return nil
851
929
}
852
930
@@ -915,26 +993,41 @@ func encodeCredentials(accessKey *iamtypes.AccessKey, region string) string {
915
993
// newUserAccessKey generates a new AWS Access Key pair based off of the
916
994
// bootstrap user. This tests that the CloudFormation policy is correct.
917
995
func newUserAccessKey (ctx context.Context , cfg * awsv2.Config , userName string ) * iamtypes.AccessKey {
996
+ By (fmt .Sprintf ("newUserAccessKey: Starting for user: %s" , userName ))
997
+
918
998
iamSvc := iam .NewFromConfig (* cfg )
919
999
920
- keyOuts , _ := iamSvc .ListAccessKeys (ctx , & iam.ListAccessKeysInput {
1000
+ By (fmt .Sprintf ("newUserAccessKey: Listing existing access keys for user: %s" , userName ))
1001
+ keyOuts , err := iamSvc .ListAccessKeys (ctx , & iam.ListAccessKeysInput {
921
1002
UserName : aws .String (userName ),
922
1003
})
1004
+ if err != nil {
1005
+ By (fmt .Sprintf ("newUserAccessKey: Failed to list access keys: %v" , err ))
1006
+ Expect (err ).NotTo (HaveOccurred ())
1007
+ }
1008
+
1009
+ By (fmt .Sprintf ("newUserAccessKey: Found %d existing access keys" , len (keyOuts .AccessKeyMetadata )))
1010
+
923
1011
for i := range keyOuts .AccessKeyMetadata {
924
- By (fmt .Sprintf ("Deleting an existing access key: user-name= %s" , userName ))
1012
+ By (fmt .Sprintf ("newUserAccessKey: Deleting existing access key: %s" , * keyOuts . AccessKeyMetadata [ i ]. AccessKeyId ))
925
1013
_ , err := iamSvc .DeleteAccessKey (ctx , & iam.DeleteAccessKeyInput {
926
1014
UserName : aws .String (userName ),
927
1015
AccessKeyId : keyOuts .AccessKeyMetadata [i ].AccessKeyId ,
928
1016
})
929
1017
Expect (err ).NotTo (HaveOccurred ())
1018
+ By (fmt .Sprintf ("newUserAccessKey: Successfully deleted access key: %s" , * keyOuts .AccessKeyMetadata [i ].AccessKeyId ))
930
1019
}
931
- By (fmt .Sprintf ("Creating an access key: user-name=%s" , userName ))
1020
+
1021
+ By (fmt .Sprintf ("newUserAccessKey: Creating new access key for user: %s" , userName ))
932
1022
out , err := iamSvc .CreateAccessKey (ctx , & iam.CreateAccessKeyInput {UserName : aws .String (userName )})
933
1023
Expect (err ).NotTo (HaveOccurred ())
934
1024
Expect (out .AccessKey ).ToNot (BeNil ())
935
1025
Expect (out .AccessKey .AccessKeyId ).ToNot (BeNil ())
936
1026
Expect (out .AccessKey .SecretAccessKey ).ToNot (BeNil ())
937
1027
1028
+ By (fmt .Sprintf ("newUserAccessKey: Successfully created access key: %s" , * out .AccessKey .AccessKeyId ))
1029
+ By (fmt .Sprintf ("newUserAccessKey: Access key status: %s" , out .AccessKey .Status ))
1030
+
938
1031
return & iamtypes.AccessKey {
939
1032
AccessKeyId : out .AccessKey .AccessKeyId ,
940
1033
SecretAccessKey : out .AccessKey .SecretAccessKey ,
0 commit comments