@@ -37,9 +37,13 @@ const (
37
37
defaultSpecExt = ".yaml"
38
38
)
39
39
40
+ type validator interface {
41
+ Validate (* cdi.Spec ) error
42
+ }
43
+
40
44
var (
41
45
// Externally set CDI Spec validation function.
42
- specValidator func ( * cdi. Spec ) error
46
+ specValidator validator
43
47
validatorLock sync.RWMutex
44
48
)
45
49
@@ -236,6 +240,9 @@ func (s *Spec) validate() (map[string]*Device, error) {
236
240
}
237
241
devices [d .Name ] = dev
238
242
}
243
+ if len (devices ) == 0 {
244
+ return nil , fmt .Errorf ("invalid spec, no devices" )
245
+ }
239
246
240
247
return devices , nil
241
248
}
@@ -253,10 +260,10 @@ func ParseSpec(data []byte) (*cdi.Spec, error) {
253
260
// SetSpecValidator sets a CDI Spec validator function. This function
254
261
// is used for extra CDI Spec content validation whenever a Spec file
255
262
// loaded (using ReadSpec() or written (using WriteSpec()).
256
- func SetSpecValidator (fn func ( * cdi. Spec ) error ) {
263
+ func SetSpecValidator (v validator ) {
257
264
validatorLock .Lock ()
258
265
defer validatorLock .Unlock ()
259
- specValidator = fn
266
+ specValidator = v
260
267
}
261
268
262
269
// validateSpec validates the Spec using the external validator.
@@ -267,7 +274,7 @@ func validateSpec(raw *cdi.Spec) error {
267
274
if specValidator == nil {
268
275
return nil
269
276
}
270
- err := specValidator (raw )
277
+ err := specValidator . Validate (raw )
271
278
if err != nil {
272
279
return fmt .Errorf ("Spec validation failed: %w" , err )
273
280
}
0 commit comments