ci: add kube-api-linter and exclude current findings (#416)

Part of #207, following the plan discussed there with @juli4n and
@kannon92: plumbing plus the non invasive fixes first, with the existing
invasive findings excluded so new APIs do not regress (as @kannon92
suggested in
https://github.com/agent-substrate/substrate/issues/207#issuecomment-4921051580).
The linter itself was originally suggested by @BenTheElder in #188.

Plumbing:
- hack/tools/kube-api-linter module with the
golangci-lint-kube-api-linter tool, same pattern as the other tools.
- .golangci-kal.yaml config. The pre-existing findings from rules that
need Go API changes (nomaps, nonpointerstructs, nophase, optionalfields,
requiredfields, ssatags) are excluded rather than disabled, and each
exclusion rule names the fields it excuses, so the rules still apply to
new API files and to new fields on the existing types. Fixing them on
the existing types is the follow up in #207.
- hack/verify/kube-api-linter.sh runs it against ./pkg/api/... and is
picked up by hack/verify-all.sh in CI.

Fixes in pkg/api/v1alpha1 (doc and marker only, no Go API change):
- commentstart: field godocs now start with the serialized field name.
- conditions: Conditions moved to the first position in
ActorTemplateStatus and got the listType, listMapKey and patch markers.
- defaultorrequired: SandboxConfigSpec.SandboxClass had both a default
and required; now optional with omitempty, matching the same field on
WorkerPoolSpec and ActorTemplateSpec. The ValidatingAdmissionPolicy in
sandboxconfig-validation.yaml is unaffected since CRD defaulting runs
before admission, so spec.sandboxClass is always set by then.
- optionalorrequired: missing +optional markers added on
ActorTemplateStatus fields.
- defaults: configured preferredDefaultMarker to kubebuilder:default
since CRDs are generated with controller-gen.

Generated CRDs regenerated. Structural schema changes are only the
conditions listType/listMapKey and sandboxClass no longer in the
required list (it is defaulted, so behavior is the same); the rest is
description text.

Note: my earlier count of 50 issues in #207 was capped by the default
golangci-lint issue limit. With the cap removed the real total is 86;
the extra ones are requiredfields (20) and ssatags (4), both in the
excluded set above.

Test plan
- hack/verify/kube-api-linter.sh passes (0 issues).
- Exclusions verified both ways: dropping them brings the pre-existing
findings back, and a scratch field added to WorkerPoolSpec is still
reported (optionalfields), which the earlier per-file exclusion
swallowed.
- TestSandboxConfigValidation passes against the regenerated CRD.
- go build ./... and go test ./pkg/api/... ./cmd/atecontroller/... pass.
- gofmt, shellcheck and the regular golangci-lint on pkg/api are clean.
This commit is contained in:
Mesut Oezdil
2026-08-29 14:14:55 -07:00
committed by GitHub
parent e1adb33147
commit f936206dd5
5 changed files with 1427 additions and 0 deletions
+169
View File
@@ -0,0 +1,169 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Config for kube-api-linter (github.com/kubernetes-sigs/kube-api-linter),
# run by hack/verify/kube-api-linter.sh against the API types in pkg/api/.
# It is a separate file from .golangci.yaml because the kubeapilinter module
# plugin only exists in the golangci-lint-kube-api-linter binary, not in the
# regular golangci-lint one.
version: "2"
linters:
default: none
enable:
- kubeapilinter
settings:
custom:
kubeapilinter:
type: module
description: Kubernetes API conventions linter.
settings:
# The enabled set below is the default set of the pinned linter
# version, spelled out so the enforced rules are visible here.
linters:
enable:
- "arrayofstruct" # Structs in arrays need at least one required field, to avoid ambiguous YAML.
- "commentstart" # Field godocs must start with the serialized field name.
- "conditions" # Conditions fields need the correct json tags and markers.
- "defaultorrequired" # A field cannot have both a default and be required.
- "defaults" # Default markers must use the preferred form (see lintersConfig).
- "duplicatemarkers" # No exact duplicate markers on types and fields.
- "integers" # Only int32 and int64 for integers.
- "jsontags" # Every field needs a json tag.
- "nodurations" # No Duration types.
- "nofloats" # No float types.
- "nomaps" # No map types (string-to-string maps allowed), use lists with a unique key.
- "nonpointerstructs" # Non-pointer struct fields with no required fields must be optional.
- "nonullable" # No nullable marker.
- "nophase" # No phase fields, use conditions instead.
- "noreferences" # Field names should use Ref rather than Reference.
- "notimestamp" # No Timestamp fields, use Time.
- "optionalfields" # Optional fields must be pointers/omitempty where appropriate.
- "optionalorrequired" # Every field must be marked +optional or +required.
- "requiredfields" # Required fields must not be pointers or have omitempty.
- "ssatags" # Array fields need listType markers for Server-Side Apply.
- "uniquemarkers" # Single-definition markers must not repeat.
# Everything not listed above stays off until evaluated.
disable:
- "*"
lintersConfig:
conditions:
# CRD types are neither protobuf-serialized nor patched by
# strategic merge, the two settings the linter docs call out
# for CRD-based types.
useProtobuf: Ignore
usePatchStrategy: Ignore
defaults:
# CRDs are generated with controller-gen, which reads
# +kubebuilder:default.
preferredDefaultMarker: kubebuilder:default
exclusions:
rules:
# TEMPORARY: every current commentstart, conditions, defaultorrequired,
# optionalorrequired and defaults finding, excluded file-wide so this
# PR only introduces the tool with no content changes, per review on
# #416. A follow-up PR removes these and fixes the findings by class.
- path: 'pkg/api/v1alpha1/.*_types\.go'
text: '^commentstart:'
- path: 'pkg/api/v1alpha1/.*_types\.go'
text: '^conditions:'
- path: 'pkg/api/v1alpha1/.*_types\.go'
text: '^defaultorrequired:'
- path: 'pkg/api/v1alpha1/.*_types\.go'
text: '^optionalorrequired:'
- path: 'pkg/api/v1alpha1/.*_types\.go'
text: '^defaults:'
# Pre-existing findings from rules that require Go API changes
# (pointer fields, omitempty/omitzero tags, map-to-list refactors)
# on the existing v1alpha1 types. Each rule names the fields it
# excuses, so a field added to one of these types is still checked.
# Fixing these on the existing types is tracked in issue #207.
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(noreferences|requiredfields): .*\bImageVolumeSource\.Reference\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bActorMetadataItem\.(Field|Path)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(requiredfields|ssatags): .*\bActorMetadataDataSource\.Items\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bTrustBundleDataSource\.(Name|Path)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^ssatags: .*\bSystemInfoVolumeSource\.DataSources\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^nomaps: .*\bContainerResourceList\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^optionalfields: .*\bContainerReadyz\.TimeoutSeconds\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bEnvVar\.Value\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^optionalfields: .*\bOnResumeConfig\.FromData\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^optionalfields: .*\bSnapshotsConfig\.OnResume\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^ssatags: .*\bActorTemplateStatus\.Conditions\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bExternalVolumeTemplate\.(Capacity|StorageClassName)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bVolume\.Name\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bVolumeMount\.(MountPath|Name)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(requiredfields|ssatags): .*\bContainer\.(Env|Image|Name|VolumeMounts)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bContainerReadyz\.HTTPGet\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(optionalfields|requiredfields): .*\bHTTPGetAction\.(Path|Port)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bEnvVar\.Name\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^requiredfields: .*\bSecretKeySelector\.(Key|Name)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(optionalfields|requiredfields): .*\bSnapshotsConfig\.(Location|OnCommit|OnPause)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(optionalfields|requiredfields|ssatags): .*\bActorTemplateSpec\.(Containers|PauseImage|SandboxClass|SnapshotsConfig|Volumes)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(nophase|optionalfields): .*\bActorTemplateStatus\.(GoldenActorID|GoldenSnapshot|Phase|TakeGoldenSnapshotAt)\b'
- path: 'pkg/api/v1alpha1/actortemplate_types\.go'
text: '^(optionalfields|requiredfields): .*\bActorTemplate\.(Spec|Status)\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^requiredfields: .*\bAssetFile\.(SHA256|URL)\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^(nomaps|optionalfields|requiredfields): .*\bSandboxConfigSpec\.(Assets|Default|PauseImage|SandboxClass)\b'
- path: 'pkg/api/v1alpha1/sandboxconfig_types\.go'
text: '^(nonpointerstructs|requiredfields): .*\bSandboxConfig\.Spec\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
text: '^requiredfields: .*\bCSIDriverConfigSpec\.(ControllerEndpoint|DriverName)\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
text: '^optionalfields: .*\bCSIDriverConfigSpec\.NodeSocketOverride\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
text: '^requiredfields: .*\bCSIDriverTLSConfig\.Enabled\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
text: '^optionalfields: .*\bCSIDriverTLSConfig\.(ServerName|UsePodIdentity)\b'
- path: 'pkg/api/v1alpha1/csidriverconfig_types\.go'
text: '^nonpointerstructs: .*\bCSIDriverConfig\.Spec\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^optionalfields: .*\bWorkerPoolPodTemplate\.PriorityClassName\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^(optionalfields|requiredfields): .*\bWorkerPoolSpec\.(Replicas|SandboxClass|SandboxConfigName|WorkerImage)\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^optionalfields: .*\bWorkerPoolStatus\.(ReadyReplicas|Replicas|Selector)\b'
- path: 'pkg/api/v1alpha1/workerpool_types\.go'
text: '^(optionalfields|requiredfields): .*\bWorkerPool\.(Spec|Status)\b'
issues:
max-issues-per-linter: 0
max-same-issues: 0
+3
View File
@@ -35,6 +35,9 @@ case "${TOOL_NAME}" in
"client-gen"|"informer-gen"|"lister-gen"|"validation-gen")
TOOL_DIR="${ROOT}/hack/tools/code-generator"
;;
"golangci-lint-kube-api-linter")
TOOL_DIR="${ROOT}/hack/tools/kube-api-linter"
;;
*)
TOOL_DIR="${ROOT}/hack/tools/${TOOL_NAME}"
;;
+219
View File
@@ -0,0 +1,219 @@
module github.com/agent-substrate/substrate/hack/tools/kube-api-linter
go 1.26.2
tool sigs.k8s.io/kube-api-linter/cmd/golangci-lint-kube-api-linter
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
dev.gaijin.team/go/golib v0.6.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
github.com/Abirdcfly/dupword v0.1.6 // indirect
github.com/AdminBenni/iota-mixing v1.0.0 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
github.com/Antonboom/errname v1.1.1 // indirect
github.com/Antonboom/nilnil v1.1.1 // indirect
github.com/Antonboom/testifylint v1.6.4 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/Djarvur/go-err113 v0.1.1 // indirect
github.com/Masterminds/semver/v3 v3.3.1 // indirect
github.com/MirrexOne/unqueryvet v1.2.1 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/alecthomas/chroma/v2 v2.20.0 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
github.com/alexkohler/prealloc v1.0.0 // indirect
github.com/alfatraining/structtag v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/ashanbrown/forbidigo/v2 v2.1.0 // indirect
github.com/ashanbrown/makezero/v2 v2.0.1 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
github.com/bombsimon/wsl/v5 v5.2.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
github.com/butuzov/ireturn v0.4.0 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.9.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.10 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/curioswitch/go-reassign v0.3.0 // indirect
github.com/daixiang0/gci v0.13.7 // indirect
github.com/dave/dst v0.27.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/ghostiam/protogetter v0.3.16 // indirect
github.com/go-critic/go-critic v0.13.0 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
github.com/go-toolsmith/astfmt v1.1.0 // indirect
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/godoc-lint/godoc-lint v0.10.0 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golangci/asciicheck v0.5.0 // indirect
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golangci-lint/v2 v2.5.0 // indirect
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect
github.com/golangci/misspell v0.7.0 // indirect
github.com/golangci/nilerr v0.0.0-20250918000102-015671e622fe // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/gordonklaus/ineffassign v0.2.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.5.0 // indirect
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jgautheron/goconst v1.8.2 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/julz/importas v0.2.0 // indirect
github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect
github.com/kisielk/errcheck v1.9.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/kulti/thelper v0.7.1 // indirect
github.com/kunwardeep/paralleltest v1.0.14 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
github.com/ldez/exptostd v0.4.4 // indirect
github.com/ldez/gomoddirectives v0.7.0 // indirect
github.com/ldez/grignotin v0.10.1 // indirect
github.com/ldez/tagliatelle v0.7.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
github.com/maratori/testableexamples v1.0.0 // indirect
github.com/maratori/testpackage v1.1.1 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mgechev/revive v1.12.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.21.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/quasilyte/go-ruleguard v0.4.4 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/securego/gosec/v2 v2.22.8 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/sonatard/noctx v0.4.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spf13/afero v1.14.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/cobra v1.10.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/spf13/viper v1.12.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.11.1 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/tetafro/godot v1.5.4 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/uudashr/gocognit v1.2.0 // indirect
github.com/uudashr/iface v1.4.1 // indirect
github.com/xen0n/gosmopolitan v1.3.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.14.0 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
go.augendre.info/arangolint v0.2.0 // indirect
go.augendre.info/fatcontext v0.8.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621 // indirect
golang.org/x/mod v0.28.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.36.0 // indirect
golang.org/x/text v0.29.0 // indirect
golang.org/x/tools v0.37.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.6.1 // indirect
k8s.io/apimachinery v0.32.3 // indirect
k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
mvdan.cc/gofumpt v0.9.1 // indirect
mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
sigs.k8s.io/kube-api-linter v0.0.0-20260518104151-5ebe05f9440b // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit -o nounset -o pipefail
ROOT="$(git rev-parse --show-toplevel)"
cd "${ROOT}"
# Lint the Kubernetes API types against the upstream API conventions.
# Same GOOS=linux override as golangci-lint.sh: analyze the code the same
# way the Linux CI runners do.
BIN="$("${ROOT}"/hack/run-tool.sh --print-bin-path golangci-lint-kube-api-linter)"
exec env GOOS=linux "${BIN}" run --config .golangci-kal.yaml ./pkg/api/... | { grep -v '^0 issues.$' || true; }