Skip to content

Commit

Permalink
Update FunctionRunner Interface (kptdev#2714)
Browse files Browse the repository at this point in the history
And make names more consistent.
  • Loading branch information
martinmaly committed Feb 18, 2022
1 parent 11ffa0b commit 0892fd0
Show file tree
Hide file tree
Showing 11 changed files with 155 additions and 130 deletions.
14 changes: 14 additions & 0 deletions internal/util/pathutil/pathutil.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pathutil

import (
Expand Down
12 changes: 6 additions & 6 deletions internal/util/render/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ type Renderer struct {
// PkgPath is the absolute path to the root package
PkgPath string

// Evaluator evaluates the function, if specified, this can override the default
// Runner evaluates the function, if specified, this can override the default
// kpt function evaluator
Evaluator fn.Evaluator
Runner fn.FunctionRunner

// ResultsDirPath is absolute path to the directory to write results
ResultsDirPath string
Expand Down Expand Up @@ -90,7 +90,7 @@ func (e *Renderer) Execute(ctx context.Context) error {
imagePullPolicy: e.ImagePullPolicy,
allowExec: e.AllowExec,
fileSystem: e.FileSystem,
evaluator: e.Evaluator,
evaluator: e.Runner,
}

if _, err = hydrate(ctx, root, hctx); err != nil {
Expand Down Expand Up @@ -205,7 +205,7 @@ type hydrationContext struct {

fileSystem filesys.FileSystem

evaluator fn.Evaluator
evaluator fn.FunctionRunner
}

//
Expand Down Expand Up @@ -486,7 +486,7 @@ func (pn *pkgNode) runValidators(ctx context.Context, hctx *hydrationContext, in
hctx.dockerCheckDone = true
}
if hctx.evaluator != nil {
validator, err = hctx.evaluator.NewRunner(ctx, &function, fn.EvalOptions{ResultList: hctx.fnResults})
validator, err = hctx.evaluator.NewRunner(ctx, &function, fn.RunnerOptions{ResultList: hctx.fnResults})
} else {
validator, err = fnruntime.NewRunner(ctx, &function, pn.pkg.UniquePath, hctx.fnResults, hctx.imagePullPolicy, displayResourceCount)
}
Expand Down Expand Up @@ -604,7 +604,7 @@ func fnChain(ctx context.Context, hctx *hydrationContext, pkgPath types.UniquePa
hctx.dockerCheckDone = true
}
if hctx.evaluator != nil {
runner, err = hctx.evaluator.NewRunner(ctx, &function, fn.EvalOptions{ResultList: hctx.fnResults})
runner, err = hctx.evaluator.NewRunner(ctx, &function, fn.RunnerOptions{ResultList: hctx.fnResults})
} else {
runner, err = fnruntime.NewRunner(ctx, &function, pkgPath, hctx.fnResults, hctx.imagePullPolicy, displayResourceCount)
}
Expand Down
8 changes: 3 additions & 5 deletions pkg/fn/eval.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,14 @@ import (

fnresult "github.com/GoogleContainerTools/kpt/pkg/api/fnresult/v1"
v1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
"sigs.k8s.io/kustomize/kyaml/filesys"
"sigs.k8s.io/kustomize/kyaml/kio"
)

type EvalOptions struct {
type RunnerOptions struct {
// ResultList stores the result of the function evaluation
ResultList *fnresult.ResultList
}

type Evaluator interface {
Eval(ctx context.Context, pkg filesys.FileSystem, fn v1.Function, opts EvalOptions) error
NewRunner(ctx context.Context, fn *v1.Function, opts EvalOptions) (kio.Filter, error)
type FunctionRunner interface {
NewRunner(ctx context.Context, fn *v1.Function, opts RunnerOptions) (kio.Filter, error)
}
2 changes: 1 addition & 1 deletion pkg/fn/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (
)

type RenderOptions struct {
Eval Evaluator
Runner FunctionRunner
PkgPath string
}

Expand Down
2 changes: 1 addition & 1 deletion porch/engine/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ require (
github.com/GoogleContainerTools/kpt/porch/controllers v0.0.0-00010101000000-000000000000
github.com/GoogleContainerTools/kpt/porch/repository v0.0.0-00010101000000-000000000000
k8s.io/klog/v2 v2.40.1
sigs.k8s.io/kustomize/api v0.8.11
sigs.k8s.io/kustomize/kyaml v0.13.1
)

Expand Down Expand Up @@ -93,7 +94,6 @@ require (
k8s.io/kubectl v0.22.2 // indirect
k8s.io/utils v0.0.0-20211208161948-7d6a63dca704 // indirect
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
sigs.k8s.io/kustomize/api v0.8.11 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
60 changes: 43 additions & 17 deletions porch/engine/pkg/engine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@ import (
"reflect"
"strings"

fnresultv1 "github.com/GoogleContainerTools/kpt/pkg/api/fnresult/v1"
v1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
"github.com/GoogleContainerTools/kpt/pkg/fn"
api "github.com/GoogleContainerTools/kpt/porch/api/porch/v1alpha1"
configapi "github.com/GoogleContainerTools/kpt/porch/controllers/pkg/apis/porch/v1alpha1"
"github.com/GoogleContainerTools/kpt/porch/engine/pkg/kpt"
"github.com/GoogleContainerTools/kpt/porch/repository/pkg/cache"
"github.com/GoogleContainerTools/kpt/porch/repository/pkg/repository"
"sigs.k8s.io/kustomize/api/filesys"
"sigs.k8s.io/kustomize/kyaml/kio"
)

type CaDEngine interface {
Expand All @@ -44,16 +47,16 @@ type CaDEngine interface {

func NewCaDEngine(cache *cache.Cache) (CaDEngine, error) {
return &cadEngine{
cache: cache,
renderer: kpt.NewPlaceholderRenderer(),
evaluator: kpt.NewPlaceholderEvaluator(),
cache: cache,
renderer: kpt.NewPlaceholderRenderer(),
runner: kpt.NewPlaceholderFunctionRunner(),
}, nil
}

type cadEngine struct {
cache *cache.Cache
renderer fn.Renderer
evaluator fn.Evaluator
cache *cache.Cache
renderer fn.Renderer
runner fn.FunctionRunner
}

var _ CaDEngine = &cadEngine{}
Expand Down Expand Up @@ -101,8 +104,8 @@ func (cad *cadEngine) CreatePackageRevision(ctx context.Context, repositoryObj *
return nil, fmt.Errorf("eval not set for task of type %q", task.Type)
}
mutations = append(mutations, &evalFunctionMutation{
evaluator: cad.evaluator,
task: task,
runner: cad.runner,
task: task,
})

default:
Expand All @@ -112,8 +115,8 @@ func (cad *cadEngine) CreatePackageRevision(ctx context.Context, repositoryObj *

// Render package after creation.
mutations = append(mutations, &renderPackageMutation{
renderer: cad.renderer,
evaluator: cad.evaluator,
renderer: cad.renderer,
runner: cad.runner,
})

baseResources := repository.PackageResources{}
Expand Down Expand Up @@ -164,8 +167,8 @@ func (cad *cadEngine) UpdatePackageRevision(ctx context.Context, repositoryObj *
}

mutations = append(mutations, &renderPackageMutation{
renderer: cad.renderer,
evaluator: cad.evaluator,
renderer: cad.renderer,
runner: cad.runner,
})

draft, err := repo.UpdatePackage(ctx, oldPackage)
Expand Down Expand Up @@ -340,8 +343,8 @@ func loadResourcesFromDirectory(dir string) (repository.PackageResources, error)
}

type evalFunctionMutation struct {
evaluator fn.Evaluator
task *api.Task
runner fn.FunctionRunner
task *api.Task
}

func (m *evalFunctionMutation) Apply(ctx context.Context, resources repository.PackageResources) (repository.PackageResources, *api.Task, error) {
Expand All @@ -353,12 +356,35 @@ func (m *evalFunctionMutation) Apply(ctx context.Context, resources repository.P
return repository.PackageResources{}, nil, err
}

if err := m.evaluator.Eval(ctx, fs, v1.Function{
results := fnresultv1.ResultList{}
filter, err := m.runner.NewRunner(ctx, &v1.Function{
Image: e.Image,
ConfigMap: e.ConfigMap,
Selectors: []v1.Selector{},
}, fn.EvalOptions{}); err != nil {
return repository.PackageResources{}, nil, err
}, fn.RunnerOptions{
ResultList: &results,
})
if err != nil {
return repository.PackageResources{}, nil, fmt.Errorf("failed to create function runner: %w", err)
}

rw := &kio.LocalPackageReadWriter{
PackagePath: "/", // TODO: Populate with the package directory.
IncludeSubpackages: true,
FileSystem: filesys.FileSystemOrOnDisk{
FileSystem: fs,
},
}

pipeline := kio.Pipeline{
Inputs: []kio.Reader{rw},
Filters: []kio.Filter{filter},
Outputs: []kio.Writer{rw},
ContinueOnEmptyResult: false,
}

if err := pipeline.Execute(); err != nil {
return repository.PackageResources{}, nil, fmt.Errorf("failed to evaluate function: %w", err)
}

result, err := readResources(fs)
Expand Down
6 changes: 3 additions & 3 deletions porch/engine/pkg/engine/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import (
)

type renderPackageMutation struct {
renderer fn.Renderer
evaluator fn.Evaluator
renderer fn.Renderer
runner fn.FunctionRunner
}

var _ mutation = &renderPackageMutation{}
Expand All @@ -42,7 +42,7 @@ func (m *renderPackageMutation) Apply(ctx context.Context, resources repository.
}

if err := m.renderer.Render(ctx, fs, fn.RenderOptions{
Eval: m.evaluator,
Runner: m.runner,
}); err != nil {
return repository.PackageResources{}, nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions porch/engine/pkg/engine/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import (

func TestRender(t *testing.T) {
render := &renderPackageMutation{
renderer: kpt.NewPlaceholderRenderer(),
evaluator: kpt.NewPlaceholderEvaluator(),
renderer: kpt.NewPlaceholderRenderer(),
runner: kpt.NewPlaceholderFunctionRunner(),
}

const path = "bucket.yaml"
Expand Down
70 changes: 1 addition & 69 deletions porch/engine/pkg/internal/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,88 +15,20 @@
package internal

import (
"context"
"fmt"

v1 "github.com/GoogleContainerTools/kpt/pkg/api/kptfile/v1"
"github.com/GoogleContainerTools/kpt/pkg/fn"
"sigs.k8s.io/kustomize/kyaml/filesys"
"sigs.k8s.io/kustomize/kyaml/fn/framework"
"sigs.k8s.io/kustomize/kyaml/kio"
"sigs.k8s.io/kustomize/kyaml/yaml"
)

var functions map[string]framework.ResourceListProcessorFunc = map[string]framework.ResourceListProcessorFunc{
"gcr.io/kpt-fn/set-labels:v0.1.5": setLabels,
}

func Eval(ctx context.Context, pkg filesys.FileSystem, fn v1.Function, opts fn.EvalOptions) error {
rw := &kio.LocalPackageReadWriter{
IncludeSubpackages: true,
PackagePath: "/",
FileSystem: filesys.FileSystemOrOnDisk{
FileSystem: pkg,
},
}

rl := framework.ResourceList{}

if fn.ConfigMap != nil {
if cm, err := NewConfigMap(fn.ConfigMap); err != nil {
return err
} else {
rl.FunctionConfig = cm
}
}

// Read input
if items, err := rw.Read(); err != nil {
return fmt.Errorf("failed to read fn eval input: %w", err)
} else {
rl.Items = items
}

if err := eval(fn.Image, &rl); err != nil {
return fmt.Errorf("function evaluation failed; %w", err)
}

// Return error on error
if rl.Results.ExitCode() != 0 {
return rl.Results
}

// Write Output
if err := rw.Write(rl.Items); err != nil {
return fmt.Errorf("failed to write fn eval output: %w", err)
}

return nil
}

func eval(image string, rl *framework.ResourceList) error {
func Eval(image string, rl *framework.ResourceList) error {
// Evaluate
if f, ok := functions[image]; ok {
return f(rl)
} else {
return fmt.Errorf("unsupported kpt function %q", image)
}
}

func NewConfigMap(data map[string]string) (*yaml.RNode, error) {
node := yaml.NewMapRNode(&data)
if node == nil {
return nil, nil
}
// create a ConfigMap only for configMap config
configMap := yaml.MustParse(`
apiVersion: v1
kind: ConfigMap
metadata:
name: function-input
data: {}
`)
if err := configMap.PipeE(yaml.SetField("data", node)); err != nil {
return nil, err
}
return configMap, nil
}
Loading

0 comments on commit 0892fd0

Please sign in to comment.