github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/getVmVolume.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 7 "github.com/Cloud-Foundations/Dominator/lib/log" 8 ) 9 10 func getVmVolumeSubcommand(args []string, logger log.DebugLogger) error { 11 if err := getVmVolume(args[0], logger); err != nil { 12 return fmt.Errorf("Error getting VM volume: %s", err) 13 } 14 return nil 15 } 16 17 func getVmVolume(vmHostname string, logger log.DebugLogger) error { 18 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 19 return err 20 } else { 21 return getVmVolumeOnHypervisor(hypervisor, vmIP, logger) 22 } 23 } 24 25 func getVmVolumeOnHypervisor(hypervisor string, ipAddr net.IP, 26 logger log.DebugLogger) error { 27 client, err := dialHypervisor(hypervisor) 28 if err != nil { 29 return err 30 } 31 defer client.Close() 32 vmInfo, err := getVmInfoClient(client, ipAddr) 33 if err != nil { 34 return err 35 } 36 if *volumeIndex >= uint(len(vmInfo.Volumes)) { 37 return fmt.Errorf("volumeIndex too large") 38 } 39 return copyVolumeToVmSaver(&directorySaver{filename: *volumeFilename}, 40 client, ipAddr, *volumeIndex, vmInfo.Volumes[*volumeIndex].Size, logger) 41 }