From 436a047617e4155e9f0c56fa87a9a590326414d7 Mon Sep 17 00:00:00 2001 From: yutaroyamanaka Date: Mon, 27 Mar 2023 21:33:57 +0900 Subject: [PATCH 1/5] re-enabled TestFnContainerTransformer with e2econtainerconfig container --- api/krusty/fnplugin_test.go | 112 ++++++++++-------------------------- 1 file changed, 29 insertions(+), 83 deletions(-) diff --git a/api/krusty/fnplugin_test.go b/api/krusty/fnplugin_test.go index 40f63b642..736b6df6b 100644 --- a/api/krusty/fnplugin_test.go +++ b/api/krusty/fnplugin_test.go @@ -714,103 +714,49 @@ spec: } func TestFnContainerTransformer(t *testing.T) { - t.Skip("wait for #3881") skipIfNoDocker(t) - - // Function plugins should not need the env setup done by MakeEnhancedHarness th := kusttest_test.MakeHarness(t) - - th.WriteK(".", ` + o := th.MakeOptionsPluginsEnabled() + fSys := filesys.MakeFsOnDisk() + b := MakeKustomizer(&o) + tmpDir, err := filesys.NewTmpConfirmedDir() + assert.NoError(t, err) + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(` resources: -- data.yaml +- deployment.yaml transformers: -- transf1.yaml -- transf2.yaml -`) - - th.WriteF("data.yaml", ` +- e2econtainerconfig.yaml +`))) + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "deployment.yaml"), []byte(` apiVersion: apps/v1 kind: Deployment metadata: - name: nginx - labels: - app: nginx - annotations: - tshirt-size: small # this injects the resource reservations -spec: - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx -`) - // This transformer should add resource reservations based on annotation in data.yaml - // See https://github.com/kubernetes-sigs/kustomize/tree/master/functions/examples/injection-tshirt-sizes - th.WriteF("transf1.yaml", ` -apiVersion: examples.config.kubernetes.io/v1beta1 -kind: Validator + name: foo +`))) + + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "e2econtainerconfig.yaml"), []byte(` +apiVersion: example.com/v1alpha1 +kind: Input metadata: - name: valid - annotations: - config.kubernetes.io/function: |- - container: - image: gcr.io/kustomize-functions/example-tshirt:v0.2.0 -`) - // This transformer will check resources without and won't do any changes - // See https://github.com/kubernetes-sigs/kustomize/tree/master/functions/examples/validator-kubeval - th.WriteF("transf2.yaml", ` -apiVersion: examples.config.kubernetes.io/v1beta1 -kind: Kubeval -metadata: - name: validate + name: foo annotations: config.kubernetes.io/function: | container: - image: gcr.io/kustomize-functions/example-validator-kubeval:v0.1.0 -spec: - strict: true - ignoreMissingSchemas: true - - # TODO: Update this to use network/volumes features. - # Relevant issues: - # - https://github.com/kubernetes-sigs/kustomize/issues/1901 - # - https://github.com/kubernetes-sigs/kustomize/issues/1902 - kubernetesVersion: "1.16.0" - schemaLocation: "file:///schemas" -`) - m := th.Run(".", th.MakeOptionsPluginsEnabled()) - th.AssertActualEqualsExpected(m, ` -apiVersion: apps/v1 + image: "gcr.io/kustomize-functions/e2econtainerconfig" +`))) + m, err := b.Run(fSys, tmpDir.String()) + assert.NoError(t, err) + actual, err := m.AsYaml() + assert.NoError(t, err) + assert.Equal(t, `apiVersion: apps/v1 kind: Deployment metadata: annotations: - tshirt-size: small - labels: - app: nginx - name: nginx -spec: - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - image: nginx - name: nginx - resources: - requests: - cpu: 200m - memory: 50M -`) + a-bool-value: "false" + a-int-value: "0" + a-string-value: "" + name: foo +`, string(actual)) } func TestFnContainerTransformerWithConfig(t *testing.T) { From 71a7a7df13cabfd14775c2ae508cd523c36dfb2c Mon Sep 17 00:00:00 2001 From: yutaroyamanaka Date: Mon, 27 Mar 2023 23:00:24 +0900 Subject: [PATCH 2/5] re-enabled TestFnContainerGenerator with enable-gcp-services --- api/krusty/fnplugin_test.go | 225 +++++------------------------------- 1 file changed, 30 insertions(+), 195 deletions(-) diff --git a/api/krusty/fnplugin_test.go b/api/krusty/fnplugin_test.go index 736b6df6b..8d3e0e196 100644 --- a/api/krusty/fnplugin_test.go +++ b/api/krusty/fnplugin_test.go @@ -504,213 +504,49 @@ func skipIfNoDocker(t *testing.T) { } func TestFnContainerGenerator(t *testing.T) { - t.Skip("wait for #3881") skipIfNoDocker(t) - - // Function plugins should not need the env setup done by MakeEnhancedHarness th := kusttest_test.MakeHarness(t) - - th.WriteK(".", ` -resources: -- short_secret.yaml + o := th.MakeOptionsPluginsEnabled() + fSys := filesys.MakeFsOnDisk() + b := MakeKustomizer(&o) + tmpDir, err := filesys.NewTmpConfirmedDir() + assert.NoError(t, err) + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(` generators: -- gener.yaml -`) - // Create generator config - th.WriteF("gener.yaml", ` -apiVersion: examples.config.kubernetes.io/v1beta1 -kind: CockroachDB +- project-service-set.yaml +`))) + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "project-service-set.yaml"), []byte(` +apiVersion: blueprints.cloud.google.com/v1alpha1 +kind: ProjectServiceSet metadata: name: demo annotations: config.kubernetes.io/function: | container: - image: gcr.io/kustomize-functions/example-cockroachdb:v0.1.0 + image: gcr.io/kpt-fn/enable-gcp-services:v0.1.0 spec: - replicas: 3 -`) - // Create some additional resource just to make sure everything is added - th.WriteF("short_secret.yaml", ` -apiVersion: v1 -kind: Secret -metadata: - labels: - airshipit.org/ephemeral-user-data: "true" - name: node1-bmc-secret -type: Opaque -stringData: - userData: | - bootcmd: - - mkdir /mnt/vda -`) - m := th.Run(".", th.MakeOptionsPluginsEnabled()) - th.AssertActualEqualsExpected(m, ` -apiVersion: v1 -kind: Secret -metadata: - labels: - airshipit.org/ephemeral-user-data: "true" - name: node1-bmc-secret -stringData: - userData: | - bootcmd: - - mkdir /mnt/vda -type: Opaque ---- -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - labels: - app: cockroachdb - name: demo - name: demo-budget -spec: - minAvailable: 67% - selector: - matchLabels: - app: cockroachdb - name: demo ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: cockroachdb - name: demo - name: demo-public -spec: - ports: - - name: grpc - port: 26257 - targetPort: 26257 - - name: http - port: 8080 - targetPort: 8080 - selector: - app: cockroachdb - name: demo ---- -apiVersion: v1 + services: + - compute.googleapis.com + projectID: foo +`))) + m, err := b.Run(fSys, tmpDir.String()) + assert.NoError(t, err) + actual, err := m.AsYaml() + assert.NoError(t, err) + assert.Equal(t, `apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: - prometheus.io/path: _status/vars - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" - labels: - app: cockroachdb - name: demo - name: demo + blueprints.cloud.google.com/ownerReference: blueprints.cloud.google.com/ProjectServiceSet/demo + config.kubernetes.io/function: | + container: + image: gcr.io/kpt-fn/enable-gcp-services:v0.1.0 + name: demo-compute spec: - clusterIP: None - ports: - - name: grpc - port: 26257 - targetPort: 26257 - - name: http - port: 8080 - targetPort: 8080 - selector: - app: cockroachdb - name: demo ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - labels: - app: cockroachdb - name: demo - name: demo -spec: - replicas: 3 - selector: - matchLabels: - app: cockroachdb - name: demo - serviceName: demo - template: - metadata: - labels: - app: cockroachdb - name: demo - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - cockroachdb - topologyKey: kubernetes.io/hostname - weight: 100 - containers: - - command: - - /bin/bash - - -ecx - - | - # The use of qualified `+"`hostname -f`"+` is crucial: - # Other nodes aren't able to look up the unqualified hostname. - CRARGS=("start" "--logtostderr" "--insecure" "--host" "$(hostname -f)" "--http-host" "0.0.0.0") - # We only want to initialize a new cluster (by omitting the join flag) - # if we're sure that we're the first node (i.e. index 0) and that - # there aren't any other nodes running as part of the cluster that - # this is supposed to be a part of (which indicates that a cluster - # already exists and we should make sure not to create a new one). - # It's fine to run without --join on a restart if there aren't any - # other nodes. - if [ ! "$(hostname)" == "cockroachdb-0" ] || [ -e "/cockroach/cockroach-data/cluster_exists_marker" ] - then - # We don't join cockroachdb in order to avoid a node attempting - # to join itself, which currently doesn't work - # (https://github.com/cockroachdb/cockroach/issues/9625). - CRARGS+=("--join" "cockroachdb-public") - fi - exec /cockroach/cockroach ${CRARGS[*]} - image: cockroachdb/cockroach:v1.1.0 - imagePullPolicy: IfNotPresent - name: demo - ports: - - containerPort: 26257 - name: grpc - - containerPort: 8080 - name: http - volumeMounts: - - mountPath: /cockroach/cockroach-data - name: datadir - initContainers: - - args: - - -on-start=/on-start.sh - - -service=cockroachdb - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: cockroachdb/cockroach-k8s-init:0.1 - imagePullPolicy: IfNotPresent - name: bootstrap - volumeMounts: - - mountPath: /cockroach/cockroach-data - name: datadir - terminationGracePeriodSeconds: 60 - volumes: - - name: datadir - persistentVolumeClaim: - claimName: datadir - volumeClaimTemplates: - - metadata: - name: datadir - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Gi -`) + projectRef: + external: foo + resourceID: compute.googleapis.com +`, string(actual)) } func TestFnContainerTransformer(t *testing.T) { @@ -733,7 +569,6 @@ kind: Deployment metadata: name: foo `))) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "e2econtainerconfig.yaml"), []byte(` apiVersion: example.com/v1alpha1 kind: Input From c9f500cc0b4b038541629bab9e578acdc3921c08 Mon Sep 17 00:00:00 2001 From: yutaroyamanaka Date: Sat, 1 Apr 2023 23:10:07 +0900 Subject: [PATCH 3/5] add another resource for making sure an existing resource isn't affeced by a generator --- api/krusty/fnplugin_test.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/api/krusty/fnplugin_test.go b/api/krusty/fnplugin_test.go index 8d3e0e196..2e8be19b8 100644 --- a/api/krusty/fnplugin_test.go +++ b/api/krusty/fnplugin_test.go @@ -507,15 +507,16 @@ func TestFnContainerGenerator(t *testing.T) { skipIfNoDocker(t) th := kusttest_test.MakeHarness(t) o := th.MakeOptionsPluginsEnabled() - fSys := filesys.MakeFsOnDisk() - b := MakeKustomizer(&o) tmpDir, err := filesys.NewTmpConfirmedDir() assert.NoError(t, err) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(` + th.WriteK(tmpDir.String(), ` +resources: +- deployment.yaml generators: - project-service-set.yaml -`))) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "project-service-set.yaml"), []byte(` +`) + // Create generator config + th.WriteF(filepath.Join(tmpDir.String(), "project-service-set.yaml"), ` apiVersion: blueprints.cloud.google.com/v1alpha1 kind: ProjectServiceSet metadata: @@ -528,12 +529,23 @@ spec: services: - compute.googleapis.com projectID: foo -`))) - m, err := b.Run(fSys, tmpDir.String()) - assert.NoError(t, err) +`) + // Create another resource just to make sure everything is added + th.WriteF(filepath.Join(tmpDir.String(), "deployment.yaml"), ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: foo +`) + m := th.Run(tmpDir.String(), o) actual, err := m.AsYaml() assert.NoError(t, err) - assert.Equal(t, `apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 + assert.Equal(t, `apiVersion: apps/v1 +kind: Deployment +metadata: + name: foo +--- +apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: From faab836ec9c22dc20a1e99a8a9ffc4f7ccb7229f Mon Sep 17 00:00:00 2001 From: yutaroyamanaka Date: Sat, 1 Apr 2023 23:16:58 +0900 Subject: [PATCH 4/5] use test helpers --- api/krusty/fnplugin_test.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/api/krusty/fnplugin_test.go b/api/krusty/fnplugin_test.go index 2e8be19b8..e979858e8 100644 --- a/api/krusty/fnplugin_test.go +++ b/api/krusty/fnplugin_test.go @@ -565,23 +565,21 @@ func TestFnContainerTransformer(t *testing.T) { skipIfNoDocker(t) th := kusttest_test.MakeHarness(t) o := th.MakeOptionsPluginsEnabled() - fSys := filesys.MakeFsOnDisk() - b := MakeKustomizer(&o) tmpDir, err := filesys.NewTmpConfirmedDir() assert.NoError(t, err) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(` + th.WriteK(tmpDir.String(), ` resources: - deployment.yaml transformers: - e2econtainerconfig.yaml -`))) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "deployment.yaml"), []byte(` +`) + th.WriteF(filepath.Join(tmpDir.String(), "deployment.yaml"), ` apiVersion: apps/v1 kind: Deployment metadata: name: foo -`))) - assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "e2econtainerconfig.yaml"), []byte(` +`) + th.WriteF(filepath.Join(tmpDir.String(), "e2econtainerconfig.yaml"), ` apiVersion: example.com/v1alpha1 kind: Input metadata: @@ -590,9 +588,8 @@ metadata: config.kubernetes.io/function: | container: image: "gcr.io/kustomize-functions/e2econtainerconfig" -`))) - m, err := b.Run(fSys, tmpDir.String()) - assert.NoError(t, err) +`) + m := th.Run(tmpDir.String(), o) actual, err := m.AsYaml() assert.NoError(t, err) assert.Equal(t, `apiVersion: apps/v1 From 2649d39fd300df34addbbecbe956048a9d0f659d Mon Sep 17 00:00:00 2001 From: yutaroyamanaka Date: Tue, 4 Apr 2023 18:22:43 +0900 Subject: [PATCH 5/5] docker build locally because gcr.io/kustomize-functions/e2econtainerconfig doesn't exist in the public --- api/krusty/fnplugin_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/krusty/fnplugin_test.go b/api/krusty/fnplugin_test.go index e979858e8..5a521e7ca 100644 --- a/api/krusty/fnplugin_test.go +++ b/api/krusty/fnplugin_test.go @@ -589,6 +589,9 @@ metadata: container: image: "gcr.io/kustomize-functions/e2econtainerconfig" `) + build := exec.Command("docker", "build", ".", "-t", "gcr.io/kustomize-functions/e2econtainerconfig") + build.Dir = "../../cmd/config/internal/commands/e2e/e2econtainerconfig" + assert.NoError(t, build.Run()) m := th.Run(tmpDir.String(), o) actual, err := m.AsYaml() assert.NoError(t, err)