github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/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); 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 fm_proto.GetMachineInfoResponse, error) { 37 if *fleetManagerHostname != "" { 38 return getInfoForMachineFromFleetManager(fmCR, hostname) 39 } 40 if info, err := getInfoForMachineFromTopology(hostname); err != nil { 41 return fm_proto.GetMachineInfoResponse{}, err 42 } else { 43 return *info, nil 44 } 45 } 46 47 func getInfoForMachineFromFleetManager(fmCR *srpc.ClientResource, 48 hostname string) (fm_proto.GetMachineInfoResponse, error) { 49 request := fm_proto.GetMachineInfoRequest{Hostname: hostname} 50 var reply fm_proto.GetMachineInfoResponse 51 client, err := fmCR.GetHTTP(nil, 0) 52 if err != nil { 53 return fm_proto.GetMachineInfoResponse{}, err 54 } 55 defer client.Put() 56 err = client.RequestReply("FleetManager.GetMachineInfo", request, &reply) 57 if err != nil { 58 return fm_proto.GetMachineInfoResponse{}, err 59 } 60 if err := errors.New(reply.Error); err != nil { 61 return fm_proto.GetMachineInfoResponse{}, err 62 } 63 return reply, nil 64 } 65 66 func getInfoForMachineFromTopology(hostname string) ( 67 *fm_proto.GetMachineInfoResponse, error) { 68 if *topologyDir == "" { 69 return nil, errors.New("no topologyDir specified") 70 } 71 topo, err := topology.Load(*topologyDir) 72 if err != nil { 73 return nil, err 74 } 75 machines, err := topo.ListMachines("") 76 if err != nil { 77 return nil, err 78 } 79 var machinePtr *fm_proto.Machine 80 for _, machine := range machines { 81 if machine.Hostname == hostname { 82 machinePtr = machine 83 break 84 } 85 } 86 if machinePtr == nil { 87 return nil, 88 fmt.Errorf("machine: %s not found in topology", hostname) 89 } 90 subnets, err := topo.GetSubnetsForMachine(hostname) 91 if err != nil { 92 return nil, err 93 } 94 info := fm_proto.GetMachineInfoResponse{Machine: *machinePtr} 95 info.Subnets = make([]*hyper_proto.Subnet, 0, len(subnets)) 96 for _, subnet := range subnets { 97 info.Subnets = append(info.Subnets, &subnet.Subnet) 98 } 99 return &info, nil 100 }