github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/startInstances.go (about)

     1  package amipublisher
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/awsutil"
     7  	"github.com/Cloud-Foundations/Dominator/lib/log"
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/ec2"
    10  )
    11  
    12  func startInstances(targets awsutil.TargetList, skipList awsutil.TargetList,
    13  	name string, logger log.Logger) ([]InstanceResult, error) {
    14  	resultsChannel := make(chan InstanceResult, 1)
    15  	numTargets, err := awsutil.ForEachTarget(targets, skipList,
    16  		func(awsService *ec2.EC2, account, region string, logger log.Logger) {
    17  			instanceId, privateIp, err := startInstancesInTarget(awsService,
    18  				name, logger)
    19  			if err != nil {
    20  				logger.Println(err)
    21  			}
    22  			resultsChannel <- InstanceResult{
    23  				awsutil.Target{account, region},
    24  				instanceId,
    25  				privateIp,
    26  				err,
    27  			}
    28  		},
    29  		logger)
    30  	// Collect results.
    31  	results := make([]InstanceResult, 0, numTargets)
    32  	for i := 0; i < numTargets; i++ {
    33  		result := <-resultsChannel
    34  		if result.AccountName == "" || result.Region == "" {
    35  			continue
    36  		}
    37  		results = append(results, result)
    38  	}
    39  	return results, err
    40  }
    41  
    42  func startInstancesInTarget(awsService *ec2.EC2, name string,
    43  	logger log.Logger) (string, string, error) {
    44  	instances, err := getInstances(awsService, name)
    45  	if err != nil {
    46  		return "", "", err
    47  	}
    48  	if len(instances) < 1 {
    49  		return "", "", nil
    50  	}
    51  	if len(instances) > 1 {
    52  		return "", "", errors.New("multiple instances")
    53  	}
    54  	instanceId := getInstanceIds(instances)[0]
    55  	instanceIp := aws.StringValue(instances[0].PrivateIpAddress)
    56  	if aws.StringValue(instances[0].State.Name) ==
    57  		ec2.InstanceStateNameRunning {
    58  		return instanceId, instanceIp, nil
    59  	}
    60  	logger.Printf("starting instance: %s\n", instanceId)
    61  	if err := libStartInstances(awsService, instanceId); err != nil {
    62  		return "", "", err
    63  	}
    64  	return instanceId, instanceIp, nil
    65  }