github.com/Cloud-Foundations/Dominator@v0.3.4/imagepublishers/amipublisher/stopIdleUnpackers.go (about) 1 package amipublisher 2 3 import ( 4 "strconv" 5 "time" 6 7 uclient "github.com/Cloud-Foundations/Dominator/imageunpacker/client" 8 "github.com/Cloud-Foundations/Dominator/lib/awsutil" 9 "github.com/Cloud-Foundations/Dominator/lib/constants" 10 "github.com/Cloud-Foundations/Dominator/lib/log" 11 "github.com/Cloud-Foundations/Dominator/lib/srpc" 12 "github.com/aws/aws-sdk-go/aws" 13 "github.com/aws/aws-sdk-go/service/ec2" 14 ) 15 16 func stopIdleUnpackers(targets awsutil.TargetList, skipList awsutil.TargetList, 17 name string, idleTimeout time.Duration, logger log.Logger) error { 18 resultsChannel := make(chan error, 1) 19 numTargets, err := awsutil.ForEachTarget(targets, skipList, 20 func(awsService *ec2.EC2, account, region string, logger log.Logger) { 21 err := stopIdleUnpackersInTarget(awsService, name, idleTimeout, 22 logger) 23 if err != nil { 24 logger.Println(err) 25 } 26 resultsChannel <- err 27 }, 28 logger) 29 // Collect results. 30 firstError := err 31 for i := 0; i < numTargets; i++ { 32 err := <-resultsChannel 33 if err != nil && firstError == nil { 34 firstError = err 35 } 36 } 37 return firstError 38 } 39 40 func stopIdleUnpackersInTarget(awsService *ec2.EC2, name string, 41 idleTimeout time.Duration, logger log.Logger) error { 42 unpackerInstances, err := getInstances(awsService, name) 43 if err != nil { 44 return err 45 } 46 if len(unpackerInstances) < 1 { 47 return nil 48 } 49 var firstError error 50 for _, instance := range unpackerInstances { 51 err := stopIdleUnpacker(awsService, instance, idleTimeout, logger) 52 if err != nil && firstError == nil { 53 firstError = err 54 } 55 } 56 return firstError 57 } 58 59 func stopIdleUnpacker(awsService *ec2.EC2, instance *ec2.Instance, 60 idleTimeout time.Duration, logger log.Logger) error { 61 if aws.StringValue(instance.State.Name) != ec2.InstanceStateNameRunning { 62 return nil 63 } 64 address := *instance.PrivateIpAddress + ":" + 65 strconv.Itoa(constants.ImageUnpackerPortNumber) 66 srpcClient, err := srpc.DialHTTP("tcp", address, time.Second*5) 67 if err != nil { 68 return err 69 } 70 defer srpcClient.Close() 71 status, err := uclient.GetStatus(srpcClient) 72 if err != nil { 73 return err 74 } 75 if status.TimeSinceLastUsed < idleTimeout { 76 return nil 77 } 78 instanceId := aws.StringValue(instance.InstanceId) 79 if err := stopInstances(awsService, instanceId); err != nil { 80 return err 81 } 82 logger.Printf("stopped idle instance: %s\n", instanceId) 83 return nil 84 }