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  }