Skip to content

Commit 3e2e7d3

Browse files
committed
Modify functionRunner
1 parent 78748f0 commit 3e2e7d3

File tree

5 files changed

+76
-25
lines changed

5 files changed

+76
-25
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: config.kubernetes.io/v1
2+
kind: ResourceList
3+
items:
4+
- apiVersion: v1
5+
kind: Service
6+
metadata:
7+
name: example
8+
functionConfig:
9+
apiVersion: v1
10+
kind: ConfigMap
11+
metadata:
12+
name: setlabel
13+
data:
14+
owner: kpt
15+
org: google

go/fn/examples/data/setlabels-resourcelist.yaml renamed to go/fn/examples/data/setlabels-customFnConfig.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@ functionConfig:
1010
kind: SetLabels
1111
metadata:
1212
name: setlabel-fn-config
13+
owner: kpt
14+
org: google

go/fn/examples/example_asmain_runner_test.go

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,40 +22,26 @@ import (
2222
var _ fn.Runner = &SetLabels{}
2323

2424
type SetLabels struct {
25-
Labels map[string]string `json:"labels,omitempty"`
25+
Owner string
26+
Org string
2627
}
2728

2829
// Run is the main function logic.
2930
// `ctx` provides easy methods to add info, error or warning result to `ResourceList.Results`.
3031
// `items` is parsed from the STDIN "ResourceList.Items".
3132
// `functionConfig` is from the STDIN "ResourceList.FunctionConfig". The value has been assigned to the r.Labels
3233
// the functionConfig is validated to have kind "SetLabels" and apiVersion "fn.kpt.dev/v1alpha1"
33-
func (r *SetLabels) Run(ctx *fn.Context, functionConfig *fn.KubeObject, items []*fn.KubeObject) {
34+
func (r *SetLabels) Run(ctx *fn.Context, functionConfig *fn.KubeObject, items fn.KubeObjects) {
3435
for _, o := range items {
35-
for k, newLabel := range r.Labels {
36-
o.SetLabel(k, newLabel)
37-
}
36+
o.SetLabel("owner", r.Owner)
37+
o.SetLabel("org", r.Org)
3838
}
3939
ctx.ResultInfo("updated labels", nil)
4040
}
4141

4242
// This example uses a SetLabels object, which implements `Runner.Run` methods.
43-
//
44-
// The input from ./data/setlabels-resourcelist.yaml:
45-
// apiVersion: config.kubernetes.io/v1
46-
// kind: ResourceList
47-
// items:
48-
// - apiVersion: v1
49-
// kind: Service
50-
// metadata:
51-
// name: example
52-
// functionConfig:
53-
// apiVersion: fn.kpt.dev/v1alpha1
54-
// kind: SetLabels
55-
// metadata:
56-
// name: setlabel-fn-config
57-
func Example_asMain() {
58-
file, _ := os.Open("./data/setlabels-resourcelist.yaml")
43+
func Example_asMainCustomFnConfig() {
44+
file, _ := os.Open("./data/setlabels-customFnConfig.yaml")
5945
defer file.Close()
6046
os.Stdin = file
6147

@@ -70,11 +56,48 @@ func Example_asMain() {
7056
// kind: Service
7157
// metadata:
7258
// name: example
59+
// labels:
60+
// owner: kpt
61+
// org: google
7362
// functionConfig:
7463
// apiVersion: fn.kpt.dev/v1alpha1
7564
// kind: SetLabels
7665
// metadata:
7766
// name: setlabel-fn-config
67+
// owner: kpt
68+
// org: google
69+
// results:
70+
// - message: updated labels
71+
// severity: info
72+
}
73+
74+
func Example_asMainConfigMap() {
75+
file, _ := os.Open("./data/setlabels-configmap.yaml")
76+
defer file.Close()
77+
os.Stdin = file
78+
79+
if err := fn.AsMain(&SetLabels{}); err != nil {
80+
os.Exit(1)
81+
}
82+
// Output:
83+
// apiVersion: config.kubernetes.io/v1
84+
// kind: ResourceList
85+
// items:
86+
// - apiVersion: v1
87+
// kind: Service
88+
// metadata:
89+
// name: example
90+
// labels:
91+
// owner: kpt
92+
// org: google
93+
// functionConfig:
94+
// apiVersion: v1
95+
// kind: ConfigMap
96+
// metadata:
97+
// name: setlabel
98+
// data:
99+
// owner: kpt
100+
// org: google
78101
// results:
79102
// - message: updated labels
80103
// severity: info

go/fn/functionrunner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@
1515
package fn
1616

1717
type Runner interface {
18-
Run(context *Context, functionConfig *KubeObject, items []*KubeObject)
18+
Run(context *Context, functionConfig *KubeObject, items KubeObjects)
1919
}

go/fn/runnerProcessor.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package fn
1717
import (
1818
"fmt"
1919
"reflect"
20+
"strings"
2021
)
2122

2223
type runnerProcessor struct {
@@ -39,9 +40,19 @@ func (r *runnerProcessor) config(ctx *Context, o *KubeObject) {
3940
data := o.NestedStringMapOrDie("data")
4041
fnRunnerElem := reflect.ValueOf(r.fnRunner).Elem()
4142
for i := 0; i < fnRunnerElem.NumField(); i++ {
42-
if fnRunnerElem.Field(i).Kind() == reflect.Map {
43-
fnRunnerElem.Field(i).Set(reflect.ValueOf(data))
44-
break
43+
switch fnRunnerElem.Field(i).Kind() {
44+
case reflect.String:
45+
for k, v := range data {
46+
lowerKey := strings.ToLower(k)
47+
if lowerKey == strings.ToLower(fnRunnerElem.Type().Field(i).Name) {
48+
fnRunnerElem.Field(i).SetString(v)
49+
break
50+
}
51+
}
52+
case reflect.Map:
53+
if "data" == strings.ToLower(fnRunnerElem.Type().Field(i).Name) {
54+
fnRunnerElem.Field(i).Set(reflect.ValueOf(data))
55+
}
4556
}
4657
}
4758
case o.IsGVK("fn.kpt.dev", "v1alpha1", fnName):

0 commit comments

Comments
 (0)