github.com/cilium/cilium@v1.16.2/tools/crdcheck/main.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package main 5 6 import ( 7 "fmt" 8 "log" 9 "os" 10 "path/filepath" 11 12 crdv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" 13 "k8s.io/client-go/kubernetes/scheme" 14 ) 15 16 const mandatoryCategory = "cilium" 17 18 type checkCRDFunc func(*crdv1.CustomResourceDefinition) error 19 20 var allChecks = []checkCRDFunc{ 21 checkForCategory, 22 } 23 24 func main() { 25 if len(os.Args) != 2 { 26 log.Fatalf("usage: %s <path>", os.Args[0]) 27 } 28 29 _ = crdv1.AddToScheme(scheme.Scheme) 30 31 if err := filepath.Walk(os.Args[1], func(path string, info os.FileInfo, _ error) error { 32 if info.IsDir() { 33 return nil 34 } 35 36 if ext := filepath.Ext(path); ext != ".yaml" && ext != ".yml" { 37 return nil 38 } 39 40 fileContent, err := os.ReadFile(path) 41 if err != nil { 42 return err 43 } 44 45 obj, _, err := scheme.Codecs.UniversalDeserializer().Decode(fileContent, nil, nil) 46 if err != nil { 47 return err 48 } 49 50 crd, ok := obj.(*crdv1.CustomResourceDefinition) 51 if !ok { 52 return nil 53 } 54 55 for _, f := range allChecks { 56 if err = f(crd); err != nil { 57 return err 58 } 59 } 60 return nil 61 }); err != nil { 62 log.Fatal(err) 63 } 64 } 65 66 func checkForCategory(crd *crdv1.CustomResourceDefinition) error { 67 if len(crd.Spec.Names.Categories) == 0 || !sliceContains(crd.Spec.Names.Categories, mandatoryCategory) { 68 return fmt.Errorf("category %s missing for %s", mandatoryCategory, crd.GetName()) 69 } 70 71 return nil 72 } 73 74 func sliceContains(slice []string, item string) bool { 75 for _, a := range slice { 76 if a == item { 77 return true 78 } 79 } 80 return false 81 }