diff --git a/pkg/scheduler/plugins/extender/argument.go b/pkg/scheduler/plugins/extender/argument.go index 804d4e7208..123cd18920 100644 --- a/pkg/scheduler/plugins/extender/argument.go +++ b/pkg/scheduler/plugins/extender/argument.go @@ -62,3 +62,11 @@ type QueueOverusedRequest struct { type QueueOverusedResponse struct { Overused bool `json:"overused"` } + +type JobReadyRequest struct { + Job *api.JobInfo `json:"job"` +} + +type JobReadyResponse struct { + Status bool `json:"status"` +} diff --git a/pkg/scheduler/plugins/extender/extender.go b/pkg/scheduler/plugins/extender/extender.go index 561e212e22..2b57b1131b 100644 --- a/pkg/scheduler/plugins/extender/extender.go +++ b/pkg/scheduler/plugins/extender/extender.go @@ -54,6 +54,8 @@ const ( ExtenderQueueOverusedVerb = "extender.queueOverusedVerb" // ExtenderJobEnqueueableVerb is the verb of JobEnqueueable method ExtenderJobEnqueueableVerb = "extender.jobEnqueueableVerb" + // ExtenderJobReadyVerb is the verb of JobReady method + ExtenderJobReadyVerb = "extender.jobReadyVerb" // ExtenderIgnorable indicates whether the extender can ignore unexpected errors ExtenderIgnorable = "extender.ignorable" ) @@ -69,6 +71,7 @@ type extenderConfig struct { reclaimableVerb string queueOverusedVerb string jobEnqueueableVerb string + jobReadyVerb string ignorable bool } @@ -114,6 +117,7 @@ func parseExtenderConfig(arguments framework.Arguments) *extenderConfig { ec.reclaimableVerb, _ = arguments[ExtenderReclaimableVerb].(string) ec.queueOverusedVerb, _ = arguments[ExtenderQueueOverusedVerb].(string) ec.jobEnqueueableVerb, _ = arguments[ExtenderJobEnqueueableVerb].(string) + ec.jobReadyVerb, _ = arguments[ExtenderJobReadyVerb].(string) arguments.GetBool(&ec.ignorable, ExtenderIgnorable) @@ -260,6 +264,21 @@ func (ep *extenderPlugin) OnSessionOpen(ssn *framework.Session) { return resp.Overused }) } + + if ep.config.jobReadyVerb != "" { + ssn.AddJobReadyFn(ep.Name(), func(obj interface{}) bool { + job := obj.(*api.JobInfo) + resp := &JobReadyResponse{} + err := ep.send(ep.config.jobReadyVerb, &JobReadyRequest{Job: job}, resp) + if err != nil { + klog.Warningf("JobReady failed with error %v", err) + + return !ep.config.ignorable + } + + return resp.Status + }) + } } func (ep *extenderPlugin) OnSessionClose(ssn *framework.Session) {