github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imagepublishers/amipublisher/addVolumes.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  	libtags "github.com/Cloud-Foundations/Dominator/lib/tags"
     8  	"github.com/aws/aws-sdk-go/service/ec2"
     9  )
    10  
    11  func addVolumes(targets awsutil.TargetList, skipList awsutil.TargetList,
    12  	tags libtags.Tags, unpackerName string, size uint64,
    13  	logger log.Logger) error {
    14  	errorsChannel := make(chan error, 1)
    15  	numTargets, err := awsutil.ForEachTarget(targets, skipList,
    16  		func(awsService *ec2.EC2, account, region string, logger log.Logger) {
    17  			addVolumeToTargetWrapper(awsService, tags, unpackerName, size,
    18  				errorsChannel, logger)
    19  		},
    20  		logger)
    21  	// Collect errors.
    22  	for i := 0; i < numTargets; i++ {
    23  		e := <-errorsChannel
    24  		if e != nil && err == nil {
    25  			err = e
    26  		}
    27  	}
    28  	return err
    29  }
    30  
    31  func addVolumeToTargetWrapper(awsService *ec2.EC2, tags libtags.Tags,
    32  	unpackerName string, size uint64, errorChannel chan<- error,
    33  	logger log.Logger) {
    34  	errorChannel <- addVolumeToTarget(awsService, tags, unpackerName, size,
    35  		logger)
    36  }
    37  
    38  func addVolumeToTarget(awsService *ec2.EC2, tags libtags.Tags,
    39  	unpackerName string, size uint64, logger log.Logger) error {
    40  	unpackerInstance, srpcClient, err := getWorkingUnpacker(awsService,
    41  		unpackerName, logger)
    42  	if err != nil {
    43  		logger.Println(err)
    44  		return err
    45  	}
    46  	defer srpcClient.Close()
    47  	volumeId, err := addVolume(srpcClient, awsService, size, tags,
    48  		unpackerInstance, logger)
    49  	if err != nil {
    50  		logger.Println(err)
    51  		return err
    52  	}
    53  	status, err := uclient.GetStatus(srpcClient)
    54  	if err != nil {
    55  		logger.Println(err)
    56  		return err
    57  	}
    58  	logger.Printf("%s attached as device: %s\n",
    59  		volumeId, status.Devices[volumeId].DeviceName)
    60  	return nil
    61  }