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 }