Skip to content

fix(serde): add #[serde(default)] to Option<Vec/Map> resource fields#39

Open
indyjonesnl wants to merge 4 commits into
calfonso:mainfrom
indyjonesnl:upstream/serde-defaults
Open

fix(serde): add #[serde(default)] to Option<Vec/Map> resource fields#39
indyjonesnl wants to merge 4 commits into
calfonso:mainfrom
indyjonesnl:upstream/serde-defaults

Conversation

@indyjonesnl
Copy link
Copy Markdown

Problem

K8s API serialization omits empty arrays. `Option<Vec>` fields without `#[serde(default)]` then fail deserialization round-trip when the source JSON omits the field entirely — even though that's the standard K8s wire format for "no items".

Affected ~80 fields across ~15 resource files. Minimal objects (a Service with no `ports`, a Pod with no `tolerations`, etc.) couldn't round-trip through our types.

Fix

For every `Option<Vec>`, `Option<HashMap<K, V>>`, `Option<BTreeMap<K, V>>` field on a resource struct, add `#[serde(default)]` alongside the existing `#[serde(skip_serializing_if = "Option::is_none")]`. Preserve any `rename = "..."` overrides — order normalized to `rename → default → skip_serializing_if`.

Split into four commits by file batch (A, A-qualified-maps, B, C) for reviewability:

  • Batch A: `admission_webhook`, `authentication`, `authorization`, `autoscaling` (35 fields).
  • Batch A qualified maps: `std::collections::HashMap` paths missed by the bulk regex in batch A (6 more fields in admission_webhook + autoscaling).
  • Batch B: `certificates`, `componentstatus`, `coordination`, `csi`, `dra` (10 fields).
  • Batch C: `endpoints`, `endpointslice`, `event`, `flowcontrol`, `ingress`, `ingressclass`, `networking`, `policy`, `rbac` (40 fields).

Mechanical change — no behavior change for any object that does populate these fields. Restores round-trip compatibility for objects that omit them.

Verification

`cargo build --workspace --locked` clean. No new test failures vs baseline.

Depends on #32 for green CI.

indyjonesnl and others added 4 commits May 14, 2026 17:47
K8s API omits empty arrays — without serde(default), deserialization of
minimal objects fails round-trip. Affects certificates, componentstatus,
csi resource files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
K8s API omits empty arrays — without serde(default), deserialization of
minimal objects fails round-trip. Affects admission_webhook, authentication,
authorization, autoscaling resource files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Follow-up to the batch-A patch — the regex pattern missed fully-qualified
std::collections::HashMap fields in admission_webhook and autoscaling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
K8s API omits empty arrays — without serde(default), deserialization of
minimal objects fails round-trip. Affects endpoints, endpointslice,
flowcontrol, ingress, networking, policy, rbac resource files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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