@ -20,20 +20,23 @@ import (
"fmt"
"os"
"path/filepath"
"strings"
"sync"
"sigs.k8s.io/kustomize/api/filesys"
"sigs.k8s.io/kustomize/api/konfig"
"sigs.k8s.io/kustomize/api/krusty"
"sigs.k8s.io/kustomize/api/provider"
kustypes "sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/yaml"
"github.com/fluxcd/pkg/kustomize/filesys"
"github.com/fluxcd/flux2/pkg/manifestgen"
)
// Generate scans the given directory for Kubernetes manifests and creates a kustomization.yaml
// including all discovered manifests as resources.
// Generate scans the given directory for Kubernetes manifests and creates a
// konfig.DefaultKustomizationFileName file, including all discovered manifests
// as resources.
func Generate ( options Options ) ( * manifestgen . Manifest , error ) {
kfile := filepath . Join ( options . TargetPath , konfig . DefaultKustomizationFileName ( ) )
abskfile := filepath . Join ( options . BaseDir , kfile )
@ -50,7 +53,7 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
return nil
}
if info . IsDir ( ) {
// If a sub-directory contains an existing Kustomization file add the
// If a sub-directory contains an existing Kustomization file , add the
// directory as a resource and do not decent into it.
for _ , kfilename := range konfig . RecognizedKustomizationFileNames ( ) {
if options . FileSystem . Exists ( filepath . Join ( path , kfilename ) ) {
@ -88,7 +91,9 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
if err != nil {
return nil , err
}
f . Close ( )
if err = f . Close ( ) ; err != nil {
return nil , err
}
kus := kustypes . Kustomization {
TypeMeta : kustypes . TypeMeta {
@ -128,20 +133,32 @@ func Generate(options Options) (*manifestgen.Manifest, error) {
} , nil
}
// kustomizeBuildMutex is a workaround for a concurrent map read and map write bug.
// TODO(stefan): https://github.com/kubernetes-sigs/kustomize/issues/3659
var kustomizeBuildMutex sync . Mutex
// Build takes a Kustomize overlays and returns the resulting manifests as multi-doc YAML.
// Build takes the path to a directory with a konfig.RecognizedKustomizationFileNames,
// builds it, and returns the resulting manifests as multi-doc YAML.
func Build ( base string ) ( [ ] byte , error ) {
// TODO(stefan): temporary workaround for concurrent map read and map write bug
// https://github.com/kubernetes-sigs/kustomize/issues/3659
kustomizeBuildMutex . Lock ( )
defer kustomizeBuildMutex . Unlock ( )
kfile := filepath . Join ( base , konfig . DefaultKustomizationFileName ( ) )
// TODO(hidde): make this configurable to a specific root (relative to base)
parent := filepath . Dir ( strings . TrimSuffix ( base , string ( filepath . Separator ) ) )
fs , err := filesys . MakeFsOnDiskSecureBuild ( parent )
if err != nil {
return nil , err
}
fs := filesys . MakeFsOnDisk ( )
if ! fs . Exists ( kfile ) {
return nil , fmt . Errorf ( "%s not found" , kfile )
var kfile string
for _ , f := range konfig . RecognizedKustomizationFileNames ( ) {
if kf := filepath . Join ( base , f ) ; fs . Exists ( kf ) {
kfile = kf
break
}
}
if kfile == "" {
return nil , fmt . Errorf ( "%s not found" , konfig . DefaultKustomizationFileName ( ) )
}
// TODO(hidde): work around for a bug in kustomize causing it to