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 }