Repository: kubernetes/kubernetes
Pull request #131693: Remove package protected fields from ActionType
Author: login: ania-borowiec
Labels: name: kind/cleanup
description: Categorizes issue or PR as related to cleaning up code, process, or technical debt.
name: sig/scheduling
description: Categorizes an issue or PR as relevant to SIG Scheduling.
name: lgtm
description: "Looks good to me", indicates that a PR is ready to be merged.
name: size/M
description: Denotes a PR that changes 30-99 lines, ignoring generated files.
name: release-note-none
description: Denotes a PR that doesn't merit a release note.
name: approved
description: Indicates a PR has been approved by an approver from all required OWNERS files.
name: cncf-cla: yes
description: Indicates the PR's author has signed the CNCF CLA.
name: ok-to-test
description: Indicates a non-member PR verified by an org member that is safe to test.
name: needs-priority
description: Indicates a PR lacks a `priority/foo` label and requires one.
name: needs-triage
description: Indicates an issue or PR lacks a `triage/foo` label and requires one.
Created: 2025-05-09T10:16:47Z | Merged: 2025-05-23T12:30:35Z

<!--  Thanks for sending a pull request!  Here are some tips for you:

1. If this is your first time, please read our contributor guidelines: https://git.k8s.io/community/contributors/guide/first-contribution.md#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request. For reference on required PR/issue labels, read here:
https://git.k8s.io/community/contributors/devel/sig-release/release.md#issuepr-kind-label
3. Ensure you have added or ran the appropriate tests for your PR: https://git.k8s.io/community/contributors/devel/sig-testing/testing.md
4. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews
5. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
-->

#### What type of PR is this?
/kind cleanup
<!--
Add one of the following kinds:
/kind bug

/kind documentation
/kind feature

Optionally add one or more of the following kinds if applicable:
/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->

#### What this PR does / why we need it:
This is part of moving scheduler framework types and interfaces to staging repo.
In order to move ActionType to staging, and not need to move a significant chunk of scheduler's code at the same time, all ActionType values should be public, instead of package protected.
This PR removes the `updatePodOther` value, which seems not to be crucial for scheduler's logic, and makes the `none` value public.

#### Which issue(s) this PR fixes:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->
Part of #89930

