release/cli/pkg/clients/clients.go (281 lines of code) (raw):

// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package clients import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/kms" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" ecrsdk "github.com/aws/aws-sdk-go/service/ecr" ecrpublicsdk "github.com/aws/aws-sdk-go/service/ecrpublic" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" docker "github.com/fsouza/go-dockerclient" "github.com/pkg/errors" "github.com/aws/eks-anywhere/release/cli/pkg/aws/ecr" "github.com/aws/eks-anywhere/release/cli/pkg/aws/ecrpublic" "github.com/aws/eks-anywhere/release/cli/pkg/constants" ) type SourceClients struct { S3 *SourceS3Clients ECR *SourceECRClient Packages *SourceECRClient } type ReleaseClients struct { S3 *ReleaseS3Clients ECRPublic *ReleaseECRPublicClient Packages *ReleaseECRPublicClient } type SourceS3Clients struct { Client *s3.S3 Downloader *s3manager.Downloader } type ReleaseS3Clients struct { Client *s3.S3 Uploader *s3manager.Uploader } type SourceECRClient struct { EcrClient *ecrsdk.ECR EcrPublicClient *ecrpublicsdk.ECRPublic AuthConfig *docker.AuthConfiguration } type ReleaseECRPublicClient struct { Client *ecrpublicsdk.ECRPublic AuthConfig *docker.AuthConfiguration } // Function to create release clients for dev release. func CreateDevReleaseClients(dryRun bool) (*SourceClients, *ReleaseClients, error) { fmt.Println("\n==========================================================") fmt.Println(" Dev Release Clients Creation") fmt.Println("==========================================================") if dryRun { fmt.Println("Skipping clients creation in dry-run mode") return nil, nil, nil } // PDX session for eks-a-build-prod-pdx pdxSession, err := session.NewSession(&aws.Config{ Region: aws.String("us-west-2"), }) if err != nil { return nil, nil, errors.Cause(err) } // IAD session for eks-a-build-prod-pdx iadSession, err := session.NewSession(&aws.Config{ Region: aws.String("us-east-1"), }) if err != nil { return nil, nil, errors.Cause(err) } // PDX Session for beta-pdx-packages packagesPDXSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-west-2"), }, Profile: "packages-beta-pdx", }) if err != nil { return nil, nil, errors.Cause(err) } // IAD Session for beta-pdx-packages packagesIADSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-east-1"), }, Profile: "packages-beta-iad", }) if err != nil { return nil, nil, errors.Cause(err) } // S3 client and uploader s3Client := s3.New(pdxSession) downloader := s3manager.NewDownloader(pdxSession) uploader := s3manager.NewUploader(pdxSession) // Get source ECR auth config ecrClient := ecrsdk.New(pdxSession) sourceAuthConfig, err := ecr.GetAuthConfig(ecrClient) if err != nil { return nil, nil, errors.Cause(err) } // Get packages source ECR auth config packagesECRClient := ecrsdk.New(packagesPDXSession) packagesSourceAuthConfig, err := ecr.GetAuthConfig(packagesECRClient) if err != nil { return nil, nil, errors.Cause(err) } // Get release ECR Public auth config ecrPublicClient := ecrpublicsdk.New(iadSession) releaseAuthConfig, err := ecrpublic.GetAuthConfig(ecrPublicClient) if err != nil { return nil, nil, errors.Cause(err) } // Get packages release ECR Public auth config packagesECRPublicClient := ecrpublicsdk.New(packagesIADSession) packagesReleaseAuthConfig, err := ecrpublic.GetAuthConfig(packagesECRPublicClient) if err != nil { return nil, nil, errors.Cause(err) } // Constructing source clients sourceClients := &SourceClients{ S3: &SourceS3Clients{ Client: s3Client, Downloader: downloader, }, ECR: &SourceECRClient{ EcrClient: ecrClient, AuthConfig: sourceAuthConfig, }, Packages: &SourceECRClient{ EcrClient: packagesECRClient, AuthConfig: packagesSourceAuthConfig, }, } // Constructing release clients releaseClients := &ReleaseClients{ S3: &ReleaseS3Clients{ Client: s3Client, Uploader: uploader, }, ECRPublic: &ReleaseECRPublicClient{ Client: ecrPublicClient, AuthConfig: releaseAuthConfig, }, Packages: &ReleaseECRPublicClient{ Client: packagesECRPublicClient, AuthConfig: packagesReleaseAuthConfig, }, } return sourceClients, releaseClients, nil } // Function to create clients for staging release. func CreateStagingReleaseClients(bundleRelease bool) (*SourceClients, *ReleaseClients, error) { fmt.Println("\n==========================================================") fmt.Println(" Staging Release Clients Creation") fmt.Println("==========================================================") // Session for eks-a-build-prod-pdx sourceSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-west-2"), }, }) if err != nil { return nil, nil, errors.Cause(err) } // Session for eks-a-artifact-beta-iad releaseSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-east-1"), }, Profile: "artifacts-staging", }) if err != nil { return nil, nil, errors.Cause(err) } // Source S3 client sourceS3Client := s3.New(sourceSession) // Release S3 client and uploader releaseS3Client := s3.New(releaseSession) downloader := s3manager.NewDownloader(sourceSession) uploader := s3manager.NewUploader(releaseSession) // Get source ECR auth config ecrClient := ecrsdk.New(sourceSession) sourceAuthConfig, err := ecr.GetAuthConfig(ecrClient) if err != nil { return nil, nil, errors.Cause(err) } // Get release ECR Public auth config ecrPublicClient := ecrpublicsdk.New(releaseSession) releaseAuthConfig, err := ecrpublic.GetAuthConfig(ecrPublicClient) if err != nil { return nil, nil, errors.Cause(err) } var packagesECRClient *ecrsdk.ECR var packagesSourceAuthConfig *docker.AuthConfiguration if bundleRelease { // Session for beta-pdx-packages packagesPDXSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-west-2"), }, Profile: "packages-beta", }) if err != nil { return nil, nil, errors.Cause(err) } // Get packages source ECR auth config packagesECRClient = ecrsdk.New(packagesPDXSession) packagesSourceAuthConfig, err = ecr.GetAuthConfig(packagesECRClient) if err != nil { return nil, nil, errors.Cause(err) } } // Constructing source clients sourceClients := &SourceClients{ S3: &SourceS3Clients{ Client: sourceS3Client, Downloader: downloader, }, ECR: &SourceECRClient{ EcrClient: ecrClient, AuthConfig: sourceAuthConfig, }, Packages: &SourceECRClient{ EcrClient: packagesECRClient, AuthConfig: packagesSourceAuthConfig, }, } // Constructing release clients releaseClients := &ReleaseClients{ S3: &ReleaseS3Clients{ Client: releaseS3Client, Uploader: uploader, }, ECRPublic: &ReleaseECRPublicClient{ Client: ecrPublicClient, AuthConfig: releaseAuthConfig, }, } return sourceClients, releaseClients, nil } // Function to create clients for production release. func CreateProdReleaseClients() (*SourceClients, *ReleaseClients, error) { fmt.Println("\n==========================================================") fmt.Println(" Production Release Clients Creation") fmt.Println("==========================================================") // Session for eks-a-artifact-beta-iad sourceSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-east-1"), }, Profile: "artifacts-staging", }) if err != nil { return nil, nil, errors.Cause(err) } // Session for eks-a-artifact-prod-iad releaseSession, err := session.NewSessionWithOptions(session.Options{ Config: aws.Config{ Region: aws.String("us-east-1"), }, Profile: "artifacts-production", }) if err != nil { return nil, nil, errors.Cause(err) } // Source S3 client sourceS3Client := s3.New(sourceSession) // Release S3 client and uploader releaseS3Client := s3.New(releaseSession) downloader := s3manager.NewDownloader(sourceSession) uploader := s3manager.NewUploader(releaseSession) // Get source ECR Public auth config sourceEcrPublicClient := ecrpublicsdk.New(sourceSession) sourceAuthConfig, err := ecrpublic.GetAuthConfig(sourceEcrPublicClient) if err != nil { return nil, nil, errors.Cause(err) } // Get release ECR Public auth config releaseEcrPublicClient := ecrpublicsdk.New(releaseSession) releaseAuthConfig, err := ecrpublic.GetAuthConfig(releaseEcrPublicClient) if err != nil { return nil, nil, errors.Cause(err) } // Constructing release clients sourceClients := &SourceClients{ S3: &SourceS3Clients{ Client: sourceS3Client, Downloader: downloader, }, ECR: &SourceECRClient{ EcrPublicClient: sourceEcrPublicClient, AuthConfig: sourceAuthConfig, }, } // Constructing release clients releaseClients := &ReleaseClients{ S3: &ReleaseS3Clients{ Client: releaseS3Client, Uploader: uploader, }, ECRPublic: &ReleaseECRPublicClient{ Client: releaseEcrPublicClient, AuthConfig: releaseAuthConfig, }, } return sourceClients, releaseClients, nil } // Function to create KMS client for bundle manifest signing and eks distro manifest signing. func CreateKMSClient(ctx context.Context) (*kms.Client, error) { conf, err := config.LoadDefaultConfig(ctx, config.WithRegion(constants.DefaultRegion)) if err != nil { return nil, fmt.Errorf("loading AWS config in region %q: %v", constants.DefaultRegion, err) } client := kms.NewFromConfig(conf) return client, nil }