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

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"net"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     9  	"github.com/Cloud-Foundations/Dominator/lib/log"
    10  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    11  	proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor"
    12  )
    13  
    14  func netbootMachineSubcommand(args []string, logger log.DebugLogger) error {
    15  	var hostname string
    16  	if len(args) > 2 {
    17  		hostname = args[2]
    18  	}
    19  	err := netbootMachine(args[0], args[1], hostname, logger)
    20  	if err != nil {
    21  		return fmt.Errorf("Error netbooting machine: %s", err)
    22  	}
    23  	return nil
    24  }
    25  
    26  func netbootMachine(macAddr, ipAddr, hostname string,
    27  	logger log.DebugLogger) error {
    28  	request := proto.NetbootMachineRequest{
    29  		Address: proto.Address{
    30  			MacAddress: macAddr,
    31  			IpAddress:  net.ParseIP(ipAddr),
    32  		},
    33  		Files: make(map[string][]byte,
    34  			len(netbootFiles)),
    35  		FilesExpiration:              *netbootFilesTimeout,
    36  		Hostname:                     hostname,
    37  		NumAcknowledgementsToWaitFor: *numAcknowledgementsToWaitFor,
    38  		OfferExpiration:              *offerTimeout,
    39  		WaitTimeout:                  *netbootTimeout,
    40  	}
    41  	for tftpFilename, localFilename := range netbootFiles {
    42  		if data, err := ioutil.ReadFile(localFilename); err != nil {
    43  			return err
    44  		} else {
    45  			request.Files[tftpFilename] = data
    46  		}
    47  	}
    48  	var reply proto.NetbootMachineResponse
    49  	clientName := fmt.Sprintf("%s:%d", *hypervisorHostname, *hypervisorPortNum)
    50  	client, err := srpc.DialHTTP("tcp", clientName, 0)
    51  	if err != nil {
    52  		return err
    53  	}
    54  	defer client.Close()
    55  	err = client.RequestReply("Hypervisor.NetbootMachine", request, &reply)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	return errors.New(reply.Error)
    60  }