Skip to content

Commit 6c3100b

Browse files
committed
Move linters config validation into intialization
1 parent a057db4 commit 6c3100b

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

pkg/analysis/registry.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,6 @@ type Registry interface {
5757
// InitializeLinters returns a set of newly initialized linters based on the
5858
// provided configuration.
5959
InitializeLinters(config.Linters, config.LintersConfig) ([]*analysis.Analyzer, error)
60-
61-
// ValidateLintersConfig validates the provided linters config
62-
// against the set or registered linters.
63-
ValidateLintersConfig(config.Linters, config.LintersConfig, *field.Path) field.ErrorList
6460
}
6561

6662
type registry struct {
@@ -120,6 +116,10 @@ func (r *registry) AllLinters() sets.Set[string] {
120116

121117
// InitializeLinters returns a list of initialized linters based on the provided config.
122118
func (r *registry) InitializeLinters(cfg config.Linters, lintersCfg config.LintersConfig) ([]*analysis.Analyzer, error) {
119+
if errs := r.validateLintersConfig(cfg, lintersCfg, field.NewPath("lintersConfig")); len(errs) > 0 {
120+
return nil, fmt.Errorf("error validating linters config: %w", errs.ToAggregate())
121+
}
122+
123123
analyzers := []*analysis.Analyzer{}
124124
errs := []error{}
125125

@@ -147,9 +147,9 @@ func (r *registry) InitializeLinters(cfg config.Linters, lintersCfg config.Linte
147147
return analyzers, kerrors.NewAggregate(errs)
148148
}
149149

150-
// ValidateLintersConfig validates the provided linters config
150+
// validateLintersConfig validates the provided linters config
151151
// against the set or registered linters.
152-
func (r *registry) ValidateLintersConfig(cfg config.Linters, lintersCfg config.LintersConfig, fieldPath *field.Path) field.ErrorList {
152+
func (r *registry) validateLintersConfig(cfg config.Linters, lintersCfg config.LintersConfig, fieldPath *field.Path) field.ErrorList {
153153
fieldErrors := field.ErrorList{}
154154
validatedLinters := sets.New[string]()
155155

pkg/analysis/registry_test.go

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
goanalysis "golang.org/x/tools/go/analysis"
2424
"k8s.io/apimachinery/pkg/util/sets"
25-
"k8s.io/apimachinery/pkg/util/validation/field"
2625

2726
"sigs.k8s.io/kube-api-linter/pkg/analysis"
2827
"sigs.k8s.io/kube-api-linter/pkg/analysis/jsontags"
@@ -142,20 +141,20 @@ var _ = Describe("Registry", func() {
142141
)
143142
})
144143

145-
Context("ValidateLintersConfig", func() {
144+
Context("Config validation", func() {
146145
type validateLintersConfigTableInput struct {
147146
linters config.Linters
148147
config config.LintersConfig
149148
expectedErr string
150149
}
151150

152-
DescribeTable("Validate Linters Configuration", func(in validateLintersConfigTableInput) {
151+
DescribeTable("Validate Linters Configuration through Initialization", func(in validateLintersConfigTableInput) {
153152
r := analysis.NewRegistry()
154-
errs := r.ValidateLintersConfig(in.linters, in.config, field.NewPath("lintersConfig"))
153+
_, err := r.InitializeLinters(in.linters, in.config)
155154
if len(in.expectedErr) > 0 {
156-
Expect(errs.ToAggregate()).To(MatchError(in.expectedErr))
155+
Expect(err).To(MatchError(in.expectedErr))
157156
} else {
158-
Expect(errs).To(HaveLen(0), "No errors were expected")
157+
Expect(err).To(Not(HaveOccurred()), "No errors were expected")
159158
}
160159
},
161160
Entry("Empty config", validateLintersConfigTableInput{
@@ -178,7 +177,7 @@ var _ = Describe("Registry", func() {
178177
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*",
179178
}),
180179
},
181-
expectedErr: "lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
180+
expectedErr: "error validating linters config: lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
182181
}),
183182
Entry("With a valid JSONTagsConfig JSONTagRegex (legacy field name)", validateLintersConfigTableInput{
184183
linters: config.Linters{},
@@ -194,9 +193,43 @@ var _ = Describe("Registry", func() {
194193
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*",
195194
}),
196195
},
197-
expectedErr: "lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
196+
expectedErr: "error validating linters config: lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
198197
}),
199198

199+
Entry("With a valid OptionalOrRequiredConfig (legacy field name)", validateLintersConfigTableInput{
200+
config: config.LintersConfig{
201+
"optionalorrequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
202+
PreferredOptionalMarker: markers.OptionalMarker,
203+
PreferredRequiredMarker: markers.RequiredMarker,
204+
}),
205+
},
206+
expectedErr: "",
207+
}),
208+
Entry("With kubebuilder preferred markers (legacy field name)", validateLintersConfigTableInput{
209+
config: config.LintersConfig{
210+
"optionalorrequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
211+
PreferredOptionalMarker: markers.KubebuilderOptionalMarker,
212+
PreferredRequiredMarker: markers.KubebuilderRequiredMarker,
213+
}),
214+
},
215+
expectedErr: "",
216+
}),
217+
Entry("With invalid preferred optional marker (legacy field name)", validateLintersConfigTableInput{
218+
config: config.LintersConfig{
219+
"optionalorrequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
220+
PreferredOptionalMarker: "invalid",
221+
}),
222+
},
223+
expectedErr: "error validating linters config: lintersConfig.optionalorrequired.preferredOptionalMarker: Invalid value: \"invalid\": invalid value, must be one of \"optional\", \"kubebuilder:validation:Optional\" or omitted",
224+
}),
225+
Entry("With invalid preferred required marker (legacy field name)", validateLintersConfigTableInput{
226+
config: config.LintersConfig{
227+
"optionalorrequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
228+
PreferredRequiredMarker: "invalid",
229+
}),
230+
},
231+
expectedErr: "error validating linters config: lintersConfig.optionalorrequired.preferredRequiredMarker: Invalid value: \"invalid\": invalid value, must be one of \"required\", \"kubebuilder:validation:Required\" or omitted",
232+
}),
200233
Entry("With a valid OptionalOrRequiredConfig (legacy field name)", validateLintersConfigTableInput{
201234
config: config.LintersConfig{
202235
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
@@ -221,15 +254,15 @@ var _ = Describe("Registry", func() {
221254
PreferredOptionalMarker: "invalid",
222255
}),
223256
},
224-
expectedErr: "lintersConfig.optionalorrequired.preferredOptionalMarker: Invalid value: \"invalid\": invalid value, must be one of \"optional\", \"kubebuilder:validation:Optional\" or omitted",
257+
expectedErr: "error validating linters config: lintersConfig.optionalorrequired.preferredOptionalMarker: Invalid value: \"invalid\": invalid value, must be one of \"optional\", \"kubebuilder:validation:Optional\" or omitted",
225258
}),
226259
Entry("With invalid preferred required marker (legacy field name)", validateLintersConfigTableInput{
227260
config: config.LintersConfig{
228261
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
229262
PreferredRequiredMarker: "invalid",
230263
}),
231264
},
232-
expectedErr: "lintersConfig.optionalorrequired.preferredRequiredMarker: Invalid value: \"invalid\": invalid value, must be one of \"required\", \"kubebuilder:validation:Required\" or omitted",
265+
expectedErr: "error validating linters config: lintersConfig.optionalorrequired.preferredRequiredMarker: Invalid value: \"invalid\": invalid value, must be one of \"required\", \"kubebuilder:validation:Required\" or omitted",
233266
}),
234267
)
235268
})

pkg/validation/config.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package validation
1717

1818
import (
1919
"k8s.io/apimachinery/pkg/util/validation/field"
20-
"sigs.k8s.io/kube-api-linter/pkg/analysis"
2120
"sigs.k8s.io/kube-api-linter/pkg/config"
2221
)
2322

@@ -31,7 +30,6 @@ func ValidateGolangCIConfig(g config.GolangCIConfig, fldPath *field.Path) error
3130
var fieldErrors field.ErrorList
3231

3332
fieldErrors = append(fieldErrors, ValidateLinters(g.Linters, fldPath.Child("linters"))...)
34-
fieldErrors = append(fieldErrors, analysis.NewRegistry().ValidateLintersConfig(g.Linters, g.LintersConfig, fldPath.Child("lintersConfig"))...)
3533

3634
return fieldErrors.ToAggregate()
3735
}

0 commit comments

Comments
 (0)