github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/hyper-control/getMachineInfo.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/Cloud-Foundations/Dominator/fleetmanager/topology"
     8  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     9  	"github.com/Cloud-Foundations/Dominator/lib/json"
    10  	"github.com/Cloud-Foundations/Dominator/lib/log"
    11  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    12  	fm_proto "github.com/Cloud-Foundations/Dominator/proto/fleetmanager"
    13  	hyper_proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor"
    14  )
    15  
    16  func getMachineInfoSubcommand(args []string, logger log.DebugLogger) error {
    17  	err := getMachineInfo(args[0], logger)
    18  	if err != nil {
    19  		return fmt.Errorf("error getting machine info: %s", err)
    20  	}
    21  	return nil
    22  }
    23  
    24  func getMachineInfo(hostname string, logger log.DebugLogger) error {
    25  	fmCR := srpc.NewClientResource("tcp",
    26  		fmt.Sprintf("%s:%d", *fleetManagerHostname, *fleetManagerPortNum))
    27  	defer fmCR.ScheduleClose()
    28  	if info, err := getInfoForMachine(fmCR, hostname, logger); err != nil {
    29  		return err
    30  	} else {
    31  		return json.WriteWithIndent(os.Stdout, "    ", info)
    32  	}
    33  }
    34  
    35  func getInfoForMachine(fmCR *srpc.ClientResource, hostname string,
    36  	logger log.DebugLogger) (
    37  	fm_proto.GetMachineInfoResponse, error) {
    38  	if *fleetManagerHostname != "" {
    39  		return getInfoForMachineFromFleetManager(fmCR, hostname)
    40  	}
    41  	info, err := getInfoForMachineFromTopology(hostname, logger)
    42  	if err != nil {
    43  		return fm_proto.GetMachineInfoResponse{}, err
    44  	} else {
    45  		return *info, nil
    46  	}
    47  }
    48  
    49  func getInfoForMachineFromFleetManager(fmCR *srpc.ClientResource,
    50  	hostname string) (fm_proto.GetMachineInfoResponse, error) {
    51  	request := fm_proto.GetMachineInfoRequest{
    52  		Hostname:               hostname,
    53  		IgnoreMissingLocalTags: *ignoreMissingLocalTags,
    54  	}
    55  	var reply fm_proto.GetMachineInfoResponse
    56  	client, err := fmCR.GetHTTP(nil, 0)
    57  	if err != nil {
    58  		return fm_proto.GetMachineInfoResponse{}, err
    59  	}
    60  	defer client.Put()
    61  	err = client.RequestReply("FleetManager.GetMachineInfo", request, &reply)
    62  	if err != nil {
    63  		return fm_proto.GetMachineInfoResponse{}, err
    64  	}
    65  	if err := errors.New(reply.Error); err != nil {
    66  		return fm_proto.GetMachineInfoResponse{}, err
    67  	}
    68  	return reply, nil
    69  }
    70  
    71  func getInfoForMachineFromTopology(hostname string, logger log.DebugLogger) (
    72  	*fm_proto.GetMachineInfoResponse, error) {
    73  	if *topologyDir == "" {
    74  		return nil, errors.New("no topologyDir specified")
    75  	}
    76  	topo, err := topology.LoadWithParams(topology.Params{
    77  		Logger:      logger,
    78  		TopologyDir: *topologyDir,
    79  	})
    80  	if err != nil {
    81  		return nil, err
    82  	}
    83  	machines, err := topo.ListMachines("")
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  	var machinePtr *fm_proto.Machine
    88  	for _, machine := range machines {
    89  		if machine.Hostname == hostname {
    90  			machinePtr = machine
    91  			break
    92  		}
    93  	}
    94  	if machinePtr == nil {
    95  		return nil,
    96  			fmt.Errorf("machine: %s not found in topology", hostname)
    97  	}
    98  	subnets, err := topo.GetSubnetsForMachine(hostname)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  	info := fm_proto.GetMachineInfoResponse{Machine: *machinePtr}
   103  	info.Subnets = make([]*hyper_proto.Subnet, 0, len(subnets))
   104  	for _, subnet := range subnets {
   105  		info.Subnets = append(info.Subnets, &subnet.Subnet)
   106  	}
   107  	return &info, nil
   108  }