Skip to content

Commit 78748f0

Browse files
authored
add methods to allow selection and exclusion of resources by gvk (#581)
1 parent d5df21d commit 78748f0

16 files changed

+921
-144
lines changed

go/fn/examples/const.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414

1515
package example
1616

17+
import "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn"
18+
1719
const (
18-
appsv1 = "apps/v1"
20+
apps = "apps"
21+
v1 = "v1"
1922
)
23+
24+
func hasDesiredGVK(obj *fn.KubeObject) bool {
25+
return obj.IsGVK(apps, v1, "Deployment") || obj.IsGVK(apps, v1, "StatefulSet") ||
26+
obj.IsGVK(apps, v1, "DaemonSet") || obj.IsGVK(apps, v1, "ReplicaSet")
27+
}

go/fn/examples/example_filter_GVK_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,8 @@ func updateReplicas(rl *fn.ResourceList) (bool, error) {
3535
}
3636
var replicas int
3737
rl.FunctionConfig.GetOrDie(&replicas, "replicas")
38-
for i, obj := range rl.Items {
39-
if obj.IsGVK("apps/v1", "Deployment") {
40-
rl.Items[i].SetOrDie(replicas, "spec", "replicas")
41-
}
38+
for i := range rl.Items.Where(fn.IsGVK("apps", "v1", "Deployment")) {
39+
rl.Items[i].SetOrDie(replicas, "spec", "replicas")
4240
}
4341
return true, nil
4442
}

go/fn/examples/example_logger_injector_test.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,28 +39,26 @@ func injectLogger(rl *fn.ResourceList) (bool, error) {
3939
if err := rl.FunctionConfig.As(&li); err != nil {
4040
return false, err
4141
}
42-
for i, obj := range rl.Items {
43-
if obj.IsGVK(appsv1, "Deployment") || obj.IsGVK(appsv1, "StatefulSet") ||
44-
obj.IsGVK(appsv1, "DaemonSet") || obj.IsGVK(appsv1, "ReplicaSet") {
45-
var containers []corev1.Container
46-
obj.GetOrDie(&containers, "spec", "template", "spec", "containers")
47-
foundTargetContainer := false
48-
for j, container := range containers {
49-
if container.Name == li.ContainerName {
50-
containers[j].Image = li.ImageName
51-
foundTargetContainer = true
52-
break
53-
}
42+
for i, obj := range rl.Items.Where(hasDesiredGVK) {
43+
var containers []corev1.Container
44+
obj.GetOrDie(&containers, "spec", "template", "spec", "containers")
45+
foundTargetContainer := false
46+
for j, container := range containers {
47+
if container.Name == li.ContainerName {
48+
containers[j].Image = li.ImageName
49+
foundTargetContainer = true
50+
break
5451
}
55-
if !foundTargetContainer {
56-
c := corev1.Container{
57-
Name: li.ContainerName,
58-
Image: li.ImageName,
59-
}
60-
containers = append(containers, c)
52+
}
53+
if !foundTargetContainer {
54+
c := corev1.Container{
55+
Name: li.ContainerName,
56+
Image: li.ImageName,
6157
}
62-
rl.Items[i].SetOrDie(containers, "spec", "template", "spec", "containers")
58+
containers = append(containers, c)
6359
}
60+
rl.Items[i].SetOrDie(containers, "spec", "template", "spec", "containers")
61+
6462
}
6563
return true, nil
6664
}

go/fn/examples/example_read_field_test.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,24 @@ func Example_aReadField() {
2929
}
3030

3131
func readField(rl *fn.ResourceList) (bool, error) {
32-
for _, obj := range rl.Items {
33-
if obj.IsGVK("apps/v1", "Deployment") {
34-
// Style 1: like using unstrucuted.Unstructured, get/set the value from field paths*
35-
replicas := obj.NestedInt64OrDie("spec", "replicas")
36-
fn.Logf("replicas is %v\n", replicas)
37-
paused := obj.NestedBoolOrDie("spec", "paused")
38-
fn.Logf("paused is %v\n", paused)
39-
// Update strategy from Recreate to RollingUpdate.
40-
if strategy := obj.NestedStringOrDie("spec", "strategy", "type"); strategy == "Recreate" {
41-
obj.SetNestedStringOrDie("RollingUpdate", "spec", "strategy", "type")
42-
}
32+
for _, obj := range rl.Items.Where(fn.IsGVK("apps", "v1", "Deployment")) {
33+
// Style 1: like using unstrucuted.Unstructured, get/set the value from field paths*
34+
replicas := obj.NestedInt64OrDie("spec", "replicas")
35+
fn.Logf("replicas is %v\n", replicas)
36+
paused := obj.NestedBoolOrDie("spec", "paused")
37+
fn.Logf("paused is %v\n", paused)
38+
// Update strategy from Recreate to RollingUpdate.
39+
if strategy := obj.NestedStringOrDie("spec", "strategy", "type"); strategy == "Recreate" {
40+
obj.SetNestedStringOrDie("RollingUpdate", "spec", "strategy", "type")
41+
}
4342

44-
// Style 2: operate each resource layer via `GetMap`
45-
spec := obj.GetMap("spec")
46-
replicas = spec.GetInt("replicas")
47-
fn.Logf("replicas is %v\n", replicas)
48-
nodeSelector := spec.GetMap("template").GetMap("spec").GetMap("nodeSelector")
49-
if nodeSelector.GetString("disktype") != "ssd" {
50-
nodeSelector.SetNestedStringOrDie("ssd", "disktype")
51-
}
43+
// Style 2: operate each resource layer via `GetMap`
44+
spec := obj.GetMap("spec")
45+
replicas = spec.GetInt("replicas")
46+
fn.Logf("replicas is %v\n", replicas)
47+
nodeSelector := spec.GetMap("template").GetMap("spec").GetMap("nodeSelector")
48+
if nodeSelector.GetString("disktype") != "ssd" {
49+
nodeSelector.SetNestedStringOrDie("ssd", "disktype")
5250
}
5351
}
5452
return true, nil
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package example
2+
3+
import (
4+
"os"
5+
6+
"github.com/GoogleContainerTools/kpt-functions-sdk/go/fn"
7+
)
8+
9+
// This example implements a function that selectively includes or excludes some resources.
10+
11+
func Example_selectExclude() {
12+
if err := fn.AsMain(fn.ResourceListProcessorFunc(selectResources)); err != nil {
13+
os.Exit(1)
14+
}
15+
}
16+
17+
// selectResources keeps all resources with the GVK apps/v1 Deployment that do
18+
// NOT have the label foo=bar, and removes the rest.
19+
func selectResources(rl *fn.ResourceList) (bool, error) {
20+
rl.Items = rl.Items.Where(fn.IsGVK("apps", "v1", "Deployment")).
21+
WhereNot(fn.HasLabels(map[string]string{"foo": "bar"}))
22+
return true, nil
23+
}

go/fn/examples/example_validator_test.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,11 @@ func Example_validator() {
3030

3131
func validator(rl *fn.ResourceList) (bool, error) {
3232
var results fn.Results
33-
for _, obj := range rl.Items {
34-
if obj.IsGVK(appsv1, "Deployment") || obj.IsGVK(appsv1, "StatefulSet") ||
35-
obj.IsGVK(appsv1, "DaemonSet") || obj.IsGVK(appsv1, "ReplicaSet") {
36-
var runAsNonRoot bool
37-
obj.GetOrDie(&runAsNonRoot, "spec", "template", "spec", "securityContext", "runAsNonRoot")
38-
if !runAsNonRoot {
39-
results = append(results, fn.ConfigObjectResult("`spec.template.spec.securityContext.runAsNonRoot` must be set to true", obj, fn.Error))
40-
}
33+
for _, obj := range rl.Items.Where(hasDesiredGVK) {
34+
var runAsNonRoot bool
35+
obj.GetOrDie(&runAsNonRoot, "spec", "template", "spec", "securityContext", "runAsNonRoot")
36+
if !runAsNonRoot {
37+
results = append(results, fn.ConfigObjectResult("`spec.template.spec.securityContext.runAsNonRoot` must be set to true", obj, fn.Error))
4138
}
4239
}
4340
return true, results

go/fn/examples/go.mod

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,41 @@ require (
88
github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0
99
k8s.io/api v0.24.0
1010
k8s.io/apimachinery v0.24.0
11-
sigs.k8s.io/kustomize/kyaml v0.13.6
11+
sigs.k8s.io/kustomize/kyaml v0.13.7-0.20220418212550-9d5491c2e20c
1212
)
1313

1414
require (
1515
github.com/PuerkitoBio/purell v1.1.1 // indirect
1616
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
1717
github.com/davecgh/go-spew v1.1.1 // indirect
18-
github.com/go-errors/errors v1.0.1 // indirect
18+
github.com/go-errors/errors v1.4.2 // indirect
1919
github.com/go-logr/logr v1.2.0 // indirect
2020
github.com/go-openapi/jsonpointer v0.19.5 // indirect
21-
github.com/go-openapi/jsonreference v0.19.3 // indirect
22-
github.com/go-openapi/swag v0.19.5 // indirect
21+
github.com/go-openapi/jsonreference v0.19.6 // indirect
22+
github.com/go-openapi/swag v0.21.1 // indirect
2323
github.com/gogo/protobuf v1.3.2 // indirect
24+
github.com/golang/protobuf v1.5.2 // indirect
25+
github.com/google/gnostic v0.5.7-v3refs // indirect
2426
github.com/google/gofuzz v1.1.0 // indirect
27+
github.com/josharian/intern v1.0.0 // indirect
2528
github.com/json-iterator/go v1.1.12 // indirect
26-
github.com/mailru/easyjson v0.7.0 // indirect
29+
github.com/kr/pretty v0.2.1 // indirect
30+
github.com/mailru/easyjson v0.7.7 // indirect
2731
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2832
github.com/modern-go/reflect2 v1.0.2 // indirect
2933
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
3034
github.com/pkg/errors v0.9.1 // indirect
3135
github.com/pmezard/go-difflib v1.0.0 // indirect
32-
github.com/stretchr/testify v1.7.0 // indirect
33-
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
34-
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
36+
github.com/stretchr/testify v1.7.1 // indirect
37+
github.com/xlab/treeprint v1.1.0 // indirect
38+
golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect
3539
golang.org/x/text v0.3.7 // indirect
40+
google.golang.org/protobuf v1.28.0 // indirect
3641
gopkg.in/inf.v0 v0.9.1 // indirect
3742
gopkg.in/yaml.v2 v2.4.0 // indirect
3843
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
3944
k8s.io/klog/v2 v2.60.1 // indirect
40-
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
45+
k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 // indirect
4146
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
4247
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
4348
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect

0 commit comments

Comments
 (0)