Skip to content

Commit

Permalink
add methods to allow selection and exclusion of resources by gvk (#581)
Browse files Browse the repository at this point in the history
  • Loading branch information
natasha41575 authored Jun 8, 2022
1 parent d5df21d commit 78748f0
Show file tree
Hide file tree
Showing 16 changed files with 921 additions and 144 deletions.
10 changes: 9 additions & 1 deletion go/fn/examples/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@

package example

import "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn"

const (
appsv1 = "apps/v1"
apps = "apps"
v1 = "v1"
)

func hasDesiredGVK(obj *fn.KubeObject) bool {
return obj.IsGVK(apps, v1, "Deployment") || obj.IsGVK(apps, v1, "StatefulSet") ||
obj.IsGVK(apps, v1, "DaemonSet") || obj.IsGVK(apps, v1, "ReplicaSet")
}
6 changes: 2 additions & 4 deletions go/fn/examples/example_filter_GVK_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,8 @@ func updateReplicas(rl *fn.ResourceList) (bool, error) {
}
var replicas int
rl.FunctionConfig.GetOrDie(&replicas, "replicas")
for i, obj := range rl.Items {
if obj.IsGVK("apps/v1", "Deployment") {
rl.Items[i].SetOrDie(replicas, "spec", "replicas")
}
for i := range rl.Items.Where(fn.IsGVK("apps", "v1", "Deployment")) {
rl.Items[i].SetOrDie(replicas, "spec", "replicas")
}
return true, nil
}
36 changes: 17 additions & 19 deletions go/fn/examples/example_logger_injector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,28 +39,26 @@ func injectLogger(rl *fn.ResourceList) (bool, error) {
if err := rl.FunctionConfig.As(&li); err != nil {
return false, err
}
for i, obj := range rl.Items {
if obj.IsGVK(appsv1, "Deployment") || obj.IsGVK(appsv1, "StatefulSet") ||
obj.IsGVK(appsv1, "DaemonSet") || obj.IsGVK(appsv1, "ReplicaSet") {
var containers []corev1.Container
obj.GetOrDie(&containers, "spec", "template", "spec", "containers")
foundTargetContainer := false
for j, container := range containers {
if container.Name == li.ContainerName {
containers[j].Image = li.ImageName
foundTargetContainer = true
break
}
for i, obj := range rl.Items.Where(hasDesiredGVK) {
var containers []corev1.Container
obj.GetOrDie(&containers, "spec", "template", "spec", "containers")
foundTargetContainer := false
for j, container := range containers {
if container.Name == li.ContainerName {
containers[j].Image = li.ImageName
foundTargetContainer = true
break
}
if !foundTargetContainer {
c := corev1.Container{
Name: li.ContainerName,
Image: li.ImageName,
}
containers = append(containers, c)
}
if !foundTargetContainer {
c := corev1.Container{
Name: li.ContainerName,
Image: li.ImageName,
}
rl.Items[i].SetOrDie(containers, "spec", "template", "spec", "containers")
containers = append(containers, c)
}
rl.Items[i].SetOrDie(containers, "spec", "template", "spec", "containers")

}
return true, nil
}
Expand Down
36 changes: 17 additions & 19 deletions go/fn/examples/example_read_field_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,24 @@ func Example_aReadField() {
}

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

// Style 2: operate each resource layer via `GetMap`
spec := obj.GetMap("spec")
replicas = spec.GetInt("replicas")
fn.Logf("replicas is %v\n", replicas)
nodeSelector := spec.GetMap("template").GetMap("spec").GetMap("nodeSelector")
if nodeSelector.GetString("disktype") != "ssd" {
nodeSelector.SetNestedStringOrDie("ssd", "disktype")
}
// Style 2: operate each resource layer via `GetMap`
spec := obj.GetMap("spec")
replicas = spec.GetInt("replicas")
fn.Logf("replicas is %v\n", replicas)
nodeSelector := spec.GetMap("template").GetMap("spec").GetMap("nodeSelector")
if nodeSelector.GetString("disktype") != "ssd" {
nodeSelector.SetNestedStringOrDie("ssd", "disktype")
}
}
return true, nil
Expand Down
23 changes: 23 additions & 0 deletions go/fn/examples/example_select_exclude_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package example

import (
"os"

"github.com/GoogleContainerTools/kpt-functions-sdk/go/fn"
)

// This example implements a function that selectively includes or excludes some resources.

func Example_selectExclude() {
if err := fn.AsMain(fn.ResourceListProcessorFunc(selectResources)); err != nil {
os.Exit(1)
}
}

// selectResources keeps all resources with the GVK apps/v1 Deployment that do
// NOT have the label foo=bar, and removes the rest.
func selectResources(rl *fn.ResourceList) (bool, error) {
rl.Items = rl.Items.Where(fn.IsGVK("apps", "v1", "Deployment")).
WhereNot(fn.HasLabels(map[string]string{"foo": "bar"}))
return true, nil
}
13 changes: 5 additions & 8 deletions go/fn/examples/example_validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,11 @@ func Example_validator() {

func validator(rl *fn.ResourceList) (bool, error) {
var results fn.Results
for _, obj := range rl.Items {
if obj.IsGVK(appsv1, "Deployment") || obj.IsGVK(appsv1, "StatefulSet") ||
obj.IsGVK(appsv1, "DaemonSet") || obj.IsGVK(appsv1, "ReplicaSet") {
var runAsNonRoot bool
obj.GetOrDie(&runAsNonRoot, "spec", "template", "spec", "securityContext", "runAsNonRoot")
if !runAsNonRoot {
results = append(results, fn.ConfigObjectResult("`spec.template.spec.securityContext.runAsNonRoot` must be set to true", obj, fn.Error))
}
for _, obj := range rl.Items.Where(hasDesiredGVK) {
var runAsNonRoot bool
obj.GetOrDie(&runAsNonRoot, "spec", "template", "spec", "securityContext", "runAsNonRoot")
if !runAsNonRoot {
results = append(results, fn.ConfigObjectResult("`spec.template.spec.securityContext.runAsNonRoot` must be set to true", obj, fn.Error))
}
}
return true, results
Expand Down
23 changes: 14 additions & 9 deletions go/fn/examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,41 @@ require (
github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0
k8s.io/api v0.24.0
k8s.io/apimachinery v0.24.0
sigs.k8s.io/kustomize/kyaml v0.13.6
sigs.k8s.io/kustomize/kyaml v0.13.7-0.20220418212550-9d5491c2e20c
)

require (
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-errors/errors v1.0.1 // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-logr/logr v1.2.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.3 // indirect
github.com/go-openapi/swag v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/swag v0.21.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.0 // indirect
github.com/kr/pretty v0.2.1 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
github.com/stretchr/testify v1.7.1 // indirect
github.com/xlab/treeprint v1.1.0 // indirect
golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/klog/v2 v2.60.1 // indirect
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 // indirect
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
Expand Down
Loading

0 comments on commit 78748f0

Please sign in to comment.