Skip to content

migrate estimator protobuf to use standard protoc-gen-go - #7298

Merged
karmada-bot merged 1 commit into
karmada-io:masterfrom
zhzhuang-zju:protoc
Apr 25, 2026
Merged

karmada-bot merged 1 commit into
karmada-io:masterfrom
zhzhuang-zju:protoc

Conversation

@zhzhuang-zju

@zhzhuang-zju zhzhuang-zju commented Mar 18, 2026 •

Copy link
Copy Markdown
Contributor

What type of PR is this?

/kind api-change

What this PR does / why we need it:

This PR migrates the scheduler-estimator protobuf implementation to use the standard protoc-gen-go toolchain, replacing the legacy go-to-protobuf generator. This change is a proactive adaptation for Kubernetes 1.35+ dependencies.

Background:
Kubernetes v1.35 has removed the ProtoMessage() marker method from core REST API types (e.g., Pod, Node). To provide a buffer for downstream projects like Karmada, upstream Kubernetes introduced a temporary build tag, kubernetes_protomessage_one_more_release, which forces these types to implement an empty ProtoMessage() method. However, this compatibility layer is slated for complete removal in Kubernetes v1.36. This PR ensures Karmada is fully decoupled from this dependency ahead of time.

Solution:
Adopted a "Peer Fields" strategy:

  1. Peer Fields: Introduced new bytes fields (e.g., NodeAffinityBytes) alongside existing fields to support direct binary transmission of K8s objects.
  2. Graceful Migration: Kept the existing strongly-typed fields (deprecated) to maintain wire compatibility with older components during upgrades.
  3. Modern Toolchain: Switched to standard protoc-gen-go and protoc-gen-go-grpc.
  4. Helper Layer: Added helper methods (MustSet..., Unmarshal...) to handle the conversion between K8s Go types and the new protobuf structure seamlessly.

Which issue(s) this PR fixes:
Parts of #7140

Special notes for your reviewer:

Does this PR introduce a user-facing change?:

`scheduler-estimator`: Migrated to standard protoc-gen-go for gRPC API generation to support Kubernetes 1.35+. Introduced peer `bytes` fields for K8s types to ensure compatibility.
`karmada-scheduler-estimator`: The following fields in the scheduler-estimator gRPC API have been deprecated in favor of bytes-serialized alternatives:
- `ReplicaRequirements.resourceRequest` has been deprecated in favor of `resourceRequestBytes`, which stores proto-serialized `resource.Quantity` objects.
- `ComponentReplicaRequirements.resourceRequest` has been deprecated in favor of `resourceRequestBytes`, which stores proto-serialized `resource.Quantity` objects.
- `NodeClaim.nodeAffinity` has been deprecated in favor of `nodeAffinityBytes`, which stores a proto-serialized `corev1.NodeSelector` object.
- `NodeClaim.tolerations` has been deprecated in favor of `tolerationsBytes`, which stores proto-serialized `corev1.Toleration` objects.

Copilot AI review requested due to automatic review settings March 18, 2026 09:29
@karmada-bot karmada-bot added kind/api-change Categorizes issue or PR as related to adding, removing, or otherwise changing an API do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. labels Mar 18, 2026
@karmada-bot karmada-bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Mar 18, 2026
@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request modernizes the scheduler-estimator's protobuf implementation to ensure its long-term compatibility with evolving Kubernetes APIs, specifically addressing changes in Kubernetes 1.35 and beyond. The core change involves transitioning to standard protobuf generation tools and introducing a dual-field strategy for Kubernetes object serialization. This approach allows for direct binary handling of Kubernetes types while preserving backward compatibility for existing components, facilitating a smooth upgrade path.

