From 8c18970b56df40b344a3c55aa05ace7e70bf6877 Mon Sep 17 00:00:00 2001 From: Tobias Bradtke Date: Mon, 20 Apr 2020 18:33:22 +0200 Subject: [PATCH 01/24] Fix formating of example --- cmd/config/docs/api-conventions/functions-spec.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/config/docs/api-conventions/functions-spec.md b/cmd/config/docs/api-conventions/functions-spec.md index 342882dc3..2c3468f87 100644 --- a/cmd/config/docs/api-conventions/functions-spec.md +++ b/cmd/config/docs/api-conventions/functions-spec.md @@ -77,8 +77,7 @@ An example using `v1/List` as input: apiVersion: v1 kind: List items: - spec: - - apiVersion: foo-corp.com/v1 + - apiVersion: foo-corp.com/v1 kind: FulfillmentCenter metadata: name: staging From 46316198cb665e3b4cf636d24ed4575d45cc0d4f Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Wed, 22 Apr 2020 13:08:19 -0700 Subject: [PATCH 02/24] release kyaml and cmd/config --- releasing/VERSIONS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/releasing/VERSIONS b/releasing/VERSIONS index a1364fa6d..9564660ec 100644 --- a/releasing/VERSIONS +++ b/releasing/VERSIONS @@ -6,7 +6,7 @@ # kyaml version export kyaml_major=0 export kyaml_minor=1 -export kyaml_patch=6 +export kyaml_patch=7 # kstatus version export kstatus_major=0 @@ -21,7 +21,7 @@ export api_patch=3 # cmd/config version export cmd_config_major=0 export cmd_config_minor=1 -export cmd_config_patch=5 +export cmd_config_patch=6 # cmd/kubectl version export cmd_kubectl_major=0 From 3786db2dba95f39118c86e9a2ffecd0f5fdef505 Mon Sep 17 00:00:00 2001 From: jregan Date: Wed, 22 Apr 2020 13:12:40 -0700 Subject: [PATCH 03/24] Remove time guessing. --- .../plugins/compiler/compiler_test.go | 5 ++--- api/internal/plugins/compiler/utils.go | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/api/internal/plugins/compiler/compiler_test.go b/api/internal/plugins/compiler/compiler_test.go index 89640f7b1..36f4031cb 100644 --- a/api/internal/plugins/compiler/compiler_test.go +++ b/api/internal/plugins/compiler/compiler_test.go @@ -6,7 +6,6 @@ package compiler_test import ( "path/filepath" "testing" - "time" "sigs.k8s.io/kustomize/api/filesys" . "sigs.k8s.io/kustomize/api/internal/plugins/compiler" @@ -30,7 +29,7 @@ func TestCompiler(t *testing.T) { if err != nil { t.Error(err) } - if !FileYoungerThan(expectObj, time.Second) { + if !FileExists(expectObj) { t.Errorf("didn't find expected obj file %s", expectObj) } c.Cleanup() @@ -49,7 +48,7 @@ func TestCompiler(t *testing.T) { if err != nil { t.Error(err) } - if !FileYoungerThan(expectObj, time.Second) { + if !FileExists(expectObj) { t.Errorf("didn't find expected obj file %s", expectObj) } c.Cleanup() diff --git a/api/internal/plugins/compiler/utils.go b/api/internal/plugins/compiler/utils.go index d117184ff..40bde9e96 100644 --- a/api/internal/plugins/compiler/utils.go +++ b/api/internal/plugins/compiler/utils.go @@ -81,7 +81,8 @@ func DeterminePluginSrcRoot(fSys filesys.FileSystem) (string, error) { }) } -// FileYoungerThan returns true if the file age is <= the Duration argument. +// FileYoungerThan returns true if the file both exists and has an +// age is <= the Duration argument. func FileYoungerThan(path string, d time.Duration) bool { fi, err := os.Stat(path) if err != nil { @@ -92,8 +93,20 @@ func FileYoungerThan(path string, d time.Duration) bool { return time.Since(fi.ModTime()) <= d } -func FileExists(name string) bool { - if _, err := os.Stat(name); err != nil { +// FileModifiedAfter returns true if the file both exists and was +// modified after the given time.. +func FileModifiedAfter(path string, t time.Time) bool { + fi, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false + } + } + return fi.ModTime().After(t) +} + +func FileExists(path string) bool { + if _, err := os.Stat(path); err != nil { if os.IsNotExist(err) { return false } From efeb26c634f3ba2cb7134baf1825680c9fa0fbca Mon Sep 17 00:00:00 2001 From: jregan Date: Wed, 22 Apr 2020 12:04:18 -0700 Subject: [PATCH 04/24] Fix broken Makefiles. --- cmd/kubectl/Makefile | 3 +-- functions/examples/application-cr/Makefile | 4 ++-- .../examples/injection-tshirt-sizes/Makefile | 4 ++-- functions/examples/template-go-nginx/Makefile | 4 ++-- .../template-heredoc-cockroachdb/Makefile | 6 ++++-- functions/examples/validator-kubeval/Makefile | 4 ++-- .../examples/validator-resource-requests/Makefile | 4 ++-- travis/kyaml-pre-commit.sh | 15 ++++++++++++++- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/cmd/kubectl/Makefile b/cmd/kubectl/Makefile index a12443dba..b2f9dff29 100644 --- a/cmd/kubectl/Makefile +++ b/cmd/kubectl/Makefile @@ -5,7 +5,7 @@ GOBIN := $(shell go env GOPATH)/bin -all: generate license fix vet fmt test lint tidy +all: generate license fix vet fmt test tidy fix: go fix ./... @@ -33,4 +33,3 @@ test: vet: go vet ./... - diff --git a/functions/examples/application-cr/Makefile b/functions/examples/application-cr/Makefile index 540708df4..9b057cec2 100644 --- a/functions/examples/application-cr/Makefile +++ b/functions/examples/application-cr/Makefile @@ -21,8 +21,8 @@ generate: (cd image && GOBIN=$(GOBIN) go generate ./...) license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . tidy: (cd image && go mod tidy) diff --git a/functions/examples/injection-tshirt-sizes/Makefile b/functions/examples/injection-tshirt-sizes/Makefile index 8e3dcc300..1f79b472d 100644 --- a/functions/examples/injection-tshirt-sizes/Makefile +++ b/functions/examples/injection-tshirt-sizes/Makefile @@ -21,8 +21,8 @@ generate: (cd image && GOBIN=$(GOBIN) go generate ./...) license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . tidy: (cd image && go mod tidy) diff --git a/functions/examples/template-go-nginx/Makefile b/functions/examples/template-go-nginx/Makefile index 3149fd10c..c3e0c2cb4 100644 --- a/functions/examples/template-go-nginx/Makefile +++ b/functions/examples/template-go-nginx/Makefile @@ -21,8 +21,8 @@ generate: (cd image && GOBIN=$(GOBIN) go generate ./...) license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . tidy: (cd image && go mod tidy) diff --git a/functions/examples/template-heredoc-cockroachdb/Makefile b/functions/examples/template-heredoc-cockroachdb/Makefile index 0badb79a7..d218aca00 100644 --- a/functions/examples/template-heredoc-cockroachdb/Makefile +++ b/functions/examples/template-heredoc-cockroachdb/Makefile @@ -3,9 +3,11 @@ .PHONY: license image +GOBIN := $(shell go env GOPATH)/bin + license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . all: license diff --git a/functions/examples/validator-kubeval/Makefile b/functions/examples/validator-kubeval/Makefile index b8030c006..08a214c41 100644 --- a/functions/examples/validator-kubeval/Makefile +++ b/functions/examples/validator-kubeval/Makefile @@ -21,8 +21,8 @@ generate: (cd image && GOBIN=$(GOBIN) go generate ./...) license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . tidy: (cd image && go mod tidy) diff --git a/functions/examples/validator-resource-requests/Makefile b/functions/examples/validator-resource-requests/Makefile index 95fb12b89..f3d362626 100644 --- a/functions/examples/validator-resource-requests/Makefile +++ b/functions/examples/validator-resource-requests/Makefile @@ -21,8 +21,8 @@ generate: (cd image && GOBIN=$(GOBIN) go generate ./...) license: - (which $(GOPATH)/bin/addlicense || go get github.com/google/addlicense) - $(GOPATH)/bin/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . + (which $(GOBIN)/addlicense || go get github.com/google/addlicense) + $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . tidy: (cd image && go mod tidy) diff --git a/travis/kyaml-pre-commit.sh b/travis/kyaml-pre-commit.sh index d357f2c4b..962f5189b 100755 --- a/travis/kyaml-pre-commit.sh +++ b/travis/kyaml-pre-commit.sh @@ -5,8 +5,21 @@ set -e # run all tests for kyaml and related commands -targets="kyaml cmd/config cmd/kubectl functions/examples/injection-tshirt-sizes functions/examples/template-go-nginx functions/examples/template-heredoc-cockroachdb functions/examples/validator-kubeval functions/examples/validator-resource-requests functions/examples/application-cr" + +targets=" +kyaml +cmd/config +cmd/kubectl +functions/examples/injection-tshirt-sizes +functions/examples/template-go-nginx +functions/examples/template-heredoc-cockroachdb +functions/examples/validator-kubeval +functions/examples/validator-resource-requests +functions/examples/application-cr +" + for target in $targets; do + echo "----- Making $target -----" pushd . cd $target make all From 53e7c87604ca6cdafd411b88cf6277678366cf85 Mon Sep 17 00:00:00 2001 From: jregan Date: Wed, 22 Apr 2020 18:34:15 -0700 Subject: [PATCH 05/24] Adjust scripts to be go v1.14 compatible --- Makefile | 14 +++++++++----- hack/shellHelpers.sh | 15 +++++++++++++++ hack/testExamplesAgainstKustomize.sh | 13 +++++-------- hack/testUnitKustomizePlugins.sh | 19 ++++++------------- 4 files changed, 35 insertions(+), 26 deletions(-) create mode 100644 hack/shellHelpers.sh diff --git a/Makefile b/Makefile index 677a7c460..186f2d2a2 100644 --- a/Makefile +++ b/Makefile @@ -218,10 +218,6 @@ test-unit-cmd-all: test-go-mod: ./travis/check-go-mod.sh -.PHONY: -test-examples-kustomize-against-HEAD: $(MYGOBIN)/kustomize $(MYGOBIN)/mdrip - ./hack/testExamplesAgainstKustomize.sh HEAD - .PHONY: test-examples-e2e-kustomize: $(MYGOBIN)/mdrip $(MYGOBIN)/kind ( \ @@ -232,13 +228,17 @@ test-examples-e2e-kustomize: $(MYGOBIN)/mdrip $(MYGOBIN)/kind ./hack/testExamplesE2EAgainstKustomize.sh .; \ ) +.PHONY: +test-examples-kustomize-against-HEAD: $(MYGOBIN)/kustomize $(MYGOBIN)/mdrip + ./hack/testExamplesAgainstKustomize.sh HEAD + .PHONY: test-examples-kustomize-against-latest: $(MYGOBIN)/mdrip ( \ set -e; \ /bin/rm -f $(MYGOBIN)/kustomize; \ echo "Installing kustomize from latest."; \ - GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v3; \ + GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3@v3.5.4; \ ./hack/testExamplesAgainstKustomize.sh latest; \ echo "Reinstalling kustomize from HEAD."; \ cd kustomize; go install .; \ @@ -289,6 +289,10 @@ $(MYGOBIN)/helmV3: rm -rf $$d \ ) +# Default version of helm is v2 for the time being. +$(MYGOBIN)/helm: $(MYGOBIN)/helmV2 + ln -s $(MYGOBIN)/helmV2 $(MYGOBIN)/helm + $(MYGOBIN)/kind: ( \ set -e; \ diff --git a/hack/shellHelpers.sh b/hack/shellHelpers.sh new file mode 100644 index 000000000..8bb622a89 --- /dev/null +++ b/hack/shellHelpers.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Copyright 2019 The Kubernetes Authors. +# SPDX-License-Identifier: Apache-2.0 + +# TODO: Make the code ignorant of the CI environment "brand name". +# We used to run CI tests on travis, and disabled certain tests +# when running there. Now we run on Prow, so look for that. +# https://github.com/kubernetes/test-infra/blob/master/prow/jobs.md +# Might be useful to eschew using the brand name of the CI environment +# (replace "travis" with "RemoteCI" or something - not just switch to "prow"). + +function onLinuxAndNotOnRemoteCI { + [[ ("linux" == "$(go env GOOS)") && (-z ${PROW_JOB_ID+x}) ]] && return + false +} diff --git a/hack/testExamplesAgainstKustomize.sh b/hack/testExamplesAgainstKustomize.sh index eb186cc40..da1e147d2 100755 --- a/hack/testExamplesAgainstKustomize.sh +++ b/hack/testExamplesAgainstKustomize.sh @@ -9,10 +9,8 @@ set -o pipefail version=$1 -function onLinuxAndNotOnTravis { - [[ ("linux" == "$(go env GOOS)") && (-z ${TRAVIS+x}) ]] && return - false -} +# All hack scripts should run from top level. +. hack/shellHelpers.sh # TODO: change the label? # We test against the latest release, and HEAD, and presumably @@ -22,13 +20,12 @@ mdrip --mode test \ --label testAgainstLatestRelease examples # TODO: make work for non-linux -if onLinuxAndNotOnTravis; then - echo "On linux, and not on travis, so running the notravis example tests." +if onLinuxAndNotOnRemoteCI; then + echo "On linux, and not on remote CI. Running expensive tests." # Requires helm. make $(go env GOPATH)/bin/helm - mdrip --mode test \ - --label helmtest examples/chart.md + mdrip --mode test --label helmtest examples/chart.md fi echo "Example tests passed against ${version}." diff --git a/hack/testUnitKustomizePlugins.sh b/hack/testUnitKustomizePlugins.sh index 354fa652b..da1103040 100755 --- a/hack/testUnitKustomizePlugins.sh +++ b/hack/testUnitKustomizePlugins.sh @@ -14,27 +14,19 @@ set -o pipefail rcAccumulator=0 -function onLinuxAndNotOnTravis { - # TODO: Make the code ignorant of the CI environment "brand name". - # We used to run CI tests on travis, and disabled certain tests - # when running there. Now we run on Prow, so look for that. - # https://github.com/kubernetes/test-infra/blob/master/prow/jobs.md - # Should eschew using the brand name of the CI environment - # (replace "travis" with "CI_env" or something - not just switch to "prow"). - [[ ("linux" == "$(go env GOOS)") && (-z ${$PROW_JOB_ID+x}) ]] && return - false -} +# All hack scripts should run from top level. +. hack/shellHelpers.sh function runTest { local file=$1 local code=0 if grep -q "// +build notravis" "$file"; then - if onLinuxAndNotOnTravis; then + if onLinuxAndNotOnRemoteCI; then go test -v -tags=notravis $file code=$? else # TODO: make work for non-linux - echo "Not on linux or on travis; skipping $file" + echo "Not on linux or on remote CI; skipping $file" fi else go test -v $file @@ -55,10 +47,11 @@ function scanDir { popd >& /dev/null } -if onLinuxAndNotOnTravis; then +if onLinuxAndNotOnRemoteCI; then # Some of these tests have special deps. make $(go env GOPATH)/bin/helmV2 make $(go env GOPATH)/bin/helmV3 + make $(go env GOPATH)/bin/helm make $(go env GOPATH)/bin/kubeval fi From c777a3805deb55d9d42a93f8b102378166c69be8 Mon Sep 17 00:00:00 2001 From: jregan Date: Thu, 23 Apr 2020 12:17:32 -0700 Subject: [PATCH 06/24] Bug hunting; add more tests high and low. --- api/filters/fsslice/fsslice_test.go | 93 +++++++- api/filters/labels/labels_test.go | 218 +++++++++++++++--- .../labeltransformer/LabelTransformer_test.go | 57 ++++- 3 files changed, 328 insertions(+), 40 deletions(-) diff --git a/api/filters/fsslice/fsslice_test.go b/api/filters/fsslice/fsslice_test.go index a000fe14e..379531bc8 100644 --- a/api/filters/fsslice/fsslice_test.go +++ b/api/filters/fsslice/fsslice_test.go @@ -334,21 +334,90 @@ func TestFilter_Filter(t *testing.T) { } func TestGetGVK(t *testing.T) { - obj, err := yaml.Parse(` + testCases := map[string]struct { + input string + expected resid.Gvk + parseError string + metaError string + }{ + "empty": { + input: ` +`, + parseError: "EOF", + }, + "junk": { + input: ` +congress: effective +`, + metaError: "missing Resource metadata", + }, + "normal": { + input: ` apiVersion: apps/v1 kind: Deployment -`) - if !assert.NoError(t, err) { - t.FailNow() - } - meta, err := obj.GetMeta() - if !assert.NoError(t, err) { - t.FailNow() +`, + expected: resid.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}, + }, + "apiVersionOnlyWithSlash": { + input: ` +apiVersion: apps/v1 +`, + expected: resid.Gvk{Group: "apps", Version: "v1", Kind: ""}, + }, + // When apiVersion is just "v1" (not, say, "apps/v1"), that + // could be interpreted as Group="", Version="v1" + // (implying the original "core" api group) or the other way around + // (Group="v1", Version=""). + // At the time of writing, fsslice.go does the latter - + // might have to change that. + "apiVersionOnlyNoSlash1": { + input: ` +apiVersion: apps +`, + expected: resid.Gvk{Group: "apps", Version: "", Kind: ""}, + }, + "apiVersionOnlyNoSlash2": { + input: ` +apiVersion: v1 +`, + expected: resid.Gvk{Group: "v1", Version: "", Kind: ""}, + }, } - gvk := fsslice.GetGVK(meta) - expected := resid.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"} - if !assert.Equal(t, expected, gvk) { - t.FailNow() + for tn, tc := range testCases { + t.Run(tn, func(t *testing.T) { + obj, err := yaml.Parse(tc.input) + if len(tc.parseError) != 0 { + if err == nil { + t.Error("expected parse error") + return + } + if !strings.Contains(err.Error(), tc.parseError) { + t.Errorf("expected parse err '%s', got '%v'", tc.parseError, err) + } + return + } + if !assert.NoError(t, err) { + t.FailNow() + } + meta, err := obj.GetMeta() + if len(tc.metaError) != 0 { + if err == nil { + t.Error("expected meta error") + return + } + if !strings.Contains(err.Error(), tc.metaError) { + t.Errorf("expected meta err '%s', got '%v'", tc.metaError, err) + } + return + } + if !assert.NoError(t, err) { + t.FailNow() + } + gvk := fsslice.GetGVK(meta) + if !assert.Equal(t, tc.expected, gvk) { + t.FailNow() + } + }) } } diff --git a/api/filters/labels/labels_test.go b/api/filters/labels/labels_test.go index 2758dc215..a651a1276 100644 --- a/api/filters/labels/labels_test.go +++ b/api/filters/labels/labels_test.go @@ -8,19 +8,16 @@ import ( "testing" "github.com/stretchr/testify/assert" - "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" + "sigs.k8s.io/kustomize/api/resid" filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest" "sigs.k8s.io/kustomize/api/types" ) -var labelsFs = builtinconfig.MakeDefaultConfig().CommonLabels - func TestLabels_Filter(t *testing.T) { testCases := map[string]struct { input string expectedOutput string filter Filter - fsSlice types.FsSlice }{ "add": { input: ` @@ -45,12 +42,20 @@ metadata: clown: emmett kelley dragon: smaug `, - filter: Filter{Labels: labelMap{ - "clown": "emmett kelley", - "auto": "ford", - "dragon": "smaug", - "bean": "cannellini", - }}, + filter: Filter{ + Labels: labelMap{ + "clown": "emmett kelley", + "auto": "ford", + "dragon": "smaug", + "bean": "cannellini", + }, + FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + }, + }, }, "update": { input: ` @@ -73,13 +78,21 @@ metadata: bean: cannellini clown: emmett kelley `, - filter: Filter{Labels: labelMap{ - "clown": "emmett kelley", - "hero": "superman", - "fiend": "luthor", - "bean": "cannellini", - }}, + filter: Filter{ + Labels: labelMap{ + "clown": "emmett kelley", + "hero": "superman", + "fiend": "luthor", + "bean": "cannellini", + }, FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + }, + }, }, + "data-fieldspecs": { input: ` apiVersion: example.com/v1 @@ -113,13 +126,168 @@ a: b: sleater: kinney `, - filter: Filter{Labels: labelMap{ - "sleater": "kinney", - }}, - fsSlice: []types.FieldSpec{ - { - Path: "a/b", - CreateIfNotPresent: true, + filter: Filter{ + Labels: labelMap{ + "sleater": "kinney", + }, + FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + { + Path: "a/b", + CreateIfNotPresent: true, + }, + }, + }, + }, + + "fieldSpecWithKind": { + input: ` +apiVersion: example.com/v1 +kind: Foo +metadata: + name: instance +--- +apiVersion: example.com/v2 +kind: Bar +metadata: + name: instance +`, + expectedOutput: ` +apiVersion: example.com/v1 +kind: Foo +metadata: + name: instance + labels: + cheese: cheddar +--- +apiVersion: example.com/v2 +kind: Bar +metadata: + name: instance + labels: + cheese: cheddar +a: + b: + cheese: cheddar +`, + filter: Filter{ + Labels: labelMap{ + "cheese": "cheddar", + }, + FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + { + Gvk: resid.Gvk{ + Kind: "Bar", + }, + Path: "a/b", + CreateIfNotPresent: true, + }, + }, + }, + }, + + "fieldSpecWithVersion": { + input: ` +apiVersion: example.com/v1 +kind: Foo +metadata: + name: instance +--- +apiVersion: example.com/v2 +kind: Bar +metadata: + name: instance +`, + expectedOutput: ` +apiVersion: example.com/v1 +kind: Foo +metadata: + name: instance + labels: + cheese: cheddar +a: + b: + cheese: cheddar +--- +apiVersion: example.com/v2 +kind: Bar +metadata: + name: instance + labels: + cheese: cheddar +`, + filter: Filter{ + Labels: labelMap{ + "cheese": "cheddar", + }, + FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + { + Gvk: resid.Gvk{ + Version: "v1", + }, + Path: "a/b", + CreateIfNotPresent: true, + }, + }, + }, + }, + "fieldSpecWithVersionInConfigButNoGroupInData": { + input: ` +apiVersion: v1 +kind: Foo +metadata: + name: instance +--- +apiVersion: v2 +kind: Bar +metadata: + name: instance +`, + expectedOutput: ` +apiVersion: v1 +kind: Foo +metadata: + name: instance + labels: + cheese: cheddar +a: + b: + cheese: cheddar +--- +apiVersion: v2 +kind: Bar +metadata: + name: instance + labels: + cheese: cheddar +`, + filter: Filter{ + Labels: labelMap{ + "cheese": "cheddar", + }, + FsSlice: []types.FieldSpec{ + { + Path: "metadata/labels", + CreateIfNotPresent: true, + }, + { + Gvk: resid.Gvk{ + Group: "v1", + }, + Path: "a/b", + CreateIfNotPresent: true, + }, }, }, }, @@ -127,11 +295,9 @@ a: for tn, tc := range testCases { t.Run(tn, func(t *testing.T) { - filter := tc.filter - filter.FsSlice = append(labelsFs, tc.fsSlice...) if !assert.Equal(t, strings.TrimSpace(tc.expectedOutput), - strings.TrimSpace(filtertest_test.RunFilter(t, tc.input, filter))) { + strings.TrimSpace(filtertest_test.RunFilter(t, tc.input, tc.filter))) { t.FailNow() } }) diff --git a/plugin/builtin/labeltransformer/LabelTransformer_test.go b/plugin/builtin/labeltransformer/LabelTransformer_test.go index 1799626ef..7cd529ae9 100644 --- a/plugin/builtin/labeltransformer/LabelTransformer_test.go +++ b/plugin/builtin/labeltransformer/LabelTransformer_test.go @@ -23,8 +23,18 @@ labels: app: myApp env: production fieldSpecs: - - path: metadata/labels - create: true +- path: spec/selector + create: true + version: v1 + kind: Service +- path: metadata/labels + create: true +- path: spec/selector/matchLabels + create: true + kind: Deployment +- path: spec/template/metadata/labels + create: true + kind: Deployment `, ` apiVersion: v1 kind: Service @@ -33,6 +43,23 @@ metadata: spec: ports: - port: 7002 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mungebot + labels: + app: mungebot +spec: + replicas: 1 + template: + metadata: + labels: + app: mungebot + spec: + containers: + - name: nginx + image: nginx `) th.AssertActualEqualsExpected(rm, ` @@ -46,5 +73,31 @@ metadata: spec: ports: - port: 7002 + selector: + app: myApp + env: production +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: myApp + env: production + name: mungebot +spec: + replicas: 1 + selector: + matchLabels: + app: myApp + env: production + template: + metadata: + labels: + app: myApp + env: production + spec: + containers: + - image: nginx + name: nginx `) } From d4d95012c75f71cc6628bdee4e0a3023f63ae9df Mon Sep 17 00:00:00 2001 From: Alexey Odinokov Date: Fri, 24 Apr 2020 05:14:08 +0000 Subject: [PATCH 07/24] Added needed calls for HelmV3 --- .../v1/chartinflator/ChartInflator | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/plugin/someteam.example.com/v1/chartinflator/ChartInflator b/plugin/someteam.example.com/v1/chartinflator/ChartInflator index aba44f26e..3cdca0f26 100755 --- a/plugin/someteam.example.com/v1/chartinflator/ChartInflator +++ b/plugin/someteam.example.com/v1/chartinflator/ChartInflator @@ -145,8 +145,13 @@ function v2PullChart { } function v3PullChart { - # TODO implement - echo "?? helmV3 pull --repo https://hub.helm.sh/charts/ stable/minecraft --destination /tmp/junk" + if [ ! -d "$chartHome/$chartName" ]; then + v3RunHelm pull $chartVersionArg \ + $chartRepoArg \ + --untar \ + --untardir $chartHome \ + $chartNameArg + fi } function v2InflateChart { @@ -158,8 +163,12 @@ function v2InflateChart { } function v3InflateChart { - # TODO implement - true + v3RunHelm template \ + --release-name $releaseName \ + --namespace $releaseNamespace \ + --values $valuesFile \ + $chartHome/$chartName + } HELM_VERSION=$($helmBin version -c --short) From 40db077d3d7ee58adf206f6fc43ec13321cb841b Mon Sep 17 00:00:00 2001 From: Alexey Odinokov Date: Fri, 24 Apr 2020 05:51:23 +0000 Subject: [PATCH 08/24] updated test for helmV3 --- .../someteam.example.com/v1/chartinflator/ChartInflator_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go b/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go index 2d41fe3e8..08bb9bbba 100644 --- a/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go +++ b/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go @@ -103,6 +103,7 @@ apiVersion: someteam.example.com/v1 kind: ChartInflator metadata: name: notImportantHere +chartRepo: https://kubernetes-charts.storage.googleapis.com/ chartName: minecraft helmBin: helmV3 `) From d5ba8533fa2dc51ec7786b991e88a30d05a18d25 Mon Sep 17 00:00:00 2001 From: jregan Date: Fri, 24 Apr 2020 13:09:07 -0700 Subject: [PATCH 09/24] Isolate apiVersion parsing. --- api/filters/fsslice/fieldspec_filter.go | 7 +- api/filters/fsslice/fsslice.go | 20 ---- api/filters/fsslice/fsslice_test.go | 136 ++++++++---------------- api/filters/fsslice/gvk.go | 37 +++++++ api/filters/fsslice/gvk_test.go | 101 ++++++++++++++++++ 5 files changed, 185 insertions(+), 116 deletions(-) create mode 100644 api/filters/fsslice/gvk.go create mode 100644 api/filters/fsslice/gvk_test.go diff --git a/api/filters/fsslice/fieldspec_filter.go b/api/filters/fsslice/fieldspec_filter.go index 7ff2387f8..4d2e3c4c1 100644 --- a/api/filters/fsslice/fieldspec_filter.go +++ b/api/filters/fsslice/fieldspec_filter.go @@ -124,12 +124,7 @@ func isMatchGVK(fs types.FieldSpec, obj *yaml.RNode) (bool, error) { } // parse the group and version from the apiVersion field - var group, version string - parts := strings.SplitN(meta.APIVersion, "/", 2) - group = parts[0] - if len(parts) > 1 { - version = parts[1] - } + group, version := parseGV(meta.APIVersion) if fs.Group != "" && fs.Group != group { // group doesn't match diff --git a/api/filters/fsslice/fsslice.go b/api/filters/fsslice/fsslice.go index e5c896d19..69e62c6fb 100644 --- a/api/filters/fsslice/fsslice.go +++ b/api/filters/fsslice/fsslice.go @@ -4,9 +4,6 @@ package fsslice import ( - "strings" - - "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -59,20 +56,3 @@ func (fltr Filter) Filter(obj *yaml.RNode) (*yaml.RNode, error) { } return obj, nil } - -// GetGVK parses the metadata into a GVK -func GetGVK(meta yaml.ResourceMeta) resid.Gvk { - // parse the group and version from the apiVersion field - var group, version string - parts := strings.SplitN(meta.APIVersion, "/", 2) - group = parts[0] - if len(parts) > 1 { - version = parts[1] - } - - return resid.Gvk{ - Group: group, - Version: version, - Kind: meta.Kind, - } -} diff --git a/api/filters/fsslice/fsslice_test.go b/api/filters/fsslice/fsslice_test.go index 379531bc8..9535ab208 100644 --- a/api/filters/fsslice/fsslice_test.go +++ b/api/filters/fsslice/fsslice_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" "sigs.k8s.io/kustomize/api/filters/fsslice" - "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -281,6 +280,52 @@ kind: Bar a: b: - c: {d: e} +`, + filter: fsslice.Filter{ + SetValue: fsslice.SetScalar("e"), + CreateKind: yaml.ScalarNode, + }, + }, + + { + name: "group v1", + fsSlice: ` +- path: a/b + group: v1 + create: true + kind: Bar +`, + input: ` +apiVersion: v1 +kind: Bar +`, + expected: ` +apiVersion: v1 +kind: Bar +a: + b: e +`, + filter: fsslice.Filter{ + SetValue: fsslice.SetScalar("e"), + CreateKind: yaml.ScalarNode, + }, + }, + + { + name: "version v1", + fsSlice: ` +- path: a/b + version: v1 + create: true + kind: Bar +`, + input: ` +apiVersion: v1 +kind: Bar +`, + expected: ` +apiVersion: v1 +kind: Bar `, filter: fsslice.Filter{ SetValue: fsslice.SetScalar("e"), @@ -332,92 +377,3 @@ func TestFilter_Filter(t *testing.T) { }) } } - -func TestGetGVK(t *testing.T) { - testCases := map[string]struct { - input string - expected resid.Gvk - parseError string - metaError string - }{ - "empty": { - input: ` -`, - parseError: "EOF", - }, - "junk": { - input: ` -congress: effective -`, - metaError: "missing Resource metadata", - }, - "normal": { - input: ` -apiVersion: apps/v1 -kind: Deployment -`, - expected: resid.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}, - }, - "apiVersionOnlyWithSlash": { - input: ` -apiVersion: apps/v1 -`, - expected: resid.Gvk{Group: "apps", Version: "v1", Kind: ""}, - }, - // When apiVersion is just "v1" (not, say, "apps/v1"), that - // could be interpreted as Group="", Version="v1" - // (implying the original "core" api group) or the other way around - // (Group="v1", Version=""). - // At the time of writing, fsslice.go does the latter - - // might have to change that. - "apiVersionOnlyNoSlash1": { - input: ` -apiVersion: apps -`, - expected: resid.Gvk{Group: "apps", Version: "", Kind: ""}, - }, - "apiVersionOnlyNoSlash2": { - input: ` -apiVersion: v1 -`, - expected: resid.Gvk{Group: "v1", Version: "", Kind: ""}, - }, - } - - for tn, tc := range testCases { - t.Run(tn, func(t *testing.T) { - obj, err := yaml.Parse(tc.input) - if len(tc.parseError) != 0 { - if err == nil { - t.Error("expected parse error") - return - } - if !strings.Contains(err.Error(), tc.parseError) { - t.Errorf("expected parse err '%s', got '%v'", tc.parseError, err) - } - return - } - if !assert.NoError(t, err) { - t.FailNow() - } - meta, err := obj.GetMeta() - if len(tc.metaError) != 0 { - if err == nil { - t.Error("expected meta error") - return - } - if !strings.Contains(err.Error(), tc.metaError) { - t.Errorf("expected meta err '%s', got '%v'", tc.metaError, err) - } - return - } - if !assert.NoError(t, err) { - t.FailNow() - } - gvk := fsslice.GetGVK(meta) - if !assert.Equal(t, tc.expected, gvk) { - t.FailNow() - } - }) - } -} diff --git a/api/filters/fsslice/gvk.go b/api/filters/fsslice/gvk.go new file mode 100644 index 000000000..559a33057 --- /dev/null +++ b/api/filters/fsslice/gvk.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +package fsslice + +import ( + "strings" + + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// parseGV parses apiVersion field into group and version. +func parseGV(apiVersion string) (group, version string) { + // parse the group and version from the apiVersion field + parts := strings.SplitN(apiVersion, "/", 2) + group = parts[0] + if len(parts) > 1 { + version = parts[1] + } + // TODO: Special case the original "apiVersion" of what + // we now call the "core" (empty) group. + //if group == "v1" && version == "" { + // version = "v1" + // group = "" + //} + return +} + +// GetGVK parses the metadata into a GVK +func GetGVK(meta yaml.ResourceMeta) resid.Gvk { + group, version := parseGV(meta.APIVersion) + return resid.Gvk{ + Group: group, + Version: version, + Kind: meta.Kind, + } +} diff --git a/api/filters/fsslice/gvk_test.go b/api/filters/fsslice/gvk_test.go new file mode 100644 index 000000000..151d7dbed --- /dev/null +++ b/api/filters/fsslice/gvk_test.go @@ -0,0 +1,101 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +package fsslice + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "sigs.k8s.io/kustomize/api/resid" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +func TestGetGVK(t *testing.T) { + testCases := map[string]struct { + input string + expected resid.Gvk + parseError string + metaError string + }{ + "empty": { + input: ` +`, + parseError: "EOF", + }, + "junk": { + input: ` +congress: effective +`, + metaError: "missing Resource metadata", + }, + "normal": { + input: ` +apiVersion: apps/v1 +kind: Deployment +`, + expected: resid.Gvk{Group: "apps", Version: "v1", Kind: "Deployment"}, + }, + "apiVersionOnlyWithSlash": { + input: ` +apiVersion: apps/v1 +`, + expected: resid.Gvk{Group: "apps", Version: "v1", Kind: ""}, + }, + // When apiVersion is just "v1" (not, say, "apps/v1"), that + // could be interpreted as Group="", Version="v1" + // (implying the original "core" api group) or the other way around + // (Group="v1", Version=""). + // At the time of writing, fsslice.go does the latter - + // might have to change that. + "apiVersionOnlyNoSlash1": { + input: ` +apiVersion: apps +`, + expected: resid.Gvk{Group: "apps", Version: "", Kind: ""}, + }, + "apiVersionOnlyNoSlash2": { + input: ` +apiVersion: v1 +`, + expected: resid.Gvk{Group: "v1", Version: "", Kind: ""}, + }, + } + + for tn, tc := range testCases { + t.Run(tn, func(t *testing.T) { + obj, err := yaml.Parse(tc.input) + if len(tc.parseError) != 0 { + if err == nil { + t.Error("expected parse error") + return + } + if !strings.Contains(err.Error(), tc.parseError) { + t.Errorf("expected parse err '%s', got '%v'", tc.parseError, err) + } + return + } + if !assert.NoError(t, err) { + t.FailNow() + } + meta, err := obj.GetMeta() + if len(tc.metaError) != 0 { + if err == nil { + t.Error("expected meta error") + return + } + if !strings.Contains(err.Error(), tc.metaError) { + t.Errorf("expected meta err '%s', got '%v'", tc.metaError, err) + } + return + } + if !assert.NoError(t, err) { + t.FailNow() + } + gvk := GetGVK(meta) + if !assert.Equal(t, tc.expected, gvk) { + t.FailNow() + } + }) + } +} From 0636368c8ca3377aed7d71bd83ca8d3913c6a00f Mon Sep 17 00:00:00 2001 From: jregan Date: Fri, 24 Apr 2020 15:10:59 -0700 Subject: [PATCH 10/24] More GVK tests before GV treatment changes. --- api/filters/fsslice/gvk_test.go | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/api/filters/fsslice/gvk_test.go b/api/filters/fsslice/gvk_test.go index 151d7dbed..66f23b14a 100644 --- a/api/filters/fsslice/gvk_test.go +++ b/api/filters/fsslice/gvk_test.go @@ -11,6 +11,67 @@ import ( "sigs.k8s.io/kustomize/kyaml/yaml" ) +func TestParseGV(t *testing.T) { + testCases := map[string]struct { + input string + expectedGroup string + expectedVersion string + }{ + "empty": { + input: "", + expectedGroup: "", + expectedVersion: "", + }, + "certSigning": { + input: "certificates.k8s.io/v1beta1", + expectedGroup: "certificates.k8s.io", + expectedVersion: "v1beta1", + }, + "extensions": { + input: "extensions/v1beta1", + expectedGroup: "extensions", + expectedVersion: "v1beta1", + }, + "normal": { + input: "apps/v1", + expectedGroup: "apps", + expectedVersion: "v1", + }, + "justApps": { + input: "apps", + expectedGroup: "apps", + expectedVersion: "", + }, + "coreV1": { + input: "v1", + expectedGroup: "v1", + expectedVersion: "", + }, + "coreV2": { + input: "v2", + expectedGroup: "v2", + expectedVersion: "", + }, + "coreV2Beta1": { + input: "v2beta1", + expectedGroup: "v2beta1", + expectedVersion: "", + }, + } + + for tn, tc := range testCases { + t.Run(tn, func(t *testing.T) { + group, version := parseGV(tc.input) + if !assert.Equal(t, tc.expectedGroup, group) { + t.FailNow() + } + if !assert.Equal(t, tc.expectedVersion, version) { + t.FailNow() + } + }) + } +} + func TestGetGVK(t *testing.T) { testCases := map[string]struct { input string From c852bb00f24cf0411d8bb4e489a0f0cf94467d0f Mon Sep 17 00:00:00 2001 From: jregan Date: Fri, 24 Apr 2020 15:40:23 -0700 Subject: [PATCH 11/24] Special treatment for core apiVersions. --- api/filters/fsslice/fsslice_test.go | 4 ++-- api/filters/fsslice/gvk.go | 24 ++++++++++++++++++------ api/filters/fsslice/gvk_test.go | 20 +++++++------------- api/filters/labels/labels_test.go | 2 +- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/api/filters/fsslice/fsslice_test.go b/api/filters/fsslice/fsslice_test.go index 9535ab208..458ad1195 100644 --- a/api/filters/fsslice/fsslice_test.go +++ b/api/filters/fsslice/fsslice_test.go @@ -302,8 +302,6 @@ kind: Bar expected: ` apiVersion: v1 kind: Bar -a: - b: e `, filter: fsslice.Filter{ SetValue: fsslice.SetScalar("e"), @@ -326,6 +324,8 @@ kind: Bar expected: ` apiVersion: v1 kind: Bar +a: + b: e `, filter: fsslice.Filter{ SetValue: fsslice.SetScalar("e"), diff --git a/api/filters/fsslice/gvk.go b/api/filters/fsslice/gvk.go index 559a33057..c130eb31a 100644 --- a/api/filters/fsslice/gvk.go +++ b/api/filters/fsslice/gvk.go @@ -9,6 +9,18 @@ import ( "sigs.k8s.io/kustomize/kyaml/yaml" ) +// Return true for 'v' followed by a 1 or 2, and don't look at rest. +// I.e. 'v1', 'v1beta1', 'v2', would return true. +func looksLikeACoreApiVersion(s string) bool { + if len(s) < 2 { + return false + } + if s[0:1] != "v" { + return false + } + return s[1:2] == "1" || s[1:2] == "2" +} + // parseGV parses apiVersion field into group and version. func parseGV(apiVersion string) (group, version string) { // parse the group and version from the apiVersion field @@ -17,12 +29,12 @@ func parseGV(apiVersion string) (group, version string) { if len(parts) > 1 { version = parts[1] } - // TODO: Special case the original "apiVersion" of what - // we now call the "core" (empty) group. - //if group == "v1" && version == "" { - // version = "v1" - // group = "" - //} + // Special case the original "apiVersion" of what + // we now call the "core" (empty) group. + if version == "" && looksLikeACoreApiVersion(group) { + version = group + group = "" + } return } diff --git a/api/filters/fsslice/gvk_test.go b/api/filters/fsslice/gvk_test.go index 66f23b14a..57894ce5d 100644 --- a/api/filters/fsslice/gvk_test.go +++ b/api/filters/fsslice/gvk_test.go @@ -44,18 +44,18 @@ func TestParseGV(t *testing.T) { }, "coreV1": { input: "v1", - expectedGroup: "v1", - expectedVersion: "", + expectedGroup: "", + expectedVersion: "v1", }, "coreV2": { input: "v2", - expectedGroup: "v2", - expectedVersion: "", + expectedGroup: "", + expectedVersion: "v2", }, "coreV2Beta1": { input: "v2beta1", - expectedGroup: "v2beta1", - expectedVersion: "", + expectedGroup: "", + expectedVersion: "v2beta1", }, } @@ -103,12 +103,6 @@ apiVersion: apps/v1 `, expected: resid.Gvk{Group: "apps", Version: "v1", Kind: ""}, }, - // When apiVersion is just "v1" (not, say, "apps/v1"), that - // could be interpreted as Group="", Version="v1" - // (implying the original "core" api group) or the other way around - // (Group="v1", Version=""). - // At the time of writing, fsslice.go does the latter - - // might have to change that. "apiVersionOnlyNoSlash1": { input: ` apiVersion: apps @@ -119,7 +113,7 @@ apiVersion: apps input: ` apiVersion: v1 `, - expected: resid.Gvk{Group: "v1", Version: "", Kind: ""}, + expected: resid.Gvk{Group: "", Version: "v1", Kind: ""}, }, } diff --git a/api/filters/labels/labels_test.go b/api/filters/labels/labels_test.go index a651a1276..3a51cc4fe 100644 --- a/api/filters/labels/labels_test.go +++ b/api/filters/labels/labels_test.go @@ -283,7 +283,7 @@ metadata: }, { Gvk: resid.Gvk{ - Group: "v1", + Version: "v1", }, Path: "a/b", CreateIfNotPresent: true, From 72c7db39f2b087dd1c75658cf580489a35279122 Mon Sep 17 00:00:00 2001 From: jregan Date: Fri, 24 Apr 2020 15:53:53 -0700 Subject: [PATCH 12/24] Migrate the label transformer. --- api/builtins/LabelTransformer.go | 19 +++++++++++-------- .../labeltransformer/LabelTransformer.go | 19 +++++++++++-------- plugin/builtin/labeltransformer/go.mod | 1 + 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/api/builtins/LabelTransformer.go b/api/builtins/LabelTransformer.go index 88df34561..eaa7d8a81 100644 --- a/api/builtins/LabelTransformer.go +++ b/api/builtins/LabelTransformer.go @@ -4,9 +4,10 @@ package builtins import ( + "sigs.k8s.io/kustomize/api/filters/labels" "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/transform" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/yaml" ) @@ -24,14 +25,16 @@ func (p *LabelTransformerPlugin) Config( } func (p *LabelTransformerPlugin) Transform(m resmap.ResMap) error { - t, err := transform.NewMapTransformer( - p.FieldSpecs, - p.Labels, - ) - if err != nil { - return err + for _, r := range m.Resources() { + err := filtersutil.ApplyToJSON(labels.Filter{ + Labels: p.Labels, + FsSlice: p.FieldSpecs, + }, r.Kunstructured) + if err != nil { + return err + } } - return t.Transform(m) + return nil } func NewLabelTransformerPlugin() resmap.TransformerPlugin { diff --git a/plugin/builtin/labeltransformer/LabelTransformer.go b/plugin/builtin/labeltransformer/LabelTransformer.go index df852c497..93697719e 100644 --- a/plugin/builtin/labeltransformer/LabelTransformer.go +++ b/plugin/builtin/labeltransformer/LabelTransformer.go @@ -5,9 +5,10 @@ package main import ( + "sigs.k8s.io/kustomize/api/filters/labels" "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/transform" "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/yaml" ) @@ -28,12 +29,14 @@ func (p *plugin) Config( } func (p *plugin) Transform(m resmap.ResMap) error { - t, err := transform.NewMapTransformer( - p.FieldSpecs, - p.Labels, - ) - if err != nil { - return err + for _, r := range m.Resources() { + err := filtersutil.ApplyToJSON(labels.Filter{ + Labels: p.Labels, + FsSlice: p.FieldSpecs, + }, r.Kunstructured) + if err != nil { + return err + } } - return t.Transform(m) + return nil } diff --git a/plugin/builtin/labeltransformer/go.mod b/plugin/builtin/labeltransformer/go.mod index 48b93a9e4..e1eeca9c3 100644 --- a/plugin/builtin/labeltransformer/go.mod +++ b/plugin/builtin/labeltransformer/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( sigs.k8s.io/kustomize/api v0.3.1 + sigs.k8s.io/kustomize/kyaml v0.1.5 sigs.k8s.io/yaml v1.1.0 ) From 855b2c31712b41e8f8aed753a23e9d59fffe097d Mon Sep 17 00:00:00 2001 From: Alexey Odinokov Date: Sat, 25 Apr 2020 04:58:14 +0000 Subject: [PATCH 13/24] Polishing helmV3 related changes Enabled HelmV3 related test, Made sure HelmV2 and HelmV3 UT pass, Pinned Chart version as per TODO note Removed accomplished TODOs --- .../v1/chartinflator/ChartInflator | 4 ---- .../v1/chartinflator/ChartInflator_test.go | 23 ++++++++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/plugin/someteam.example.com/v1/chartinflator/ChartInflator b/plugin/someteam.example.com/v1/chartinflator/ChartInflator index 3cdca0f26..37aa63d16 100755 --- a/plugin/someteam.example.com/v1/chartinflator/ChartInflator +++ b/plugin/someteam.example.com/v1/chartinflator/ChartInflator @@ -28,10 +28,6 @@ # Example execution: # ./plugin/someteam.example.com/v1/ChartInflator configFile.yaml -# TODO: allow specification of a specific chart VERSION -# so this test doesn't break every time minecraft is upgraded :P -# See https://github.com/helm/helm/issues/4008 - set -e # Yaml parsing is a ridiculous thing to do in bash, diff --git a/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go b/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go index 08bb9bbba..107b6c105 100644 --- a/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go +++ b/plugin/someteam.example.com/v1/chartinflator/ChartInflator_test.go @@ -8,13 +8,14 @@ package main_test import ( + "fmt" "regexp" "testing" kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" ) -const expectedResources = ` +const expectedResourcesTemplate = ` apiVersion: v1 data: rcon-password: Q0hBTkdFTUUh @@ -23,7 +24,7 @@ metadata: labels: app: release-name-minecraft chart: minecraft-SOMEVERSION - heritage: Tiller + heritage: %s release: release-name name: release-name-minecraft type: Opaque @@ -36,7 +37,7 @@ metadata: labels: app: release-name-minecraft chart: minecraft-SOMEVERSION - heritage: Tiller + heritage: %s release: release-name name: release-name-minecraft-datadir spec: @@ -52,7 +53,7 @@ metadata: labels: app: release-name-minecraft chart: minecraft-SOMEVERSION - heritage: Tiller + heritage: %s release: release-name name: release-name-minecraft spec: @@ -66,9 +67,13 @@ spec: type: LoadBalancer ` +func expectedResources(serviceName string) string { + return fmt.Sprintf(expectedResourcesTemplate, serviceName, serviceName, serviceName) +} + // This test requires having "helmV2" (presumably helm V2 series) on the PATH. // -// TODO: Download and inflate the chart, and check that +// Download and inflate the chart, and check that // in for the test. func TestHelmV2ChartInflator(t *testing.T) { th := kusttest_test.MakeEnhancedHarness(t). @@ -81,6 +86,7 @@ kind: ChartInflator metadata: name: notImportantHere chartName: minecraft +chartVersion: 1.2.0 helmBin: helmV2 `) @@ -88,12 +94,12 @@ helmBin: helmV2 th.AssertActualEqualsExpectedWithTweak(m, func(x []byte) []byte { return chartName.ReplaceAll(x, []byte("chart: minecraft-SOMEVERSION")) - }, expectedResources) + }, expectedResources("Tiller")) } // This test requires having "helmV3" (presumably helm V3 series) on the PATH. // -func disabled_TestHelmV3ChartInflator(t *testing.T) { +func TestHelmV3ChartInflator(t *testing.T) { th := kusttest_test.MakeEnhancedHarness(t). PrepExecPlugin("someteam.example.com", "v1", "ChartInflator") defer th.Reset() @@ -105,6 +111,7 @@ metadata: name: notImportantHere chartRepo: https://kubernetes-charts.storage.googleapis.com/ chartName: minecraft +chartVersion: 1.2.0 helmBin: helmV3 `) @@ -112,5 +119,5 @@ helmBin: helmV3 th.AssertActualEqualsExpectedWithTweak(m, func(x []byte) []byte { return chartName.ReplaceAll(x, []byte("chart: minecraft-SOMEVERSION")) - }, expectedResources) + }, expectedResources("Helm")) } From f07cae82b06f2258b856b0925dc39c91676ab627 Mon Sep 17 00:00:00 2001 From: jregan Date: Sat, 25 Apr 2020 12:32:32 -0700 Subject: [PATCH 14/24] Disable flakey git diff checks. --- travis/check-go-mod.sh | 10 ++++++---- travis/kyaml-pre-commit.sh | 14 ++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/travis/check-go-mod.sh b/travis/check-go-mod.sh index 1bfc9e91d..a387f30d4 100755 --- a/travis/check-go-mod.sh +++ b/travis/check-go-mod.sh @@ -14,7 +14,9 @@ for i in $(find . -name go.mod -not -path "./hack/*"); do popd done -# verify no changes to go.mods -- these should be part of the PR -find . -name go.sum | xargs git checkout -- -git add . -git diff-index HEAD --exit-code +# Need better check. This is repeated git diff check +# more pain than benefit for most people 25Apr2020 +## verify no changes to go.mods -- these should be part of the PR +# find . -name go.sum | xargs git checkout -- +# git add . +# git diff-index HEAD --exit-code diff --git a/travis/kyaml-pre-commit.sh b/travis/kyaml-pre-commit.sh index 962f5189b..4f1f93f21 100755 --- a/travis/kyaml-pre-commit.sh +++ b/travis/kyaml-pre-commit.sh @@ -26,9 +26,11 @@ for target in $targets; do popd done -# make sure no files were generated or changed by make -# ignore changes to go.mod and go.sum -- they are too flaky -find . -name go.mod | xargs git checkout -- -find . -name go.sum | xargs git checkout -- -git add . -git diff-index HEAD --exit-code +# Need better check. This is repeated git diff check +# more pain than benefit for most people 25Apr2020 +## make sure no files were generated or changed by make +## ignore changes to go.mod and go.sum -- they are too flaky +# find . -name go.mod | xargs git checkout -- +# find . -name go.sum | xargs git checkout -- +# git add . +# git diff-index HEAD --exit-code From 7feb873ef685b2246a14ac53592fffe3e907b59d Mon Sep 17 00:00:00 2001 From: jregan Date: Sat, 25 Apr 2020 12:59:38 -0700 Subject: [PATCH 15/24] Remove MapTransformer. --- api/builtins/AnnotationsTransformer.go | 28 +- api/go.sum | 9 +- api/transform/maptransformer.go | 64 -- api/transform/maptransformer_test.go | 570 ------------------ api/transform/nooptransformer.go | 21 - .../AnnotationsTransformer.go | 28 +- .../someteam.example.com/v1/gogetter/go.sum | 1 + 7 files changed, 15 insertions(+), 706 deletions(-) delete mode 100644 api/transform/maptransformer.go delete mode 100644 api/transform/maptransformer_test.go delete mode 100644 api/transform/nooptransformer.go diff --git a/api/builtins/AnnotationsTransformer.go b/api/builtins/AnnotationsTransformer.go index 823b12d62..3db04125c 100644 --- a/api/builtins/AnnotationsTransformer.go +++ b/api/builtins/AnnotationsTransformer.go @@ -6,7 +6,6 @@ package builtins import ( "sigs.k8s.io/kustomize/api/filters/annotations" "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/transform" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/yaml" @@ -16,10 +15,6 @@ import ( type AnnotationsTransformerPlugin struct { Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` - - // YAMLSupport can be set to true to use the kyaml filter instead of the - // kunstruct transformer - YAMLSupport bool `json:"yamlSupport,omitempty" yaml:"yamlSupport,omitempty"` } func (p *AnnotationsTransformerPlugin) Config( @@ -30,27 +25,16 @@ func (p *AnnotationsTransformerPlugin) Config( } func (p *AnnotationsTransformerPlugin) Transform(m resmap.ResMap) error { - if p.YAMLSupport { - for _, r := range m.Resources() { - err := filtersutil.ApplyToJSON(annotations.Filter{ - Annotations: p.Annotations, - FsSlice: p.FieldSpecs, - }, r.Kunstructured) - if err != nil { - return err - } - } - return nil - } else { - t, err := transform.NewMapTransformer( - p.FieldSpecs, - p.Annotations, - ) + for _, r := range m.Resources() { + err := filtersutil.ApplyToJSON(annotations.Filter{ + Annotations: p.Annotations, + FsSlice: p.FieldSpecs, + }, r.Kunstructured) if err != nil { return err } - return t.Transform(m) } + return nil } func NewAnnotationsTransformerPlugin() resmap.TransformerPlugin { diff --git a/api/go.sum b/api/go.sum index fef49cded..797cde2d4 100644 --- a/api/go.sum +++ b/api/go.sum @@ -297,6 +297,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d h1:BzRvVq1EHuIjxpijCEKpAxzKUUMurOQ4sknehIATRh8= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= @@ -422,6 +423,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -506,13 +508,6 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphD mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -sigs.k8s.io/kustomize v1.0.11 h1:Yb+6DDt9+aR2AvQApvUaKS/ugteeG4MPyoFeUHiPOjk= -sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= -sigs.k8s.io/kustomize/kyaml v0.1.1 h1:nGUNYINljZNmlAS8uoobUv/wx/s3Pg8dNxYo+W7uYh0= -sigs.k8s.io/kustomize/kyaml v0.1.1/go.mod h1:/NdPPfrperSCGjm55cwEro1loBVtbtVIXSb7FguK6uk= -sigs.k8s.io/kustomize/kyaml v0.1.2 h1:l12+QGl+ETUHhP8/bZAi6TknU7H194fXL/9b2gUxZFY= -sigs.k8s.io/kustomize/kyaml v0.1.3 h1:zbeHVTMCQPtWgjIH/YYJZC45mm7coTdw2TblyJ79BrY= -sigs.k8s.io/kustomize/kyaml v0.1.3/go.mod h1:461i94nj0h0ylJ6w83jLkR4SqqVhn1iY6fjD0JSTQeE= sigs.k8s.io/kustomize/kyaml v0.1.5 h1:NicBWYTwkuOfVyZDbNkfSBSCwSgin4uirkedtyZltIc= sigs.k8s.io/kustomize/kyaml v0.1.5/go.mod h1:461i94nj0h0ylJ6w83jLkR4SqqVhn1iY6fjD0JSTQeE= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= diff --git a/api/transform/maptransformer.go b/api/transform/maptransformer.go deleted file mode 100644 index 125e83ce8..000000000 --- a/api/transform/maptransformer.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package transform - -import ( - "errors" - "fmt" - - "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/types" -) - -// mapTransformer applies a string->string map to fieldSpecs. -type mapTransformer struct { - m map[string]string - fieldSpecs []types.FieldSpec -} - -var _ resmap.Transformer = &mapTransformer{} - -// NewMapTransformer construct a mapTransformer. -func NewMapTransformer( - pc []types.FieldSpec, m map[string]string) (resmap.Transformer, error) { - if m == nil { - return newNoOpTransformer(), nil - } - if pc == nil { - return nil, errors.New("fieldSpecs is not expected to be nil") - } - return &mapTransformer{fieldSpecs: pc, m: m}, nil -} - -// Transform apply each pair in the mapTransformer to the -// fields specified in mapTransformer. -func (o *mapTransformer) Transform(m resmap.ResMap) error { - for _, r := range m.Resources() { - for _, path := range o.fieldSpecs { - if !r.OrgId().IsSelected(&path.Gvk) { - continue - } - err := MutateField( - r.Map(), path.PathSlice(), - path.CreateIfNotPresent, o.addMap) - if err != nil { - return err - } - } - } - return nil -} - -func (o *mapTransformer) addMap(in interface{}) (interface{}, error) { - m, ok := in.(map[string]interface{}) - if in == nil { - m = map[string]interface{}{} - } else if !ok { - return nil, fmt.Errorf("%#v is expected to be %T", in, m) - } - for k, v := range o.m { - m[k] = v - } - return m, nil -} diff --git a/api/transform/maptransformer_test.go b/api/transform/maptransformer_test.go deleted file mode 100644 index 631150b04..000000000 --- a/api/transform/maptransformer_test.go +++ /dev/null @@ -1,570 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package transform_test - -import ( - "testing" - - "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig" - "sigs.k8s.io/kustomize/api/k8sdeps/kunstruct" - "sigs.k8s.io/kustomize/api/resource" - resmaptest_test "sigs.k8s.io/kustomize/api/testutils/resmaptest" - . "sigs.k8s.io/kustomize/api/transform" -) - -var resourceFactory = resource.NewFactory(kunstruct.NewKunstructuredFactoryImpl()) - -func TestLabelsRun(t *testing.T) { - m := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - }, - }). - Add(map[string]interface{}{ - "group": "apps", - "apiVersion": "v1", - "kind": "Deployment", - "metadata": map[string]interface{}{ - "name": "deploy1", - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "old-label": "old-value", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "Service", - "metadata": map[string]interface{}{ - "name": "svc1", - }, - "spec": map[string]interface{}{ - "ports": []interface{}{ - map[string]interface{}{ - "name": "port1", - "port": "12345", - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1", - "kind": "Job", - "metadata": map[string]interface{}{ - "name": "job1", - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1", - "kind": "Job", - "metadata": map[string]interface{}{ - "name": "job2", - }, - "spec": map[string]interface{}{ - "selector": map[string]interface{}{ - "matchLabels": map[string]interface{}{ - "old-label": "old-value", - }, - }, - "template": map[string]interface{}{ - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1beta1", - "kind": "CronJob", - "metadata": map[string]interface{}{ - "name": "cronjob1", - }, - "spec": map[string]interface{}{ - "schedule": "* 23 * * *", - "jobTemplate": map[string]interface{}{ - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1beta1", - "kind": "CronJob", - "metadata": map[string]interface{}{ - "name": "cronjob2", - }, - "spec": map[string]interface{}{ - "schedule": "* 23 * * *", - "jobTemplate": map[string]interface{}{ - "spec": map[string]interface{}{ - "selector": map[string]interface{}{ - "matchLabels": map[string]interface{}{ - "old-label": "old-value", - }, - }, - "template": map[string]interface{}{ - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }, - }, - }).ResMap() - - expected := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - }). - Add(map[string]interface{}{ - "group": "apps", - "apiVersion": "v1", - "kind": "Deployment", - "metadata": map[string]interface{}{ - "name": "deploy1", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "selector": map[string]interface{}{ - "matchLabels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "old-label": "old-value", - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "Service", - "metadata": map[string]interface{}{ - "name": "svc1", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "ports": []interface{}{ - map[string]interface{}{ - "name": "port1", - "port": "12345", - }, - }, - "selector": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1", - "kind": "Job", - "metadata": map[string]interface{}{ - "name": "job1", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1", - "kind": "Job", - "metadata": map[string]interface{}{ - "name": "job2", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "selector": map[string]interface{}{ - "matchLabels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - "old-label": "old-value", - }, - }, - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1beta1", - "kind": "CronJob", - "metadata": map[string]interface{}{ - "name": "cronjob1", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "schedule": "* 23 * * *", - "jobTemplate": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "batch/v1beta1", - "kind": "CronJob", - "metadata": map[string]interface{}{ - "name": "cronjob2", - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "schedule": "* 23 * * *", - "jobTemplate": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "selector": map[string]interface{}{ - "matchLabels": map[string]interface{}{ - "old-label": "old-value", - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "label-key1": "label-value1", - "label-key2": "label-value2", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }, - }, - }).ResMap() - - lt, err := NewMapTransformer( - builtinconfig.MakeDefaultConfig().CommonLabels, - map[string]string{"label-key1": "label-value1", "label-key2": "label-value2"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = lt.Transform(m) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err = expected.ErrorIfNotEqualLists(m); err != nil { - t.Fatalf("actual doesn't match expected: %v", err) - } -} - -func TestAnnotationsRun(t *testing.T) { - m := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - }, - }). - Add(map[string]interface{}{ - "group": "apps", - "apiVersion": "v1", - "kind": "Deployment", - "metadata": map[string]interface{}{ - "name": "deploy1", - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - "old-label": "old-value", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "Service", - "metadata": map[string]interface{}{ - "name": "svc1", - }, - "spec": map[string]interface{}{ - "ports": []interface{}{ - map[string]interface{}{ - "name": "port1", - "port": "12345", - }, - }, - }, - }).ResMap() - - expected := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - "annotations": map[string]interface{}{ - "anno-key1": "anno-value1", - "anno-key2": "anno-value2", - }, - }, - }). - Add(map[string]interface{}{ - "group": "apps", - "apiVersion": "v1", - "kind": "Deployment", - "metadata": map[string]interface{}{ - "name": "deploy1", - "annotations": map[string]interface{}{ - "anno-key1": "anno-value1", - "anno-key2": "anno-value2", - }, - }, - "spec": map[string]interface{}{ - "template": map[string]interface{}{ - "metadata": map[string]interface{}{ - "annotations": map[string]interface{}{ - "anno-key1": "anno-value1", - "anno-key2": "anno-value2", - }, - "labels": map[string]interface{}{ - "old-label": "old-value", - }, - }, - "spec": map[string]interface{}{ - "containers": []interface{}{ - map[string]interface{}{ - "name": "nginx", - "image": "nginx:1.7.9", - }, - }, - }, - }, - }, - }). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "Service", - "metadata": map[string]interface{}{ - "name": "svc1", - "annotations": map[string]interface{}{ - "anno-key1": "anno-value1", - "anno-key2": "anno-value2", - }, - }, - "spec": map[string]interface{}{ - "ports": []interface{}{ - map[string]interface{}{ - "name": "port1", - "port": "12345", - }, - }, - }, - }).ResMap() - at, err := NewMapTransformer( - builtinconfig.MakeDefaultConfig().CommonAnnotations, - map[string]string{"anno-key1": "anno-value1", "anno-key2": "anno-value2"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = at.Transform(m) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err = expected.ErrorIfNotEqualLists(m); err != nil { - t.Fatalf("actual doesn't match expected: %v", err) - } -} - -func TestAnnotationsRunWithNullValue(t *testing.T) { - m := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - "annotations": nil, - }, - }).ResMap() - - expected := resmaptest_test.NewRmBuilder(t, resourceFactory). - Add(map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": "cm1", - "annotations": map[string]interface{}{ - "anno-key1": "anno-value1", - "anno-key2": "anno-value2", - }, - }, - }).ResMap() - - at, err := NewMapTransformer( - builtinconfig.MakeDefaultConfig().CommonAnnotations, - map[string]string{"anno-key1": "anno-value1", "anno-key2": "anno-value2"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = at.Transform(m) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if err = expected.ErrorIfNotEqualLists(m); err != nil { - t.Fatalf("actual doesn't match expected: %v", err) - } -} diff --git a/api/transform/nooptransformer.go b/api/transform/nooptransformer.go deleted file mode 100644 index 52e87a077..000000000 --- a/api/transform/nooptransformer.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package transform - -import "sigs.k8s.io/kustomize/api/resmap" - -// noOpTransformer contains a no-op transformer. -type noOpTransformer struct{} - -var _ resmap.Transformer = &noOpTransformer{} - -// newNoOpTransformer constructs a noOpTransformer. -func newNoOpTransformer() resmap.Transformer { - return &noOpTransformer{} -} - -// Transform does nothing. -func (o *noOpTransformer) Transform(_ resmap.ResMap) error { - return nil -} diff --git a/plugin/builtin/annotationstransformer/AnnotationsTransformer.go b/plugin/builtin/annotationstransformer/AnnotationsTransformer.go index 7b6ea3296..c03edb435 100644 --- a/plugin/builtin/annotationstransformer/AnnotationsTransformer.go +++ b/plugin/builtin/annotationstransformer/AnnotationsTransformer.go @@ -7,7 +7,6 @@ package main import ( "sigs.k8s.io/kustomize/api/filters/annotations" "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/transform" "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/filtersutil" "sigs.k8s.io/yaml" @@ -17,10 +16,6 @@ import ( type plugin struct { Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` - - // YAMLSupport can be set to true to use the kyaml filter instead of the - // kunstruct transformer - YAMLSupport bool `json:"yamlSupport,omitempty" yaml:"yamlSupport,omitempty"` } //noinspection GoUnusedGlobalVariable @@ -34,25 +29,14 @@ func (p *plugin) Config( } func (p *plugin) Transform(m resmap.ResMap) error { - if p.YAMLSupport { - for _, r := range m.Resources() { - err := filtersutil.ApplyToJSON(annotations.Filter{ - Annotations: p.Annotations, - FsSlice: p.FieldSpecs, - }, r.Kunstructured) - if err != nil { - return err - } - } - return nil - } else { - t, err := transform.NewMapTransformer( - p.FieldSpecs, - p.Annotations, - ) + for _, r := range m.Resources() { + err := filtersutil.ApplyToJSON(annotations.Filter{ + Annotations: p.Annotations, + FsSlice: p.FieldSpecs, + }, r.Kunstructured) if err != nil { return err } - return t.Transform(m) } + return nil } diff --git a/plugin/someteam.example.com/v1/gogetter/go.sum b/plugin/someteam.example.com/v1/gogetter/go.sum index 47393806c..5870a181c 100644 --- a/plugin/someteam.example.com/v1/gogetter/go.sum +++ b/plugin/someteam.example.com/v1/gogetter/go.sum @@ -201,6 +201,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= From 1d46edccb5f40315b5c947c5ca6fa76df3792510 Mon Sep 17 00:00:00 2001 From: Ian Howell Date: Mon, 27 Apr 2020 11:00:41 -0500 Subject: [PATCH 16/24] Fix a panic when doing variable replacement. This fixes an issue where Kustomize expects a []string, but gets a slice of something else instead, which causing a runtime panic. This fixes 2241 --- api/internal/accumulator/refvartransformer.go | 10 +++-- .../accumulator/refvartransformer_test.go | 45 +++++++++++++++---- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/api/internal/accumulator/refvartransformer.go b/api/internal/accumulator/refvartransformer.go index 1900cdc4b..bda417046 100644 --- a/api/internal/accumulator/refvartransformer.go +++ b/api/internal/accumulator/refvartransformer.go @@ -40,7 +40,11 @@ func (rv *refVarTransformer) replaceVars(in interface{}) (interface{}, error) { case []interface{}: var xs []interface{} for _, a := range in.([]interface{}) { - xs = append(xs, expansion2.Expand(a.(string), rv.mappingFunc)) + x, ok := a.(string) + if !ok { + return nil, fmt.Errorf("expected array of strings, found %v", in) + } + xs = append(xs, expansion2.Expand(x, rv.mappingFunc)) } return xs, nil case map[string]interface{}: @@ -49,7 +53,7 @@ func (rv *refVarTransformer) replaceVars(in interface{}) (interface{}, error) { for k, v := range inMap { s, ok := v.(string) if !ok { - // This field not contain a $(VAR) since it is not + // This field can not contain a $(VAR) since it is not // of string type. For instance .spec.replicas: 3 in // a Deployment object xs[k] = v @@ -64,7 +68,7 @@ func (rv *refVarTransformer) replaceVars(in interface{}) (interface{}, error) { case interface{}: s, ok := in.(string) if !ok { - // This field not contain a $(VAR) since it is not of string type. + // This field can not contain a $(VAR) since it is not of string type. return in, nil } // This field can potentially contain a $(VAR) since it is diff --git a/api/internal/accumulator/refvartransformer_test.go b/api/internal/accumulator/refvartransformer_test.go index 64ffbb635..ac899f9f3 100644 --- a/api/internal/accumulator/refvartransformer_test.go +++ b/api/internal/accumulator/refvartransformer_test.go @@ -29,6 +29,7 @@ func TestRefVarTransformer(t *testing.T) { description string given given expected expected + errMessage string }{ { description: "var replacement in map[string]", @@ -111,6 +112,27 @@ func TestRefVarTransformer(t *testing.T) { unused: []string{"BAR"}, }, }, + { + description: "var replacement panic in map[string]", + given: given{ + varMap: map[string]interface{}{}, + fs: []types.FieldSpec{ + {Gvk: resid.Gvk{Version: "v1", Kind: "ConfigMap"}, Path: "data/slice"}, + }, + res: resmaptest_test.NewRmBuilder( + t, resource.NewFactory(kunstruct.NewKunstructuredFactoryImpl())). + Add(map[string]interface{}{ + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": map[string]interface{}{ + "name": "cm1", + }, + "data": map[string]interface{}{ + "slice": []interface{}{5}, // noticeably *not* a []string + }}).ResMap(), + }, + errMessage: "expected array of strings, found [5]", + }, } for _, tc := range testCases { @@ -122,16 +144,23 @@ func TestRefVarTransformer(t *testing.T) { err := tr.Transform(tc.given.res) // assert - if err != nil { - t.Errorf("unexpected error: %v", err) - } + if tc.errMessage != "" { + if err == nil { + t.Fatalf("missing expected error %v", tc.errMessage) + } else if err.Error() != tc.errMessage { + t.Fatalf("actual error doesn't match expected error: \nACTUAL: %v\nEXPECTED: %v", err.Error(), tc.errMessage) + } + } else { + if err != nil { + t.Errorf("unexpected error: %v", err) + } - a, e := tc.given.res, tc.expected.res - if !reflect.DeepEqual(a, e) { - err = e.ErrorIfNotEqualLists(a) - t.Fatalf("actual doesn't match expected: \nACTUAL:\n%v\nEXPECTED:\n%v\nERR: %v", a, e, err) + a, e := tc.given.res, tc.expected.res + if !reflect.DeepEqual(a, e) { + err = e.ErrorIfNotEqualLists(a) + t.Fatalf("actual doesn't match expected: \nACTUAL:\n%v\nEXPECTED:\n%v\nERR: %v", a, e, err) + } } - }) } } From 63f7495e88f7d3fe807df6d05f0e8820c221aba8 Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Wed, 22 Apr 2020 16:56:16 -0700 Subject: [PATCH 17/24] Remove inventory transformer #2392 --- Makefile | 2 - api/builtins/InventoryTransformer.go | 125 ----- .../builtinplugintype_string.go | 23 +- .../plugins/builtinhelpers/builtins.go | 2 - api/internal/target/kusttarget.go | 43 +- api/inventory/constants.go | 12 - api/inventory/inventory.go | 235 --------- api/inventory/inventory_test.go | 60 --- api/krusty/kustomizer.go | 6 +- api/krusty/pruneconfigmap_test.go | 163 ------- api/types/garbagepolicy.go | 12 - api/types/garbagepolicy_string.go | 25 - kustomize/internal/commands/build/build.go | 32 -- .../InventoryTransformer.go | 125 ----- .../InventoryTransformer_test.go | 108 ----- plugin/builtin/inventorytransformer/go.mod | 10 - plugin/builtin/inventorytransformer/go.sum | 453 ------------------ 17 files changed, 14 insertions(+), 1422 deletions(-) delete mode 100644 api/builtins/InventoryTransformer.go delete mode 100644 api/inventory/constants.go delete mode 100644 api/inventory/inventory.go delete mode 100644 api/inventory/inventory_test.go delete mode 100644 api/krusty/pruneconfigmap_test.go delete mode 100644 api/types/garbagepolicy.go delete mode 100644 api/types/garbagepolicy_string.go delete mode 100644 plugin/builtin/inventorytransformer/InventoryTransformer.go delete mode 100644 plugin/builtin/inventorytransformer/InventoryTransformer_test.go delete mode 100644 plugin/builtin/inventorytransformer/go.mod delete mode 100644 plugin/builtin/inventorytransformer/go.sum diff --git a/Makefile b/Makefile index 186f2d2a2..e221146b3 100644 --- a/Makefile +++ b/Makefile @@ -116,7 +116,6 @@ _builtinplugins = \ ConfigMapGenerator.go \ HashTransformer.go \ ImageTagTransformer.go \ - InventoryTransformer.go \ LabelTransformer.go \ LegacyOrderTransformer.go \ NamespaceTransformer.go \ @@ -141,7 +140,6 @@ $(pGen)/AnnotationsTransformer.go: $(pSrc)/annotationstransformer/AnnotationsTra $(pGen)/ConfigMapGenerator.go: $(pSrc)/configmapgenerator/ConfigMapGenerator.go $(pGen)/HashTransformer.go: $(pSrc)/hashtransformer/HashTransformer.go $(pGen)/ImageTagTransformer.go: $(pSrc)/imagetagtransformer/ImageTagTransformer.go -$(pGen)/InventoryTransformer.go: $(pSrc)/inventorytransformer/InventoryTransformer.go $(pGen)/LabelTransformer.go: $(pSrc)/labeltransformer/LabelTransformer.go $(pGen)/LegacyOrderTransformer.go: $(pSrc)/legacyordertransformer/LegacyOrderTransformer.go $(pGen)/NamespaceTransformer.go: $(pSrc)/namespacetransformer/NamespaceTransformer.go diff --git a/api/builtins/InventoryTransformer.go b/api/builtins/InventoryTransformer.go deleted file mode 100644 index 4976e8916..000000000 --- a/api/builtins/InventoryTransformer.go +++ /dev/null @@ -1,125 +0,0 @@ -// Code generated by pluginator on InventoryTransformer; DO NOT EDIT. -// pluginator {unknown 1970-01-01T00:00:00Z } - -package builtins - -import ( - "fmt" - - "sigs.k8s.io/kustomize/api/hasher" - "sigs.k8s.io/kustomize/api/inventory" - "sigs.k8s.io/kustomize/api/kv" - "sigs.k8s.io/kustomize/api/resid" - "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/resource" - "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/yaml" -) - -type InventoryTransformerPlugin struct { - h *resmap.PluginHelpers - types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Policy string `json:"policy,omitempty" yaml:"policy,omitempty"` -} - -func (p *InventoryTransformerPlugin) Config( - h *resmap.PluginHelpers, c []byte) (err error) { - p.h = h - err = yaml.Unmarshal(c, p) - if err != nil { - return err - } - if p.Policy == "" { - p.Policy = types.GarbageIgnore.String() - } - if p.Policy != types.GarbageCollect.String() && - p.Policy != types.GarbageIgnore.String() { - return fmt.Errorf( - "unrecognized garbagePolicy '%s'", p.Policy) - } - return nil -} - -// Transform generates an inventory object from the input ResMap. -// This ConfigMap supports the pruning command in -// the client side tool proposed here: -// https://github.com/kubernetes/enhancements/pull/810 -// -// The inventory data is written to the ConfigMap's -// annotations, rather than to the key-value pairs in -// the ConfigMap's data field, since -// 1. Keys in a ConfigMap's data field are too -// constrained for this purpose. -// 2. Using annotations allow any object to be used, -// not just a ConfigMap, should some other object -// (e.g. some App object) become more desirable -// for this purpose. -func (p *InventoryTransformerPlugin) Transform(m resmap.ResMap) error { - inv, h, err := makeInventory(m) - if err != nil { - return err - } - args := types.ConfigMapArgs{} - args.Name = p.Name - args.Namespace = p.Namespace - args.Options = &types.GeneratorOptions{ - Annotations: map[string]string{inventory.HashAnnotation: h}, - } - err = inv.UpdateAnnotations(args.Options.Annotations) - if err != nil { - return err - } - - cm, err := p.h.ResmapFactory().RF().MakeConfigMap( - kv.NewLoader(p.h.Loader(), p.h.Validator()), &args) - if err != nil { - return err - } - - if p.Policy == types.GarbageCollect.String() { - for _, byeBye := range m.AllIds() { - m.Remove(byeBye) - } - } - return m.Append(cm) -} - -func makeInventory(m resmap.ResMap) ( - inv *inventory.Inventory, hash string, err error) { - inv = inventory.NewInventory() - var keys []string - for _, r := range m.Resources() { - ns := r.GetNamespace() - item := resid.NewResIdWithNamespace(r.GetGvk(), r.GetName(), ns) - if _, ok := inv.Current[item]; ok { - return nil, "", fmt.Errorf( - "item '%v' already in inventory", item) - } - inv.Current[item], err = computeRefs(r, m) - if err != nil { - return nil, "", err - } - keys = append(keys, item.String()) - } - h, err := hasher.SortArrayAndComputeHash(keys) - return inv, h, err -} - -func computeRefs( - r *resource.Resource, m resmap.ResMap) (refs []resid.ResId, err error) { - for _, refid := range r.GetRefBy() { - ref, err := m.GetByCurrentId(refid) - if err != nil { - return nil, err - } - refs = append( - refs, - resid.NewResIdWithNamespace( - ref.GetGvk(), ref.GetName(), ref.GetNamespace())) - } - return -} - -func NewInventoryTransformerPlugin() resmap.TransformerPlugin { - return &InventoryTransformerPlugin{} -} diff --git a/api/internal/plugins/builtinhelpers/builtinplugintype_string.go b/api/internal/plugins/builtinhelpers/builtinplugintype_string.go index 6c9e3cd2a..281f13bfd 100644 --- a/api/internal/plugins/builtinhelpers/builtinplugintype_string.go +++ b/api/internal/plugins/builtinhelpers/builtinplugintype_string.go @@ -13,21 +13,20 @@ func _() { _ = x[ConfigMapGenerator-2] _ = x[HashTransformer-3] _ = x[ImageTagTransformer-4] - _ = x[InventoryTransformer-5] - _ = x[LabelTransformer-6] - _ = x[LegacyOrderTransformer-7] - _ = x[NamespaceTransformer-8] - _ = x[PatchJson6902Transformer-9] - _ = x[PatchStrategicMergeTransformer-10] - _ = x[PatchTransformer-11] - _ = x[PrefixSuffixTransformer-12] - _ = x[ReplicaCountTransformer-13] - _ = x[SecretGenerator-14] + _ = x[LabelTransformer-5] + _ = x[LegacyOrderTransformer-6] + _ = x[NamespaceTransformer-7] + _ = x[PatchJson6902Transformer-8] + _ = x[PatchStrategicMergeTransformer-9] + _ = x[PatchTransformer-10] + _ = x[PrefixSuffixTransformer-11] + _ = x[ReplicaCountTransformer-12] + _ = x[SecretGenerator-13] } -const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorHashTransformerImageTagTransformerInventoryTransformerLabelTransformerLegacyOrderTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerReplicaCountTransformerSecretGenerator" +const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorHashTransformerImageTagTransformerLabelTransformerLegacyOrderTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerReplicaCountTransformerSecretGenerator" -var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 62, 81, 101, 117, 139, 159, 183, 213, 229, 252, 275, 290} +var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 62, 81, 97, 119, 139, 163, 193, 209, 232, 255, 270} func (i BuiltinPluginType) String() string { if i < 0 || i >= BuiltinPluginType(len(_BuiltinPluginType_index)-1) { diff --git a/api/internal/plugins/builtinhelpers/builtins.go b/api/internal/plugins/builtinhelpers/builtins.go index d21815cd0..8e50b82e0 100644 --- a/api/internal/plugins/builtinhelpers/builtins.go +++ b/api/internal/plugins/builtinhelpers/builtins.go @@ -17,7 +17,6 @@ const ( ConfigMapGenerator HashTransformer ImageTagTransformer - InventoryTransformer LabelTransformer LegacyOrderTransformer NamespaceTransformer @@ -63,7 +62,6 @@ var TransformerFactories = map[BuiltinPluginType]func() resmap.TransformerPlugin AnnotationsTransformer: builtins.NewAnnotationsTransformerPlugin, HashTransformer: builtins.NewHashTransformerPlugin, ImageTagTransformer: builtins.NewImageTagTransformerPlugin, - InventoryTransformer: builtins.NewInventoryTransformerPlugin, LabelTransformer: builtins.NewLabelTransformerPlugin, LegacyOrderTransformer: builtins.NewLegacyOrderTransformerPlugin, NamespaceTransformer: builtins.NewNamespaceTransformerPlugin, diff --git a/api/internal/target/kusttarget.go b/api/internal/target/kusttarget.go index f5fb08fb9..a020eb32a 100644 --- a/api/internal/target/kusttarget.go +++ b/api/internal/target/kusttarget.go @@ -106,15 +106,10 @@ func unmarshal(y []byte, o interface{}) error { // MakeCustomizedResMap creates a fully customized ResMap // per the instructions contained in its kustomiztion instance. func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { - return kt.makeCustomizedResMap(types.GarbageIgnore) + return kt.makeCustomizedResMap() } -func (kt *KustTarget) MakePruneConfigMap() (resmap.ResMap, error) { - return kt.makeCustomizedResMap(types.GarbageCollect) -} - -func (kt *KustTarget) makeCustomizedResMap( - garbagePolicy types.GarbagePolicy) (resmap.ResMap, error) { +func (kt *KustTarget) makeCustomizedResMap() (resmap.ResMap, error) { ra, err := kt.AccumulateTarget() if err != nil { return nil, err @@ -141,11 +136,6 @@ func (kt *KustTarget) makeCustomizedResMap( return nil, err } - err = kt.computeInventory(ra, garbagePolicy) - if err != nil { - return nil, err - } - return ra.ResMap(), nil } @@ -159,35 +149,6 @@ func (kt *KustTarget) addHashesToNames( return ra.Transform(p) } -func (kt *KustTarget) computeInventory( - ra *accumulator.ResAccumulator, garbagePolicy types.GarbagePolicy) error { - inv := kt.kustomization.Inventory - if inv == nil { - return nil - } - if inv.Type != "ConfigMap" { - return fmt.Errorf("don't know how to do that") - } - - if inv.ConfigMap.Namespace != kt.kustomization.Namespace { - return fmt.Errorf("namespace mismatch") - } - - var c struct { - Policy string - types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty"` - } - c.Name = inv.ConfigMap.Name - c.Namespace = inv.ConfigMap.Namespace - c.Policy = garbagePolicy.String() - p := builtins.NewInventoryTransformerPlugin() - err := kt.configureBuiltinPlugin(p, c, builtinhelpers.InventoryTransformer) - if err != nil { - return err - } - return ra.Transform(p) -} - // AccumulateTarget returns a new ResAccumulator, // holding customized resources and the data/rules used // to do so. The name back references and vars are diff --git a/api/inventory/constants.go b/api/inventory/constants.go deleted file mode 100644 index 75df271b5..000000000 --- a/api/inventory/constants.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package inventory - -const ( - // Annotation that contains the inventory content. - ContentAnnotation = "kustomize.config.k8s.io/Inventory" - - // Annotation for inventory content hash. - HashAnnotation = "kustomize.config.k8s.io/InventoryHash" -) diff --git a/api/inventory/inventory.go b/api/inventory/inventory.go deleted file mode 100644 index 27696ee7a..000000000 --- a/api/inventory/inventory.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package inventory - -import ( - "encoding/json" - - "sigs.k8s.io/kustomize/api/resid" -) - -//Refs is a reference map. Each key is the id -//of a k8s resource, and each value is a list of -//object ids that refer back to the object in the -//key. - -//For example, the key could correspond to a -//ConfigMap, and the list of values might include -//several different Deployments that get data from -//that ConfigMap (and thus refer to it). - -//References are important in inventory management -//because one may not delete an object before all -//objects referencing it have been removed. -type Refs map[resid.ResId][]resid.ResId - -func NewRefs() Refs { - return Refs{} -} - -// Merge merges a Refs into an existing Refs -func (rf Refs) Merge(b Refs) Refs { - for key, value := range b { - _, ok := rf[key] - if ok { - rf[key] = append(rf[key], value...) - } else { - rf[key] = value - } - } - return rf -} - -// removeIfContains removes the reference relationship -// a --> b -// from the Refs if it exists -func (rf Refs) RemoveIfContains(a, b resid.ResId) { - refs, ok := rf[a] - if !ok { - return - } - for i, ref := range refs { - if ref.Equals(b) { - rf[a] = append(refs[:i], refs[i+1:]...) - break - } - } -} - -//Inventory is a an object intended for -//serialization into the annotations of a so-called -//apply-root object (a ConfigMap, an Application, -//etc.) living in the cluster. This apply-root -//object is written as part of an apply operation as -//a means to record overall cluster state changes. - -//At the end of a successful apply, the "current" -//field in Inventory will be a map whose keys all -//correspond to an object in the cluster, and -//"previous" will be the previous such set (an empty -//set on the first apply). - -//An Inventory allows the Prune method to work. -type Inventory struct { - Current Refs `json:"current,omitempty"` - Previous Refs `json:"previous,omitempty"` -} - -// NewInventory returns an Inventory object -func NewInventory() *Inventory { - return &Inventory{ - Current: NewRefs(), - Previous: NewRefs(), - } -} - -// UpdateCurrent updates the Inventory given a -// new current Refs -// The existing Current refs is merged into -// the Previous refs -func (a *Inventory) UpdateCurrent(curref Refs) *Inventory { - if len(a.Previous) > 0 { - a.Previous.Merge(a.Current) - } else { - a.Previous = a.Current - } - a.Current = curref - return a -} - -func (a *Inventory) removeNewlyOrphanedItemsFromPrevious() []resid.ResId { - var results []resid.ResId - for item, refs := range a.Previous { - if _, ok := a.Current[item]; ok { - delete(a.Previous, item) - continue - } - - var newRefs []resid.ResId - toDelete := true - for _, ref := range refs { - if _, ok := a.Current[ref]; ok { - toDelete = false - newRefs = append(newRefs, ref) - } - } - if toDelete { - results = append(results, item) - delete(a.Previous, item) - } else { - a.Previous[item] = newRefs - } - } - return results -} - -func (a *Inventory) removeOrphanedItemsFromPreviousThatAreNotInCurrent() []resid.ResId { - var results []resid.ResId - for item, refs := range a.Previous { - if _, ok := a.Current[item]; ok { - continue - } - if len(refs) == 0 { - results = append(results, item) - delete(a.Previous, item) - } - } - return results -} - -func (a *Inventory) removeOrphanedItemsFromPreviousThatAreInCurrent() { - //Remove references from Previous that are already in Current refs - for item, refs := range a.Current { - for _, ref := range refs { - a.Previous.RemoveIfContains(item, ref) - } - } - //Remove items from Previous that are already in Current refs - for item, refs := range a.Previous { - if len(refs) == 0 { - if _, ok := a.Current[item]; ok { - delete(a.Previous, item) - } - } - } -} - -// Prune computes the diff of Current refs and Previous refs -// and returns a list of Items that can be pruned. -// An item that can be pruned shows up only in Previous refs. -// Prune also updates the Previous refs with those items removed -func (a *Inventory) Prune() []resid.ResId { - a.removeOrphanedItemsFromPreviousThatAreInCurrent() - - // These are candidates for deletion from the cluster. - removable1 := a.removeOrphanedItemsFromPreviousThatAreNotInCurrent() - removable2 := a.removeNewlyOrphanedItemsFromPrevious() - return append(removable1, removable2...) -} - -// inventory is the internal type used for serialization -type inventory struct { - Current map[string][]resid.ResId `json:"current,omitempty"` - Previous map[string][]resid.ResId `json:"previous,omitempty"` -} - -func (a *Inventory) toInternalType() inventory { - prev := map[string][]resid.ResId{} - curr := map[string][]resid.ResId{} - for id, refs := range a.Current { - curr[id.String()] = refs - } - for id, refs := range a.Previous { - prev[id.String()] = refs - } - return inventory{ - Current: curr, - Previous: prev, - } -} - -func (a *Inventory) fromInternalType(i *inventory) { - for s, refs := range i.Previous { - a.Previous[resid.FromString(s)] = refs - } - for s, refs := range i.Current { - a.Current[resid.FromString(s)] = refs - } -} - -func (a *Inventory) marshal() ([]byte, error) { - return json.Marshal(a.toInternalType()) -} - -func (a *Inventory) unMarshal(data []byte) error { - inv := &inventory{ - Current: map[string][]resid.ResId{}, - Previous: map[string][]resid.ResId{}, - } - err := json.Unmarshal(data, inv) - if err != nil { - return err - } - a.fromInternalType(inv) - return nil -} - -// UpdateAnnotations update the annotation map -func (a *Inventory) UpdateAnnotations(annot map[string]string) error { - data, err := a.marshal() - if err != nil { - return err - } - annot[ContentAnnotation] = string(data) - return nil -} - -// LoadFromAnnotation loads the Inventory date from the annotation map -func (a *Inventory) LoadFromAnnotation(annot map[string]string) error { - value, ok := annot[ContentAnnotation] - if ok { - return a.unMarshal([]byte(value)) - } - return nil -} diff --git a/api/inventory/inventory_test.go b/api/inventory/inventory_test.go deleted file mode 100644 index 92c137129..000000000 --- a/api/inventory/inventory_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package inventory_test - -import ( - "testing" - - . "sigs.k8s.io/kustomize/api/inventory" - "sigs.k8s.io/kustomize/api/resid" -) - -func makeRefs() (Refs, Refs) { - a := resid.FromString("G1_V1_K1|ns1|nm1") - b := resid.FromString("G2_V2_K2|ns2|nm2") - c := resid.FromString("G3_V3_K3|ns3|nm3") - current := NewRefs() - current[a] = []resid.ResId{b, c} - current[b] = []resid.ResId{} - current[c] = []resid.ResId{} - newRefs := NewRefs() - newRefs[a] = []resid.ResId{b} - newRefs[b] = []resid.ResId{} - return current, newRefs -} - -func TestInventory(t *testing.T) { - inventory := NewInventory() - curref, _ := makeRefs() - - inventory.UpdateCurrent(curref) - if len(inventory.Current) != 3 { - t.Fatalf("not getting the correct inventory %v", inventory) - } - curref, newref := makeRefs() - inventory.UpdateCurrent(curref) - if len(inventory.Current) != 3 { - t.Fatalf("not getting the corrent inventory %v", inventory) - } - if len(inventory.Previous) != 3 { - t.Fatalf("not getting the corrent inventory %v", inventory) - } - - items := inventory.Prune() - if len(items) != 0 { - t.Fatalf("not getting the corrent items %v", items) - } - if len(inventory.Previous) != 0 { - t.Fatalf("not getting the corrent inventory %v", inventory) - } - - inventory.UpdateCurrent(newref) - items = inventory.Prune() - if len(items) != 1 { - t.Fatalf("not getting the corrent items %v", items) - } - if len(inventory.Previous) != 0 { - t.Fatalf("not getting the corrent inventory %v", inventory.Previous) - } -} diff --git a/api/krusty/kustomizer.go b/api/krusty/kustomizer.go index e71fc163c..849d38762 100644 --- a/api/krusty/kustomizer.go +++ b/api/krusty/kustomizer.go @@ -71,11 +71,7 @@ func (b *Kustomizer) Run(path string) (resmap.ResMap, error) { return nil, err } var m resmap.ResMap - if b.options.DoPrune { - m, err = kt.MakePruneConfigMap() - } else { - m, err = kt.MakeCustomizedResMap() - } + m, err = kt.MakeCustomizedResMap() if err != nil { return nil, err } diff --git a/api/krusty/pruneconfigmap_test.go b/api/krusty/pruneconfigmap_test.go deleted file mode 100644 index 6669a5ba0..000000000 --- a/api/krusty/pruneconfigmap_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package krusty_test - -import ( - "testing" - - kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" -) - -func TestPruneConfigMap(t *testing.T) { - th := kusttest_test.MakeHarness(t) - th.WriteK("/app/base", ` -resources: -- deployment.yaml -- service.yaml -- secret.yaml - -inventory: - type: ConfigMap - configMap: - name: haha - namespace: default - -namePrefix: my- -namespace: default -`) - th.WriteF("/app/base/deployment.yaml", ` -apiVersion: apps/v1beta2 -kind: Deployment -metadata: - name: mysql - labels: - app: mysql -spec: - selector: - matchLabels: - app: mysql - strategy: - type: Recreate - template: - metadata: - labels: - app: mysql - spec: - containers: - - image: mysql:5.6 - name: mysql - env: - - name: MYSQL_ROOT_PASSWORD - valueFrom: - secretKeyRef: - name: pass - key: password - ports: - - containerPort: 3306 - name: mysql - volumeMounts: - - name: mysql-persistent-storage - mountPath: /var/lib/mysql - volumes: - - name: mysql-persistent-storage - emptyDir: {} -`) - th.WriteF("/app/base/service.yaml", ` -apiVersion: v1 -kind: Service -metadata: - name: mmmysql - labels: - app: mysql -spec: - ports: - - port: 3306 - selector: - app: mysql -`) - th.WriteF("/app/base/secret.yaml", ` -apiVersion: v1 -kind: Secret -metadata: - name: pass -type: Opaque -data: - # Default password is "admin". - password: YWRtaW4= - username: jingfang -`) - - m := th.Run("/app/base", th.MakeDefaultOptions()) - //nolint - th.AssertActualEqualsExpected(m, ` -apiVersion: apps/v1beta2 -kind: Deployment -metadata: - labels: - app: mysql - name: my-mysql - namespace: default -spec: - selector: - matchLabels: - app: mysql - strategy: - type: Recreate - template: - metadata: - labels: - app: mysql - spec: - containers: - - env: - - name: MYSQL_ROOT_PASSWORD - valueFrom: - secretKeyRef: - key: password - name: my-pass - image: mysql:5.6 - name: mysql - ports: - - containerPort: 3306 - name: mysql - volumeMounts: - - mountPath: /var/lib/mysql - name: mysql-persistent-storage - volumes: - - emptyDir: {} - name: mysql-persistent-storage ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: mysql - name: my-mmmysql - namespace: default -spec: - ports: - - port: 3306 - selector: - app: mysql ---- -apiVersion: v1 -data: - password: YWRtaW4= - username: jingfang -kind: Secret -metadata: - name: my-pass - namespace: default -type: Opaque ---- -apiVersion: v1 -kind: ConfigMap -metadata: - annotations: - kustomize.config.k8s.io/Inventory: '{"current":{"apps_v1beta2_Deployment|default|my-mysql":null,"~G_v1_Secret|default|my-pass":[{"group":"apps","version":"v1beta2","kind":"Deployment","name":"my-mysql","namespace":"default"}],"~G_v1_Service|default|my-mmmysql":null}}' - kustomize.config.k8s.io/InventoryHash: kd67f7ht8t - name: haha - namespace: default -`) -} diff --git a/api/types/garbagepolicy.go b/api/types/garbagepolicy.go deleted file mode 100644 index 41e677d4b..000000000 --- a/api/types/garbagepolicy.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package types - -//go:generate stringer -type=GarbagePolicy -type GarbagePolicy int - -const ( - GarbageIgnore GarbagePolicy = iota + 1 - GarbageCollect -) diff --git a/api/types/garbagepolicy_string.go b/api/types/garbagepolicy_string.go deleted file mode 100644 index b6ff7d291..000000000 --- a/api/types/garbagepolicy_string.go +++ /dev/null @@ -1,25 +0,0 @@ -// Code generated by "stringer -type=GarbagePolicy"; DO NOT EDIT. - -package types - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[GarbageIgnore-1] - _ = x[GarbageCollect-2] -} - -const _GarbagePolicy_name = "GarbageIgnoreGarbageCollect" - -var _GarbagePolicy_index = [...]uint8{0, 13, 27} - -func (i GarbagePolicy) String() string { - i -= 1 - if i < 0 || i >= GarbagePolicy(len(_GarbagePolicy_index)-1) { - return "GarbagePolicy(" + strconv.FormatInt(int64(i+1), 10) + ")" - } - return _GarbagePolicy_name[_GarbagePolicy_index[i]:_GarbagePolicy_index[i+1]] -} diff --git a/kustomize/internal/commands/build/build.go b/kustomize/internal/commands/build/build.go index 0c356f536..9bd490c96 100644 --- a/kustomize/internal/commands/build/build.go +++ b/kustomize/internal/commands/build/build.go @@ -77,7 +77,6 @@ func NewCmdBuild(out io.Writer) *cobra.Command { addFlagLoadRestrictor(cmd.Flags()) addFlagEnablePlugins(cmd.Flags()) addFlagReorderOutput(cmd.Flags()) - cmd.AddCommand(NewCmdBuildPrune(out)) return cmd } @@ -105,7 +104,6 @@ func (o *Options) makeOptions() *krusty.Options { opts := &krusty.Options{ DoLegacyResourceSort: o.outOrder == legacy, LoadRestrictions: getFlagLoadRestrictorValue(), - DoPrune: false, } if isFlagEnablePluginsSet() { c, err := konfig.EnabledPluginConfig(types.BploUseStaticallyLinked) @@ -129,18 +127,6 @@ func (o *Options) RunBuild(out io.Writer) error { return o.emitResources(out, fSys, m) } -func (o *Options) RunBuildPrune(out io.Writer) error { - fSys := filesys.MakeFsOnDisk() - opts := o.makeOptions() - opts.DoPrune = true - k := krusty.MakeKustomizer(fSys, opts) - m, err := k.Run(o.kustomizationPath) - if err != nil { - return err - } - return o.emitResources(out, fSys, m) -} - func (o *Options) emitResources( out io.Writer, fSys filesys.FileSystem, m resmap.ResMap) error { if o.outputPath != "" && fSys.IsDir(o.outputPath) { @@ -157,24 +143,6 @@ func (o *Options) emitResources( return err } -func NewCmdBuildPrune(out io.Writer) *cobra.Command { - var o Options - cmd := &cobra.Command{ - Use: "alpha-inventory [path]", - Short: "Print the inventory object which contains a list of all other objects", - Example: examples, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - err := o.Validate(args) - if err != nil { - return err - } - return o.RunBuildPrune(out) - }, - } - return cmd -} - func writeIndividualFiles( fSys filesys.FileSystem, folderPath string, m resmap.ResMap) error { byNamespace := m.GroupedByCurrentNamespace() diff --git a/plugin/builtin/inventorytransformer/InventoryTransformer.go b/plugin/builtin/inventorytransformer/InventoryTransformer.go deleted file mode 100644 index 4e127548e..000000000 --- a/plugin/builtin/inventorytransformer/InventoryTransformer.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -//go:generate pluginator -package main - -import ( - "fmt" - - "sigs.k8s.io/kustomize/api/hasher" - "sigs.k8s.io/kustomize/api/inventory" - "sigs.k8s.io/kustomize/api/kv" - "sigs.k8s.io/kustomize/api/resid" - "sigs.k8s.io/kustomize/api/resmap" - "sigs.k8s.io/kustomize/api/resource" - "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/yaml" -) - -type plugin struct { - h *resmap.PluginHelpers - types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - Policy string `json:"policy,omitempty" yaml:"policy,omitempty"` -} - -//noinspection GoUnusedGlobalVariable -var KustomizePlugin plugin - -func (p *plugin) Config( - h *resmap.PluginHelpers, c []byte) (err error) { - p.h = h - err = yaml.Unmarshal(c, p) - if err != nil { - return err - } - if p.Policy == "" { - p.Policy = types.GarbageIgnore.String() - } - if p.Policy != types.GarbageCollect.String() && - p.Policy != types.GarbageIgnore.String() { - return fmt.Errorf( - "unrecognized garbagePolicy '%s'", p.Policy) - } - return nil -} - -// Transform generates an inventory object from the input ResMap. -// This ConfigMap supports the pruning command in -// the client side tool proposed here: -// https://github.com/kubernetes/enhancements/pull/810 -// -// The inventory data is written to the ConfigMap's -// annotations, rather than to the key-value pairs in -// the ConfigMap's data field, since -// 1. Keys in a ConfigMap's data field are too -// constrained for this purpose. -// 2. Using annotations allow any object to be used, -// not just a ConfigMap, should some other object -// (e.g. some App object) become more desirable -// for this purpose. -func (p *plugin) Transform(m resmap.ResMap) error { - inv, h, err := makeInventory(m) - if err != nil { - return err - } - args := types.ConfigMapArgs{} - args.Name = p.Name - args.Namespace = p.Namespace - args.Options = &types.GeneratorOptions{ - Annotations: map[string]string{inventory.HashAnnotation: h}, - } - err = inv.UpdateAnnotations(args.Options.Annotations) - if err != nil { - return err - } - - cm, err := p.h.ResmapFactory().RF().MakeConfigMap( - kv.NewLoader(p.h.Loader(), p.h.Validator()), &args) - if err != nil { - return err - } - - if p.Policy == types.GarbageCollect.String() { - for _, byeBye := range m.AllIds() { - m.Remove(byeBye) - } - } - return m.Append(cm) -} - -func makeInventory(m resmap.ResMap) ( - inv *inventory.Inventory, hash string, err error) { - inv = inventory.NewInventory() - var keys []string - for _, r := range m.Resources() { - ns := r.GetNamespace() - item := resid.NewResIdWithNamespace(r.GetGvk(), r.GetName(), ns) - if _, ok := inv.Current[item]; ok { - return nil, "", fmt.Errorf( - "item '%v' already in inventory", item) - } - inv.Current[item], err = computeRefs(r, m) - if err != nil { - return nil, "", err - } - keys = append(keys, item.String()) - } - h, err := hasher.SortArrayAndComputeHash(keys) - return inv, h, err -} - -func computeRefs( - r *resource.Resource, m resmap.ResMap) (refs []resid.ResId, err error) { - for _, refid := range r.GetRefBy() { - ref, err := m.GetByCurrentId(refid) - if err != nil { - return nil, err - } - refs = append( - refs, - resid.NewResIdWithNamespace( - ref.GetGvk(), ref.GetName(), ref.GetNamespace())) - } - return -} diff --git a/plugin/builtin/inventorytransformer/InventoryTransformer_test.go b/plugin/builtin/inventorytransformer/InventoryTransformer_test.go deleted file mode 100644 index 9feb29d88..000000000 --- a/plugin/builtin/inventorytransformer/InventoryTransformer_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package main_test - -import ( - "testing" - - kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" -) - -const ( - content = ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: cm1 ---- -apiVersion: v1 -kind: Secret -metadata: - name: secret1 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: deploy1 -spec: - template: - spec: - containers: - - env: - name: CM_FOO - valueFrom: - configMapKeyRef: - key: someKey - name: cm1 - envFrom: - configMapRef: - key: someKey - name: cm1 - secretRef: - key: someKey - name: secret1 - image: nginx:1.7.9 - name: nginx -` - inv = ` -apiVersion: v1 -kind: ConfigMap -metadata: - annotations: - kustomize.config.k8s.io/Inventory: '{"current":{"apps_v1_Deployment|~X|deploy1":null,"~G_v1_ConfigMap|~X|cm1":null,"~G_v1_Secret|~X|secret1":null}}' - kustomize.config.k8s.io/InventoryHash: h44788gt7g - name: pruneCM - namespace: default -` -) - -func TestInventoryTransformerCollect(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("InventoryTransformer") - defer th.Reset() - - rm := th.LoadAndRunTransformer(` -apiVersion: builtin -kind: InventoryTransformer -metadata: - name: pruneCM - namespace: default -policy: GarbageCollect -`, content) - - th.AssertActualEqualsExpected(rm, inv) -} - -func TestInventoryTransformerIgnore(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("InventoryTransformer") - defer th.Reset() - - rm := th.LoadAndRunTransformer(` -apiVersion: builtin -kind: InventoryTransformer -metadata: - name: pruneCM - namespace: default -policy: GarbageIgnore -`, content) - - th.AssertActualEqualsExpected(rm, content+"---"+inv) -} - -func TestInventoryTransformerDefaultPolicy(t *testing.T) { - th := kusttest_test.MakeEnhancedHarness(t). - PrepBuiltin("InventoryTransformer") - defer th.Reset() - - rm := th.LoadAndRunTransformer(` -apiVersion: builtin -kind: InventoryTransformer -metadata: - name: pruneCM - namespace: default -`, content) - - th.AssertActualEqualsExpected(rm, content+"---"+inv) -} diff --git a/plugin/builtin/inventorytransformer/go.mod b/plugin/builtin/inventorytransformer/go.mod deleted file mode 100644 index 50b0f3f62..000000000 --- a/plugin/builtin/inventorytransformer/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module sigs.k8s.io/kustomize/plugin/builtin/inventorytransformer - -go 1.13 - -require ( - sigs.k8s.io/kustomize/api v0.3.1 - sigs.k8s.io/yaml v1.1.0 -) - -replace sigs.k8s.io/kustomize/api v0.3.1 => ../../../api diff --git a/plugin/builtin/inventorytransformer/go.sum b/plugin/builtin/inventorytransformer/go.sum deleted file mode 100644 index 5870a181c..000000000 --- a/plugin/builtin/inventorytransformer/go.sum +++ /dev/null @@ -1,453 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.21.0/go.mod h1:phxpHK52q7SE+5KpPnti4oZTdFCEsn/tKN+nFvCKXfk= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d/go.mod h1:7DPO4domFU579Ga6E61sB9VFNaniPVwJP5C4bBCu3wA= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok= -github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v0.0.0-20190926065955-1655d0de0517/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yujunz/go-getter v1.4.1-lite h1:FhvNc94AXMZkfqUwfMKhnQEC9phkphSGdPTL7tIdhOM= -github.com/yujunz/go-getter v1.4.1-lite/go.mod h1:sbmqxXjyLunH1PkF3n7zSlnVeMvmYUuIl9ZVs/7NyCc= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69 h1:rOhMmluY6kLMhdnrivzec6lLgaVbMHMn2ISQXJeJ5EM= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM= -k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= -k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg= -k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -sigs.k8s.io/kustomize/kyaml v0.1.5 h1:NicBWYTwkuOfVyZDbNkfSBSCwSgin4uirkedtyZltIc= -sigs.k8s.io/kustomize/kyaml v0.1.5/go.mod h1:461i94nj0h0ylJ6w83jLkR4SqqVhn1iY6fjD0JSTQeE= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 9195f05bbad5a4f58cffc5540256ac1c9d40c8fb Mon Sep 17 00:00:00 2001 From: Donny Xia Date: Mon, 27 Apr 2020 11:32:10 -0700 Subject: [PATCH 18/24] Update document --- docs/howItWorks.md | 3 +-- docs/inventory_object.md | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/howItWorks.md b/docs/howItWorks.md index 090ade175..252cfcb8a 100644 --- a/docs/howItWorks.md +++ b/docs/howItWorks.md @@ -47,5 +47,4 @@ Call stack when running `kustomize build`, with links to code. * The following steps must be done last, not as part of the recursion implicit in AccumulateTarget. * [addHashesToNames](https://github.com/kubernetes-sigs/kustomize/blob/c7d78970fb86782dbdded3a93944b774f826071f/api/internal/target/kusttarget.go#L153) * [FixBackReferences](https://github.com/kubernetes-sigs/kustomize/blob/c7d78970fb86782dbdded3a93944b774f826071f/api/internal/accumulator/resaccumulator.go#L160): Given that names have changed (prefixs/suffixes added), fix all the back references to those names. - * [ResolveVars](https://github.com/kubernetes-sigs/kustomize/blob/c7d78970fb86782dbdded3a93944b774f826071f/api/internal/accumulator/resaccumulator.go#L141) - * [computeInventory](https://github.com/kubernetes-sigs/kustomize/blob/c7d78970fb86782dbdded3a93944b774f826071f/api/internal/target/kusttarget.go#L163) + * [ResolveVars](https://github.com/kubernetes-sigs/kustomize/blob/c7d78970fb86782dbdded3a93944b774f826071f/api/internal/accumulator/resaccumulator.go#L141) \ No newline at end of file diff --git a/docs/inventory_object.md b/docs/inventory_object.md index ab2bc0575..3367ebf54 100644 --- a/docs/inventory_object.md +++ b/docs/inventory_object.md @@ -1,4 +1,8 @@ -# inventory directive in kustomization.yaml +# [DEPRECATED] inventory directive in kustomization.yaml + +**Inventory object has been deprecated in Kustomize. Please use [kpt live apply](https://googlecontainertools.github.io/kpt/reference/live/apply/).** + +--- New in v2.1.0, a kustomization file may have an `inventory` field: ```yaml From 499246a4a47ff59d7b474d03b9a194e8c97c7f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20M=C3=BCnch?= Date: Tue, 28 Apr 2020 21:34:55 +0200 Subject: [PATCH 19/24] add test to demonstrate kubernetes-sigs/kustomize#1835 --- api/krusty/mergeenvfrom_test.go | 110 ++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 api/krusty/mergeenvfrom_test.go diff --git a/api/krusty/mergeenvfrom_test.go b/api/krusty/mergeenvfrom_test.go new file mode 100644 index 000000000..b1213c2e1 --- /dev/null +++ b/api/krusty/mergeenvfrom_test.go @@ -0,0 +1,110 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package krusty_test + +import ( + "testing" + + kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" +) + +func makeCommonFileForMergeEnvFromTest(th kusttest_test.Harness) { + th.WriteF("/app/deployment.yaml", ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + template: + spec: + containers: + - name: nginx + image: image1 + envFrom: + - configMapRef: + name: some-config + - configMapRef: + name: more-config +`) +} + +// When patching, `envFrom` should merge the list instead of replacing it. +func TestMergeEnvFrom(t *testing.T) { + th := kusttest_test.MakeHarness(t) + makeCommonFileForMergeEnvFromTest(th) + th.WriteK("/app", ` +resources: +- deployment.yaml + +patchesStrategicMerge: +- |- + apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx + spec: + template: + spec: + containers: + - name: nginx + envFrom: + - configMapRef: + name: another-config +`) + m := th.Run("/app", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + template: + spec: + containers: + - envFrom: + - configMapRef: + name: another-config + image: image1 + name: nginx +`) +} + +func TestMergeEnvFromViaJsonInline(t *testing.T) { + th := kusttest_test.MakeHarness(t) + makeCommonFileForMergeEnvFromTest(th) + th.WriteK("app", ` +resources: +- deployment.yaml +patches: +- target: + kind: Deployment + name: nginx + patch: |- + - op: add + path: /spec/template/spec/containers/0/envFrom/- + value: + configMapRef: + name: another-config +`) + m := th.Run("app", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected(m, ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + template: + spec: + containers: + - envFrom: + - configMapRef: + name: some-config + - configMapRef: + name: more-config + - configMapRef: + name: another-config + image: image1 + name: nginx +`) +} From 028811eb97f21ebfa7adde24fd80192268d8ee36 Mon Sep 17 00:00:00 2001 From: Justin SB Date: Wed, 29 Apr 2020 13:36:02 -0400 Subject: [PATCH 20/24] Fix godocs on MergeFilter It was copy-pasted from GrepFilter --- kyaml/kio/filters/merge.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kyaml/kio/filters/merge.go b/kyaml/kio/filters/merge.go index c41164fee..87e43dc9c 100644 --- a/kyaml/kio/filters/merge.go +++ b/kyaml/kio/filters/merge.go @@ -5,11 +5,12 @@ package filters import ( + "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" "sigs.k8s.io/kustomize/kyaml/yaml/merge2" ) -// GrepFilter merges Resources with the Group/Version/Kind/Namespace/Name together using +// MergeFilter merges Resources with the Group/Version/Kind/Namespace/Name together using // a 2-way merge strategy. // // - Fields set to null in the source will be cleared from the destination @@ -20,6 +21,8 @@ type MergeFilter struct { Reverse bool } +var _ kio.Filter = MergeFilter{} + type mergeKey struct { apiVersion string kind string @@ -27,7 +30,7 @@ type mergeKey struct { name string } -// GrepFilter implements kio.GrepFilter by merge Resources with the same G/V/K/NS/N +// MergeFilter implements kio.Filter by merging Resources with the same G/V/K/NS/N func (c MergeFilter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) { // invert the merge precedence if c.Reverse { From a2f2cc6a85f0c1d3110e304503773d55035eb31e Mon Sep 17 00:00:00 2001 From: Phani Teja Marupaka Date: Sun, 26 Apr 2020 18:06:13 -0700 Subject: [PATCH 21/24] Create setter with marker as name for subst --- .../commands/cmdcreatesubstitution.go | 37 ++++++----- .../commands/cmdcreatesubstitution_test.go | 62 +++++++++---------- .../settersutil/substitutioncreator.go | 8 ++- 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/cmd/config/internal/commands/cmdcreatesubstitution.go b/cmd/config/internal/commands/cmdcreatesubstitution.go index 66bbba070..d7a675a92 100644 --- a/cmd/config/internal/commands/cmdcreatesubstitution.go +++ b/cmd/config/internal/commands/cmdcreatesubstitution.go @@ -4,6 +4,7 @@ package commands import ( + "regexp" "strings" "github.com/spf13/cobra" @@ -17,20 +18,19 @@ import ( func NewCreateSubstitutionRunner(parent string) *CreateSubstitutionRunner { r := &CreateSubstitutionRunner{} cs := &cobra.Command{ - Use: "create-subst DIR NAME VALUE", - Args: cobra.ExactArgs(3), + Use: "create-subst DIR NAME", + Args: cobra.ExactArgs(2), PreRunE: r.preRunE, RunE: r.runE, } cs.Flags().StringVar(&r.CreateSubstitution.FieldName, "field", "", - "name of the field to set -- e.g. --field port") + "name of the field to set -- e.g. --field image") + cs.Flags().StringVar(&r.CreateSubstitution.FieldValue, "field-value", "", + "value of the field to create substitution for -- e.g. --field-value nginx:0.1.0") cs.Flags().StringVar(&r.CreateSubstitution.Pattern, "pattern", "", - "substitution pattern") - cs.Flags().StringSliceVar(&r.Values, "value", []string{""}, - "substitution values for the pattern. format is PATTERN_MARKER=SETTER_NAME"+ - "where PATTERN_MARKER is the pattern substring to replace, and SETTER_NAME is the"+ - "setter from which to take the replacement value.") + `substitution pattern -- e.g. --pattern \${my-image-setter}:\${my-tag-setter}`) _ = cs.MarkFlagRequired("pattern") + _ = cs.MarkFlagRequired("field-value") fixDocs(parent, cs) r.Command = cs return r @@ -54,7 +54,6 @@ func (r *CreateSubstitutionRunner) runE(c *cobra.Command, args []string) error { func (r *CreateSubstitutionRunner) preRunE(c *cobra.Command, args []string) error { var err error r.CreateSubstitution.Name = args[1] - r.CreateSubstitution.FieldValue = args[2] if err != nil { return err } @@ -64,16 +63,20 @@ func (r *CreateSubstitutionRunner) preRunE(c *cobra.Command, args []string) erro return err } - // parse the marker values - for i := range r.Values { - parts := strings.SplitN(r.Values[i], "=", 2) - if len(parts) < 2 { - return errors.Errorf("values must be specified as PATTERN_MARKER=SETTER_NAME") - } - ref := setters2.DefinitionsPrefix + setters2.SetterDefinitionPrefix + parts[1] + // extract setter name tokens from pattern enclosed in ${} + re := regexp.MustCompile(`\$\{([^}]*)\}`) + markers := re.FindAll([]byte(r.CreateSubstitution.Pattern), -1) + if len(markers) == 0 { + return errors.Errorf("unable to find setter names in pattern, " + + "setter names must be enclosed in ${}") + } + + for _, marker := range markers { + ref := setters2.DefinitionsPrefix + setters2.SetterDefinitionPrefix + + strings.TrimSuffix(strings.TrimPrefix(string(marker), "${"), "}") r.CreateSubstitution.Values = append( r.CreateSubstitution.Values, - setters2.Value{Marker: parts[0], Ref: ref}, + setters2.Value{Marker: string(marker), Ref: ref}, ) } diff --git a/cmd/config/internal/commands/cmdcreatesubstitution_test.go b/cmd/config/internal/commands/cmdcreatesubstitution_test.go index bc014d9c2..09a60c4bd 100644 --- a/cmd/config/internal/commands/cmdcreatesubstitution_test.go +++ b/cmd/config/internal/commands/cmdcreatesubstitution_test.go @@ -29,8 +29,7 @@ func TestCreateSubstitutionCommand(t *testing.T) { { name: "substitution replicas", args: []string{ - "image", "nginx:1.7.9", "--pattern", "IMAGE:TAG", - "--value", "IMAGE=image", "--value", "TAG=tag"}, + "my-image-subst", "--field-value", "nginx:1.7.9", "--pattern", "${my-image-setter}:${my-tag-setter}"}, input: ` apiVersion: apps/v1 kind: Deployment @@ -51,15 +50,15 @@ apiVersion: v1alpha1 kind: Example openAPI: definitions: - io.k8s.cli.setters.image: + io.k8s.cli.setters.my-image-setter: x-k8s-cli: setter: - name: image + name: my-image-setter value: "nginx" - io.k8s.cli.setters.tag: + io.k8s.cli.setters.my-tag-setter: x-k8s-cli: setter: - name: tag + name: my-tag-setter value: "1.7.9" `, expectedOpenAPI: ` @@ -67,26 +66,26 @@ apiVersion: v1alpha1 kind: Example openAPI: definitions: - io.k8s.cli.setters.image: + io.k8s.cli.setters.my-image-setter: x-k8s-cli: setter: - name: image + name: my-image-setter value: "nginx" - io.k8s.cli.setters.tag: + io.k8s.cli.setters.my-tag-setter: x-k8s-cli: setter: - name: tag + name: my-tag-setter value: "1.7.9" - io.k8s.cli.substitutions.image: + io.k8s.cli.substitutions.my-image-subst: x-k8s-cli: substitution: - name: image - pattern: IMAGE:TAG + name: my-image-subst + pattern: ${my-image-setter}:${my-tag-setter} values: - - marker: IMAGE - ref: '#/definitions/io.k8s.cli.setters.image' - - marker: TAG - ref: '#/definitions/io.k8s.cli.setters.tag' + - marker: ${my-image-setter} + ref: '#/definitions/io.k8s.cli.setters.my-image-setter' + - marker: ${my-tag-setter} + ref: '#/definitions/io.k8s.cli.setters.my-tag-setter' `, expectedResources: ` apiVersion: apps/v1 @@ -99,7 +98,7 @@ spec: spec: containers: - name: nginx - image: nginx:1.7.9 # {"$ref":"#/definitions/io.k8s.cli.substitutions.image"} + image: nginx:1.7.9 # {"$ref":"#/definitions/io.k8s.cli.substitutions.my-image-subst"} - name: sidecar image: sidecar:1.7.9 `, @@ -107,8 +106,7 @@ spec: { name: "substitution and create setters 1", args: []string{ - "image", "something/nginx::1.7.9/nginxotherthing", "--pattern", "something/IMAGE::TAG/nginxotherthing", - "--value", "IMAGE=image", "--value", "TAG=tag"}, + "my-image-subst", "--field-value", "something/nginx::1.7.9/nginxotherthing", "--pattern", "something/${my-image-setter}::${my-tag-setter}/nginxotherthing"}, input: ` apiVersion: apps/v1 kind: Deployment @@ -133,26 +131,26 @@ apiVersion: v1alpha1 kind: Example openAPI: definitions: - io.k8s.cli.setters.image: + io.k8s.cli.setters.my-image-setter: x-k8s-cli: setter: - name: image + name: my-image-setter value: nginx - io.k8s.cli.setters.tag: + io.k8s.cli.setters.my-tag-setter: x-k8s-cli: setter: - name: tag + name: my-tag-setter value: 1.7.9 - io.k8s.cli.substitutions.image: + io.k8s.cli.substitutions.my-image-subst: x-k8s-cli: substitution: - name: image - pattern: something/IMAGE::TAG/nginxotherthing + name: my-image-subst + pattern: something/${my-image-setter}::${my-tag-setter}/nginxotherthing values: - - marker: IMAGE - ref: '#/definitions/io.k8s.cli.setters.image' - - marker: TAG - ref: '#/definitions/io.k8s.cli.setters.tag' + - marker: ${my-image-setter} + ref: '#/definitions/io.k8s.cli.setters.my-image-setter' + - marker: ${my-tag-setter} + ref: '#/definitions/io.k8s.cli.setters.my-tag-setter' `, expectedResources: ` apiVersion: apps/v1 @@ -165,7 +163,7 @@ spec: spec: containers: - name: nginx - image: something/nginx::1.7.9/nginxotherthing # {"$ref":"#/definitions/io.k8s.cli.substitutions.image"} + image: something/nginx::1.7.9/nginxotherthing # {"$ref":"#/definitions/io.k8s.cli.substitutions.my-image-subst"} - name: sidecar image: sidecar:1.7.9 `, diff --git a/kyaml/setters2/settersutil/substitutioncreator.go b/kyaml/setters2/settersutil/substitutioncreator.go index fc187c63e..e31cb8dd9 100644 --- a/kyaml/setters2/settersutil/substitutioncreator.go +++ b/kyaml/setters2/settersutil/substitutioncreator.go @@ -4,6 +4,7 @@ package settersutil import ( + "fmt" "strings" "sigs.k8s.io/kustomize/kyaml/errors" @@ -98,11 +99,14 @@ func (c SubstitutionCreator) CreateSettersForSubstitution(openAPIPath string) er } if obj == nil { + name := strings.TrimPrefix(value.Ref, "#/definitions/io.k8s.cli.setters.") + value := m[value.Marker] + fmt.Printf("unable to find setter with name %s, creating new setter with value %s\n", name, value) sd := setters2.SetterDefinition{ // get the setter name from ref. Ex: from #/definitions/io.k8s.cli.setters.image_setter // extract image_setter - Name: strings.TrimPrefix(value.Ref, "#/definitions/io.k8s.cli.setters."), - Value: m[value.Marker], + Name: name, + Value: value, } err := sd.AddToFile(openAPIPath) if err != nil { From de9f80c41badc5cb57bb4afaaa6585c9170187c6 Mon Sep 17 00:00:00 2001 From: jregan Date: Wed, 29 Apr 2020 19:42:56 -0700 Subject: [PATCH 22/24] Improve config failure error message. --- api/internal/target/kusttarget.go | 3 ++- cmd/config/internal/generateddocs/api/docs.go | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/internal/target/kusttarget.go b/api/internal/target/kusttarget.go index f5fb08fb9..7d243acf9 100644 --- a/api/internal/target/kusttarget.go +++ b/api/internal/target/kusttarget.go @@ -364,7 +364,8 @@ func (kt *KustTarget) configureBuiltinPlugin( } err = p.Config(resmap.NewPluginHelpers(kt.ldr, kt.validator, kt.rFactory), y) if err != nil { - return errors.Wrapf(err, "builtin %s config: %v", bpt, y) + return errors.Wrapf( + err, "trouble configuring builtin %s with config: `\n%s`", bpt, string(y)) } return nil } diff --git a/cmd/config/internal/generateddocs/api/docs.go b/cmd/config/internal/generateddocs/api/docs.go index b7a3a512d..70d8b2bf8 100644 --- a/cmd/config/internal/generateddocs/api/docs.go +++ b/cmd/config/internal/generateddocs/api/docs.go @@ -308,8 +308,7 @@ An example using ` + "`" + `v1/List` + "`" + ` as input: apiVersion: v1 kind: List items: - spec: - - apiVersion: foo-corp.com/v1 + - apiVersion: foo-corp.com/v1 kind: FulfillmentCenter metadata: name: staging From cae8fd00131194b5f17bfa61fc19e35d952f87f8 Mon Sep 17 00:00:00 2001 From: Patrick Wiseman Date: Thu, 30 Apr 2020 12:03:47 -0400 Subject: [PATCH 23/24] Update link to travis pre-commit hook in docs --- api/internal/plugins/doc.go | 2 +- examples/README.md | 2 +- examples/zh/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/internal/plugins/doc.go b/api/internal/plugins/doc.go index 54f411948..83e428352 100644 --- a/api/internal/plugins/doc.go +++ b/api/internal/plugins/doc.go @@ -94,7 +94,7 @@ TO GENERATE CODE cd $repo/plugin/builtin go generate ./... -See travis/pre-commit.sh for canonical way +See travis/kyaml-pre-commit.sh for canonical way to execute the above. This creates diff --git a/examples/README.md b/examples/README.md index 051e62111..804fab4ce 100644 --- a/examples/README.md +++ b/examples/README.md @@ -5,7 +5,7 @@ English | [简体中文](zh/README.md) To run these examples, your `$PATH` must contain `kustomize`. See the [installation instructions](../docs/INSTALL.md). -These examples are [tested](../travis/pre-commit.sh) +These examples are [tested](../travis/kyaml-pre-commit.sh) to work with the latest _released_ version of kustomize. Basic Usage diff --git a/examples/zh/README.md b/examples/zh/README.md index 4ecd8ea72..1673e1598 100644 --- a/examples/zh/README.md +++ b/examples/zh/README.md @@ -4,7 +4,7 @@ 这些示例默认 `kustomize` 在您的 `$PATH` 中。 -这些示例通过了 [pre-commit](../../travis/pre-commit.sh) 测试,并且应该与 HEAD 一起使用。 +这些示例通过了 [pre-commit](../../travis/kyaml-pre-commit.sh) 测试,并且应该与 HEAD 一起使用。 ``` go get sigs.k8s.io/kustomize/v3/cmd/kustomize From 218880cdd9b08a1ea9b5eb391aa461b2ce0c9420 Mon Sep 17 00:00:00 2001 From: Jeffrey Regan Date: Thu, 30 Apr 2020 15:51:49 -0700 Subject: [PATCH 24/24] kyaml 0.1.8, cmd/config 0.1.7 --- releasing/VERSIONS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/releasing/VERSIONS b/releasing/VERSIONS index 9564660ec..d24a007fa 100644 --- a/releasing/VERSIONS +++ b/releasing/VERSIONS @@ -6,7 +6,7 @@ # kyaml version export kyaml_major=0 export kyaml_minor=1 -export kyaml_patch=7 +export kyaml_patch=8 # kstatus version export kstatus_major=0 @@ -21,7 +21,7 @@ export api_patch=3 # cmd/config version export cmd_config_major=0 export cmd_config_minor=1 -export cmd_config_patch=6 +export cmd_config_patch=7 # cmd/kubectl version export cmd_kubectl_major=0