// Package filesys implements helpers for converting various filesystems to // Kustomize / kyaml filesystems. package filesys import ( "embed" "fmt" "io/fs" "path/filepath" "sigs.k8s.io/kustomize/kyaml/filesys" ) // ConvertEmbeddedFSToKustomizeFS performs a walk from the root of the provided // embed.FS and copies the file tree into an in-memory Kustomize FileSystem, // allowing the use of Kustomize APIs (build, etc) against embedded manifests. func ConvertEmbeddedFSToKustomizeFS(efs embed.FS) (filesys.FileSystem, error) { return ConvertEmbeddedFSToKustomizeFSDir(efs, "") } func ConvertEmbeddedFSToKustomizeFSDir(efs embed.FS, dir string) (filesys.FileSystem, error) { fsys := filesys.MakeFsInMemory() return ConvertEmbeddedFSToKustomizeFSExisting(efs, fsys, dir) } func ConvertEmbeddedFSToKustomizeFSExisting(efs embed.FS, fsys filesys.FileSystem, dir string) (filesys.FileSystem, error) { err := fs.WalkDir(efs, ".", func(path string, d fs.DirEntry, walkErr error) error { // this shouldn't happe because we are traversing an embedded file system // from the root, but per io/fs we should handle this error explicitly if walkErr != nil { return fmt.Errorf("encountered a walk error: %w", walkErr) } if d.IsDir() { return fsys.Mkdir(filepath.Join(dir, path)) } return writeEmbeddedFileToKustomizeFS(efs, fsys, path, dir) }) if err != nil { return nil, fmt.Errorf("failed to convert embedded file system to in-memory kustomize file system: %w", err) } return fsys, nil } func writeEmbeddedFileToKustomizeFS(efs embed.FS, kfs filesys.FileSystem, path, dir string) error { data, err := efs.ReadFile(path) if err != nil { return fmt.Errorf("failed to read path %s from embedded file system: %w", path, err) } if err := kfs.WriteFile(filepath.Join(dir, path), data); err != nil { return fmt.Errorf("failed to write path %s to in-memory kustomize file system: %w", path, err) } return nil }