Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/koord-scheduler/app/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ func installProfilingHandler(pathRecorderMux *mux.PathRecorderMux, enableContent
debugFlags := utilroutes.NewDebugFlags(pathRecorderMux)
debugFlags.Install("v", utilroutes.StringFlagPutHandler(logs.GlogSetter))
debugFlags.Install("s", utilroutes.StringFlagPutHandler(frameworkext.DebugScoresSetter))
debugFlags.Install("f", utilroutes.StringFlagPutHandler(frameworkext.DebugFiltersSetter))
}

// newMetricsHandler builds a metrics server from the config.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ import (
)

var (
debugTopNScores = 0
debugTopNScores = 0
debugFilterFailure = false
)

func AddFlags(fs *pflag.FlagSet) {
fs.IntVarP(&debugTopNScores, "debug-scores", "s", debugTopNScores, "logging topN nodes score and scores for each plugin after running the score extension, disable if set to 0")
fs.BoolVarP(&debugFilterFailure, "debug-filters", "f", debugFilterFailure, "logging filter failures")
}

// DebugScoresSetter updates debugTopNScores to specified value
Expand All @@ -46,6 +48,16 @@ func DebugScoresSetter(val string) (string, error) {
return fmt.Sprintf("successfully set debugTopNScores to %s", val), nil
}

// DebugFiltersSetter updates debugFilterFailure to specified value
func DebugFiltersSetter(val string) (string, error) {
filterFailure, err := strconv.ParseBool(val)
if err != nil {
return "", fmt.Errorf("failed set debugFilterFailure %s: %v", val, err)
}
debugFilterFailure = filterFailure
return fmt.Sprintf("successfully set debugFilterFailure to %s", val), nil
}

func debugScores(topN int, pod *corev1.Pod, pluginToNodeScores map[string]framework.NodeScoreList, nodes []*corev1.Node) prettytable.Writer {
// Summarize all scores.
result := make(framework.NodeScoreList, 0, len(nodes))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,40 @@ func TestDebugScoresSetter(t *testing.T) {
}
}

func TestDebugFiltersSetter(t *testing.T) {
tests := []struct {
name string
value string
wantErr bool
want bool
}{
{
name: "valid bool",
value: "true",
wantErr: false,
want: true,
},
{
name: "invalid",
value: "11.22",
wantErr: true,
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := DebugFiltersSetter(tt.value)
if tt.wantErr && err == nil {
t.Error("expected error but got nil")
} else if !tt.wantErr && err != nil {
t.Errorf("expected no error but got err: %v", err)
}
assert.Equal(t, tt.want, debugFilterFailure)
debugFilterFailure = false
})
}
}

func TestDebugScores(t *testing.T) {
pluginToNodeScores := map[string]framework.NodeScoreList{
"ImageLocality": {
Expand Down
6 changes: 5 additions & 1 deletion pkg/scheduler/frameworkext/framework_extender.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,11 @@ func (ext *frameworkExtenderImpl) RunFilterPluginsWithNominatedPods(ctx context.
nodeInfo = newNodeInfo
}
}
return ext.Framework.RunFilterPluginsWithNominatedPods(ctx, cycleState, pod, nodeInfo)
status := ext.Framework.RunFilterPluginsWithNominatedPods(ctx, cycleState, pod, nodeInfo)
if !status.IsSuccess() && debugFilterFailure {
klog.Infof("Failed to filter for Pod %q on Node %q, failedPlugin: %s, reason: %s", klog.KObj(pod), klog.KObj(nodeInfo.Node()), status.FailedPlugin(), status.Message())
}
return status
}

func (ext *frameworkExtenderImpl) RunScorePlugins(ctx context.Context, state *framework.CycleState, pod *corev1.Pod, nodes []*corev1.Node) (framework.PluginToNodeScores, *framework.Status) {
Expand Down