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  }