github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/patchVmImage.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 8 "github.com/Cloud-Foundations/Dominator/lib/log" 9 "github.com/Cloud-Foundations/Dominator/lib/srpc" 10 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 11 ) 12 13 func patchVmImageSubcommand(args []string, logger log.DebugLogger) error { 14 if err := patchVmImage(args[0], logger); err != nil { 15 return fmt.Errorf("Error patching VM image: %s", err) 16 } 17 return nil 18 } 19 20 func callPatchVmImage(client *srpc.Client, request proto.PatchVmImageRequest, 21 reply *proto.PatchVmImageResponse, logger log.DebugLogger) error { 22 conn, err := client.Call("Hypervisor.PatchVmImage") 23 if err != nil { 24 return err 25 } 26 defer conn.Close() 27 if err := conn.Encode(request); err != nil { 28 return err 29 } 30 if err := conn.Flush(); err != nil { 31 return err 32 } 33 for { 34 var response proto.PatchVmImageResponse 35 if err := conn.Decode(&response); err != nil { 36 return err 37 } 38 if response.Error != "" { 39 return errors.New(response.Error) 40 } 41 if response.ProgressMessage != "" { 42 logger.Debugln(0, response.ProgressMessage) 43 } 44 if response.Final { 45 *reply = response 46 return nil 47 } 48 } 49 } 50 51 func patchVmImage(vmHostname string, logger log.DebugLogger) error { 52 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 53 return err 54 } else { 55 return patchVmImageOnHypervisor(hypervisor, vmIP, logger) 56 } 57 } 58 59 func patchVmImageOnHypervisor(hypervisor string, ipAddr net.IP, 60 logger log.DebugLogger) error { 61 request := proto.PatchVmImageRequest{ 62 ImageName: *imageName, 63 ImageTimeout: *imageTimeout, 64 IpAddress: ipAddr, 65 } 66 client, err := dialHypervisor(hypervisor) 67 if err != nil { 68 return err 69 } 70 defer client.Close() 71 var reply proto.PatchVmImageResponse 72 err = callPatchVmImage(client, request, &reply, logger) 73 if err != nil { 74 return err 75 } 76 return nil 77 }