github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/traceMetadata.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 traceVmMetadataSubcommand(args []string, logger log.DebugLogger) error { 14 if err := traceVmMetadata(args[0], logger); err != nil { 15 return fmt.Errorf("Error tracing VM metadata: %s", err) 16 } 17 return nil 18 } 19 20 func traceVmMetadata(vmHostname string, logger log.DebugLogger) error { 21 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 22 return err 23 } else { 24 return traceVmMetadataOnHypervisor(hypervisor, vmIP, logger) 25 } 26 } 27 28 func traceVmMetadataOnHypervisor(hypervisor string, ipAddr net.IP, 29 logger log.DebugLogger) error { 30 client, err := dialHypervisor(hypervisor) 31 if err != nil { 32 return err 33 } 34 defer client.Close() 35 return doTraceMetadata(client, ipAddr, logger) 36 } 37 38 func doTraceMetadata(client *srpc.Client, ipAddr net.IP, 39 logger log.Logger) error { 40 request := proto.TraceVmMetadataRequest{ipAddr} 41 conn, err := client.Call("Hypervisor.TraceVmMetadata") 42 if err != nil { 43 return err 44 } 45 defer conn.Close() 46 if err := conn.Encode(request); err != nil { 47 return err 48 } 49 if err := conn.Flush(); err != nil { 50 return err 51 } 52 var reply proto.TraceVmMetadataResponse 53 if err := conn.Decode(&reply); err != nil { 54 return err 55 } 56 if reply.Error != "" { 57 return errors.New(reply.Error) 58 } 59 for { 60 if line, err := conn.ReadString('\n'); err != nil { 61 return err 62 } else { 63 if line == "\n" { 64 return nil 65 } 66 logger.Print(line) 67 } 68 } 69 } 70 71 func maybeWatchVm(client *srpc.Client, hypervisor string, ipAddr net.IP, 72 logger log.DebugLogger) error { 73 if !*traceMetadata && *probePortNum < 1 { 74 return nil 75 } else if *traceMetadata && *probePortNum < 1 { 76 return doTraceMetadata(client, ipAddr, logger) 77 } else if !*traceMetadata && *probePortNum > 0 { 78 return probeVmPortOnHypervisorClient(client, ipAddr, logger) 79 } else { // Do both. 80 go doTraceMetadata(client, ipAddr, logger) 81 return probeVmPortOnHypervisor(hypervisor, ipAddr, logger) 82 } 83 }