Skip to content

Commit 8d888da

Browse files
debug debug
1 parent a9358f4 commit 8d888da

File tree

2 files changed

+167
-5
lines changed

2 files changed

+167
-5
lines changed

test/e2e/shared/aws.go

Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types"
4646
"github.com/aws/aws-sdk-go-v2/service/sts"
4747
"github.com/aws/aws-sdk-go/aws"
48+
"github.com/aws/aws-sdk-go/aws/awserr"
4849
"github.com/aws/aws-sdk-go/aws/client"
4950
awscreds "github.com/aws/aws-sdk-go/aws/credentials"
5051
"github.com/aws/aws-sdk-go/aws/session"
@@ -390,15 +391,24 @@ func NewAWSSessionRepoWithKey(accessKey *iamtypes.AccessKey) client.ConfigProvid
390391
By("Getting an AWS IAM session - from access key")
391392
Expect(accessKey.AccessKeyId).NotTo(BeNil())
392393
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+
393398
config := aws.NewConfig().WithCredentialsChainVerboseErrors(true).WithRegion("us-east-1")
394399
config.Credentials = awscreds.NewStaticCredentials(*accessKey.AccessKeyId, *accessKey.SecretAccessKey, "")
395400

401+
By("NewAWSSessionRepoWithKey: Creating AWS session with static credentials")
396402
sess, err := session.NewSessionWithOptions(session.Options{
397403
Config: *config,
398404
})
399405
Expect(err).NotTo(HaveOccurred())
406+
407+
By("NewAWSSessionRepoWithKey: Session created, validating credentials")
400408
_, err = sess.Config.Credentials.Get()
401409
Expect(err).NotTo(HaveOccurred())
410+
411+
By("NewAWSSessionRepoWithKey: Credentials validated successfully")
402412
return sess
403413
}
404414

@@ -774,11 +784,53 @@ func deleteCloudFormationStack(prov client.ConfigProvider, t *cfn_bootstrap.Temp
774784
}
775785