#### Special notes for your reviewer:
Per what @sanposhiho said in sig-scheduling meeting (and what's in the code), the field `updatePodOther` was introduced to distinguish the cases where Pod got updated, but there is no ActionType value (yet) that would describe the updated of this particular part of Pod. So instead of a more specific type (e.g. `UpdatePodToleration`) scheduler would internally use `updatePodOther` and externally use a general `UpdatePod`.
Based on what I see in the code, the `updatePodOther` value may get exported in `scheduler_event_handling_duration_seconds` metrics (as a label). This PR would remove this behavior. If we feel that this information is actually important to scheduler's maintainers, perhaps we should consider logging this type of events, and introducing a new metric (counter?), that would count the number of events with an "other" update type? WDYT?

I decided to change the visibility of `ActionType.none` to public, I'm not sure if this may cause harm? Maybe adding a comment saying "do not use this outside of pkg/scheduler" would be sufficient here?

#### Does this PR introduce a user-facing change?
<!--
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".

For more information on release notes see: https://git.k8s.io/community/contributors/guide/release-notes.md
-->
```release-note
NONE
```

#### Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:

<!--
This section can be blank if this pull request does not require a release note.

When adding links which point to resources within git repositories, like
KEPs or supporting documentation, please reference a specific commit and avoid
linking directly to the master branch. This ensures that links reference a
specific point in time, rather than a document that may change over time.

See here for guidance on getting permanent links to files: https://help.github.com/en/articles/getting-permanent-links-to-files

Please use the following format for linking documentation:
- [KEP]: <link>
- [Usage]: <link>
- [Other doc]: <link>
-->
```docs

```



Diff:
diff --git a/pkg/scheduler/framework/events.go b/pkg/scheduler/framework/events.go
index 1fe1b0b972ba6..28efffeb000e8 100644
--- a/pkg/scheduler/framework/events.go
+++ b/pkg/scheduler/framework/events.go
@@ -68,26 +68,26 @@ func PodSchedulingPropertiesChange(newPod *v1.Pod, oldPod *v1.Pod) (events []Clu
 		r = unschedulablePod
 	}
 
-	podChangeExtracters := []podChangeExtractor{
+	podChangeExtractors := []podChangeExtractor{
 		extractPodLabelsChange,
 		extractPodScaleDown,
 		extractPodSchedulingGateEliminatedChange,
 		extractPodTolerationChange,
 	}
 	if utilfeature.DefaultFeatureGate.Enabled(features.DynamicResourceAllocation) {
-		podChangeExtracters = append(podChangeExtracters, extractPodGeneratedResourceClaimChange)
+		podChangeExtractors = append(podChangeExtractors, extractPodGeneratedResourceClaimChange)
 	}
 
-	for _, fn := range podChangeExtracters {
-		if event := fn(newPod, oldPod); event != none {
+	for _, fn := range podChangeExtractors {
+		if event := fn(newPod, oldPod); event != None {
 			events = append(events, ClusterEvent{Resource: r, ActionType: event})
 		}
 	}
 
 	if len(events) == 0 {
-		// When no specific event is found, we use AssignedPodOtherUpdate,
+		// When no specific event is found, we use the general Update action,
 		// which should only trigger plugins registering a general Pod/Update event.
-		events = append(events, ClusterEvent{Resource: r, ActionType: updatePodOther})
+		events = append(events, ClusterEvent{Resource: r, ActionType: Update})
 	}
 
 	return
@@ -116,14 +116,14 @@ func extractPodScaleDown(newPod, oldPod *v1.Pod) ActionType {
 		}
 	}
 
-	return none
+	return None
 }
 
 func extractPodLabelsChange(newPod *v1.Pod, oldPod *v1.Pod) ActionType {
 	if isLabelChanged(newPod.GetLabels(), oldPod.GetLabels()) {
 		return UpdatePodLabel
 	}
-	return none
+	return None
 }
 
 func extractPodTolerationChange(newPod *v1.Pod, oldPod *v1.Pod) ActionType {
@@ -135,7 +135,7 @@ func extractPodTolerationChange(newPod *v1.Pod, oldPod *v1.Pod) ActionType {
 		return UpdatePodToleration
 	}
 
-	return none
+	return None
 }
 
 func extractPodSchedulingGateEliminatedChange(newPod *v1.Pod, oldPod *v1.Pod) ActionType {
@@ -144,7 +144,7 @@ func extractPodSchedulingGateEliminatedChange(newPod *v1.Pod, oldPod *v1.Pod) Ac
 		return UpdatePodSchedulingGatesEliminated
 	}
 
-	return none
+	return None
 }
 
 func extractPodGeneratedResourceClaimChange(newPod *v1.Pod, oldPod *v1.Pod) ActionType {
@@ -152,7 +152,7 @@ func extractPodGeneratedResourceClaimChange(newPod *v1.Pod, oldPod *v1.Pod) Acti
 		return UpdatePodGeneratedResourceClaim
 	}
 
-	return none
+	return None
 }
 
 // NodeSchedulingPropertiesChange interprets the update of a node and returns corresponding UpdateNodeXYZ event(s).
@@ -167,7 +167,7 @@ func NodeSchedulingPropertiesChange(newNode *v1.Node, oldNode *v1.Node) (events
 	}
 
 	for _, fn := range nodeChangeExtracters {
-		if event := fn(newNode, oldNode); event != none {
+		if event := fn(newNode, oldNode); event != None {
 			events = append(events, ClusterEvent{Resource: Node, ActionType: event})
 		}
 	}
@@ -180,14 +180,14 @@ func extractNodeAllocatableChange(newNode *v1.Node, oldNode *v1.Node) ActionType
 	if !equality.Semantic.DeepEqual(oldNode.Status.Allocatable, newNode.Status.Allocatable) {
 		return UpdateNodeAllocatable
 	}
-	return none
+	return None
 }
 
 func extractNodeLabelsChange(newNode *v1.Node, oldNode *v1.Node) ActionType {
 	if isLabelChanged(newNode.GetLabels(), oldNode.GetLabels()) {
 		return UpdateNodeLabel
 	}
-	return none
+	return None
 }
 
 func isLabelChanged(newLabels map[string]string, oldLabels map[string]string) bool {
@@ -198,7 +198,7 @@ func extractNodeTaintsChange(newNode *v1.Node, oldNode *v1.Node) ActionType {
 	if !equality.Semantic.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints) {
 		return UpdateNodeTaint
 	}
-	return none
+	return None
 }
 
 func extractNodeConditionsChange(newNode *v1.Node, oldNode *v1.Node) ActionType {
@@ -212,7 +212,7 @@ func extractNodeConditionsChange(newNode *v1.Node, oldNode *v1.Node) ActionType
 	if !equality.Semantic.DeepEqual(strip(oldNode.Status.Conditions), strip(newNode.Status.Conditions)) {
 		return UpdateNodeCondition
 	}
-	return none
+	return None
 }
 
 func extractNodeSpecUnschedulableChange(newNode *v1.Node, oldNode *v1.Node) ActionType {
@@ -220,12 +220,12 @@ func extractNodeSpecUnschedulableChange(newNode *v1.Node, oldNode *v1.Node) Acti
 		// TODO: create UpdateNodeSpecUnschedulable ActionType
 		return UpdateNodeTaint
 	}
