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  }