2019-03-25 17:33:21 -07:00
/ * *
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2017-12-02 15:08:43 -08:00
package cmd
import (
2022-08-18 22:57:57 +05:30
"strconv"
"strings"
2020-02-19 12:18:50 -08:00
realis "github.com/aurora-scheduler/gorealis/v2"
2017-12-02 15:08:43 -08:00
"github.com/spf13/cobra"
2017-12-02 15:52:56 -08:00
)
2017-12-02 15:08:43 -08:00
func init ( ) {
rootCmd . AddCommand ( killCmd )
2018-09-16 21:23:36 -07:00
/* Sub-Commands */
// Kill Job
killCmd . AddCommand ( killJobCmd )
2022-08-18 22:57:57 +05:30
killCmd . AddCommand ( killTasksCmd )
2018-09-16 21:23:36 -07:00
killJobCmd . Flags ( ) . StringVarP ( env , "environment" , "e" , "" , "Aurora Environment" )
killJobCmd . Flags ( ) . StringVarP ( role , "role" , "r" , "" , "Aurora Role" )
killJobCmd . Flags ( ) . StringVarP ( name , "name" , "n" , "" , "Aurora Name" )
2020-09-30 16:46:14 -07:00
killJobCmd . Flags ( ) . BoolVarP ( & monitor , "monitor" , "m" , true , "monitor the result after sending the command" )
2018-09-16 21:23:36 -07:00
killJobCmd . MarkFlagRequired ( "environment" )
killJobCmd . MarkFlagRequired ( "role" )
killJobCmd . MarkFlagRequired ( "name" )
2022-08-18 22:57:57 +05:30
//Set flags for killTask sub-command
killTasksCmd . Flags ( ) . StringVarP ( env , "environment" , "e" , "" , "Aurora Environment" )
killTasksCmd . Flags ( ) . StringVarP ( role , "role" , "r" , "" , "Aurora Role" )
killTasksCmd . Flags ( ) . StringVarP ( name , "name" , "n" , "" , "Aurora Name" )
killTasksCmd . Flags ( ) . StringVarP ( instances , "instances" , "i" , "" , "Instances e.g. 1, 2, 5" )
killTasksCmd . Flags ( ) . BoolVarP ( & monitor , "monitor" , "m" , true , "monitor the result after sending the command" )
killTasksCmd . MarkFlagRequired ( "environment" )
killTasksCmd . MarkFlagRequired ( "role" )
killTasksCmd . MarkFlagRequired ( "name" )
killTasksCmd . MarkFlagRequired ( "instance" )
2017-12-02 15:52:56 -08:00
}
2017-12-02 15:08:43 -08:00
var killCmd = & cobra . Command {
Use : "kill" ,
2017-12-03 12:41:23 -08:00
Short : "Kill an Aurora Job" ,
2018-09-16 21:23:36 -07:00
}
var killJobCmd = & cobra . Command {
Use : "job" ,
Short : "Kill an Aurora Job" ,
2017-12-03 12:41:23 -08:00
Run : killJob ,
}
2022-08-18 22:57:57 +05:30
/ *
* The killTasks command allows the user to kill a specific task of a job .
* The command also allows the user to kill multiple tasks of the same job . To do so the user needs to pass a list of instance numbers as comma separated values .
* Pass the instance number of the job to be killed after the -- instances or - i flag
* Please note that all the instances passed must belong to the same job .
*
* example : australis kill tasks - e "environment" - r "role" - n "job_name" - i "1"
* The above example kills instance number 1.
*
* example 2 : australis kill tasks - e "environment" - r "role" - n "job_name" - i "1, 5, 9"
* The above example kills tasks 1 , 5 and 9 , which are part of the same job
* /
var killTasksCmd = & cobra . Command {
Use : "tasks" ,
Short : "Kill Aurora Tasks" ,
Run : killTasks ,
}
2017-12-03 12:41:23 -08:00
func killJob ( cmd * cobra . Command , args [ ] string ) {
2018-11-09 15:58:26 -08:00
log . Infof ( "Killing job [Env:%s Role:%s Name:%s]\n" , * env , * role , * name )
2017-12-03 12:41:23 -08:00
job := realis . NewJob ( ) .
2018-09-16 21:23:36 -07:00
Environment ( * env ) .
Role ( * role ) .
Name ( * name )
2018-12-27 11:31:51 -08:00
err := client . KillJob ( job . JobKey ( ) )
2017-12-03 12:41:23 -08:00
if err != nil {
2018-11-09 15:58:26 -08:00
log . Fatalln ( err )
2017-12-03 12:41:23 -08:00
}
2020-09-30 16:32:53 -07:00
if monitor {
if ok , err := client . MonitorInstances ( job . JobKey ( ) , 0 , 5 , 50 ) ; ! ok || err != nil {
log . Fatalln ( "Unable to kill all instances of job" )
}
2018-11-09 15:58:26 -08:00
}
2017-12-02 15:52:56 -08:00
}
2022-08-18 22:57:57 +05:30
func killTasks ( cmd * cobra . Command , args [ ] string ) {
log . Infof ( "Killing task [Env:%s Role:%s Name:%s Instance:%s]\n" , * env , * role , * name , * instances )
//Set jobKey for the tasks to be killed.
task := realis . NewTask ( ) .
Environment ( * env ) .
Role ( * role ) .
Name ( * name )
//Check that instance number is passed
if instances == nil {
log . Fatalln ( "Instance number not found. Please pass a valid instance number. If you want to pass multiple instances, please pass them as comma separated integer values" )
}
/ *
* In the following block , we convert instance numbers , which were passed as strings , to integer values
* After converting them to integers , we add them to a slice of type int32 .
* /
splitString := strings . Split ( * instances , "," )
instanceList := make ( [ ] int32 , len ( splitString ) )
for i := range instanceList {
splitString [ i ] = strings . TrimSpace ( splitString [ i ] )
instanceNumber , intErr := strconv . Atoi ( splitString [ i ] )
if intErr != nil {
log . Fatalln ( "Instance passed should be a number. Error: " + intErr . Error ( ) )
return
} else {
instanceList [ i ] = int32 ( instanceNumber )
}
}
//Call the killtasks function, passing the instanceList as the list of instances to be killed.
if _ , err := client . KillInstances ( task . JobKey ( ) , instanceList ... ) ; err != nil {
log . Fatalln ( err )
}
if monitor {
if ok , err := client . MonitorInstances ( task . JobKey ( ) , 0 , 5 , 50 ) ; ! ok || err != nil {
log . Fatalln ( "Unable to kill the given task" )
}
}
}