Skip to content

fix: prevent nil map panic and applyset label/annotation propagation#406

Open
yehudacohen wants to merge 1 commit intohyperspike:mainfrom
yehudacohen:fix/labels-nil-map-and-applyset-propagation
Open

fix: prevent nil map panic and applyset label/annotation propagation#406
yehudacohen wants to merge 1 commit intohyperspike:mainfrom
yehudacohen:fix/labels-nil-map-and-applyset-propagation

Conversation

@yehudacohen
Copy link
Copy Markdown

The labels() function used maps.Clone(valkey.Labels) which returns nil when the input is nil, causing a panic on the next map assignment. While validateValkeySpec() guards against nil labels during normal reconciliation, the labels() function should be self-contained.

Additionally, when tools like KRO, ArgoCD, or kubectl apply --prune inject applyset.kubernetes.io/* labels and annotations onto the Valkey CR, the operator propagated them to child Services and StatefulSets. This causes the tools to treat those children as managed resources, leading to unintended pruning: the tool deletes the Service, the operator recreates it, and the cycle repeats.

Changes:

  • labels(): initialize with make() instead of maps.Clone(), filter applyset.kubernetes.io/* labels before propagating to children
  • annotations(): copy and filter instead of returning the raw map reference, filter applyset.kubernetes.io/* annotations
  • Added tests for nil labels, applyset label filtering, applyset annotation filtering, and nil annotations

The labels() function used maps.Clone(valkey.Labels) which returns nil
when the input is nil, causing a panic on the next map assignment. While
validateValkeySpec() guards against nil labels during normal
reconciliation, the labels() function should be self-contained.

Additionally, when tools like KRO, ArgoCD, or kubectl apply --prune
inject applyset.kubernetes.io/* labels and annotations onto the Valkey
CR, the operator propagated them to child Services and StatefulSets.
This caused the tools to treat those children as managed resources,
leading to unintended pruning — the tool deletes the Service, the
operator recreates it, and the cycle repeats.

Changes:
- labels(): initialize with make() instead of maps.Clone(), filter
  applyset.kubernetes.io/* labels before propagating to children
- annotations(): copy and filter instead of returning the raw map
  reference, filter applyset.kubernetes.io/* annotations
- Added tests for nil labels, applyset label filtering, applyset
  annotation filtering, and nil annotations
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant