Skip to content

Handle the dynamic Kustomize overlay in memory #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions kustomize/data_source_kustomization_overlay.go
Original file line number Diff line number Diff line change
Expand Up @@ -665,22 +665,25 @@ func refuseExistingKustomization(fSys filesys.FileSystem) error {
func kustomizationOverlay(d *schema.ResourceData, m interface{}) error {
k := getKustomization(d)

fSys := filesys.MakeFsOnDisk()

var b bytes.Buffer
ye := yaml.NewEncoder(io.Writer(&b))
ye.Encode(k)
ye.Close()
data, _ := ioutil.ReadAll(io.Reader(&b))

fSys := makeOverlayFS(
filesys.MakeFsInMemory(),
filesys.MakeFsOnDisk(),
)

// error if the current working directory is already a Kustomization
err := refuseExistingKustomization(fSys)
if err != nil {
return err
}

fSys.WriteFile("Kustomization", data)
defer fSys.RemoveAll("Kustomization")
fSys.WriteFile(KFILENAME, data)
defer fSys.RemoveAll(KFILENAME)

rm, err := runKustomizeBuild(fSys, ".")
if err != nil {
Expand Down
120 changes: 120 additions & 0 deletions kustomize/data_source_kustomization_overlay_fs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package kustomize

import (
"fmt"
"path/filepath"
"strings"

"sigs.k8s.io/kustomize/api/filesys"
)

var KFILENAME string = "Kustomization"

var _ filesys.FileSystem = overlayFileSystem{}

type overlayFileSystem struct {
upper filesys.FileSystem
lower filesys.FileSystem
}

// When two kustmization_overlay data sources are defined in the same root module the shared
// file system prevents parallel execution.
// This filesys.FileSystem implementation solves this by handling the dynamic Kustomization in memory.
func makeOverlayFS(upper filesys.FileSystem, lower filesys.FileSystem) filesys.FileSystem {
return overlayFileSystem{
upper: upper,
lower: lower,
}
}

func (ofs overlayFileSystem) Create(name string) (filesys.File, error) {
return ofs.upper.Create(name)
}

func (ofs overlayFileSystem) Mkdir(name string) error {
return ofs.upper.Mkdir(name)
}

func (ofs overlayFileSystem) MkdirAll(name string) error {
return ofs.upper.MkdirAll(name)
}

func (ofs overlayFileSystem) RemoveAll(name string) error {
return ofs.upper.RemoveAll(name)
}

func (ofs overlayFileSystem) Open(name string) (filesys.File, error) {
of, err := ofs.lower.Open(name)

if err != nil {
return ofs.upper.Open(name)
}

return of, err
}

func (ofs overlayFileSystem) CleanedAbs(path string) (filesys.ConfirmedDir, string, error) {
cd, n, err := ofs.lower.CleanedAbs(path)

if err != nil && strings.HasSuffix(path, KFILENAME) {
cd, _, err = ofs.lower.CleanedAbs(".")
return cd, KFILENAME, err
}

return cd, n, err
}

func (ofs overlayFileSystem) Exists(name string) bool {
onDisk := ofs.lower.Exists(name)

if onDisk == false {
return ofs.upper.Exists(name)
}

return onDisk
}

func (ofs overlayFileSystem) Glob(pattern string) ([]string, error) {
lfs, err := ofs.lower.Glob(pattern)
if err != nil {
return lfs, err
}

// Glob only errors if the pattern is invalid
ufs, _ := ofs.lower.Glob(pattern)

return append(lfs, ufs...), nil

}

func (ofs overlayFileSystem) IsDir(name string) bool {
exl := ofs.lower.IsDir(name)

if exl == false {
return ofs.upper.IsDir(name)
}

return exl
}

func (ofs overlayFileSystem) ReadFile(name string) ([]byte, error) {
d, err := ofs.lower.ReadFile(name)

if err != nil && strings.HasSuffix(name, KFILENAME) {
return ofs.upper.ReadFile(KFILENAME)
}

return d, err
}

func (ofs overlayFileSystem) WriteFile(name string, c []byte) error {
if ofs.lower.Exists(name) {
return fmt.Errorf("OverlayFS: %q already exists in lower FS.", name)
}

return ofs.upper.WriteFile(name, c)
}

func (ofs overlayFileSystem) Walk(path string, walkFn filepath.WalkFunc) error {
return ofs.lower.Walk(path, walkFn)
}
Loading