github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/importKeyPair.go (about) 1 package amipublisher 2 3 import ( 4 "github.com/Cloud-Foundations/Dominator/lib/awsutil" 5 "github.com/Cloud-Foundations/Dominator/lib/log" 6 "github.com/aws/aws-sdk-go/aws" 7 "github.com/aws/aws-sdk-go/service/ec2" 8 ) 9 10 func importKeyPair(targets awsutil.TargetList, skipList awsutil.TargetList, 11 keyName string, publicKey []byte, logger log.Logger) error { 12 resultsChannel := make(chan error, 1) 13 numTargets, err := awsutil.ForEachTarget(targets, skipList, 14 func(awsService *ec2.EC2, account, region string, logger log.Logger) { 15 err := importKeyPairInTarget(awsService, keyName, publicKey, logger) 16 if err != nil { 17 logger.Println(err) 18 } 19 resultsChannel <- err 20 }, 21 logger) 22 // Collect results. 23 for i := 0; i < numTargets; i++ { 24 e := <-resultsChannel 25 if e != nil && err == nil { 26 err = e 27 } 28 } 29 return err 30 } 31 32 func importKeyPairInTarget(awsService *ec2.EC2, keyName string, 33 publicKey []byte, logger log.Logger) error { 34 out, err := awsService.DescribeKeyPairs(&ec2.DescribeKeyPairsInput{ 35 KeyNames: aws.StringSlice([]string{keyName}), 36 }) 37 if err == nil && len(out.KeyPairs) == 1 { 38 return nil 39 } 40 _, err = awsService.ImportKeyPair(&ec2.ImportKeyPairInput{ 41 KeyName: aws.String(keyName), 42 PublicKeyMaterial: publicKey, 43 }) 44 return err 45 }