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  }