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 }