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 }