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()) + +}