github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/connectToVmSerialPort.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"os"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     9  	"github.com/Cloud-Foundations/Dominator/lib/log"
    10  	terminalclient "github.com/Cloud-Foundations/Dominator/lib/net/terminal/client"
    11  	proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor"
    12  )
    13  
    14  func connectToVmSerialPortSubcommand(args []string,
    15  	logger log.DebugLogger) error {
    16  	if err := connectToVmSerialPort(args[0], logger); err != nil {
    17  		return fmt.Errorf("Error connecting to VM serial port: %s", err)
    18  	}
    19  	return nil
    20  }
    21  
    22  func connectToVmSerialPort(vmHostname string, logger log.DebugLogger) error {
    23  	if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil {
    24  		return err
    25  	} else {
    26  		return connectToVmSerialPortOnHypervisor(hypervisor, vmIP, logger)
    27  	}
    28  }
    29  
    30  func connectToVmSerialPortOnHypervisor(hypervisor string, ipAddr net.IP,
    31  	logger log.DebugLogger) error {
    32  	client, err := dialHypervisor(hypervisor)
    33  	if err != nil {
    34  		return err
    35  	}
    36  	defer client.Close()
    37  	conn, err := client.Call("Hypervisor.ConnectToVmSerialPort")
    38  	if err != nil {
    39  		return err
    40  	}
    41  	defer conn.Close()
    42  	request := proto.ConnectToVmSerialPortRequest{
    43  		IpAddress:  ipAddr,
    44  		PortNumber: *serialPort,
    45  	}
    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 response proto.ConnectToVmSerialPortResponse
    53  	if err := conn.Decode(&response); err != nil {
    54  		return err
    55  	}
    56  	if err := errors.New(response.Error); err != nil {
    57  		return err
    58  	}
    59  	if err := terminalclient.StartTerminal(conn); err != nil {
    60  		fmt.Fprintln(os.Stderr, err)
    61  		os.Exit(1)
    62  	}
    63  	fmt.Fprint(os.Stderr, "\r")
    64  	return nil
    65  }