From 0a3288a1dd38645a814c6d14e89808b5d61bc03b Mon Sep 17 00:00:00 2001 From: Renan DelValle Date: Sun, 16 Sep 2018 21:23:36 -0700 Subject: [PATCH] Changing role, env, and name to be string pointers. This is due to the fact that TaskQuery can now take nil pointers to ignore certain fields. This allows querying for all jobs of a certain environment, all jobs from a certain role, and all jobs with a certain name. --- cmd/create.go | 6 +++--- cmd/fetch.go | 31 ++++++++++++++++++++---------- cmd/kill.go | 52 ++++++++++++++++++++++++++++++++++++++++----------- cmd/root.go | 4 +--- cmd/stop.go | 38 +++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 27 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 9ebdfcd..2476f47 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -8,9 +8,9 @@ import ( func init() { rootCmd.AddCommand(createCmd) - createCmd.Flags().StringVarP(&env, "environment", "e", "", "Aurora Environment") - createCmd.Flags().StringVarP(&role, "role", "r", "", "Aurora Role") - createCmd.Flags().StringVarP(&name, "name", "n", "", "Aurora Name") + createCmd.Flags().StringVarP(env, "environment", "e", "", "Aurora Environment") + createCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") + createCmd.Flags().StringVarP(name, "name", "n", "", "Aurora Name") createCmd.MarkFlagRequired("environment") createCmd.MarkFlagRequired("role") createCmd.MarkFlagRequired("name") diff --git a/cmd/fetch.go b/cmd/fetch.go index 8cf6ba7..c9c87ac 100644 --- a/cmd/fetch.go +++ b/cmd/fetch.go @@ -16,16 +16,16 @@ func init() { // Fetch Task Config fetchCmd.AddCommand(taskConfigCmd) - taskConfigCmd.Flags().StringVarP(&env, "environment", "e", "", "Aurora Environment") - taskConfigCmd.Flags().StringVarP(&role, "role", "r", "", "Aurora Role") - taskConfigCmd.Flags().StringVarP(&name, "name", "n", "", "Aurora Name") + taskConfigCmd.Flags().StringVarP(env, "environment", "e", "", "Aurora Environment") + taskConfigCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") + taskConfigCmd.Flags().StringVarP(name, "name", "n", "", "Aurora Name") // Fetch Leader fetchCmd.AddCommand(leaderCmd) // Fetch jobs fetchCmd.AddCommand(fetchJobsCmd) - fetchJobsCmd.Flags().StringVarP(&role, "role", "r", "", "Aurora Role") + fetchJobsCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") } var fetchCmd = &cobra.Command{ @@ -59,6 +59,17 @@ var fetchJobsCmd = &cobra.Command{ func fetchTasks(cmd *cobra.Command, args []string) { fmt.Printf("Fetching job configuration for [%s/%s/%s] \n", env, role, name) + // Task Query takes nil for values it shouldn't need to match against. + // This allows us to potentially more expensive calls for specific environments, roles, or job names. + if *env == "" { + env = nil + } + if *role == "" { + role = nil + } + if *role == "" { + role = nil + } //TODO: Add filtering down by status taskQuery := &aurora.TaskQuery{Environment: env, Role: role, JobName: name} @@ -93,22 +104,22 @@ func fetchLeader(cmd *cobra.Command, args []string) { // TODO: Expand this to be able to filter by job name and environment. func fetchJobs(cmd *cobra.Command, args []string) { - fmt.Printf("Fetching tasks under role: %s \n", role) + fmt.Printf("Fetching tasks under role: %s \n", *role) - if role == "" { + if *role == "" { fmt.Println("Role must be specified.") os.Exit(1) } - if role == "*" { + if *role == "*" { fmt.Println("Warning: This is an expensive operation.") - role = "" + *role = "" } - _, result, err := client.GetJobs(role) + _, result, err := client.GetJobs(*role) if err != nil { - fmt.Print("error: %+v\n", err.Error()) + fmt.Printf("error: %+v\n", err.Error()) os.Exit(1) } diff --git a/cmd/kill.go b/cmd/kill.go index 971c3a0..07eb5cb 100644 --- a/cmd/kill.go +++ b/cmd/kill.go @@ -5,34 +5,59 @@ import ( "log" "os" - realis "github.com/paypal/gorealis" + "github.com/paypal/gorealis" "github.com/paypal/gorealis/gen-go/apache/aurora" "github.com/spf13/cobra" ) func init() { rootCmd.AddCommand(killCmd) - killCmd.Flags().StringVarP(&env, "environment", "e", "", "Aurora Environment") - killCmd.Flags().StringVarP(&role, "role", "r", "", "Aurora Role") - killCmd.Flags().StringVarP(&name, "name", "n", "", "Aurora Name") - killCmd.MarkFlagRequired("environment") - killCmd.MarkFlagRequired("role") - killCmd.MarkFlagRequired("name") + + + /* Sub-Commands */ + + + // Kill Job + killCmd.AddCommand(killJobCmd) + + killJobCmd.Flags().StringVarP(env, "environment", "e", "", "Aurora Environment") + killJobCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") + killJobCmd.Flags().StringVarP(name, "name", "n", "", "Aurora Name") + killJobCmd.MarkFlagRequired("environment") + killJobCmd.MarkFlagRequired("role") + killJobCmd.MarkFlagRequired("name") + + // Kill every task in the Aurora cluster + killCmd.AddCommand(killEntireClusterCmd) + + } var killCmd = &cobra.Command{ Use: "kill", Short: "Kill an Aurora Job", +} + +var killJobCmd = &cobra.Command{ + Use: "job", + Short: "Kill an Aurora Job", Run: killJob, } +var killEntireClusterCmd = &cobra.Command{ + Use: "entire-cluster", + Short: "Kill every task in the cluster.", + Long: `To be written.`, + Run: killEntireCluster, +} + func killJob(cmd *cobra.Command, args []string) { - log.Printf("Killing job [Env:%s Role:%s Name:%s]\n", env, role, name) + log.Printf("Killing job [Env:%s Role:%s Name:%s]\n", *env, *role, *name) job := realis.NewJob(). - Environment(env). - Role(role). - Name(name) + Environment(*env). + Role(*role). + Name(*name) resp, err := client.KillJob(job.JobKey()) if err != nil { fmt.Println(err) @@ -47,3 +72,8 @@ func killJob(cmd *cobra.Command, args []string) { } fmt.Println(resp.String()) } + +func killEntireCluster(cmd *cobra.Command, args []string) { + log.Println("This command will kill every single task inside of a cluster.") + log.Println("Not implemented yet.") +} diff --git a/cmd/root.go b/cmd/root.go index 21c1d44..8f5f300 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -21,7 +21,7 @@ var rootCmd = &cobra.Command{ } var username, password, zkAddr, schedAddr string -var env, role, name string +var env, role, name *string var client realis.Realis var monitor *realis.Monitor var insecureSkipVerify bool @@ -66,8 +66,6 @@ func connect(cmd *cobra.Command, args []string) { zkOptions := []realis.ZKOpt{ realis.ZKEndpoints(zkAddr), realis.ZKPath("/aurora/scheduler")} if clientKey != "" || clientCert != "" || caCertsPath != "" { - zkOptions = append(zkOptions, realis.ZKAuroraPortOverride(8081), realis.ZKAuroraSchemeOverride("https")) - realisOptions = append(realisOptions, realis.Certspath(caCertsPath), realis.ClientCerts(clientKey, clientCert)) } diff --git a/cmd/stop.go b/cmd/stop.go index 15df42d..71903c3 100644 --- a/cmd/stop.go +++ b/cmd/stop.go @@ -15,6 +15,14 @@ func init() { stopCmd.AddCommand(stopMaintCmd) stopMaintCmd.Flags().IntVar(&monitorInterval,"interval", 5, "Interval at which to poll scheduler.") stopMaintCmd.Flags().IntVar(&monitorTimeout,"timeout", 50, "Time after which the monitor will stop polling and throw an error.") + + // Stop update + + stopCmd.AddCommand(stopUpdateCmd) + stopUpdateCmd.Flags().StringVarP(env, "environment", "e", "", "Aurora Environment") + stopUpdateCmd.Flags().StringVarP(role, "role", "r", "", "Aurora Role") + stopUpdateCmd.Flags().StringVarP(name, "name", "n", "", "Aurora Name") + } var stopCmd = &cobra.Command{ @@ -29,6 +37,13 @@ var stopMaintCmd = &cobra.Command{ Run: endMaintenance, } +var stopUpdateCmd = &cobra.Command{ + Use: "update [update ID]", + Short: "Stop update", + Long: `To be written.`, + Run: stopUpdate, +} + func endMaintenance(cmd *cobra.Command, args []string) { fmt.Println("Setting hosts to NONE maintenance status.") fmt.Println(args) @@ -57,3 +72,26 @@ func endMaintenance(cmd *cobra.Command, args []string) { fmt.Println(result.String()) } + +func stopUpdate(cmd *cobra.Command, args []string) { + + if len(args) != 1 { + fmt.Println("Only a single update ID must be provided.") + os.Exit(1) + } + + fmt.Printf("Stopping (aborting) update [%s/%s/%s] %s\n", *env, *role, *name, args[0]) + + resp, err := client.AbortJobUpdate(aurora.JobUpdateKey{ + Job: &aurora.JobKey{Environment: *env, Role: *role, Name: *name}, + ID: args[0], + }, + "") + + if err != nil { + fmt.Println(err) + os.Exit(1) + } + fmt.Println(resp.String()) + +}