Skip to content

fix(controller): handle long rule names in bootstrap annotation keys#224

Open
vishnukothakapu wants to merge 1 commit intokubernetes-sigs:mainfrom
vishnukothakapu:fix-annotation-key-length
Open

fix(controller): handle long rule names in bootstrap annotation keys#224
vishnukothakapu wants to merge 1 commit intokubernetes-sigs:mainfrom
vishnukothakapu:fix-annotation-key-length

Conversation

@vishnukothakapu
Copy link
Copy Markdown

Description

This PR fixes a bug where NodeReadinessRule resources with long names (longer than 43 characters) caused the controller to fail when patching Node annotations. Kubernetes strictly limits the name part of an annotation key to 63 characters. Since our key pattern was readiness.k8s.io/bootstrap-completed-<rule-name>, long rule names resulted in invalid keys.

I introduced a helper function getBootstrapAnnotationKey that deterministically hashes the rule name using MD5 when it exceeds the length limit, ensuring the final key is always valid.

Related Issue

Fixes #223

Type of Change

/kind bug

Testing

  • Added internal/controller/helper_unit_test.go: Pure unit tests covering short, medium, and very long name scenarios to verify deterministic hashing and length compliance.
  • Added internal/controller/node_controller_reproduction_test.go: Reproduction test case that confirms the controller can now successfully reconcile rules with long names.
  • Verified with go test and go vet.

Checklist

  • make test passes
  • make lint passes

Does this PR introduce a user-facing change?

NONE

@k8s-ci-robot k8s-ci-robot added the kind/bug Categorizes issue or PR as related to a bug. label May 7, 2026
@netlify
Copy link
Copy Markdown

netlify Bot commented May 7, 2026

Deploy Preview for node-readiness-controller canceled.

Name Link
🔨 Latest commit d42de51
🔍 Latest deploy log https://app.netlify.com/projects/node-readiness-controller/deploys/69fc8eebd074fd0008c3171d

@k8s-ci-robot k8s-ci-robot requested a review from mrunalp May 7, 2026 08:45
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: vishnukothakapu
Once this PR has been reviewed and has the lgtm label, please assign ajaysundark for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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

@k8s-ci-robot k8s-ci-robot requested a review from tallclair May 7, 2026 08:45
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

Welcome @vishnukothakapu!

It looks like this is your first PR to kubernetes-sigs/node-readiness-controller 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-sigs/node-readiness-controller has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robot k8s-ci-robot added needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. labels May 7, 2026
@k8s-ci-robot
Copy link
Copy Markdown
Contributor

Hi @vishnukothakapu. Thanks for your PR.

I'm waiting for a kubernetes-sigs 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 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.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label May 7, 2026
Comment thread internal/controller/helper.go Outdated
// "bootstrap-completed-" is 20 characters.
if len(namePart) > 43 {
hash := md5.Sum([]byte(ruleName))
namePart = hex.EncodeToString(hash[:])
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.

Don't we need to restrict limit here?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Since the hash is fixed to 32 characters, the annotation name length also stays fixed.
With a 20-character prefix + 32-character hash, the final annotation name becomes 52 characters total, no matter how long the original rule name is.

So this keeps it safely within Kubernetes’ 63-character limit.

Comment thread internal/controller/helper.go Outdated
// Annotation name part (after prefix/) must be <= 63 characters.
// "bootstrap-completed-" is 20 characters.
if len(namePart) > 43 {
hash := md5.Sum([]byte(ruleName))
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.

is md5 is recomended or is there any other better way? like sha256?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I initially used MD5 because of its shorter fixed-length output, which fit easily within Kubernetes’ 63-character limit. I’ve now updated it to SHA256 and truncated it to 32 characters so it stays within the limit while providing stronger hashing.

Truncate and hash rule names in annotation keys when they exceed the 63-character Kubernetes limit for the name part.

Uses truncated SHA256 to ensure deterministic and valid annotation keys for rules with names up to 253 characters.
@vishnukothakapu vishnukothakapu force-pushed the fix-annotation-key-length branch from 538cca4 to d42de51 Compare May 7, 2026 13:08
@ajaysundark ajaysundark self-requested a review May 9, 2026 13:02
@ajaysundark
Copy link
Copy Markdown
Contributor

Thanks for catching this. My only thoughts on this is that it takes away the human observability on this when a bootsrap-rule is done. :/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. kind/bug Categorizes issue or PR as related to a bug. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. size/L Denotes a PR that changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Annotation key length limit exceeded for long NodeReadinessRule names

4 participants