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  }