You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/linters.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -486,11 +486,11 @@ According to Kubernetes API conventions, numeric fields should have bounds check
486
486
487
487
This linter ensures that:
488
488
- Numeric fields have both `+kubebuilder:validation:Minimum` and `+kubebuilder:validation:Maximum` markers
489
-
- K8s declarative validation markers (`+k8s:minimum` and `+k8s:maximum`) are also supported
490
-
- Bounds values are within the type's valid range:
491
-
- int32: full int32 range (±2^31-1)
492
-
- int64: JavaScript-safe range (±2^53-1) per Kubernetes API conventions
493
-
- float32/float64: within their respective ranges
489
+
- K8s declarative validation markers (`+k8s:minimum` and `+k8s:maximum`) are also supported
490
+
- Bounds values are validated:
491
+
- int32: within int32 range (±2^31-1)
492
+
- int64: within JavaScript-safe range (±2^53-1) per K8s API conventions for JSON compatibility
493
+
- float32/float64: marker values are valid (within type ranges)
494
494
495
495
**Note:** While `+k8s:minimum` is documented in the official Kubernetes declarative validation spec, `+k8s:maximum` is not yet officially documented but is supported by this linter for forward compatibility and consistency.
// Kubernetes API conventions enforce JavaScript-safe bounds for int64 (±2^53-1)
191
-
// to ensure compatibility with JavaScript clients
192
-
ifminimum<float64(minSafeInt64) {
193
-
pass.Reportf(field.Pos(), "%s has minimum bound %v that is outside the JavaScript-safe int64 range [%d, %d]. Consider using a string type to avoid precision loss in JavaScript clients", prefix, minimum, int64(minSafeInt64), int64(maxSafeInt64))
194
-
}
195
-
196
-
ifmaximum>float64(maxSafeInt64) {
197
-
pass.Reportf(field.Pos(), "%s has maximum bound %v that is outside the JavaScript-safe int64 range [%d, %d]. Consider using a string type to avoid precision loss in JavaScript clients", prefix, maximum, int64(minSafeInt64), int64(maxSafeInt64))
198
-
}
205
+
// K8s API conventions enforce JavaScript-safe bounds for int64 (±2^53-1)
// InvalidInt32NoBounds should have bounds markers
25
-
typeInvalidInt32NoBoundsstruct {
26
-
NoBoundsint32// want "field NoBounds is missing minimum bounds validation marker" "field NoBounds is missing maximum bounds validation marker"
24
+
// InvalidInt32NoBound should have bounds markers
25
+
typeInvalidInt32NoBoundstruct {
26
+
NoBoundint32// want "field NoBound is missing minimum bound validation marker" "field NoBound is missing maximum bound validation marker"
27
27
}
28
28
29
-
// InvalidInt64NoBounds should have bounds markers
30
-
typeInvalidInt64NoBoundsstruct {
31
-
NoBoundsint64// want "field NoBounds is missing minimum bounds validation marker" "field NoBounds is missing maximum bounds validation marker"
29
+
// InvalidInt64NoBound should have bounds markers
30
+
typeInvalidInt64NoBoundstruct {
31
+
NoBoundint64// want "field NoBound is missing minimum bound validation marker" "field NoBound is missing maximum bound validation marker"
32
32
}
33
33
34
34
// InvalidInt32OnlyMin should have maximum marker
35
35
typeInvalidInt32OnlyMinstruct {
36
36
// +kubebuilder:validation:Minimum=0
37
-
OnlyMinint32// want "field OnlyMin is missing maximum bounds validation marker"
37
+
OnlyMinint32// want "field OnlyMin is missing maximum bound validation marker"
38
38
}
39
39
40
40
// InvalidInt32OnlyMax should have minimum marker
41
41
typeInvalidInt32OnlyMaxstruct {
42
42
// +kubebuilder:validation:Maximum=100
43
-
OnlyMaxint32// want "field OnlyMax is missing minimum bounds validation marker"
43
+
OnlyMaxint32// want "field OnlyMax is missing minimum bound validation marker"
44
44
}
45
45
46
46
// InvalidInt64OnlyMin should have maximum marker
47
47
typeInvalidInt64OnlyMinstruct {
48
48
// +kubebuilder:validation:Minimum=0
49
-
OnlyMinint64// want "field OnlyMin is missing maximum bounds validation marker"
49
+
OnlyMinint64// want "field OnlyMin is missing maximum bound validation marker"
50
50
}
51
51
52
52
// InvalidInt64OnlyMax should have minimum marker
53
53
typeInvalidInt64OnlyMaxstruct {
54
54
// +kubebuilder:validation:Maximum=100
55
-
OnlyMaxint64// want "field OnlyMax is missing minimum bounds validation marker"
55
+
OnlyMaxint64// want "field OnlyMax is missing minimum bound validation marker"
56
56
}
57
57
58
58
// InvalidInt64ExceedsJSMaxBounds has maximum that exceeds JavaScript safe integer range
@@ -102,12 +102,12 @@ type ValidFloat32WithBounds struct {
102
102
103
103
// InvalidFloat64NoBounds should have bounds markers
104
104
typeInvalidFloat64NoBoundsstruct {
105
-
Valuefloat64// want "field Value is missing minimum bounds validation marker" "field Value is missing maximum bounds validation marker"
105
+
Valuefloat64// want "field Value is missing minimum bound validation marker" "field Value is missing maximum bound validation marker"
106
106
}
107
107
108
108
// InvalidFloat32NoBounds should have bounds markers
109
109
typeInvalidFloat32NoBoundsstruct {
110
-
Ratiofloat32// want "field Ratio is missing minimum bounds validation marker" "field Ratio is missing maximum bounds validation marker"
110
+
Ratiofloat32// want "field Ratio is missing minimum bound validation marker" "field Ratio is missing maximum bound validation marker"
111
111
}
112
112
113
113
// MixedFields has both valid and invalid fields
@@ -116,15 +116,15 @@ type MixedFields struct {
116
116
// +kubebuilder:validation:Maximum=100
117
117
ValidCountint32
118
118
119
-
InvalidCountint32// want "field InvalidCount is missing minimum bounds validation marker" "field InvalidCount is missing maximum bounds validation marker"
119
+
InvalidCountint32// want "field InvalidCount is missing minimum bound validation marker" "field InvalidCount is missing maximum bound validation marker"
120
120
121
121
Namestring
122
122
123
123
// +kubebuilder:validation:Minimum=0
124
124
// +kubebuilder:validation:Maximum=1000
125
125
ValidValueint64
126
126
127
-
InvalidValueint64// want "field InvalidValue is missing minimum bounds validation marker" "field InvalidValue is missing maximum bounds validation marker"
127
+
InvalidValueint64// want "field InvalidValue is missing minimum bound validation marker" "field InvalidValue is missing maximum bound validation marker"
128
128
}
129
129
130
130
// PointerFields with pointers should also be checked
@@ -133,18 +133,18 @@ type PointerFields struct {
133
133
// +kubebuilder:validation:Maximum=100
134
134
ValidPointerWithBounds*int32
135
135
136
-
InvalidPointer*int32// want "field InvalidPointer pointer is missing minimum bounds validation marker" "field InvalidPointer pointer is missing maximum bounds validation marker"
136
+
InvalidPointer*int32// want "field InvalidPointer pointer is missing minimum bound validation marker" "field InvalidPointer pointer is missing maximum bound validation marker"
137
137
138
-
InvalidPointer64*int64// want "field InvalidPointer64 pointer is missing minimum bounds validation marker" "field InvalidPointer64 pointer is missing maximum bounds validation marker"
138
+
InvalidPointer64*int64// want "field InvalidPointer64 pointer is missing minimum bound validation marker" "field InvalidPointer64 pointer is missing maximum bound validation marker"
139
139
}
140
140
141
141
// SliceFields with slices should check the element type
142
142
typeSliceFieldsstruct {
143
143
ValidSlice []string
144
144
145
-
InvalidSlice []int32// want "field InvalidSlice array element is missing minimum bounds validation marker" "field InvalidSlice array element is missing maximum bounds validation marker"
145
+
InvalidSlice []int32// want "field InvalidSlice array element type of int32 is missing minimum bound validation marker" "field InvalidSlice array element type of int32 is missing maximum bound validation marker"
146
146
147
-
InvalidSlice64 []int64// want "field InvalidSlice64 array element is missing minimum bounds validation marker" "field InvalidSlice64 array element is missing maximum bounds validation marker"
147
+
InvalidSlice64 []int64// want "field InvalidSlice64 array element type of int64 is missing minimum bound validation marker" "field InvalidSlice64 array element type of int64 is missing maximum bound validation marker"
148
148
149
149
// +kubebuilder:validation:items:Minimum=0
150
150
// +kubebuilder:validation:items:Maximum=100
@@ -179,13 +179,13 @@ type TypeAliasFields struct {
179
179
// +kubebuilder:validation:Maximum=100
180
180
ValidAliasInt32Alias
181
181
182
-
InvalidAliasInt32Alias// want "field InvalidAlias type Int32Alias is missing minimum bounds validation marker" "field InvalidAlias type Int32Alias is missing maximum bounds validation marker"
182
+
InvalidAliasInt32Alias// want "field InvalidAlias type Int32Alias is missing minimum bound validation marker" "field InvalidAlias type Int32Alias is missing maximum bound validation marker"
183
183
184
-
InvalidAlias64Int64Alias// want "field InvalidAlias64 type Int64Alias is missing minimum bounds validation marker" "field InvalidAlias64 type Int64Alias is missing maximum bounds validation marker"
184
+
InvalidAlias64Int64Alias// want "field InvalidAlias64 type Int64Alias is missing minimum bound validation marker" "field InvalidAlias64 type Int64Alias is missing maximum bound validation marker"
185
185
186
-
InvalidAliasFloat32Float32Alias// want "field InvalidAliasFloat32 type Float32Alias is missing minimum bounds validation marker" "field InvalidAliasFloat32 type Float32Alias is missing maximum bounds validation marker"
186
+
InvalidAliasFloat32Float32Alias// want "field InvalidAliasFloat32 type Float32Alias is missing minimum bound validation marker" "field InvalidAliasFloat32 type Float32Alias is missing maximum bound validation marker"
187
187
188
-
InvalidAliasFloat64Float64Alias// want "field InvalidAliasFloat64 type Float64Alias is missing minimum bounds validation marker" "field InvalidAliasFloat64 type Float64Alias is missing maximum bounds validation marker"
188
+
InvalidAliasFloat64Float64Alias// want "field InvalidAliasFloat64 type Float64Alias is missing minimum bound validation marker" "field InvalidAliasFloat64 type Float64Alias is missing maximum bound validation marker"
189
189
190
190
// Valid: bounds are on the type alias itself
191
191
ValidBoundedAliasBoundedInt32Alias
@@ -199,10 +199,10 @@ type TypeAliasFields struct {
199
199
200
200
// PointerSliceFields with pointer slices should also be checked
201
201
typePointerSliceFieldsstruct {
202
-
InvalidPointerSlice []*int32// want "field InvalidPointerSlice array element pointer is missing minimum bounds validation marker" "field InvalidPointerSlice array element pointer is missing maximum bounds validation marker"
202
+
InvalidPointerSlice []*int32// want "field InvalidPointerSlice array element type of int32 is missing minimum bound validation marker" "field InvalidPointerSlice array element type of int32 is missing maximum bound validation marker"
203
203
}
204
204
205
-
// K8sDeclarativeValidation with k8s declarative validation markers should work
205
+
// K8sDeclarativeValidation with k8s declarative validation markers
206
206
typeK8sDeclarativeValidationstruct {
207
207
// +k8s:minimum=0
208
208
// +k8s:maximum=100
@@ -217,7 +217,7 @@ type K8sDeclarativeValidation struct {
217
217
typeInvalidInt32BoundsOutOfRangestruct {
218
218
// +kubebuilder:validation:Minimum=-3000000000
219
219
// +kubebuilder:validation:Maximum=3000000000
220
-
OutOfRangeint32// want "field OutOfRange has minimum bound -3e\\+09 that is outside the valid int32 range" "field OutOfRange has maximum bound 3e\\+09 that is outside the valid int32 range"
220
+
OutOfRangeint32// want "field OutOfRange has minimum bound -3e\\+09 that is outside the int32 range \\[-2147483648, 2147483647\\]" "field OutOfRange has maximum bound 3e\\+09 that is outside the int32 range \\[-2147483648, 2147483647\\]"
221
221
}
222
222
223
223
// MixedMarkersKubebuilderAndK8s can use either kubebuilder or k8s markers
0 commit comments