Skip to content

Commit 0387ee4

Browse files
authored
Merge pull request kubernetes#86625 from zouyee/cnu
Move CheckNodeUnschedulable predicate to its filter plugin
2 parents 429ad7d + 89867e1 commit 0387ee4

File tree

4 files changed

+15
-86
lines changed

4 files changed

+15
-86
lines changed

pkg/scheduler/algorithm/predicates/predicates.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -780,26 +780,6 @@ func GeneralPredicates(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.N
780780
return len(predicateFails) == 0, predicateFails, nil
781781
}
782782

783-
// CheckNodeUnschedulablePredicate checks if a pod can be scheduled on a node with Unschedulable spec.
784-
func CheckNodeUnschedulablePredicate(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.NodeInfo) (bool, []PredicateFailureReason, error) {
785-
if nodeInfo == nil || nodeInfo.Node() == nil {
786-
return false, []PredicateFailureReason{ErrNodeUnknownCondition}, nil
787-
}
788-
789-
// If pod tolerate unschedulable taint, it's also tolerate `node.Spec.Unschedulable`.
790-
podToleratesUnschedulable := v1helper.TolerationsTolerateTaint(pod.Spec.Tolerations, &v1.Taint{
791-
Key: v1.TaintNodeUnschedulable,
792-
Effect: v1.TaintEffectNoSchedule,
793-
})
794-
795-
// TODO (k82cn): deprecates `node.Spec.Unschedulable` in 1.13.
796-
if nodeInfo.Node().Spec.Unschedulable && !podToleratesUnschedulable {
797-
return false, []PredicateFailureReason{ErrNodeUnschedulable}, nil
798-
}
799-
800-
return true, nil, nil
801-
}
802-
803783
// PodToleratesNodeTaints checks if a pod tolerations can tolerate the node taints.
804784
func PodToleratesNodeTaints(pod *v1.Pod, meta Metadata, nodeInfo *schedulernodeinfo.NodeInfo) (bool, []PredicateFailureReason, error) {
805785
if nodeInfo == nil || nodeInfo.Node() == nil {

pkg/scheduler/algorithm/predicates/predicates_test.go

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,65 +1760,3 @@ func TestGetMaxVols(t *testing.T) {
17601760
os.Setenv(KubeMaxPDVols, previousValue)
17611761
}
17621762
}
1763-
1764-
func TestCheckNodeUnschedulablePredicate(t *testing.T) {
1765-
testCases := []struct {
1766-
name string
1767-
pod *v1.Pod
1768-
node *v1.Node
1769-
fit bool
1770-
}{
1771-
{
1772-
name: "Does not schedule pod to unschedulable node (node.Spec.Unschedulable==true)",
1773-
pod: &v1.Pod{},
1774-
node: &v1.Node{
1775-
Spec: v1.NodeSpec{
1776-
Unschedulable: true,
1777-
},
1778-
},
1779-
fit: false,
1780-
},
1781-
{
1782-
name: "Schedule pod to normal node",
1783-
pod: &v1.Pod{},
1784-
node: &v1.Node{
1785-
Spec: v1.NodeSpec{
1786-
Unschedulable: false,
1787-
},
1788-
},
1789-
fit: true,
1790-
},
1791-
{
1792-
name: "Schedule pod with toleration to unschedulable node (node.Spec.Unschedulable==true)",
1793-
pod: &v1.Pod{
1794-
Spec: v1.PodSpec{
1795-
Tolerations: []v1.Toleration{
1796-
{
1797-
Key: v1.TaintNodeUnschedulable,
1798-
Effect: v1.TaintEffectNoSchedule,
1799-
},
1800-
},
1801-
},
1802-
},
1803-
node: &v1.Node{
1804-
Spec: v1.NodeSpec{
1805-
Unschedulable: true,
1806-
},
1807-
},
1808-
fit: true,
1809-
},
1810-
}
1811-
1812-
for _, test := range testCases {
1813-
nodeInfo := schedulernodeinfo.NewNodeInfo()
1814-
nodeInfo.SetNode(test.node)
1815-
fit, _, err := CheckNodeUnschedulablePredicate(test.pod, nil, nodeInfo)
1816-
if err != nil {
1817-
t.Fatalf("Failed to check node unschedulable: %v", err)
1818-
}
1819-
1820-
if fit != test.fit {
1821-
t.Errorf("Unexpected fit: expected %v, got %v", test.fit, fit)
1822-
}
1823-
}
1824-
}

pkg/scheduler/framework/plugins/nodeunschedulable/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ go_library(
66
importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/nodeunschedulable",
77
visibility = ["//visibility:public"],
88
deps = [
9+
"//pkg/apis/core/v1/helper:go_default_library",
910
"//pkg/scheduler/algorithm/predicates:go_default_library",
10-
"//pkg/scheduler/framework/plugins/migration:go_default_library",
1111
"//pkg/scheduler/framework/v1alpha1:go_default_library",
1212
"//pkg/scheduler/nodeinfo:go_default_library",
1313
"//staging/src/k8s.io/api/core/v1:go_default_library",

pkg/scheduler/framework/plugins/nodeunschedulable/node_unschedulable.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import (
2121

2222
v1 "k8s.io/api/core/v1"
2323
"k8s.io/apimachinery/pkg/runtime"
24+
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
2425
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
25-
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
2626
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
2727
"k8s.io/kubernetes/pkg/scheduler/nodeinfo"
2828
)
@@ -44,8 +44,19 @@ func (pl *NodeUnschedulable) Name() string {
4444

4545
// Filter invoked at the filter extension point.
4646
func (pl *NodeUnschedulable) Filter(ctx context.Context, _ *framework.CycleState, pod *v1.Pod, nodeInfo *nodeinfo.NodeInfo) *framework.Status {
47-
_, reasons, err := predicates.CheckNodeUnschedulablePredicate(pod, nil, nodeInfo)
48-
return migration.PredicateResultToFrameworkStatus(reasons, err)
47+
if nodeInfo == nil || nodeInfo.Node() == nil {
48+
return framework.NewStatus(framework.UnschedulableAndUnresolvable, predicates.ErrNodeUnknownCondition.GetReason())
49+
}
50+
// If pod tolerate unschedulable taint, it's also tolerate `node.Spec.Unschedulable`.
51+
podToleratesUnschedulable := v1helper.TolerationsTolerateTaint(pod.Spec.Tolerations, &v1.Taint{
52+
Key: v1.TaintNodeUnschedulable,
53+
Effect: v1.TaintEffectNoSchedule,
54+
})
55+
// TODO (k82cn): deprecates `node.Spec.Unschedulable` in 1.13.
56+
if nodeInfo.Node().Spec.Unschedulable && !podToleratesUnschedulable {
57+
return framework.NewStatus(framework.UnschedulableAndUnresolvable, predicates.ErrNodeUnschedulable.GetReason())
58+
}
59+
return nil
4960
}
5061

5162
// New initializes a new plugin and returns it.

0 commit comments

Comments
 (0)