diff --git a/api/internal/plugins/fnplugin/fnplugin.go b/api/internal/plugins/fnplugin/fnplugin.go index 89063d7d0..1b163e1f9 100644 --- a/api/internal/plugins/fnplugin/fnplugin.go +++ b/api/internal/plugins/fnplugin/fnplugin.go @@ -6,7 +6,7 @@ package fnplugin import ( "bytes" "fmt" - "log" + //"log" "strconv" "github.com/pkg/errors" @@ -17,22 +17,22 @@ import ( "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/yaml" - kyaml "sigs.k8s.io/kustomize/kyaml/yaml" "sigs.k8s.io/kustomize/kyaml/kio" + kyaml "sigs.k8s.io/kustomize/kyaml/yaml" - "sigs.k8s.io/kustomize/kyaml/runfn" "sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil" + "sigs.k8s.io/kustomize/kyaml/runfn" ) const ( - idAnnotation = "kustomize.config.k8s.io/id" - HashAnnotation = "kustomize.config.k8s.io/needs-hash" - BehaviorAnnotation = "kustomize.config.k8s.io/behavior" + idAnnotation = "kustomize.config.k8s.io/id" + HashAnnotation = "kustomize.config.k8s.io/needs-hash" + BehaviorAnnotation = "kustomize.config.k8s.io/behavior" ) type FnPlugin struct { // Function runner - RunFns runfn.RunFns + runFns runfn.RunFns // Plugin configuration data. cfg []byte @@ -42,11 +42,11 @@ type FnPlugin struct { } func bytesToRNode(yml []byte) (*kyaml.RNode, error) { - rnode, err := kyaml.Parse(string(yml)) - if err != nil { - return nil, err - } - return rnode, nil + rnode, err := kyaml.Parse(string(yml)) + if err != nil { + return nil, err + } + return rnode, nil } func resourceToRNode(res *resource.Resource) (*kyaml.RNode, error) { @@ -81,10 +81,10 @@ func toStorageMounts(mounts []string) []runtimeutil.StorageMount { } func NewFnPlugin(o *types.FnPluginLoadingOptions) *FnPlugin { - log.Printf("options: %v\n", o) + //log.Printf("options: %v\n", o) return &FnPlugin{ - RunFns: runfn.RunFns{ - Functions: []*kyaml.RNode{}, + runFns: runfn.RunFns{ + Functions: []*kyaml.RNode{}, Network: o.Network, NetworkName: o.NetworkName, EnableStarlark: o.EnableStar, @@ -101,14 +101,6 @@ func (p *FnPlugin) Cfg() []byte { func (p *FnPlugin) Config(h *resmap.PluginHelpers, config []byte) error { p.h = h p.cfg = config - - rnode, err := bytesToRNode(config) - if err != nil { - return err - } - - p.RunFns.Functions = append(p.RunFns.Functions, rnode) - return nil } @@ -149,30 +141,50 @@ func (p *FnPlugin) Transform(rm resmap.ResMap) error { // invokePlugin uses Function runner to run function as plugin func (p *FnPlugin) invokePlugin(input []byte) ([]byte, error) { + // get config rnode + rnode, err := bytesToRNode(p.cfg) + if err != nil { + return nil, err + } + err = rnode.PipeE(kyaml.SetAnnotation("config.kubernetes.io/local-config", "true")) + if err != nil { + return nil, err + } + + // we need to add config as input for generators. Some of them don't work with FunctionConfig + // and in addition kio.Pipeline won't create anything if there are no objects + // see https://github.com/kubernetes-sigs/kustomize/blob/master/kyaml/kio/kio.go#L93 + if input == nil { + yaml, err := rnode.String() + if err != nil { + return nil, err + } + input = []byte(yaml) + } + // Transform to ResourceList var inOut bytes.Buffer inIn := bytes.NewReader(input) - - err := kio.Pipeline{ - Inputs: []kio.Reader{&kio.ByteReader{Reader: inIn}}, + err = kio.Pipeline{ + Inputs: []kio.Reader{&kio.ByteReader{Reader: inIn}}, Outputs: []kio.Writer{kio.ByteWriter{ Writer: &inOut, WrappingKind: kio.ResourceListKind, - WrappingAPIVersion: kio.ResourceListAPIVersion,}}, + WrappingAPIVersion: kio.ResourceListAPIVersion}}, }.Execute() if err != nil { return nil, errors.Wrap( - err, "couldn't transform to ResourceList") + err, "couldn't transform to ResourceList") } - //log.Printf("converted to:\n%s\n", inOut.String()) - // Execute Fn (it's configured - see Config()) + // Configure and Execute Fn var runFnsOut bytes.Buffer - p.RunFns.Input = bytes.NewReader(inOut.Bytes()) - p.RunFns.Output = &runFnsOut + p.runFns.Input = bytes.NewReader(inOut.Bytes()) + p.runFns.Functions = append(p.runFns.Functions, rnode) + p.runFns.Output = &runFnsOut - err = p.RunFns.Execute() + err = p.runFns.Execute() if err != nil { return nil, errors.Wrap( err, "couln't execute function") @@ -186,7 +198,7 @@ func (p *FnPlugin) invokePlugin(input []byte) ([]byte, error) { err = kio.Pipeline{ Inputs: []kio.Reader{&kio.ByteReader{Reader: outIn}}, - Outputs: []kio.Writer{kio.ByteWriter{Writer: &outOut}}, + Outputs: []kio.Writer{kio.ByteWriter{Writer: &outOut}}, }.Execute() if err != nil { return nil, errors.Wrap( diff --git a/api/internal/plugins/loader/loader.go b/api/internal/plugins/loader/loader.go index 25cb12ebf..393f665f9 100644 --- a/api/internal/plugins/loader/loader.go +++ b/api/internal/plugins/loader/loader.go @@ -16,7 +16,7 @@ import ( "sigs.k8s.io/kustomize/api/ifc" "sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers" "sigs.k8s.io/kustomize/api/internal/plugins/execplugin" - "sigs.k8s.io/kustomize/api/internal/plugins/fnplugin" + "sigs.k8s.io/kustomize/api/internal/plugins/fnplugin" "sigs.k8s.io/kustomize/api/internal/plugins/utils" "sigs.k8s.io/kustomize/api/konfig" "sigs.k8s.io/kustomize/api/resid" diff --git a/api/types/pluginconfig.go b/api/types/pluginconfig.go index 9b48c6771..2756f9826 100644 --- a/api/types/pluginconfig.go +++ b/api/types/pluginconfig.go @@ -30,6 +30,6 @@ type PluginConfig struct { // BpLoadingOptions distinguishes builtin plugin behaviors. BpLoadingOptions BuiltinPluginLoadingOptions - // FnpLoadingOpeions sets the way function-based plugin behaviors. + // FnpLoadingOptions sets the way function-based plugin behaviors. FnpLoadingOptions FnPluginLoadingOptions } diff --git a/api/types/pluginrestrictions.go b/api/types/pluginrestrictions.go index 81478a8da..f5588baa4 100644 --- a/api/types/pluginrestrictions.go +++ b/api/types/pluginrestrictions.go @@ -45,12 +45,12 @@ const ( // FnPluginLoadingOptions set way functions-based pluing are restricted type FnPluginLoadingOptions struct { // Allow to run executables - EnableExec bool + EnableExec bool // Allow to run starlark - EnableStar bool + EnableStar bool // Allow container access to network - Network bool - NetworkName string + Network bool + NetworkName string // list of mounts - Mounts []string + Mounts []string } diff --git a/kustomize/internal/commands/build/build.go b/kustomize/internal/commands/build/build.go index 76219b8ef..b83b48b32 100644 --- a/kustomize/internal/commands/build/build.go +++ b/kustomize/internal/commands/build/build.go @@ -76,7 +76,7 @@ func NewCmdBuild(out io.Writer) *cobra.Command { "output", "o", "", "If specified, write the build output to this path.") cmd.Flags().BoolVar( - &o.fnOptions.EnableExec, "enable-exec", false /*do not change!*/, + &o.fnOptions.EnableExec, "enable-exec", false, /*do not change!*/ "enable support for exec functions -- note: exec functions run arbitrary code -- do not use for untrusted configs!!! (Alpha)") cmd.Flags().BoolVar( &o.fnOptions.EnableStar, "enable-star", false,