Skip to content

Commit

Permalink
Merge pull request volcano-sh#17 from asifdxtreme/master
Browse files Browse the repository at this point in the history
[Cherry-Pick} Added Configuration to enable/disable predicates
  • Loading branch information
volcano-sh-bot committed May 20, 2019
2 parents 2b508f0 + bdc7d55 commit 75c5683
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 30 deletions.
20 changes: 20 additions & 0 deletions pkg/scheduler/framework/arguments.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,23 @@ func (a Arguments) GetInt(ptr *int, key string) {

*ptr = value
}

//GetBool get the bool value from string
func (a Arguments) GetBool(ptr *bool, key string) {
if ptr == nil {
return
}

argv, ok := a[key]
if !ok || argv == "" {
return
}

value, err := strconv.ParseBool(argv)
if err != nil {
glog.Warningf("Could not parse argument: %s for key %s, with err %v", argv, key, err)
return
}

*ptr = value
}
124 changes: 94 additions & 30 deletions pkg/scheduler/plugins/predicates/predicates.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ import (
"github.com/kubernetes-sigs/kube-batch/pkg/scheduler/plugins/util"
)

const (
// MemoryPressurePredicate is the key for enabling Memory Pressure Predicate in YAML
MemoryPressurePredicate = "predicate.MemoryPressureEnable"
// DiskPressurePredicate is the key for enabling Disk Pressure Predicate in YAML
DiskPressurePredicate = "predicate.DiskPressureEnable"
// PIDPressurePredicate is the key for enabling PID Pressure Predicate in YAML
PIDPressurePredicate = "predicate.PIDPressureEnable"
)

type predicatesPlugin struct {
// Arguments given for the plugin
pluginArguments framework.Arguments
Expand All @@ -54,6 +63,53 @@ func formatReason(reasons []algorithm.PredicateFailureReason) string {
return strings.Join(reasonStrings, ", ")
}

type predicateEnable struct {
memoryPressureEnable bool
diskPressureEnable bool
pidPressureEnable bool
}

func enablePredicate(args framework.Arguments) predicateEnable {

/*
User Should give predicatesEnable in this format(predicate.MemoryPressureEnable, predicate.DiskPressureEnable, predicate.PIDPressureEnable.
Currently supported only for MemoryPressure, DiskPressure, PIDPressure predicate checks.
actions: "reclaim, allocate, backfill, preempt"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: predicates
arguments:
predicate.MemoryPressureEnable: true
predicate.DiskPressureEnable: true
predicate.PIDPressureEnable: true
- name: proportion
- name: nodeorder
*/

predicate := predicateEnable{
memoryPressureEnable: false,
diskPressureEnable: false,
pidPressureEnable: false,
}

// Checks whether predicate.MemoryPressureEnable is provided or not, if given, modifies the value in predicateEnable struct.
args.GetBool(&predicate.memoryPressureEnable, MemoryPressurePredicate)

// Checks whether predicate.DiskPressureEnable is provided or not, if given, modifies the value in predicateEnable struct.
args.GetBool(&predicate.diskPressureEnable, DiskPressurePredicate)

// Checks whether predicate.PIDPressureEnable is provided or not, if given, modifies the value in predicateEnable struct.
args.GetBool(&predicate.pidPressureEnable, PIDPressurePredicate)

return predicate
}

func (pp *predicatesPlugin) OnSessionOpen(ssn *framework.Session) {
pl := &util.PodLister{
Session: ssn,
Expand All @@ -63,6 +119,8 @@ func (pp *predicatesPlugin) OnSessionOpen(ssn *framework.Session) {
Session: ssn,
}

predicate := enablePredicate(pp.pluginArguments)

ssn.AddPredicateFn(pp.Name(), func(task *api.TaskInfo, node *api.NodeInfo) error {
nodeInfo := cache.NewNodeInfo(node.Pods()...)
nodeInfo.SetNode(node.Node)
Expand Down Expand Up @@ -141,46 +199,52 @@ func (pp *predicatesPlugin) OnSessionOpen(ssn *framework.Session) {
task.Namespace, task.Name, node.Name)
}

// CheckNodeMemoryPressurePredicate
fit, _, err = predicates.CheckNodeMemoryPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}
if predicate.memoryPressureEnable {
// CheckNodeMemoryPressurePredicate
fit, _, err = predicates.CheckNodeMemoryPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}

glog.V(4).Infof("CheckNodeMemoryPressure predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)
glog.V(4).Infof("CheckNodeMemoryPressure predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)

if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to Memory Pressure",
node.Name, task.Namespace, task.Name)
if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to Memory Pressure",
node.Name, task.Namespace, task.Name)
}
}

// CheckNodeDiskPressurePredicate
fit, _, err = predicates.CheckNodeDiskPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}
if predicate.diskPressureEnable {
// CheckNodeDiskPressurePredicate
fit, _, err = predicates.CheckNodeDiskPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}

glog.V(4).Infof("CheckNodeDiskPressure predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)
glog.V(4).Infof("CheckNodeDiskPressure predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)

if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to Disk Pressure",
node.Name, task.Namespace, task.Name)
if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to Disk Pressure",
node.Name, task.Namespace, task.Name)
}
}

// CheckNodePIDPressurePredicate
fit, _, err = predicates.CheckNodePIDPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}
if predicate.pidPressureEnable {
// CheckNodePIDPressurePredicate
fit, _, err = predicates.CheckNodePIDPressurePredicate(task.Pod, nil, nodeInfo)
if err != nil {
return err
}

glog.V(4).Infof("CheckNodePIDPressurePredicate predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)
glog.V(4).Infof("CheckNodePIDPressurePredicate predicates Task <%s/%s> on Node <%s>: fit %t, err %v",
task.Namespace, task.Name, node.Name, fit, err)

if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to PID Pressure",
node.Name, task.Namespace, task.Name)
if !fit {
return fmt.Errorf("node <%s> are not available to schedule task <%s/%s> due to PID Pressure",
node.Name, task.Namespace, task.Name)
}
}

// Pod Affinity/Anti-Affinity Predicate
Expand Down

0 comments on commit 75c5683

Please sign in to comment.