support nodeAnnotationsChanged event to trigger rescheduling
This commit is contained in:
		@@ -19,12 +19,12 @@ package scheduler
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	v1 "k8s.io/api/core/v1"
 | 
						v1 "k8s.io/api/core/v1"
 | 
				
			||||||
	storagev1 "k8s.io/api/storage/v1"
 | 
						storagev1 "k8s.io/api/storage/v1"
 | 
				
			||||||
 | 
						"k8s.io/apimachinery/pkg/api/equality"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 | 
						utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
						"k8s.io/apimachinery/pkg/util/wait"
 | 
				
			||||||
@@ -540,20 +540,23 @@ func nodeSchedulingPropertiesChange(newNode *v1.Node, oldNode *v1.Node) []framew
 | 
				
			|||||||
	if nodeConditionsChanged(newNode, oldNode) {
 | 
						if nodeConditionsChanged(newNode, oldNode) {
 | 
				
			||||||
		events = append(events, queue.NodeConditionChange)
 | 
							events = append(events, queue.NodeConditionChange)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if nodeAnnotationsChanged(newNode, oldNode) {
 | 
				
			||||||
 | 
							events = append(events, queue.NodeAnnotationChange)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return events
 | 
						return events
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func nodeAllocatableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
					func nodeAllocatableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
	return !reflect.DeepEqual(oldNode.Status.Allocatable, newNode.Status.Allocatable)
 | 
						return !equality.Semantic.DeepEqual(oldNode.Status.Allocatable, newNode.Status.Allocatable)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func nodeLabelsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
					func nodeLabelsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
	return !reflect.DeepEqual(oldNode.GetLabels(), newNode.GetLabels())
 | 
						return !equality.Semantic.DeepEqual(oldNode.GetLabels(), newNode.GetLabels())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func nodeTaintsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
					func nodeTaintsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
	return !reflect.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints)
 | 
						return !equality.Semantic.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func nodeConditionsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
					func nodeConditionsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
@@ -564,13 +567,17 @@ func nodeConditionsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return conditionStatuses
 | 
							return conditionStatuses
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return !reflect.DeepEqual(strip(oldNode.Status.Conditions), strip(newNode.Status.Conditions))
 | 
						return !equality.Semantic.DeepEqual(strip(oldNode.Status.Conditions), strip(newNode.Status.Conditions))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func nodeSpecUnschedulableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
					func nodeSpecUnschedulableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
	return newNode.Spec.Unschedulable != oldNode.Spec.Unschedulable && !newNode.Spec.Unschedulable
 | 
						return newNode.Spec.Unschedulable != oldNode.Spec.Unschedulable && !newNode.Spec.Unschedulable
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nodeAnnotationsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
 | 
				
			||||||
 | 
						return !equality.Semantic.DeepEqual(oldNode.GetAnnotations(), newNode.GetAnnotations())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func preCheckForNode(nodeInfo *framework.NodeInfo) queue.PreEnqueueCheck {
 | 
					func preCheckForNode(nodeInfo *framework.NodeInfo) queue.PreEnqueueCheck {
 | 
				
			||||||
	// Note: the following checks doesn't take preemption into considerations, in very rare
 | 
						// Note: the following checks doesn't take preemption into considerations, in very rare
 | 
				
			||||||
	// cases (e.g., node resizing), "pod" may still fail a check but preemption helps. We deliberately
 | 
						// cases (e.g., node resizing), "pod" may still fail a check but preemption helps. We deliberately
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -574,6 +574,12 @@ func TestNodeSchedulingPropertiesChange(t *testing.T) {
 | 
				
			|||||||
			}).Obj(),
 | 
								}).Obj(),
 | 
				
			||||||
			wantEvents: []framework.ClusterEvent{queue.NodeTaintChange},
 | 
								wantEvents: []framework.ClusterEvent{queue.NodeTaintChange},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "only node annotation changed",
 | 
				
			||||||
 | 
								newNode:    st.MakeNode().Annotation("foo", "bar").Obj(),
 | 
				
			||||||
 | 
								oldNode:    st.MakeNode().Annotation("foo", "fuz").Obj(),
 | 
				
			||||||
 | 
								wantEvents: []framework.ClusterEvent{queue.NodeAnnotationChange},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:    "only node condition changed",
 | 
								name:    "only node condition changed",
 | 
				
			||||||
			newNode: st.MakeNode().Obj(),
 | 
								newNode: st.MakeNode().Obj(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,11 +53,12 @@ const (
 | 
				
			|||||||
	UpdateNodeLabel       // 1000
 | 
						UpdateNodeLabel       // 1000
 | 
				
			||||||
	UpdateNodeTaint       // 10000
 | 
						UpdateNodeTaint       // 10000
 | 
				
			||||||
	UpdateNodeCondition   // 100000
 | 
						UpdateNodeCondition   // 100000
 | 
				
			||||||
 | 
						UpdateNodeAnnotation  // 1000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	All ActionType = 1<<iota - 1 // 111111
 | 
						All ActionType = 1<<iota - 1 // 1111111
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Use the general Update type if you don't either know or care the specific sub-Update type to use.
 | 
						// Use the general Update type if you don't either know or care the specific sub-Update type to use.
 | 
				
			||||||
	Update = UpdateNodeAllocatable | UpdateNodeLabel | UpdateNodeTaint | UpdateNodeCondition
 | 
						Update = UpdateNodeAllocatable | UpdateNodeLabel | UpdateNodeTaint | UpdateNodeCondition | UpdateNodeAnnotation
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GVK is short for group/version/kind, which can uniquely represent a particular API resource.
 | 
					// GVK is short for group/version/kind, which can uniquely represent a particular API resource.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,8 @@ var (
 | 
				
			|||||||
	NodeAllocatableChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeAllocatable, Label: "NodeAllocatableChange"}
 | 
						NodeAllocatableChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeAllocatable, Label: "NodeAllocatableChange"}
 | 
				
			||||||
	// NodeLabelChange is the event when node label is changed.
 | 
						// NodeLabelChange is the event when node label is changed.
 | 
				
			||||||
	NodeLabelChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeLabel, Label: "NodeLabelChange"}
 | 
						NodeLabelChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeLabel, Label: "NodeLabelChange"}
 | 
				
			||||||
 | 
						// NodeAnnotationChange is the event when node annotation is changed.
 | 
				
			||||||
 | 
						NodeAnnotationChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeAnnotation, Label: "NodeAnnotationChange"}
 | 
				
			||||||
	// NodeTaintChange is the event when node taint is changed.
 | 
						// NodeTaintChange is the event when node taint is changed.
 | 
				
			||||||
	NodeTaintChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeTaint, Label: "NodeTaintChange"}
 | 
						NodeTaintChange = framework.ClusterEvent{Resource: framework.Node, ActionType: framework.UpdateNodeTaint, Label: "NodeTaintChange"}
 | 
				
			||||||
	// NodeConditionChange is the event when node condition is changed.
 | 
						// NodeConditionChange is the event when node condition is changed.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1217,6 +1217,7 @@ func BenchmarkMoveAllToActiveOrBackoffQueue(b *testing.B) {
 | 
				
			|||||||
		NodeAllocatableChange,
 | 
							NodeAllocatableChange,
 | 
				
			||||||
		NodeConditionChange,
 | 
							NodeConditionChange,
 | 
				
			||||||
		NodeLabelChange,
 | 
							NodeLabelChange,
 | 
				
			||||||
 | 
							NodeAnnotationChange,
 | 
				
			||||||
		PvcAdd,
 | 
							PvcAdd,
 | 
				
			||||||
		PvcUpdate,
 | 
							PvcUpdate,
 | 
				
			||||||
		PvAdd,
 | 
							PvAdd,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user