Highlights

  • Protobuf Migration: Migrated the scheduler-estimator's protobuf implementation to use the standard protoc-gen-go toolchain, replacing the legacy go-to-protobuf generator.
  • Kubernetes 1.35+ Compatibility: Proactively adapted the protobuf implementation to ensure compatibility with Kubernetes 1.35+ dependencies, which remove the ProtoMessage() marker method from core REST API types.
  • Peer Fields Strategy: Introduced 'Peer Fields' (e.g., NodeAffinityBytes, ResourceRequestBytes, TolerationsBytes) to support direct binary transmission of Kubernetes objects, addressing changes in Kubernetes 1.35+ where writers cannot set certain strongly-typed fields directly.
  • Backward Compatibility: Retained existing strongly-typed fields (marked as deprecated) alongside the new bytes peer fields to maintain wire compatibility with older components during upgrades.
  • Helper Methods: Added helper methods (Set..., Unmarshal..., MustSet...) to seamlessly handle the conversion between Kubernetes Go types and the new protobuf structure, simplifying interaction with the new peer fields.
  • Build Toolchain Update: Updated the build toolchain to use standard protoc-gen-go and protoc-gen-go-grpc for protobuf generation, and removed the go-to-protobuf related build steps.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request successfully migrates the scheduler-estimator protobuf implementation from the legacy go-to-protobuf generator to the standard protoc-gen-go toolchain, addressing compatibility concerns with Kubernetes 1.35+. The adoption of a "Peer Fields" strategy, introducing new bytes fields alongside deprecated strongly-typed fields, is a robust approach to ensure graceful migration and wire compatibility. The addition of helper methods (Set..., Unmarshal..., MustSet...) simplifies the conversion between Kubernetes Go types and the new protobuf structure. The changes are comprehensive, affecting protobuf definitions, generation scripts, and Go code across various components to align with the new protobuf standard. However, several instances of ignored errors from Set and Unmarshal helper methods have been identified, which could lead to silent failures or incorrect data processing. These should be addressed to ensure the reliability of the new protobuf serialization/deserialization logic.

Comment thread pkg/estimator/client/accurate.go Resolved
Comment thread pkg/estimator/client/accurate.go Resolved
Comment thread pkg/estimator/client/accurate.go Resolved
Comment thread pkg/estimator/client/accurate.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
@zhzhuang-zju
zhzhuang-zju force-pushed the protoc branch 4 times, most recently from d7bbc4f to a3c449b Compare April 2, 2026 09:58
@zhzhuang-zju
zhzhuang-zju force-pushed the protoc branch 3 times, most recently from 6270ec0 to 9bdd629 Compare April 13, 2026 03:50
@codecov-commenter

codecov-commenter commented Apr 13, 2026 •

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 20.11019% with 580 lines in your changes missing coverage. Please review.
✅ Project coverage is 41.86%. Comparing base (923d98e) to head (e495b66).

Files with missing lines Patch % Lines
pkg/estimator/pb/estimator.pb.go 6.19% 332 Missing and 1 partial ⚠️
pkg/estimator/pb/helpers.go 45.65% 75 Missing ⚠️
pkg/estimator/service/service_grpc.pb.go 0.00% 71 Missing ⚠️
pkg/estimator/client/accurate.go 13.33% 25 Missing and 1 partial ⚠️
pkg/estimator/service/service.pb.go 0.00% 19 Missing ⚠️
pkg/estimator/scheduling_simulator_components.go 65.00% 7 Missing and 7 partials ⚠️
...ver/framework/plugins/noderesource/noderesource.go 13.33% 12 Missing and 1 partial ⚠️
...r/framework/plugins/resourcequota/resourcequota.go 57.14% 6 Missing and 6 partials ⚠️
pkg/estimator/server/nodes/filter.go 0.00% 8 Missing ⚠️
pkg/estimator/server/server.go 14.28% 6 Missing ⚠️
... and 2 more
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #7298      +/-   ##
==========================================
- Coverage   42.15%   41.86%   -0.29%     
==========================================
  Files         876      879       +3     
  Lines       53645    54224     +579     
