From 28cdaa515f25c92e5f8fcd4a6d06fc8addbf49a9 Mon Sep 17 00:00:00 2001 From: Lawrence Wong Date: Fri, 19 Aug 2022 11:03:07 -0700 Subject: [PATCH] API to get master nodes for mesos and aurora --- cmd/fetch.go | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/cmd/fetch.go b/cmd/fetch.go index 242a629..a901ebc 100644 --- a/cmd/fetch.go +++ b/cmd/fetch.go @@ -97,6 +97,38 @@ func init() { help(cmd, s) }) + /* Fetch Master nodes/Leader */ + masterCmd.Flags().String("zkPath", "/aurora/scheduler", "Zookeeper node path to get master nodes/leaders") + + fetchCmd.AddCommand(masterCmd) + + // Hijack help function to hide unnecessary global flags + masterCmd.SetHelpFunc(func(cmd *cobra.Command, s []string) { + if cmd.HasInheritedFlags() { + cmd.InheritedFlags().VisitAll(func(f *pflag.Flag) { + if f.Name != "logLevel" { + f.Hidden = true + } + }) + } + help(cmd, s) + }) + + mesosMasterCmd.Flags().String("zkPath", "/mesos", "Zookeeper node path to get mesos master nodes/leaders") + mesosCmd.AddCommand(mesosMasterCmd) + + // Hijack help function to hide unnecessary global flags + mesosMasterCmd.SetHelpFunc(func(cmd *cobra.Command, s []string) { + if cmd.HasInheritedFlags() { + cmd.InheritedFlags().VisitAll(func(f *pflag.Flag) { + if f.Name != "logLevel" { + f.Hidden = true + } + }) + } + help(cmd, s) + }) + // Fetch jobs fetchJobsCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") fetchCmd.AddCommand(fetchJobsCmd) @@ -180,6 +212,18 @@ Pass Zookeeper nodes separated by a space as an argument to this command.`, Run: fetchLeader, } +var masterCmd = &cobra.Command{ + Use: "master [zkNode0 zkNode1 ...zkNodeN]", + PersistentPreRun: func(cmd *cobra.Command, args []string) {}, // We don't need a realis client for this cmd + PersistentPostRun: func(cmd *cobra.Command, args []string) {}, // We don't need a realis client for this cmd + PreRun: setConfig, + Args: cobra.MinimumNArgs(1), + Short: "Fetch current Aurora master nodes/leader given Zookeeper nodes. ", + Long: `Gets the current aurora master nodes/leader using information from Zookeeper path. +Pass Zookeeper nodes separated by a space as an argument to this command.`, + Run: fetchMaster, +} + var mesosCmd = &cobra.Command{ Use: "mesos", PreRun: setConfig, @@ -198,6 +242,18 @@ it fetches leader from local Mesos agent or Zookeeper`, Run: fetchMesosLeader, } +var mesosMasterCmd = &cobra.Command{ + Use: "master [zkNode0 zkNode1 ...zkNodeN]", + PersistentPreRun: func(cmd *cobra.Command, args []string) {}, // We don't need a realis client for this cmd + PersistentPostRun: func(cmd *cobra.Command, args []string) {}, // We don't need a realis client for this cmd + PreRun: setConfig, + Short: "Fetch current Mesos-master nodes/leader given Zookeeper nodes.", + Long: `Gets the current Mesos-master instances using information from Zookeeper path. +Pass Zookeeper nodes separated by a space as an argument to this command. If no nodes are provided, +it fetches Mesos-master nodes/leader from local Mesos agent or Zookeeper`, + Run: fetchMesosMaster, +} + var fetchJobsCmd = &cobra.Command{ Use: "jobs", Short: "Fetch a list of task Aurora running under a role.", @@ -356,6 +412,57 @@ func fetchMesosLeader(cmd *cobra.Command, args []string) { fmt.Println(url) } +func fetchMaster(cmd *cobra.Command, args []string) { + log.Infof("Fetching master nodes from %v \n", args) + + if len(args) < 1 { + log.Fatalln("At least one Zookeeper node address must be passed in.") + } + + masterMap, err := realis.MasterNodesFromZKOpts(realis.ZKEndpoints(args...), realis.ZKPath(cmd.Flag("zkPath").Value.String())) + + if err != nil { + log.Fatalf("error: %+v\n", err) + } + + if toJson { + fmt.Println(internal.ToJSON(masterMap)) + } else { + for key, mesosMasterNodes := range masterMap { + fmt.Println(key + "=" + mesosMasterNodes) + } + } +} + +func fetchMesosMaster(cmd *cobra.Command, args []string) { + if len(args) < 1 { + mesosAgentFlags, err := fetchMasterFromAgent(localAgentStateURL) + if err != nil || mesosAgentFlags.Master == "" { + log.Debugf("unable to fetch Mesos master nodes via local Mesos agent: %v", err) + args = append(args, "localhost") + } else if mesosAgentFlags.hasMaster { + fmt.Println(mesosAgentFlags.Master) + return + } else { + args = append(args, strings.Split(mesosAgentFlags.Master, ",")...) + } + } + log.Infof("Fetching Mesos-master nodes from Zookeeper node(s): %v \n", args) + + mesosMasterMap, err := realis.MesosMasterNodesFromZKOpts(realis.ZKEndpoints(args...), realis.ZKPath(cmd.Flag("zkPath").Value.String())) + + if err != nil { + log.Fatalf("error: %+v\n", err) + } + if toJson { + fmt.Println(internal.ToJSON(mesosMasterMap)) + } else { + for key, mesosMasterNodes := range mesosMasterMap { + fmt.Println(key + "=" + mesosMasterNodes) + } + } +} + func fetchMasterFromAgent(url string) (mesosAgentFlags mesosAgentFlags, err error) { resp, err := http.Get(url) if err != nil {