From b278254eba33e4d2f1c6a0b9af02ab6a64b8d1f8 Mon Sep 17 00:00:00 2001 From: pranshul gupta Date: Wed, 5 Nov 2025 11:03:36 +0530 Subject: [PATCH 1/4] Enable optionalfields rule for Kube API linter --- hack/golangci-hints.yaml | 2 +- hack/golangci.yaml | 2 +- hack/kube-api-linter/kube-api-linter.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hack/golangci-hints.yaml b/hack/golangci-hints.yaml index 68a56bbc9fc..c588a33586a 100644 --- a/hack/golangci-hints.yaml +++ b/hack/golangci-hints.yaml @@ -417,7 +417,7 @@ linters: - "nonullable" # Ensure fields are not marked as nullable. # - "nophase" # Ensure field names do not have the word "phase" in them. - "notimestamp" # Ensure fields are not named "timestamp", prefer "time". - # - "optionalfields" # Ensure fields marked optional have omitempty and pointers. + - "optionalfields" # Ensure fields marked optional have omitempty and pointers. - "optionalorrequired" # Every field should be marked as `+optional` xor `+required`. # - "requiredfields" # Required fields should only be pointers when required based on the validity of the zero value, they should always have `omitempty`. - "ssatags" # Ensure lists have a listType tag. diff --git a/hack/golangci.yaml b/hack/golangci.yaml index 4f44df20cc1..36ecfd27915 100644 --- a/hack/golangci.yaml +++ b/hack/golangci.yaml @@ -430,7 +430,7 @@ linters: - "nonullable" # Ensure fields are not marked as nullable. # - "nophase" # Ensure field names do not have the word "phase" in them. - "notimestamp" # Ensure fields are not named "timestamp", prefer "time". - # - "optionalfields" # Ensure fields marked optional have omitempty and pointers. + - "optionalfields" # Ensure fields marked optional have omitempty and pointers. - "optionalorrequired" # Every field should be marked as `+optional` xor `+required`. # - "requiredfields" # Required fields should only be pointers when required based on the validity of the zero value, they should always have `omitempty`. - "ssatags" # Ensure lists have a listType tag. diff --git a/hack/kube-api-linter/kube-api-linter.yaml b/hack/kube-api-linter/kube-api-linter.yaml index 2ce454912be..fe60a59f59b 100644 --- a/hack/kube-api-linter/kube-api-linter.yaml +++ b/hack/kube-api-linter/kube-api-linter.yaml @@ -16,7 +16,7 @@ linters: - "nonullable" # Ensure fields are not marked as nullable. # - "nophase" # Ensure field names do not have the word "phase" in them. - "notimestamp" # Ensure fields are not named "timestamp", prefer "time". - # - "optionalfields" # Ensure fields marked optional have omitempty and pointers. + - "optionalfields" # Ensure fields marked optional have omitempty and pointers. - "optionalorrequired" # Every field should be marked as `+optional` xor `+required`. # - "requiredfields" # Required fields should only be pointers when required based on the validity of the zero value, they should always have `omitempty`. - "ssatags" # Ensure lists have a listType tag. From c0c06c9ac6c51c17b96739a7fcd4a19be6e2cf0e Mon Sep 17 00:00:00 2001 From: pranshul gupta Date: Wed, 26 Nov 2025 11:10:05 +0530 Subject: [PATCH 2/4] lint: Enable optionalfields rule in KAL with mass exclusion --- hack/golangci-hints.yaml | 4 ++++ hack/golangci.yaml | 4 ++++ hack/kube-api-linter/exceptions.yaml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/hack/golangci-hints.yaml b/hack/golangci-hints.yaml index c588a33586a..cd9d1116ba5 100644 --- a/hack/golangci-hints.yaml +++ b/hack/golangci-hints.yaml @@ -161,6 +161,10 @@ linters: path: "staging/src/k8s.io/api/events/(v1|v1beta1)/types.go" - text: 'notimestamp: naming convention "notimestamp": field AllocationResult.AllocationTimestamp: prefer use of the term ''time'' over ''timestamp''' path: "staging/src/k8s.io/api/resource/(v1|v1beta1|v1beta2)/types.go" + # optionalfields - Ignore optionalfields issues for existing API group + # TODO: For each existing API group, we aim to remove it over time. + - text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." + path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. diff --git a/hack/golangci.yaml b/hack/golangci.yaml index 36ecfd27915..9780e90a41b 100644 --- a/hack/golangci.yaml +++ b/hack/golangci.yaml @@ -176,6 +176,10 @@ linters: path: "staging/src/k8s.io/api/events/(v1|v1beta1)/types.go" - text: 'notimestamp: naming convention "notimestamp": field AllocationResult.AllocationTimestamp: prefer use of the term ''time'' over ''timestamp''' path: "staging/src/k8s.io/api/resource/(v1|v1beta1|v1beta2)/types.go" + # optionalfields - Ignore optionalfields issues for existing API group + # TODO: For each existing API group, we aim to remove it over time. + - text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." + path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. diff --git a/hack/kube-api-linter/exceptions.yaml b/hack/kube-api-linter/exceptions.yaml index fe2705e5e93..4f297d76cb1 100644 --- a/hack/kube-api-linter/exceptions.yaml +++ b/hack/kube-api-linter/exceptions.yaml @@ -37,6 +37,10 @@ path: "staging/src/k8s.io/api/events/(v1|v1beta1)/types.go" - text: 'notimestamp: naming convention "notimestamp": field AllocationResult.AllocationTimestamp: prefer use of the term ''time'' over ''timestamp''' path: "staging/src/k8s.io/api/resource/(v1|v1beta1|v1beta2)/types.go" +# optionalfields - Ignore optionalfields issues for existing API group +# TODO: For each existing API group, we aim to remove it over time. +- text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." + path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. From 1c6365cda0f2511bdfa5d7d939e171ce056d5761 Mon Sep 17 00:00:00 2001 From: pranshul gupta Date: Mon, 22 Dec 2025 22:57:03 +0530 Subject: [PATCH 3/4] lint: add granular exception for apiserverinternal Demonstrates the 1:1 migration strategy by enabling the 'apiserverinternal' API group and adding a specific exception for StorageVersionCondition. --- hack/golangci-hints.yaml | 4 +++- hack/golangci.yaml | 4 +++- hack/kube-api-linter/exceptions.yaml | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hack/golangci-hints.yaml b/hack/golangci-hints.yaml index cd9d1116ba5..22bff4e97be 100644 --- a/hack/golangci-hints.yaml +++ b/hack/golangci-hints.yaml @@ -164,7 +164,9 @@ linters: # optionalfields - Ignore optionalfields issues for existing API group # TODO: For each existing API group, we aim to remove it over time. - text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." - path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" + path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" + - text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. diff --git a/hack/golangci.yaml b/hack/golangci.yaml index 9780e90a41b..3cf7e8508a0 100644 --- a/hack/golangci.yaml +++ b/hack/golangci.yaml @@ -179,7 +179,9 @@ linters: # optionalfields - Ignore optionalfields issues for existing API group # TODO: For each existing API group, we aim to remove it over time. - text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." - path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" + path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" + - text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. diff --git a/hack/kube-api-linter/exceptions.yaml b/hack/kube-api-linter/exceptions.yaml index 4f297d76cb1..fa01aab831b 100644 --- a/hack/kube-api-linter/exceptions.yaml +++ b/hack/kube-api-linter/exceptions.yaml @@ -40,7 +40,9 @@ # optionalfields - Ignore optionalfields issues for existing API group # TODO: For each existing API group, we aim to remove it over time. - text: "optionalfields: field .* should (?:be a pointer|have the omitempty tag)\\." - path: "staging/src/k8s.io/api/(admission|admissionregistration|apiserverinternal|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" + path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" +- text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. From 10f7c34c1642512d02995cd3b03635e356c003cd Mon Sep 17 00:00:00 2001 From: pranshul gupta Date: Fri, 27 Feb 2026 09:00:07 +0530 Subject: [PATCH 4/4] added exceptions for StorageVersion.Spec , StorageVersion.Status , StorageVersionCondition.LastTransitionTime to be a pointer and StorageVersion.Spec and StorageVersion.Status to have omitempty tag --- hack/golangci-hints.yaml | 11 ++++++++++- hack/golangci.yaml | 11 ++++++++++- hack/kube-api-linter/exceptions.yaml | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/hack/golangci-hints.yaml b/hack/golangci-hints.yaml index 22bff4e97be..022417c7887 100644 --- a/hack/golangci-hints.yaml +++ b/hack/golangci-hints.yaml @@ -167,7 +167,16 @@ linters: path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" - text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" - + - text: "optionalfields: field StorageVersion.Spec should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Status should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersionCondition.LastTransitionTime should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Spec should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Status should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. # This is incorrect, but cannot be changed without breaking changes. diff --git a/hack/golangci.yaml b/hack/golangci.yaml index 3cf7e8508a0..29166908c59 100644 --- a/hack/golangci.yaml +++ b/hack/golangci.yaml @@ -182,7 +182,16 @@ linters: path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" - text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" - + - text: "optionalfields: field StorageVersion.Spec should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Status should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersionCondition.LastTransitionTime should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Spec should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" + - text: "optionalfields: field StorageVersion.Status should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. # This is incorrect, but cannot be changed without breaking changes. diff --git a/hack/kube-api-linter/exceptions.yaml b/hack/kube-api-linter/exceptions.yaml index fa01aab831b..0bed59d7c63 100644 --- a/hack/kube-api-linter/exceptions.yaml +++ b/hack/kube-api-linter/exceptions.yaml @@ -43,7 +43,16 @@ path: "staging/src/k8s.io/api/(admission|admissionregistration|apps|authentication|authorization|autoscaling|batch|certificates|coordination|core|discovery|events|extensions|flowcontrol|imagepolicy|networking|node|policy|rbac|resource|scheduling|storage|storagemigration)" - text: "optionalfields: field StorageVersionCondition.ObservedGeneration should be a pointer." path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" - +- text: "optionalfields: field StorageVersion.Spec should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" +- text: "optionalfields: field StorageVersion.Status should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" +- text: "optionalfields: field StorageVersionCondition.LastTransitionTime should be a pointer." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" +- text: "optionalfields: field StorageVersion.Spec should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" +- text: "optionalfields: field StorageVersion.Status should have the omitempty tag." + path: "staging/src/k8s.io/api/apiserverinternal/v1alpha1/types.go" # Pre-existing issues from the conflictmarkers linter # The Error field in some older API types is marked as both optional and required. # This is incorrect, but cannot be changed without breaking changes.