github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/patchVmImage.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 patchVmImageSubcommand(args []string, logger log.DebugLogger) error {
    14  	if err := patchVmImage(args[0], logger); err != nil {
    15  		return fmt.Errorf("Error patching VM image: %s", err)
    16  	}
    17  	return nil
    18  }
    19  
    20  func callPatchVmImage(client *srpc.Client, request proto.PatchVmImageRequest,
    21  	reply *proto.PatchVmImageResponse, logger log.DebugLogger) error {
    22  	conn, err := client.Call("Hypervisor.PatchVmImage")
    23  	if err != nil {
    24  		return err
    25  	}
    26  	defer conn.Close()
    27  	if err := conn.Encode(request); err != nil {
    28  		return err
    29  	}
    30  	if err := conn.Flush(); err != nil {
    31  		return err
    32  	}
    33  	for {
    34  		var response proto.PatchVmImageResponse
    35  		if err := conn.Decode(&response); err != nil {
    36  			return err
    37  		}
    38  		if response.Error != "" {
    39  			return errors.New(response.Error)
    40  		}
    41  		if response.ProgressMessage != "" {
    42  			logger.Debugln(0, response.ProgressMessage)
    43  		}
    44  		if response.Final {
    45  			*reply = response
    46  			return nil
    47  		}
    48  	}
    49  }
    50  
    51  func patchVmImage(vmHostname string, logger log.DebugLogger) error {
    52  	if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil {
    53  		return err
    54  	} else {
    55  		return patchVmImageOnHypervisor(hypervisor, vmIP, logger)
    56  	}
    57  }
    58  
    59  func patchVmImageOnHypervisor(hypervisor string, ipAddr net.IP,
    60  	logger log.DebugLogger) error {
    61  	request := proto.PatchVmImageRequest{
    62  		ImageName:    *imageName,
    63  		ImageTimeout: *imageTimeout,
    64  		IpAddress:    ipAddr,
    65  	}
    66  	client, err := dialHypervisor(hypervisor)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	defer client.Close()
    71  	var reply proto.PatchVmImageResponse
    72  	err = callPatchVmImage(client, request, &reply, logger)
    73  	if err != nil {
    74  		return err
    75  	}
    76  	return nil
    77  }