==========================================
+ Hits        22614    22703      +89     
- Misses      29334    29806     +472     
- Partials     1697     1715      +18     
Flag Coverage Δ
unittests 41.86% <20.11%> (-0.29%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@zhzhuang-zju

Copy link
Copy Markdown
Contributor Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request migrates the estimator's protobuf implementation from gogo/protobuf to the standard google.golang.org/protobuf library and transitions the schema to proto3. Key updates include pinning the protoc version in the generation script and implementing helper methods for serializing Kubernetes types as byte fields to improve compatibility. Feedback indicates that several exported methods lack mandatory documentation comments, violating the project's style guide.

@zhzhuang-zju zhzhuang-zju changed the title WIP: migrate estimator protobuf to use standard protoc-gen-go migrate estimator protobuf to use standard protoc-gen-go Apr 16, 2026
@karmada-bot karmada-bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Apr 16, 2026
@zhzhuang-zju

Copy link
Copy Markdown
Contributor Author

Test report:

  1. Set up Karmada by using hack/local-up-karmada.sh
  2. Deploy nginx to member1 cluster and print the logs of the component karmada-scheduler
$ kubectl logs -f --namespace karmada-system karmada-scheduler-xxx
I0416 09:00:02.464892       1 util.go:91] Invoked MaxAvailableReplicas of estimator general-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
I0416 09:00:02.469442       1 util.go:91] Invoked MaxAvailableReplicas of estimator scheduler-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
I0416 09:00:02.469468       1 util.go:112] Target cluster calculated by estimators (available cluster && maxAvailableReplicas): [{member1 100}]
  1. Set the image of the component karmada-scheduler to karmada-scheduler=docker.io/karmada/karmada-scheduler:v1.17.0, and repeat steps 1 and 2
$ kubectl set image --namespace karmada-system deployments/karmada-scheduler karmada-scheduler=docker.io/karmada/karmada-scheduler:v1.17.0
$ kubectl logs -f --namespace karmada-system karmada-scheduler-xxx
I0416 11:47:33.862768       1 util.go:91] Invoked MaxAvailableReplicas of estimator general-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
I0416 11:47:33.863312       1 event_handler.go:181] Ignore update event of resourceBinding default/nginx-deployment as specification no change
I0416 11:47:33.864241       1 util.go:91] Invoked MaxAvailableReplicas of estimator scheduler-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
  1. Set the image of the component karmada-scheduler back to karmada-scheduler=docker.io/karmada/karmada-scheduler:latest, then set the image of the component karmada-scheduler-estimator-member1 to docker.io/karmada/karmada-scheduler-estimator:v1.17.0, and repeat steps 1 and 2
$ kubectl set image --namespace karmada-system deployments/karmada-scheduler karmada-scheduler=docker.io/karmada/karmada-scheduler:latest
$ kubectl set image --namespace karmada-system deployments/karmada-scheduler-estimator-member1 karmada-scheduler-estimator=docker.io/karmada/karmada-scheduler-estimator:v1.17.0
$ kubectl logs -f --namespace karmada-system karmada-scheduler-xxx
I0416 11:52:21.105426       1 util.go:91] Invoked MaxAvailableReplicas of estimator general-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
I0416 11:52:21.108424       1 util.go:91] Invoked MaxAvailableReplicas of estimator scheduler-estimator for workload(apps/v1, kind=Deployment, default/nginx): [{member1 100}]
I0416 11:52:21.110609       1 util.go:112] Target cluster calculated by estimators (available cluster && maxAvailableReplicas): [{member1 100}]

From the test report, this update is backward compatible.

@zhzhuang-zju

Copy link
Copy Markdown
Contributor Author

Hi @liggitt, hope you’re doing well. This PR is a follow-up to the earlier discussion around Karmada’s Kubernetes dependency upgrade to v1.35.0.

Based on your suggestion in that discussion, this PR:

  • switch to generate with protoc instead of gogo protobuf or k8s.io/code-generator/go-to-protobuf
  • introduces peer fields to replace Kubernetes API fields, for example using resourceRequestBytes instead of
    resource.Quantity. The existing Kubernetes API fields would be removed in release-1.19.