776786
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")
777802
sessionForRepo := NewAWSSessionRepoWithKey(e2eCtx.Environment.BootstrapAccessKey)
778803

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")
779817
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+
780831
repoName := ""
781832
if err := wait.WaitForWithRetryable(wait.NewBackoff(), func() (bool, error) {
833+
By("ensureTestImageUploaded: Attempting to create ECR Public repository")
782834
output, err := ecrSvc.CreateRepository(&ecrpublic.CreateRepositoryInput{
783835
RepositoryName: aws.String("capa/update"),
784836
CatalogData: &ecrpublic.RepositoryCatalogDataInput{
@@ -788,10 +840,13 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
788840

789841
if err != nil {
790842
if !awserrors.IsRepositoryExists(err) {
843+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to create repository: %v", err))
791844
return false, err
792845
}
846+
By("ensureTestImageUploaded: Repository already exists, describing it")
793847
out, err := ecrSvc.DescribeRepositories(&ecrpublic.DescribeRepositoriesInput{RepositoryNames: []*string{aws.String("capa/update")}})
794848
if err != nil || len(out.Repositories) == 0 {
849+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to describe existing repository: %v", err))
795850
return false, err
796851
}
797852
repoName = aws.StringValue(out.Repositories[0].RepositoryUri)
@@ -801,28 +856,42 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
801856

802857
return true, nil
803858
}, awserrors.UnrecognizedClientException); err != nil {
859+
By(fmt.Sprintf("ensureTestImageUploaded: Repository creation failed: %v", err))
804860
return err
805861
}
806862

863+
By(fmt.Sprintf("ensureTestImageUploaded: Repository ready - %s", repoName))
864+
865+
By("ensureTestImageUploaded: Inspecting Docker image")
807866
cmd := exec.Command("docker", "inspect", "--format='{{index .Id}}'", "gcr.io/k8s-staging-cluster-api/capa-manager:e2e")
808867
var stdOut bytes.Buffer
809868
cmd.Stdout = &stdOut
810-
err := cmd.Run()
869+
err = cmd.Run()
811870
if err != nil {
871+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to inspect Docker image: %v", err))
812872
return err
813873
}
814874

815875
imageSha := strings.ReplaceAll(strings.TrimSuffix(stdOut.String(), "\n"), "'", "")
876+
By(fmt.Sprintf("ensureTestImageUploaded: Docker image SHA: %s", imageSha))
816877

817878
ecrImageName := repoName + ":e2e"
879+
By(fmt.Sprintf("ensureTestImageUploaded: Tagging image as %s", ecrImageName))
818880
cmd = exec.Command("docker", "tag", imageSha, ecrImageName) //nolint:gosec
819881
err = cmd.Run()
820882
if err != nil {
883+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to tag Docker image: %v", err))
821884
return err
822885
}
823886

887+
By("ensureTestImageUploaded: Getting ECR authorization token")
824888
outToken, err := ecrSvc.GetAuthorizationToken(&ecrpublic.GetAuthorizationTokenInput{})
825889
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+
}
826895
return err
827896
}
828897

@@ -831,22 +900,31 @@ func ensureTestImageUploaded(e2eCtx *E2EContext) error {
831900

832901
strList := strings.Split(string(decodedUsernamePassword), ":")
833902
if len(strList) != 2 {
903+
By("ensureTestImageUploaded: Failed to decode ECR authentication token")
834904
return errors.New("failed to decode ECR authentication token")
835905
}
836906

907+
By("ensureTestImageUploaded: Logging into ECR Public")
837908
cmd = exec.Command("docker", "login", "--username", strList[0], "--password", strList[1], "public.ecr.aws") //nolint:gosec
838909
err = cmd.Run()
839910
if err != nil {
911+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to login to ECR Public: %v", err))
840912
return err
841913
}
842914

915+
By("ensureTestImageUploaded: Pushing image to ECR Public")
843916
cmd = exec.Command("docker", "push", ecrImageName)
844917
err = cmd.Run()
845918
if err != nil {
919+
By(fmt.Sprintf("ensureTestImageUploaded: Failed to push image: %v", err))
846920
return err
847921
}
922+
923+
By("ensureTestImageUploaded: Image pushed successfully")
848924
e2eCtx.E2EConfig.Variables["CAPI_IMAGES_REGISTRY"] = repoName
849925
e2eCtx.E2EConfig.Variables["E2E_IMAGE_TAG"] = "e2e"
926+
927+
By("ensureTestImageUploaded: Function completed successfully")
850928
return nil
851929
}
852930

@@ -915,26 +993,41 @@ func encodeCredentials(accessKey *iamtypes.AccessKey, region string) string {
915993
// newUserAccessKey generates a new AWS Access Key pair based off of the
916994
// bootstrap user. This tests that the CloudFormation policy is correct.
917995
func newUserAccessKey(ctx context.Context, cfg *awsv2.Config, userName string) *iamtypes.AccessKey {
996+
By(fmt.Sprintf("newUserAccessKey: Starting for user: %s", userName))
997+
918998
iamSvc := iam.NewFromConfig(*cfg)
919999

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{
9211002
UserName: aws.String(userName),
9221003
})
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+
9231011
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))
9251013
_, err := iamSvc.DeleteAccessKey(ctx, &iam.DeleteAccessKeyInput{
9261014
UserName: aws.String(userName),
9271015
AccessKeyId: keyOuts.AccessKeyMetadata[i].AccessKeyId,
9281016
})
9291017
Expect(err).NotTo(HaveOccurred())
1018+
By(fmt.Sprintf("newUserAccessKey: Successfully deleted access key: %s", *keyOuts.AccessKeyMetadata[i].AccessKeyId))
9301019
}
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))
9321022
out, err := iamSvc.CreateAccessKey(ctx, &iam.CreateAccessKeyInput{UserName: aws.String(userName)})
9331023
Expect(err).NotTo(HaveOccurred())
9341024
Expect(out.AccessKey).ToNot(BeNil())
9351025
Expect(out.AccessKey.AccessKeyId).ToNot(BeNil())
9361026
Expect(out.AccessKey.SecretAccessKey).ToNot(BeNil())
9371027

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+
9381031
return &iamtypes.AccessKey{
9391032
AccessKeyId: out.AccessKey.AccessKeyId,
9401033
SecretAccessKey: out.AccessKey.SecretAccessKey,

test/e2e/shared/suite.go

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
"time"
3333

3434
iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types"
35+
"github.com/aws/aws-sdk-go/aws/awserr"
36+
"github.com/aws/aws-sdk-go/aws/session"
3537
"github.com/gofrs/flock"
3638
. "github.com/onsi/ginkgo/v2"
3739
. "github.com/onsi/gomega"
@@ -158,7 +160,74 @@ func Node1BeforeSuite(e2eCtx *E2EContext) []byte {
158160
e2eCtx.Environment.BootstrapAccessKey = newUserAccessKey(context.TODO(), e2eCtx.AWSSessionV2, bootstrapTemplate.Spec.BootstrapUser.UserName)
159161
e2eCtx.BootstrapUserAWSSession = NewAWSSessionWithKey(e2eCtx.Environment.BootstrapAccessKey)
160162
e2eCtx.BootstrapUserAWSSessionV2 = NewAWSSessionWithKeyV2(e2eCtx.Environment.BootstrapAccessKey)
161-
Expect(ensureTestImageUploaded(e2eCtx)).NotTo(HaveOccurred())
163+
164+
// 添加详细的日志来诊断AWS凭证问题
165+
By(fmt.Sprintf("Bootstrap access key created - AccessKeyId: %s, Status: %s",
166+
*e2eCtx.Environment.BootstrapAccessKey.AccessKeyId,
167+
e2eCtx.Environment.BootstrapAccessKey.Status))
168+
169+
// 验证访问密钥是否有效
170+
By("Verifying bootstrap access key credentials")
171+
if e2eCtx.BootstrapUserAWSSession != nil {
172+
By("BootstrapUserAWSSession created successfully")
173+
// 尝试获取凭证信息
174+
if sess, ok := e2eCtx.BootstrapUserAWSSession.(*session.Session); ok {
175+
creds, err := sess.Config.Credentials.Get()
176+
if err != nil {
177+
By(fmt.Sprintf("Failed to get credentials from BootstrapUserAWSSession: %v", err))
178+
} else {
179+
By(fmt.Sprintf("BootstrapUserAWSSession credentials - AccessKeyId: %s, ProviderName: %s",
180+
creds.AccessKeyID, creds.ProviderName))
181+
}
182+
}
183+
} else {
184+
By("WARNING: BootstrapUserAWSSession is nil")
185+
}
186+
187+
if e2eCtx.BootstrapUserAWSSessionV2 != nil {
188+
By("BootstrapUserAWSSessionV2 created successfully")
189+
// 验证V2配置
190+
creds, err := e2eCtx.BootstrapUserAWSSessionV2.Credentials.Retrieve(context.TODO())
191+
if err != nil {
192+
By(fmt.Sprintf("Failed to get credentials from BootstrapUserAWSSessionV2: %v", err))
193+
} else {
194+
By(fmt.Sprintf("BootstrapUserAWSSessionV2 credentials - AccessKeyId: %s",
195+
creds.AccessKeyID))
196+
}
197+
} else {
198+
By("WARNING: BootstrapUserAWSSessionV2 is nil")
199+
}
200+
201+
// 等待一段时间让访问密钥传播
202+
By("Waiting for access key to propagate...")
203+
time.Sleep(10 * time.Second)
204+
205+
// 尽可能加更多的log,找到为什么会failed
206+
By("Starting ensureTestImageUploaded with detailed logging")
207+
err = ensureTestImageUploaded(e2eCtx)
208+
if err != nil {
209+
By(fmt.Sprintf("ensureTestImageUploaded failed with error: %v", err))
210+
// 尝试获取更多错误信息
211+
if awsErr, ok := err.(awserr.Error); ok {
212+
By(fmt.Sprintf("AWS Error details - Code: %s, Message: %s",
213+
awsErr.Code(), awsErr.Message()))
214+
}
215+
// 重新尝试获取凭证信息
216+
if e2eCtx.BootstrapUserAWSSession != nil {
217+
if sess, ok := e2eCtx.BootstrapUserAWSSession.(*session.Session); ok {
218+
creds, err := sess.Config.Credentials.Get()
219+
if err != nil {
220+
By(fmt.Sprintf("Credentials retrieval failed after error: %v", err))
221+
} else {
222+
By(fmt.Sprintf("Current credentials - AccessKeyId: %s, ProviderName: %s",
223+
creds.AccessKeyID, creds.ProviderName))
224+
}
225+
}
226+
}
227+
// 返回错误而不是[]byte
228+
return []byte{}
229+
}
230+
By("ensureTestImageUploaded completed successfully")
162231

163232
// Image ID is needed when using a CI Kubernetes version. This is used in conformance test and upgrade to main test.
164233
if !e2eCtx.IsManaged {

0 commit comments

Comments
 (0)