github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/probeVmPort.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 7 "github.com/Cloud-Foundations/Dominator/lib/errors" 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 probeVmPortSubcommand(args []string, logger log.DebugLogger) error { 14 if *probePortNum < 1 { 15 return fmt.Errorf("Must provide -probePortNum flag") 16 } 17 if err := probeVmPort(args[0], logger); err != nil { 18 return fmt.Errorf("Error probing VM: %s", err) 19 } 20 return nil 21 } 22 23 func probeVmPort(vmHostname string, logger log.DebugLogger) error { 24 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 25 return err 26 } else { 27 return probeVmPortOnHypervisor(hypervisor, vmIP, logger) 28 } 29 } 30 31 func probeVmPortOnHypervisor(hypervisor string, ipAddr net.IP, 32 logger log.DebugLogger) error { 33 client, err := dialHypervisor(hypervisor) 34 if err != nil { 35 return err 36 } 37 defer client.Close() 38 return probeVmPortOnHypervisorClient(client, ipAddr, logger) 39 } 40 41 func probeVmPortOnHypervisorClient(client *srpc.Client, ipAddr net.IP, 42 logger log.DebugLogger) error { 43 request := proto.ProbeVmPortRequest{ 44 IpAddress: ipAddr, 45 PortNumber: *probePortNum, 46 Timeout: *probeTimeout, 47 } 48 var reply proto.ProbeVmPortResponse 49 err := client.RequestReply("Hypervisor.ProbeVmPort", request, &reply) 50 if err != nil { 51 return err 52 } 53 if err := errors.New(reply.Error); err != nil { 54 return err 55 } 56 if !reply.PortIsOpen { 57 return errors.New("Timed out probing port") 58 } 59 logger.Debugf(0, "Port %d is open\n", *probePortNum) 60 return nil 61 }