github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/listUnpackers.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/format" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 "github.com/Cloud-Foundations/Dominator/lib/srpc" 13 "github.com/aws/aws-sdk-go/aws" 14 "github.com/aws/aws-sdk-go/service/ec2" 15 ) 16 17 func listUnpackers(targets awsutil.TargetList, skipList awsutil.TargetList, 18 name string, logger log.Logger) ( 19 []TargetUnpackers, error) { 20 resultsChannel := make(chan TargetUnpackers, 1) 21 numTargets, err := awsutil.ForEachTarget(targets, skipList, 22 func(awsService *ec2.EC2, account, region string, logger log.Logger) { 23 unpackers, err := listTargetUnpackers(awsService, name, logger) 24 if err != nil { 25 logger.Println(err) 26 } 27 resultsChannel <- TargetUnpackers{ 28 awsutil.Target{account, region}, unpackers} 29 }, 30 logger) 31 // Collect results. 32 results := make([]TargetUnpackers, 0, numTargets) 33 for i := 0; i < numTargets; i++ { 34 result := <-resultsChannel 35 if len(result.Unpackers) > 0 { 36 results = append(results, result) 37 } 38 } 39 return results, err 40 } 41 42 func listTargetUnpackers(awsService *ec2.EC2, name string, logger log.Logger) ( 43 []Unpacker, error) { 44 unpackerInstances, err := getInstances(awsService, name) 45 if err != nil { 46 return nil, err 47 } 48 if len(unpackerInstances) < 1 { 49 return nil, nil 50 } 51 unpackers := make([]Unpacker, 0, len(unpackerInstances)) 52 for _, instance := range unpackerInstances { 53 unpackers = append(unpackers, Unpacker{ 54 aws.StringValue(instance.InstanceId), 55 aws.StringValue(instance.PrivateIpAddress), 56 aws.StringValue(instance.State.Name), 57 timeSinceLastUsed(instance), 58 }) 59 } 60 return unpackers, nil 61 } 62 63 func timeSinceLastUsed(instance *ec2.Instance) string { 64 if aws.StringValue(instance.State.Name) != ec2.InstanceStateNameRunning { 65 return "" 66 } 67 address := *instance.PrivateIpAddress + ":" + 68 strconv.Itoa(constants.ImageUnpackerPortNumber) 69 srpcClient, err := srpc.DialHTTP("tcp", address, time.Second*5) 70 if err != nil { 71 return "" 72 } 73 defer srpcClient.Close() 74 status, err := uclient.GetStatus(srpcClient) 75 if err != nil { 76 return "" 77 } 78 return format.Duration(status.TimeSinceLastUsed) 79 }