-	return none
+	return None
 }
 
 func extractNodeAnnotationsChange(newNode *v1.Node, oldNode *v1.Node) ActionType {
 	if !equality.Semantic.DeepEqual(oldNode.GetAnnotations(), newNode.GetAnnotations()) {
 		return UpdateNodeAnnotation
 	}
-	return none
+	return None
 }
diff --git a/pkg/scheduler/framework/events_test.go b/pkg/scheduler/framework/events_test.go
index 9c2232467f132..7d45d33cb2a43 100644
--- a/pkg/scheduler/framework/events_test.go
+++ b/pkg/scheduler/framework/events_test.go
@@ -60,7 +60,7 @@ func TestNodeAllocatableChange(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			oldNode := &v1.Node{Status: v1.NodeStatus{Allocatable: test.oldAllocatable}}
 			newNode := &v1.Node{Status: v1.NodeStatus{Allocatable: test.newAllocatable}}
-			changed := extractNodeAllocatableChange(newNode, oldNode) != none
+			changed := extractNodeAllocatableChange(newNode, oldNode) != None
 			if changed != test.changed {
 				t.Errorf("nodeAllocatableChanged should be %t, got %t", test.changed, changed)
 			}
@@ -93,7 +93,7 @@ func TestNodeLabelsChange(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			oldNode := &v1.Node{ObjectMeta: metav1.ObjectMeta{Labels: test.oldLabels}}
 			newNode := &v1.Node{ObjectMeta: metav1.ObjectMeta{Labels: test.newLabels}}
-			changed := extractNodeLabelsChange(newNode, oldNode) != none
+			changed := extractNodeLabelsChange(newNode, oldNode) != None
 			if changed != test.changed {
 				t.Errorf("Test case %q failed: should be %t, got %t", test.name, test.changed, changed)
 			}
@@ -125,7 +125,7 @@ func TestNodeTaintsChange(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			oldNode := &v1.Node{Spec: v1.NodeSpec{Taints: test.oldTaints}}
 			newNode := &v1.Node{Spec: v1.NodeSpec{Taints: test.newTaints}}
-			changed := extractNodeTaintsChange(newNode, oldNode) != none
+			changed := extractNodeTaintsChange(newNode, oldNode) != None
 			if changed != test.changed {
 				t.Errorf("Test case %q failed: should be %t, not %t", test.name, test.changed, changed)
 			}
@@ -180,7 +180,7 @@ func TestNodeConditionsChange(t *testing.T) {
 		t.Run(test.name, func(t *testing.T) {
 			oldNode := &v1.Node{Status: v1.NodeStatus{Conditions: test.oldConditions}}
 			newNode := &v1.Node{Status: v1.NodeStatus{Conditions: test.newConditions}}
-			changed := extractNodeConditionsChange(newNode, oldNode) != none
+			changed := extractNodeConditionsChange(newNode, oldNode) != None
 			if changed != test.changed {
 				t.Errorf("Test case %q failed: should be %t, got %t", test.name, test.changed, changed)
 			}
@@ -377,7 +377,7 @@ func Test_podSchedulingPropertiesChange(t *testing.T) {
 			name:   "pod's resource request is scaled up",
 			oldPod: podWithSmallRequest,
 			newPod: podWithBigRequest,
-			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: updatePodOther}},
+			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: Update}},
 		},
 		{
 			name:   "both pod's resource request and label are updated",
@@ -392,7 +392,7 @@ func Test_podSchedulingPropertiesChange(t *testing.T) {
 			name:   "untracked properties of pod is updated",
 			newPod: st.MakePod().Annotation("foo", "bar").Obj(),
 			oldPod: st.MakePod().Annotation("foo", "bar2").Obj(),
-			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: updatePodOther}},
+			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: Update}},
 		},
 		{
 			name:   "scheduling gate is eliminated",
@@ -404,7 +404,7 @@ func Test_podSchedulingPropertiesChange(t *testing.T) {
 			name:   "scheduling gate is removed, but not completely eliminated",
 			newPod: st.MakePod().SchedulingGates([]string{"foo"}).Obj(),
 			oldPod: st.MakePod().SchedulingGates([]string{"foo", "bar"}).Obj(),
-			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: updatePodOther}},
+			want:   []ClusterEvent{{Resource: unschedulablePod, ActionType: Update}},
 		},
 		{
 			name:   "pod's tolerations are updated",
@@ -417,7 +417,7 @@ func Test_podSchedulingPropertiesChange(t *testing.T) {
 			draDisabled: true,
 			newPod:      st.MakePod().ResourceClaimStatuses(claimStatusA).Obj(),
 			oldPod:      st.MakePod().Obj(),
-			want:        []ClusterEvent{{Resource: unschedulablePod, ActionType: updatePodOther}},
+			want:        []ClusterEvent{{Resource: unschedulablePod, ActionType: Update}},
 		},
 		{
 			name:   "pod claim statuses change, feature enabled",
diff --git a/pkg/scheduler/framework/types.go b/pkg/scheduler/framework/types.go
index f580dfca4731e..acf390a7a4f01 100644
--- a/pkg/scheduler/framework/types.go
+++ b/pkg/scheduler/framework/types.go
@@ -81,16 +81,13 @@ const (
 	// Depends on the DynamicResourceAllocation feature gate.
 	UpdatePodGeneratedResourceClaim
 
-	// updatePodOther is a update for pod's other fields.
-	// It's used only for the internal event handling, and thus unexported.
-	updatePodOther
-
 	All ActionType = 1<<iota - 1
 
 	// 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 | UpdateNodeAnnotation | UpdatePodLabel | UpdatePodScaleDown | UpdatePodToleration | UpdatePodSchedulingGatesEliminated | UpdatePodGeneratedResourceClaim | updatePodOther
-	// none is a special ActionType that is only used internally.
-	none ActionType = 0
+	Update = UpdateNodeAllocatable | UpdateNodeLabel | UpdateNodeTaint | UpdateNodeCondition | UpdateNodeAnnotation | UpdatePodLabel | UpdatePodScaleDown | UpdatePodToleration | UpdatePodSchedulingGatesEliminated | UpdatePodGeneratedResourceClaim
+
+	// None is a special ActionType that is only used internally.
+	None ActionType = 0
 )
 
 var (
@@ -128,8 +125,6 @@ func (a ActionType) String() string {
 		return "UpdatePodSchedulingGatesEliminated"
 	case UpdatePodGeneratedResourceClaim:
 		return "UpdatePodGeneratedResourceClaim"
-	case updatePodOther:
-		return "Update"
 	case All:
 		return "All"
 	case Update:
@@ -320,14 +315,24 @@ func (ce ClusterEvent) IsWildCard() bool {
 }
 
 // Match returns true if ClusterEvent is matched with the coming event.
+// "match" means the coming event is the same or more specific than the ce.
+// i.e., when ce.ActionType is Update, it return true if a coming event is UpdateNodeLabel
+// because UpdateNodeLabel is more specific than Update.
+// On the other hand, when ce.ActionType is UpdateNodeLabel, it doesn't return true if a coming event is Update.
+// This is based on the fact that the scheduler interprets the coming cluster event as specific event if possible;
+// meaning, if a coming event is Node/Update, it means that Node's update is not something
+// that can be interpreted as any of Node's specific Update events.
+//
 // If the ce.Resource is "*", there's no requirement for the coming event' Resource.
 // Contrarily, if the coming event's Resource is "*", the ce.Resource should only be "*".
+// (which should never happen in the current implementation of the scheduling queue.)
 //
 // Note: we have a special case here when the coming event is a wildcard event,
 // it will force all Pods to move to activeQ/backoffQ,
 // but we take it as an unmatched event unless the ce is also a wildcard one.
 func (ce ClusterEvent) Match(incomingEvent ClusterEvent) bool {
-	return ce.IsWildCard() || ce.Resource.match(incomingEvent.Resource) && ce.ActionType&incomingEvent.ActionType != 0
+	return ce.IsWildCard() ||
+		ce.Resource.match(incomingEvent.Resource) && ce.ActionType&incomingEvent.ActionType != 0 && incomingEvent.ActionType <= ce.ActionType
 }
 
 // match returns true if the resource is matched with the coming resource.
diff --git a/pkg/scheduler/framework/types_test.go b/pkg/scheduler/framework/types_test.go
index e829bba994c4e..85e7e344b5221 100644
--- a/pkg/scheduler/framework/types_test.go
+++ b/pkg/scheduler/framework/types_test.go
@@ -2135,6 +2135,18 @@ func TestCloudEvent_Match(t *testing.T) {
 			comingEvent: ClusterEvent{Resource: WildCard, ActionType: UpdateNodeLabel},
 			wantResult:  false,
 		},
+		{
+			name:        "event with resource = '*' matching with coming events carrying a too broad actionType",
+			event:       ClusterEvent{Resource: WildCard, ActionType: UpdateNodeLabel},
+			comingEvent: ClusterEvent{Resource: Pod, ActionType: Update},
+			wantResult:  false,
+		},
+		{
+			name:        "event with resource = '*' matching with coming events carrying a more specific actionType",
+			event:       ClusterEvent{Resource: WildCard, ActionType: Update},
+			comingEvent: ClusterEvent{Resource: Pod, ActionType: UpdateNodeLabel},
+			wantResult:  true,
+		},
 	}
 
 	for _, tc := range testCases {


Reviews:
user: login: sanposhiho
body: /ok-to-test
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-10T03:44:39Z
user: login: sanposhiho
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-10T03:53:36Z
user: login: ania-borowiec
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-12T08:16:40Z
user: login: macsko
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-14T08:25:32Z
user: login: sanposhiho
body: only one nit
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T09:18:22Z
user: login: ania-borowiec
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-23T09:52:26Z
user: login: sanposhiho
body: /lgtm
/approve
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-23T11:23:37Z

Review comments:
path: pkg/scheduler/framework/types.go
user: login: sanposhiho
body: We also need to change `match` function like I mentioned. 
https://docs.google.com/document/d/1c2qfNAL9M-lturrWUHZWzvZyiUV2dlm4dEw8JheLl0k/edit?disco=AAABgjFewzI

Otherwise `Update` (returned from `PodSchedulingPropertiesChange`) would match against `UpdateXXXX` (more specific update events).
created_at: 2025-05-10T03:53:36Z
author_association: MEMBER
path: pkg/scheduler/framework/types.go
user: login: ania-borowiec
body: Oops, thank you! Fixed this and added unit tests
created_at: 2025-05-12T08:16:39Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,16 +81,13 @@ const (
 	// Depends on the DynamicResourceAllocation feature gate.
 	UpdatePodGeneratedResourceClaim
 
-	// updatePodOther is a update for pod's other fields.
-	// It's used only for the internal event handling, and thus unexported.
-	updatePodOther
-
 	All ActionType = 1<<iota - 1
 
 	// 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 | UpdateNodeAnnotation | UpdatePodLabel | UpdatePodScaleDown | UpdatePodToleration | UpdatePodSchedulingGatesEliminated | UpdatePodGeneratedResourceClaim | updatePodOther
+	Update = UpdateNodeAllocatable | UpdateNodeLabel | UpdateNodeTaint | UpdateNodeCondition | UpdateNodeAnnotation | UpdatePodLabel | UpdatePodScaleDown | UpdatePodToleration | UpdatePodSchedulingGatesEliminated | UpdatePodGeneratedResourceClaim
+
 	// none is a special ActionType that is only used internally.
path: pkg/scheduler/framework/types.go
user: login: macsko
body: ```suggestion
	// None is a special ActionType that is only used internally.
```
created_at: 2025-05-14T08:23:30Z
author_association: MEMBER
diff_hunk: @@ -327,7 +322,8 @@ func (ce ClusterEvent) IsWildCard() bool {
 // it will force all Pods to move to activeQ/backoffQ,
 // but we take it as an unmatched event unless the ce is also a wildcard one.
path: pkg/scheduler/framework/types.go
user: login: sanposhiho
body: nit: better to describe,

```go
// Match returns true if ClusterEvent is matched with the coming event.
// "match" means the coming event is the same or more specific than the ce.
// i.e., when ce.ActionType is Update, it return true if a coming event is UpdateNodeLabel
// because UpdateNodeLabel is more specific than Update.
// On the other hand, when ce.ActionType is UpdateNodeLabel, it doesn't return true if a coming event is Update.
// This is based on the fact that the scheduler interprets the coming cluster event as specific event if possible;
// meaning, if a coming event is Node/Update,
// it means that Node's update is not something that can be interpreted as any of Node's specific Update events.
//
// If the ce.Resource is "*", there's no requirement for the coming event' Resource.
// Contrarily, if the coming event's Resource is "*", the ce.Resource should only be "*".
// (which should never happen in the current implementation of the scheduling queue.)
//
// Note: we have a special case here when the coming event is a wildcard event,
// it will force all Pods to move to activeQ/backoffQ,
// but we take it as an unmatched event unless the ce is also a wildcard one.
```
created_at: 2025-05-23T09:13:10Z
author_association: MEMBER
diff_hunk: @@ -327,7 +322,8 @@ func (ce ClusterEvent) IsWildCard() bool {
 // it will force all Pods to move to activeQ/backoffQ,
 // but we take it as an unmatched event unless the ce is also a wildcard one.
path: pkg/scheduler/framework/types.go
user: login: ania-borowiec
body: Thanks, updated
created_at: 2025-05-23T09:52:25Z
author_association: CONTRIBUTOR

PR comments:
user: login: k8s-ci-robot
created_at: 2025-05-09T10:16:56Z
body: This issue is currently awaiting triage.

If a SIG or subproject determines this is a relevant issue, they will accept it by applying the `triage/accepted` label and provide further guidance.

The `triage/accepted` label can be added by org members by writing `/triage accepted` in a comment.


<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: CONTRIBUTOR
user: login: k8s-ci-robot
created_at: 2025-05-09T10:16:57Z
body: Hi @ania-borowiec. Thanks for your PR.

I'm waiting for a [kubernetes](https://github.com/orgs/kubernetes/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://git.k8s.io/community/community-membership.md#member) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fkubernetes).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>

author_association: CONTRIBUTOR
user: login: ania-borowiec
created_at: 2025-05-09T10:20:53Z
body: /cc @sanposhiho @macsko
Could you please review? Thanks
author_association: CONTRIBUTOR
user: login: macsko
created_at: 2025-05-14T08:30:14Z
body: > I decided to change the visibility of `ActionType.none` to public, I'm not sure if this may cause harm? Maybe adding a comment saying "do not use this outside of pkg/scheduler" would be sufficient here?

I think a comment should be enough and simple. Variable name (`None`) and value (`0`) look suspicious enough not to use it by the users.
author_association: MEMBER
user: login: sanposhiho
created_at: 2025-05-17T10:45:29Z
body: Yeah, I cannot imagine any misuse of `None` could happen by users because its name tells everything. The name is pretty clear to understand this is no-op event, literally.
author_association: MEMBER
user: login: macsko
created_at: 2025-05-19T09:10:46Z
body: /lgtm
author_association: MEMBER
user: login: k8s-ci-robot
created_at: 2025-05-19T09:10:53Z
body: LGTM label has been added.  <details>Git tree hash: b570b98b232ad7929abb15030947b0ed3e361152</details>
author_association: CONTRIBUTOR
user: login: ania-borowiec
created_at: 2025-05-19T11:45:52Z
body: /retest
author_association: CONTRIBUTOR
user: login: sanposhiho
created_at: 2025-05-19T13:15:05Z
body: @ania-borowiec I don't think we need a release note. 
author_association: MEMBER
user: login: ania-borowiec
created_at: 2025-05-23T08:35:45Z
body: @macsko @sanposhiho do you think this is good to merge? :-)
author_association: CONTRIBUTOR
user: login: macsko
created_at: 2025-05-23T08:50:51Z
body: /lgtm
author_association: MEMBER
user: login: k8s-ci-robot
created_at: 2025-05-23T08:50:58Z
body: LGTM label has been added.  <details>Git tree hash: b570b98b232ad7929abb15030947b0ed3e361152</details>
author_association: CONTRIBUTOR
user: login: k8s-ci-robot
created_at: 2025-05-23T11:23:43Z
body: LGTM label has been added.  <details>Git tree hash: bc0861938cc852338696193a9733058843f77be7</details>
author_association: CONTRIBUTOR
user: login: k8s-ci-robot
created_at: 2025-05-23T11:23:49Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes/kubernetes/pull/131693#" title="Author self-approved">ania-borowiec</a>*, *<a href="https://github.com/kubernetes/kubernetes/pull/131693#pullrequestreview-2864087338" title="Approved">sanposhiho</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes%2Fkubernetes).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[pkg/scheduler/OWNERS](https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/OWNERS)~~ [sanposhiho]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: CONTRIBUTOR