Skip to content

cherry-pick: release-1.134: fix: sanitize managed fields metadata to remove leaked status subresource#6035

Merged
google-oss-prow[bot] merged 3 commits intoGoogleCloudPlatform:release-1.134from
maqiuyujoyce:cherry-pick-6008-release-1.134
Jan 15, 2026
Merged

cherry-pick: release-1.134: fix: sanitize managed fields metadata to remove leaked status subresource#6035
google-oss-prow[bot] merged 3 commits intoGoogleCloudPlatform:release-1.134from
maqiuyujoyce:cherry-pick-6008-release-1.134

Conversation

@maqiuyujoyce
Copy link
Collaborator

Cherry picking PR #6008

BRIEF Change description

This change:

  1. Adds SanitizeSpecManagedFields to explicitly clear subresource from entries that manage f:spec.
  2. Applies this sanitization in LifecycleHandler.updateStatus and LifecycleHandler.updateAPIServer immediately after unmarshalling the response via util.Marshal().
  3. Adds unit tests covering this corruption scenario.

Fixes: b/465380187

WHY do we need this change?

json.Unmarshal merges the input JSON into the existing struct. When reusing a k8s.Resource object across reconciliations, if a previous operation (like a status update) added a managedFields entry with subresource: status, and the subsequent json.Unmarshal (for a spec update) touches the same fields, the subresource: status field persists in the entry even if the new input didn't have it.

This causes incorrect managedFields metadata where spec updates are attributed to the status subresource, leading to 'Location must be set' errors when reconciling a CloudSchedulerJob because the controller ignores spec fields managed by status.

Special notes for your reviewer:

Does this PR add something which needs to be 'release noted'?

Fixes a bug where managedFields metadata corruption could prevent resources from reconciling correctly
  • Reviewer reviewed release note.

Additional documentation e.g., references, usage docs, etc.:


Intended Milestone

Please indicate the intended milestone.

  • Reviewer tagged PR with the actual milestone.

Tests you have done

  • Run make ready-pr to ensure this PR is ready for review.
  • Perform necessary E2E testing for changed resources.

Created local build and ran E2E test to verify the managed fields stay correct all the time.

…urce

json.Unmarshal merges the input JSON into the existing struct. When reusing a k8s.Resource object across reconciliations, if a previous operation (like a status update) added a managedFields entry with subresource: status, and the subsequent json.Unmarshal (for a spec update) touches the same fields, the subresource: status field persists in the entry even if the new input didn't have it.

This causes incorrect managedFields metadata where spec updates are attributed to the status subresource, leading to 'Location must be set' errors because KCC ignores spec fields managed by status.

This change:
1. Adds SanitizeSpecManagedFields to explicitly clear subresource from entries that manage f:spec.
2. Applies this sanitization in LifecycleHandler.updateStatus and updateAPIServer immediately after unmarshalling the response.
3. Adds unit tests covering this corruption scenario.

Refs: b/465380187
@xiaoweim
Copy link
Collaborator

/lgtm

@cheftako
Copy link
Collaborator

/lgtm
/approve

@google-oss-prow
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cheftako

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

@google-oss-prow google-oss-prow bot merged commit 97f47e1 into GoogleCloudPlatform:release-1.134 Jan 15, 2026
210 of 211 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants