github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/removeUnusedVolumes.go (about)

     1  package amipublisher
     2  
     3  import (
     4  	uclient "github.com/Cloud-Foundations/Dominator/imageunpacker/client"
     5  	"github.com/Cloud-Foundations/Dominator/lib/awsutil"
     6  	"github.com/Cloud-Foundations/Dominator/lib/log"
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/ec2"
     9  )
    10  
    11  func removeUnusedVolumes(targets awsutil.TargetList,
    12  	skipList awsutil.TargetList, unpackerName string, logger log.Logger) error {
    13  	errorsChannel := make(chan error, 1)
    14  	numTargets, err := awsutil.ForEachTarget(targets, skipList,
    15  		func(awsService *ec2.EC2, account, region string, logger log.Logger) {
    16  			removeUnusedVolumesFromTargetWrapper(awsService, unpackerName,
    17  				errorsChannel, logger)
    18  		},
    19  		logger)
    20  	// Collect errors.
    21  	for i := 0; i < numTargets; i++ {
    22  		e := <-errorsChannel
    23  		if e != nil && err != nil {
    24  			err = e
    25  		}
    26  	}
    27  	return err
    28  }
    29  
    30  func removeUnusedVolumesFromTargetWrapper(awsService *ec2.EC2,
    31  	unpackerName string, errorChannel chan<- error, logger log.Logger) {
    32  	errorChannel <- removeUnusedVolumesFromTarget(awsService, unpackerName,
    33  		logger)
    34  }
    35  
    36  func removeUnusedVolumesFromTarget(awsService *ec2.EC2, unpackerName string,
    37  	logger log.Logger) error {
    38  	unpackerInstance, srpcClient, err := getWorkingUnpacker(awsService,
    39  		unpackerName, logger)
    40  	if err != nil {
    41  		logger.Println(err)
    42  		return err
    43  	}
    44  	defer srpcClient.Close()
    45  	status, err := uclient.GetStatus(srpcClient)
    46  	if err != nil {
    47  		logger.Println(err)
    48  		return err
    49  	}
    50  	volumeIds := make([]string, 0)
    51  	// Remove unused volumes.
    52  	for volumeId, device := range status.Devices {
    53  		if device.StreamName != "" {
    54  			continue
    55  		}
    56  		if err := uclient.RemoveDevice(srpcClient, volumeId); err != nil {
    57  			logger.Println(err)
    58  		} else {
    59  			volumeIds = append(volumeIds, volumeId)
    60  		}
    61  	}
    62  	var firstError error
    63  	instanceId := aws.StringValue(unpackerInstance.InstanceId)
    64  	for _, volumeId := range volumeIds {
    65  		if err := detachVolume(awsService, instanceId, volumeId); err != nil {
    66  			logger.Println(err)
    67  			if firstError == nil {
    68  				firstError = err
    69  			}
    70  			continue
    71  		}
    72  		logger.Printf("%s detached from: %s\n", volumeId, instanceId)
    73  		if err := deleteVolume(awsService, volumeId); err != nil {
    74  			logger.Println(err)
    75  			if firstError == nil {
    76  				firstError = err
    77  			}
    78  			continue
    79  		}
    80  		logger.Printf("deleted: %s\n", volumeId)
    81  	}
    82  	return nil
    83  }