// ForceRead reads configuration from given file name or bails out if it fails func ForceRead(file_name string) *Configuration { _, err := read(file_name) if err != nil { log.Fatal("Cannot read config file:", file_name, err) } return Config }
// read reads configuration from given file, or silently skips if the file does not exist. // If the file does exist, then it is expected to be in valid JSON format or the function bails out. func read(file_name string) (*Configuration, error) { file, err := os.Open(file_name) if err == nil { decoder := json.NewDecoder(file) err := decoder.Decode(Config) if err == nil { log.Infof("Read config: %s", file_name) } else { log.Fatal("Cannot read config file:", file_name, err) } } return Config, err }
// Cli initiates a command line interface, executing requested command. func Cli(command string, instance string, sibling string, owner string, reason string) { instanceKey, err := inst.ParseInstanceKey(instance) if err != nil { instanceKey = nil } siblingKey, err := inst.ParseInstanceKey(sibling) if err != nil { siblingKey = nil } if len(owner) == 0 { // get os username as owner usr, err := user.Current() if err != nil { log.Fatale(err) } owner = usr.Username } if len(command) == 0 { log.Fatal("expected command (-c) (discover|forget|continuous|move-up|move-below|begin-maintenance|end-maintenance|clusters|topology|resolve)") } switch command { case "move-up": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } _, err := inst.MoveUp(instanceKey) if err != nil { log.Errore(err) } } case "move-below": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } if siblingKey == nil { log.Fatal("Cannot deduce sibling:", sibling) } _, err := inst.MoveBelow(instanceKey, siblingKey) if err != nil { log.Errore(err) } } case "discover": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } orchestrator.StartDiscovery(*instanceKey) } case "forget": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } inst.ForgetInstance(instanceKey) } case "begin-maintenance": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } if owner == "" { log.Fatal("--owner option required") } if reason == "" { log.Fatal("--reason option required") } maintenanceKey, err := inst.BeginMaintenance(instanceKey, owner, reason) if err == nil { log.Infof("Maintenance key: %+v", maintenanceKey) } if err != nil { log.Errore(err) } } case "end-maintenance": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } err := inst.EndMaintenanceByInstanceKey(instanceKey) if err != nil { log.Errore(err) } } case "clusters": { clusters, err := inst.ReadClusters() if err != nil { log.Errore(err) } else { fmt.Println(strings.Join(clusters, "\n")) } } case "topology": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } output, err := inst.AsciiTopology(instance) if err != nil { log.Errore(err) } else { fmt.Println(output) } } case "continuous": { orchestrator.ContinuousDiscovery() } case "resolve": { if instanceKey == nil { log.Fatal("Cannot deduce instance:", instance) } if conn, err := net.Dial("tcp", instanceKey.DisplayString()); err == nil { conn.Close() } else { log.Fatale(err) } fmt.Println(instanceKey.DisplayString()) } default: log.Fatal("Unknown command:", command) } }