Files
kustomize/kyaml/fn/framework/pkger.go
Phillip Wittrock 736f110f04 Fn framework template and process options
- Refactor framework code to be simpler
- Add TemplatesFn feature
- Add PreProcessFilters feature
- Add PostProcessFilters features
- Add TemplatesFromDir
- Add PatchTemplatesFromDir
- Add PatchContainerTemplatesFromDir
2020-11-30 08:23:34 -08:00

155 lines
3.6 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package framework
import (
"io/ioutil"
"os"
"path"
"strings"
"text/template"
"github.com/markbates/pkger"
)
type TemplatesFn func(*ResourceList) ([]*template.Template, error)
// TemplatesFromDir applies a directory of templates as generated resources.
func TemplatesFromDir(dirs ...pkger.Dir) TemplatesFn {
return func(_ *ResourceList) ([]*template.Template, error) {
var pt []*template.Template
for i := range dirs {
d := dirs[i]
err := pkger.Walk(string(d), func(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !strings.HasSuffix(info.Name(), ".template.yaml") {
return nil
}
name := path.Join(string(d), info.Name())
f, err := pkger.Open(name)
if err != nil {
return err
}
b, err := ioutil.ReadAll(f)
if err != nil {
return err
}
t, err := template.New(info.Name()).Parse(string(b))
if err != nil {
return err
}
pt = append(pt, t)
return nil
})
if err != nil {
return nil, err
}
}
return pt, nil
}
}
// PatchTemplatesFn returns a slice of PatchTemplate
type PatchTemplatesFn func(*ResourceList) ([]PatchTemplate, error)
// PT applies a directory of patches using the Selector
type PT struct {
Selector func() *Selector
Dir pkger.Dir
}
// PatchTemplatesFromDir applies a directory of templates as patches.
func PatchTemplatesFromDir(templates ...PT) PatchTemplatesFn {
return func(*ResourceList) ([]PatchTemplate, error) {
var pt []PatchTemplate
for i := range templates {
v := templates[i]
err := pkger.Walk(string(v.Dir), func(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}
name := path.Join(string(v.Dir), info.Name())
if !strings.HasSuffix(info.Name(), ".template.yaml") {
return nil
}
f, err := pkger.Open(name)
if err != nil {
return err
}
b, err := ioutil.ReadAll(f)
if err != nil {
return err
}
t, err := template.New(info.Name()).Parse(string(b))
if err != nil {
return err
}
pt = append(pt, PatchTemplate{Template: t, Selector: v.Selector()})
return nil
})
if err != nil {
return nil, err
}
}
return pt, nil
}
}
// ContainerPatchTemplateFn returns a slice of ContainerPatchTemplate
type ContainerPatchTemplateFn func(*ResourceList) ([]ContainerPatchTemplate, error)
// CPT applies a directory of container patches using the Selector
type CPT struct {
Selector func() *Selector
Dir pkger.Dir
Names []string
}
// ContainerPatchTemplatesFromDir applies a directory of templates as container patches.
func ContainerPatchTemplatesFromDir(templates ...CPT) ContainerPatchTemplateFn {
return func(*ResourceList) ([]ContainerPatchTemplate, error) {
var cpt []ContainerPatchTemplate
for i := range templates {
v := templates[i]
err := pkger.Walk(string(v.Dir), func(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !strings.HasSuffix(info.Name(), ".template.yaml") {
return nil
}
name := path.Join(string(v.Dir), info.Name())
f, err := pkger.Open(name)
if err != nil {
return err
}
b, err := ioutil.ReadAll(f)
if err != nil {
return err
}
t, err := template.New(info.Name()).Parse(string(b))
if err != nil {
return err
}
cpt = append(cpt, ContainerPatchTemplate{
PatchTemplate: PatchTemplate{Template: t, Selector: v.Selector()},
ContainerNames: v.Names,
})
return nil
})
if err != nil {
return nil, err
}
}
return cpt, nil
}
}