v2/tools/generator/gen_kustomize.go (90 lines of code) (raw):
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT license.
*/
package main
import (
"os"
"path/filepath"
"github.com/rotisserie/eris"
"github.com/spf13/cobra"
kerrors "k8s.io/apimachinery/pkg/util/errors"
"github.com/Azure/azure-service-operator/v2/tools/generator/internal/kustomization"
)
// NewGenKustomizeCommand creates a new cobra Command when invoked from the command line
func NewGenKustomizeCommand() (*cobra.Command, error) {
cmd := &cobra.Command{
// TODO: there's not great support for required
// TODO: arguments in cobra so this is the best we get... see:
// TODO: https://github.com/spf13/cobra/issues/395
Use: "gen-kustomize <path to config/crd/generated folder>",
Short: "generate K8s Kustomize file in the spirit of Kubebuilder, based on the specified config folder",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
crdPath := args[0]
const bases = "bases"
const patches = "patches"
log := CreateLogger()
// We have an expectation that the folder structure is: .../config/crd/generated/bases and .../config/crd/generated/patches
basesPath := filepath.Join(crdPath, bases)
patchesPath := filepath.Join(crdPath, patches)
destination := filepath.Join(crdPath, "kustomization.yaml")
log.Info(
"Scanning for resources",
"basePath", basesPath)
files, err := os.ReadDir(basesPath)
if err != nil {
log.Error(err, "Unable to scan folder", "folder", basesPath)
return err
}
err = os.MkdirAll(patchesPath, os.ModePerm)
if err != nil {
log.Error(err, "Unable to create output folder", "folder", patchesPath)
return err
}
var errs []error
result := kustomization.NewCRDKustomizeFile()
for _, f := range files {
if f.IsDir() {
continue
}
log.V(1).Info(
"Found resource file",
"file", f.Name())
patchFile := "webhook-conversion-" + f.Name()
var def *kustomization.ResourceDefinition
def, err = kustomization.LoadResourceDefinition(filepath.Join(basesPath, f.Name()))
if err != nil {
errs = append(errs, err)
continue
}
log.V(1).Info(
"Loaded Resource",
"name", def.Name())
patch := kustomization.NewConversionPatchFile(def.Name())
err = patch.Save(filepath.Join(patchesPath, patchFile))
if err != nil {
errs = append(errs, err)
continue
}
result.AddResource(filepath.Join(bases, f.Name()))
result.AddPatch(filepath.Join(patches, patchFile))
}
if len(errs) > 0 {
err = kerrors.NewAggregate(errs)
log.Error(
err,
"Error creating conversion patches")
return err
}
if len(result.Resources) == 0 {
err = eris.Errorf("no files found in %q", basesPath)
log.Error(
err,
"No CRD files found")
return err
}
err = result.Save(destination)
if err != nil {
log.Error(
err,
"Error generating",
"destination", destination)
return err
}
return nil
},
}
return cmd, nil
}