...

Source file src/edge-infra.dev/pkg/k8s/eyaml/filesys/filesystem.go

Documentation: edge-infra.dev/pkg/k8s/eyaml/filesys

     1  // Package filesys implements helpers for converting various filesystems to
     2  // Kustomize / kyaml filesystems.
     3  package filesys
     4  
     5  import (
     6  	"embed"
     7  	"fmt"
     8  	"io/fs"
     9  	"path/filepath"
    10  
    11  	"sigs.k8s.io/kustomize/kyaml/filesys"
    12  )
    13  
    14  // ConvertEmbeddedFSToKustomizeFS performs a walk from the root of the provided
    15  // embed.FS and copies the file tree into an in-memory Kustomize FileSystem,
    16  // allowing the use of Kustomize APIs (build, etc) against embedded manifests.
    17  func ConvertEmbeddedFSToKustomizeFS(efs embed.FS) (filesys.FileSystem, error) {
    18  	return ConvertEmbeddedFSToKustomizeFSDir(efs, "")
    19  }
    20  
    21  func ConvertEmbeddedFSToKustomizeFSDir(efs embed.FS, dir string) (filesys.FileSystem, error) {
    22  	fsys := filesys.MakeFsInMemory()
    23  	return ConvertEmbeddedFSToKustomizeFSExisting(efs, fsys, dir)
    24  }
    25  
    26  func ConvertEmbeddedFSToKustomizeFSExisting(efs embed.FS, fsys filesys.FileSystem, dir string) (filesys.FileSystem, error) {
    27  	err := fs.WalkDir(efs, ".", func(path string, d fs.DirEntry, walkErr error) error {
    28  		// this shouldn't happe because we are traversing an embedded file system
    29  		// from the root, but per io/fs we should handle this error explicitly
    30  		if walkErr != nil {
    31  			return fmt.Errorf("encountered a walk error: %w", walkErr)
    32  		}
    33  
    34  		if d.IsDir() {
    35  			return fsys.Mkdir(filepath.Join(dir, path))
    36  		}
    37  
    38  		return writeEmbeddedFileToKustomizeFS(efs, fsys, path, dir)
    39  	})
    40  	if err != nil {
    41  		return nil, fmt.Errorf("failed to convert embedded file system to in-memory kustomize file system: %w", err)
    42  	}
    43  
    44  	return fsys, nil
    45  }
    46  
    47  func writeEmbeddedFileToKustomizeFS(efs embed.FS, kfs filesys.FileSystem, path, dir string) error {
    48  	data, err := efs.ReadFile(path)
    49  	if err != nil {
    50  		return fmt.Errorf("failed to read path %s from embedded file system: %w", path, err)
    51  	}
    52  
    53  	if err := kfs.WriteFile(filepath.Join(dir, path), data); err != nil {
    54  		return fmt.Errorf("failed to write path %s to in-memory kustomize file system: %w", path, err)
    55  	}
    56  	return nil
    57  }
    58  

View as plain text