The PR is now ready for review, and I’d really appreciate your feedback if you have time.
The main changes are in:

  • pkg/estimator/pb/estimator.proto
  • pkg/estimator/pb/helpers.go

@zhzhuang-zju
zhzhuang-zju force-pushed the protoc branch 2 times, most recently from 70b4137 to 5c17fb6 Compare April 16, 2026 12:45
Comment thread hack/update-estimator-protobuf.sh Resolved
Comment thread pkg/estimator/client/accurate.go Resolved

@RainbowMango RainbowMango left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/assign

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Migrates the scheduler-estimator protobuf/gRPC API generation from legacy go-to-protobuf/gogo to the standard protoc-gen-go + protoc-gen-go-grpc toolchain, adding “peer bytes” fields to carry Kubernetes types without depending on Kubernetes’ ProtoMessage() marker compatibility layer.

Changes:

  • Switched estimator proto definitions to proto3 and regenerated Go types + gRPC stubs with standard generators.
  • Introduced helper methods to marshal/unmarshal peer bytes fields (resource requests, node affinity, tolerations) and updated server/client/plugin code to use them.
  • Updated build/generation tooling (protoc pinning script, go:generate, tools.go) and adapted tests to new pointer-based protobuf types.

Reviewed changes

Copilot reviewed 29 out of 90 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
pkg/estimator/service/service_grpc.pb.go New grpc-go stubs generated via protoc-gen-go-grpc.
pkg/estimator/service/service.proto Updates proto import + go_package for standard toolchain.
pkg/estimator/service/service.pb.go Regenerated descriptor-only file via protoc-gen-go.
pkg/estimator/service/doc.go Updates go:generate to standard protoc plugins.
pkg/estimator/server/server_test.go Updates tests to use new helper setters for peer-bytes fields.
pkg/estimator/server/server.go Embeds unimplemented server; logging changes; fixes proto field name + duration handling.
pkg/estimator/server/nodes/filter.go Uses peer-bytes node affinity unmarshal and returns errors.
pkg/estimator/server/framework/runtime/framework_test.go Updates component slice types to pointer-based protobuf messages.
pkg/estimator/server/framework/runtime/framework.go Updates framework APIs to accept []*pb.Component.
pkg/estimator/server/framework/plugins/resourcequota/resourcequota_test.go Updates tests to pointer-based messages + helper setters.
pkg/estimator/server/framework/plugins/resourcequota/resourcequota.go Uses peer-bytes resource requests; propagates errors; updates component APIs.
pkg/estimator/server/framework/plugins/noderesource/noderesource_test.go Updates tests to pointer-based messages + helper setters.
pkg/estimator/server/framework/plugins/noderesource/noderesource.go Uses peer-bytes unmarshalling; simulator now returns error.
pkg/estimator/server/framework/interface.go Interface changes for pointer-based components.
pkg/estimator/server/estimate.go Switches to pointer-based ReplicaRequirements and components.
pkg/estimator/scheduling_simulator_components_test.go Updates simulator tests for pointer-based components + error return.
pkg/estimator/scheduling_simulator_components.go Simulator now handles peer-bytes; returns errors; affinity/tolerations extraction returns error.
pkg/estimator/pb/types.go Removes legacy hand-written types (replaced by generated protos).
pkg/estimator/pb/helpers.go Adds peer-bytes helpers, MustSet..., and formatted logging helpers.
pkg/estimator/pb/generated.protomessage.pb.go Removes temporary ProtoMessage marker file.
pkg/estimator/pb/generated.pb.go Removes gogo-generated protobuf output.
pkg/estimator/pb/estimator.proto Migrates estimator proto to proto3; adds peer bytes fields; deprecates typed fields.
pkg/estimator/pb/estimator.pb.go New generated proto3 Go types via protoc-gen-go.
pkg/estimator/client/general.go Updates scheduling simulation path for pointer-based components and error return.
pkg/estimator/client/accurate.go Updates gRPC request building for pointer-based messages + peer-bytes setters.
hack/update-estimator-protobuf.sh Replaces go-to-protobuf with protoc + std plugins; pins protoc downloader.
hack/tools/tools.go Updates tool imports for standard protoc plugins.
go.mod Removes direct gogo dependency; adds protobuf/grpc tool requirements (see comments).
Makefile Adds a kubernetes build tag to default make test invocation (see comments).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +265 to +276
func (pl *resourceQuotaEstimator) aggregateComponentRequirements(components []*pb.Component) (corev1.ResourceList, error) {
resourceRequirements := map[corev1.ResourceName]int64{}

for _, component := range components {
if component.ReplicaRequirements.ResourceRequest == nil {
if component == nil {
continue
}

requirements, err := component.ReplicaRequirements.UnmarshalResourceRequest()
if err != nil {
return nil, err
}

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component.ReplicaRequirements can be nil (now that Component and its ReplicaRequirements are pointers), which will panic when calling UnmarshalResourceRequest(). Fix by guarding for component.ReplicaRequirements == nil (either continue as “no requirements” or return a validation error), and ensure evaluateComponentsAgainstQuota() does not pass components with nil requirements when selectors are empty.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component.ReplicaRequirements can be nil, but calling UnmarshalResourceRequest() on it does not necessarily panic. In Go, a method call on a nil receiver is allowed as long as the method implementation itself does not dereference the nil receiver without checking it first.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest adding some safeguards to exit the loop promptly.

Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/server/nodes/filter.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread Makefile Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved

@RainbowMango RainbowMango left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, just some nits.

Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread pkg/estimator/pb/helpers.go Resolved
Comment on lines +265 to +276
func (pl *resourceQuotaEstimator) aggregateComponentRequirements(components []*pb.Component) (corev1.ResourceList, error) {
resourceRequirements := map[corev1.ResourceName]int64{}

for _, component := range components {
if component.ReplicaRequirements.ResourceRequest == nil {
if component == nil {
continue
}

requirements, err := component.ReplicaRequirements.UnmarshalResourceRequest()
if err != nil {
return nil, err
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

Comment thread pkg/estimator/server/nodes/filter.go Resolved
@zhzhuang-zju
zhzhuang-zju force-pushed the protoc branch 2 times, most recently from aa217fc to 6b6fb09 Compare April 24, 2026 09:33
@RainbowMango
RainbowMango requested a review from Copilot April 25, 2026 04:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 30 out of 91 changed files in this pull request and generated 7 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pkg/estimator/client/accurate.go Resolved
Comment thread hack/update-estimator-protobuf.sh Resolved
Comment thread hack/update-estimator-protobuf.sh Resolved
Comment thread go.mod Resolved
Comment thread pkg/estimator/pb/estimator.proto Resolved

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 30 out of 91 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pkg/estimator/pb/estimator.proto Resolved
Signed-off-by: zhzhuang-zju <m17799853869@163.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 30 out of 91 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pkg/estimator/pb/helpers.go Resolved
Comment thread hack/update-estimator-protobuf.sh Resolved
Comment thread pkg/estimator/pb/estimator.proto Resolved
@zhzhuang-zju

Copy link
Copy Markdown
Contributor Author

/cc @RainbowMango

@RainbowMango RainbowMango left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm
/approve

@karmada-bot karmada-bot added the lgtm Indicates that a PR is ready to be merged. label Apr 25, 2026
@karmada-bot

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: RainbowMango

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@karmada-bot karmada-bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Apr 25, 2026
@karmada-bot
karmada-bot merged commit 26cbb5e into karmada-io:master Apr 25, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. kind/api-change Categorizes issue or PR as related to adding, removing, or otherwise changing an API lgtm Indicates that a PR is ready to be merged. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants