diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index edc257197..ec823eeb8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -98,7 +98,7 @@ jobs: go-version: 1.17 - name: Install kpt run: | - go install github.com/GoogleContainerTools/kpt@main + go install github.com/GoogleContainerTools/kpt@v1.0.0-beta.17 - name: Build node and Go docker images if: matrix.platform == 'ubuntu-latest' run: | diff --git a/examples/set-image-advanced/.expected/results.yaml b/examples/set-image-advanced/.expected/results.yaml index b1c2a95f9..aa8eababb 100644 --- a/examples/set-image-advanced/.expected/results.yaml +++ b/examples/set-image-advanced/.expected/results.yaml @@ -7,29 +7,23 @@ items: - image: gcr.io/kpt-fn/set-image:unstable exitCode: 0 results: - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: v1 kind: Pod name: the-pod - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: resources.yaml - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: dev.example.com/v1 kind: MyKind name: the-resource namespace: the-namespace - field: - path: spec.manifest.images.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: resources.yaml index: 1 + - message: 'summary: updated a total of 1 image(s)' + severity: info \ No newline at end of file diff --git a/examples/set-image-digest/.expected/results.yaml b/examples/set-image-digest/.expected/results.yaml index 57f9f31a4..ef15e9bfb 100644 --- a/examples/set-image-digest/.expected/results.yaml +++ b/examples/set-image-digest/.expected/results.yaml @@ -7,28 +7,22 @@ items: - image: gcr.io/kpt-fn/set-image:unstable exitCode: 0 results: - - message: set image from nginx:1.20.2 to bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f + - message: updated image from nginx:1.20.2 to bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f severity: info resourceRef: apiVersion: v1 kind: Pod name: app1 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f file: path: resources.yaml - - message: set image from nginx:1.20.2 to bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f + - message: updated image from nginx:1.20.2 to bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f severity: info resourceRef: apiVersion: v1 kind: Pod name: app2 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx@sha256:e1d6f00f191515945233f562777fc9ab3b7637ea75169b3dd628d46c9b24400f file: path: resources.yaml index: 1 + - message: 'summary: updated a total of 2 image(s)' + severity: info \ No newline at end of file diff --git a/examples/set-image-imperative/.expected/results.yaml b/examples/set-image-imperative/.expected/results.yaml index d05a4c72c..2fe13aa91 100644 --- a/examples/set-image-imperative/.expected/results.yaml +++ b/examples/set-image-imperative/.expected/results.yaml @@ -7,28 +7,22 @@ items: - image: gcr.io/kpt-fn/set-image:unstable exitCode: 0 results: - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: v1 kind: Pod name: app1 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: app.yaml - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: v1 kind: Pod name: app2 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: app.yaml index: 1 + - message: 'summary: updated a total of 2 image(s)' + severity: info \ No newline at end of file diff --git a/examples/set-image-simple/.expected/results.yaml b/examples/set-image-simple/.expected/results.yaml index 73be67279..694a08aef 100644 --- a/examples/set-image-simple/.expected/results.yaml +++ b/examples/set-image-simple/.expected/results.yaml @@ -7,28 +7,22 @@ items: - image: gcr.io/kpt-fn/set-image:unstable exitCode: 0 results: - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: v1 kind: Pod name: app1 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: resources.yaml - - message: set image from nginx:1.20.2 to bitnami/nginx:1.21.4 + - message: updated image from nginx:1.20.2 to bitnami/nginx:1.21.4 severity: info resourceRef: apiVersion: v1 kind: Pod name: app2 - field: - path: spec.containers.image - currentValue: nginx:1.20.2 - proposedValue: bitnami/nginx:1.21.4 file: path: resources.yaml index: 1 + - message: 'summary: updated a total of 2 image(s)' + severity: info \ No newline at end of file diff --git a/functions/go/set-image/custom/custom.go b/functions/go/set-image/custom/custom.go new file mode 100644 index 000000000..b58c0eaff --- /dev/null +++ b/functions/go/set-image/custom/custom.go @@ -0,0 +1,65 @@ +package custom + +import ( + "fmt" + + "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" + "sigs.k8s.io/kustomize/api/filters/imagetag" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/filtersutil" + "sigs.k8s.io/kustomize/kyaml/yaml" +) + +// SetAdditionalFieldSpec updates the image in user given fieldPaths. To be deprecated in around a year, to avoid possible invalid fieldPaths. +func SetAdditionalFieldSpec(img *fn.SubObject, objects fn.KubeObjects, addImgFields fn.SliceSubObjects, ctx *fn.Context) { + image := NewImageAdaptor(img) + additionalImageFields := NewFieldSpecSliceAdaptor(addImgFields) + + for i, obj := range objects { + objRN, err := yaml.Parse(obj.String()) + if err != nil { + ctx.ResultErr(err.Error(), obj) + } + filter := imagetag.Filter{ + ImageTag: image, + FsSlice: additionalImageFields, + } + + filter.WithMutationTracker(logResultCallback(ctx, obj)) + err = filtersutil.ApplyToJSON(filter, objRN) + if err != nil { + ctx.ResultErr(err.Error(), obj) + } + newObj, err := fn.ParseKubeObject([]byte(objRN.MustString())) + if err != nil { + ctx.ResultErr(err.Error(), obj) + } + objects[i] = newObj + } +} + +func logResultCallback(ctx *fn.Context, ko *fn.KubeObject) func(key, value, tag string, node *yaml.RNode) { + return func(key, value, tag string, node *yaml.RNode) { + currentValue := node.YNode().Value + msg := fmt.Sprintf("updated image from %v to %v", currentValue, value) + ctx.ResultInfo(msg, ko) + } +} + +// NewImageAdaptor transforms the image struct inside transformer to the struct inside kustomize +func NewImageAdaptor(imgObj *fn.SubObject) types.Image { + imgPtr := &types.Image{} + imgObj.AsOrDie(imgPtr) + return *imgPtr +} + +// NewFieldSpecSliceAdaptor transforms the additionalImageFields struct inside transformer to the struct inside kustomize +func NewFieldSpecSliceAdaptor(addImgFields fn.SliceSubObjects) types.FsSlice { + additionalImageFields := types.FsSlice{} + for _, v := range addImgFields { + fieldPtr := &types.FieldSpec{} + v.AsOrDie(fieldPtr) + additionalImageFields = append(additionalImageFields, *fieldPtr) + } + return additionalImageFields +} diff --git a/functions/go/set-image/go.mod b/functions/go/set-image/go.mod index 49db7549f..3c0393b0f 100644 --- a/functions/go/set-image/go.mod +++ b/functions/go/set-image/go.mod @@ -3,31 +3,34 @@ module github.com/GoogleContainerTools/kpt-functions-catalog/functions/go/set-im go 1.17 require ( - github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220503232936-7ad5b77727ee - github.com/stretchr/testify v1.7.0 + github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220812180116-970f3e4cbc5a + github.com/stretchr/testify v1.8.0 sigs.k8s.io/kustomize/api v0.11.0 - sigs.k8s.io/kustomize/kyaml v0.13.6 + sigs.k8s.io/kustomize/kyaml v0.13.9 ) require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/GoogleContainerTools/kpt-functions-sdk/go/api v0.0.0-20220812180116-970f3e4cbc5a // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-errors/errors v1.0.1 // indirect - github.com/go-logr/logr v1.2.0 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.3 // indirect - github.com/go-openapi/swag v0.19.5 // indirect - github.com/mailru/easyjson v0.7.0 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.22.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.6.9 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/kr/pretty v0.2.1 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect - golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect - golang.org/x/text v0.3.7 // indirect + github.com/xlab/treeprint v1.1.0 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - k8s.io/klog/v2 v2.30.0 // indirect - k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.70.1 // indirect + k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/functions/go/set-image/go.sum b/functions/go/set-image/go.sum index 5833c574e..4696e9659 100644 --- a/functions/go/set-image/go.sum +++ b/functions/go/set-image/go.sum @@ -39,12 +39,14 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220503232936-7ad5b77727ee h1:zi0tfHXaBbCWvO785ZGUHkpa3RgKubDhO4NSzDZ1bxw= -github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220503232936-7ad5b77727ee/go.mod h1:vl3iiwgrqdDgvGi5ckt3O9IoyaHUgFkfxE4RjQIqgwk= +github.com/GoogleContainerTools/kpt-functions-sdk/go/api v0.0.0-20220720212527-133180134b93/go.mod h1:gkK43tTaPXFNASpbIbQImzhmt1hdcdin++kvzTblykc= +github.com/GoogleContainerTools/kpt-functions-sdk/go/api v0.0.0-20220812180116-970f3e4cbc5a h1:C9hMUYtxc2Tk5k2QYkv1dUpCYpS/Twfeuj+68f5sK0Q= +github.com/GoogleContainerTools/kpt-functions-sdk/go/api v0.0.0-20220812180116-970f3e4cbc5a/go.mod h1:gkK43tTaPXFNASpbIbQImzhmt1hdcdin++kvzTblykc= +github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220812180116-970f3e4cbc5a h1:QpWSBYH7s+M2oKHg7kv58YF7a0bBulLtIH0eP/i+6Cw= +github.com/GoogleContainerTools/kpt-functions-sdk/go/fn v0.0.0-20220812180116-970f3e4cbc5a/go.mod h1:Kfyd06y9XFV1QXUI1L7OI5xxINyK0Xq+7BcXcnv28c4= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -53,7 +55,9 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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= @@ -61,43 +65,58 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.0 h1:1VXunYCNgapcSzFtcY+eBmrwESlYCnFJZahQRgTRoo8= +github.com/go-openapi/swag v0.22.0/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -132,8 +151,9 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= +github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -144,9 +164,11 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -162,6 +184,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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= @@ -192,12 +215,16 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 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/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -206,6 +233,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -213,8 +242,10 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -230,13 +261,24 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= 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.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -250,39 +292,50 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= +github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= @@ -293,6 +346,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -304,6 +358,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -339,8 +394,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -364,6 +421,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -376,8 +434,13 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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= @@ -403,6 +466,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -412,9 +476,11 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -435,6 +501,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -442,9 +509,17 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/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= @@ -453,7 +528,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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= @@ -506,15 +580,19 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -586,6 +664,7 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -606,6 +685,7 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -618,15 +698,20 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 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.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -637,8 +722,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/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.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -650,20 +736,26 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661/go.mod h1:daOouuuwd9JXpv1L7Y34iV3yf6nxzipkKMWWlqlvK9M= +k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea h1:3QOH5+2fGsY8e1qf+GIFpg+zw/JGNrgyZRQR7/m6uWg= +k8s.io/kube-openapi v0.0.0-20220803164354-a70c9af30aea/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/kustomize/api v0.11.0 h1:rOc0rOdDjCvxadrOJ0IXBgicXsaaDNScwrOGJ5Zy/h0= sigs.k8s.io/kustomize/api v0.11.0/go.mod h1:dALzjWwENwAPSfWF7UdYeQXLJMlbZI0bELeovauXs2w= sigs.k8s.io/kustomize/kyaml v0.13.2/go.mod h1:/ya3Gk4diiQzlE4mBh7wykyLRFZNvqlbh+JnwQ9Vhrc= -sigs.k8s.io/kustomize/kyaml v0.13.6 h1:eF+wsn4J7GOAXlvajv6OknSunxpcOBQQqsnPxObtkGs= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= +sigs.k8s.io/kustomize/kyaml v0.13.7-0.20220418212550-9d5491c2e20c/go.mod h1:6K+IUOuir3Y7nucPRAjw9yth04KSWBnP5pqUTGwj/qU= +sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= +sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/functions/go/set-image/image_transformer.go b/functions/go/set-image/image_transformer.go deleted file mode 100644 index 4ca8b83f8..000000000 --- a/functions/go/set-image/image_transformer.go +++ /dev/null @@ -1,187 +0,0 @@ -package main - -import ( - "fmt" - "strconv" - "strings" - - "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" - "sigs.k8s.io/kustomize/api/filters/imagetag" - "sigs.k8s.io/kustomize/api/konfig/builtinpluginconsts" - "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kyaml/filtersutil" - "sigs.k8s.io/kustomize/kyaml/kio/kioutil" - "sigs.k8s.io/kustomize/kyaml/yaml" -) - -const ( - fnConfigGroup = "fn.kpt.dev" - fnConfigVersion = "v1alpha1" - fnConfigAPIVersion = fnConfigGroup + "/" + fnConfigVersion - fnConfigKind = "SetImage" -) - -// getDefaultImageFields returns default image FieldSpecs -func getDefaultImageFields() (types.FsSlice, error) { - type defaultConfig struct { - FieldSpecs types.FsSlice `json:"images,omitempty" yaml:"images,omitempty"` - } - defaultConfigString := builtinpluginconsts.GetDefaultFieldSpecsAsMap()["images"] - var tc defaultConfig - err := yaml.Unmarshal([]byte(defaultConfigString), &tc) - return tc.FieldSpecs, err -} - -type SetImage struct { - // Image Desired image tag. - Image types.Image `json:"image,omitempty" yaml:"image,omitempty"` - // AdditionalImageFields is used to specify additional fields to set image. - AdditionalImageFields types.FsSlice `json:"additionalImageFields,omitempty" yaml:"additionalImageFields,omitempty"` - // setImageResults is used internally to track which images were updated - setImageResults setImageResults -} - -// setImageResultKey is used as a unique identifier for set image results -type setImageResultKey struct { - ResourceRef yaml.ResourceIdentifier - // FilePath is the file path of the resource - FilePath string - // FileIndex is the file index of the resource - FileIndex int - // FieldPath is field path of the image field - FieldPath string -} - -// setImageResult maps a previous image value to a new image value where set-image is applied -// e.g. "nginx:1.20.2" -> "nginx:1.21.6" -type setImageResult struct { - // CurrentValue is the value before applying the set-image mutation - CurrentValue string - // UpdatedValue is the value that will be set after applying set-image - UpdatedValue string -} - -// setImageResults tracks the number of images updated matching the key -type setImageResults map[setImageResultKey][]setImageResult - -// SdkResults returns fn.Results representing which images were updated -func (si *SetImage) SdkResults() fn.Results { - results := fn.Results{} - if len(si.setImageResults) == 0 { - results = append(results, &fn.Result{ - Message: "no images changed", - Severity: fn.Info, - }) - return results - } - for k, v := range si.setImageResults { - resourceRef := k.ResourceRef - for _, sir := range v { - results = append(results, &fn.Result{ - Message: fmt.Sprintf("set image from %s to %s", sir.CurrentValue, sir.UpdatedValue), - Field: &fn.Field{ - Path: k.FieldPath, - CurrentValue: sir.CurrentValue, - ProposedValue: sir.UpdatedValue, - }, - File: &fn.File{Path: k.FilePath, Index: k.FileIndex}, - Severity: fn.Info, - ResourceRef: &resourceRef, - }) - } - } - results.Sort() - return results -} - -// validateInput validates the inputs passed into via the functionConfig -func (si *SetImage) validateInput() error { - if si.Image.Name == "" { - return fmt.Errorf("missing image name") - } - if si.Image.NewName == "" && si.Image.NewTag == "" && si.Image.Digest == "" { - return fmt.Errorf("missing image newName, newTag, or digest") - } - if si.Image.NewTag != "" && si.Image.Digest != "" { - return fmt.Errorf("image newTag and digest both set") - } - return nil -} - -// Config initializes SetImage from a functionConfig fn.KubeObject -func (si *SetImage) Config(functionConfig *fn.KubeObject) (error, bool) { - si.Image = types.Image{} - si.AdditionalImageFields = nil - switch { - case functionConfig.IsGVK( "v1", "ConfigMap"): - functionConfig.GetOrDie(&si.Image, "data") - case functionConfig.IsGVK(fnConfigAPIVersion, fnConfigKind): - functionConfig.AsOrDie(si) - default: - return fmt.Errorf("`functionConfig` must be a `ConfigMap` or `%s`", fnConfigKind), false - } - if err := si.validateInput(); err != nil { - return err, false - } - defaultImageFields, err := getDefaultImageFields() - if err != nil { - return err, false - } - si.AdditionalImageFields = append(si.AdditionalImageFields, defaultImageFields...) - return nil, true -} - -// Transform set image out of place. -func (si *SetImage) Transform(rl *fn.ResourceList) error { - var transformedItems []*fn.KubeObject - si.setImageResults = make(setImageResults) - for _, obj := range rl.Items { - objRN, err := yaml.Parse(obj.String()) - if err != nil { - return err - } - filter := imagetag.Filter{ - ImageTag: si.Image, - FsSlice: si.AdditionalImageFields, - } - filter.WithMutationTracker(si.mutationTracker(objRN, obj)) - err = filtersutil.ApplyToJSON(filter, objRN) - if err != nil { - return err - } - obj, err = fn.ParseKubeObject([]byte(objRN.MustString())) - if err != nil { - return err - } - transformedItems = append(transformedItems, obj) - } - rl.Items = transformedItems - return nil -} - -func (si *SetImage) mutationTracker(objRN *yaml.RNode, ko *fn.KubeObject) func(key, value, tag string, node *yaml.RNode) { - filePath, fileIndexStr, _ := kioutil.GetFileAnnotations(objRN) - fileIndex, _ := strconv.Atoi(fileIndexStr) - return func(key, value, tag string, node *yaml.RNode) { - currentValue := node.YNode().Value - rk := setImageResultKey{ - ResourceRef: yaml.ResourceIdentifier{ - TypeMeta: yaml.TypeMeta{ - APIVersion: ko.GetAPIVersion(), - Kind: ko.GetKind(), - }, - NameMeta: yaml.NameMeta{ - Name: ko.GetName(), - Namespace: ko.GetNamespace(), - }, - }, - FilePath: filePath, - FileIndex: fileIndex, - FieldPath: strings.Join(node.FieldPath(), "."), - } - si.setImageResults[rk] = append(si.setImageResults[rk], setImageResult{ - CurrentValue: currentValue, - UpdatedValue: value, - }) - } -} diff --git a/functions/go/set-image/image_transformer_test.go b/functions/go/set-image/image_transformer_test.go deleted file mode 100644 index 1df475f5f..000000000 --- a/functions/go/set-image/image_transformer_test.go +++ /dev/null @@ -1,373 +0,0 @@ -package main - -import ( - "fmt" - "strings" - "testing" - - "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" - "github.com/stretchr/testify/assert" -) - -// helper function to convert ResourceList items to yaml -func itemsToYaml(items []*fn.KubeObject) string { - var itemYamls []string - for _, item := range items { - itemYamls = append(itemYamls, item.String()) - } - result := strings.Join(itemYamls, "---\n") - return result -} - -func runImageTransformerResults(input, config string) (*fn.ResourceList, error) { - rl, err := fn.ParseResourceList([]byte(input)) - if err != nil { - return nil, err - } - functionConfig, err := fn.ParseKubeObject([]byte(config)) - if err != nil { - return nil, err - } - rl.FunctionConfig = functionConfig - in, _ := rl.ToYAML() - out, err := fn.Run(fn.ResourceListProcessorFunc(setImageTags), in) - if err != nil { - return nil, err - } - rl, _ = fn.ParseResourceList(out) - - ko, _ := fn.ParseKubeObject(out) - results := ko.GetSlice("results") - for _, result := range results{ - if result.GetString("severity") == "error" { - return rl, fn.GeneralResult(result.GetString("message"), fn.Error) - } - rl.Results = append(rl.Results, fn.GeneralResult(result.GetString("message"), fn.Info)) - } - return rl, nil -} - -func runImageTransformerE(input, config string) (string, error) { - rl, err := runImageTransformerResults(input, config) - if err != nil { - return "", err - } - rl.Sort() - result := itemsToYaml(rl.Items) - return result, nil -} - -func runImageTransformer(t *testing.T, input, config string) string { - s, err := runImageTransformerE(input, config) - if err != nil { - t.Fatal(err) - } - return s -} - -func TestImageTransformer(t *testing.T) { - testCases := []struct { - TestName string - FunctionConfig string - Input string - ExpectedOutput string - }{ - { - TestName: "set-image should accept a ConfigMap functionConfig", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - name: foo - newName: bar - newTag: 4.5.6 -`, - Input: ` -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: v1 - kind: Pod - metadata: - name: the-pod - namespace: the-namespace - spec: - containers: - - image: foo:1.2.3 - name: test-container -`, - ExpectedOutput: `apiVersion: v1 -kind: Pod -metadata: - name: the-pod - namespace: the-namespace -spec: - containers: - - image: bar:4.5.6 - name: test-container -`, - }, - { - TestName: "set-image should allow specifying an image digest", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - name: foo - newName: bar - digest: 123456 -`, - Input: ` -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: v1 - kind: Pod - metadata: - name: the-pod - namespace: the-namespace - spec: - containers: - - image: foo:1.2.3 - name: test-container -`, - ExpectedOutput: `apiVersion: v1 -kind: Pod -metadata: - name: the-pod - namespace: the-namespace -spec: - containers: - - image: bar@123456 - name: test-container -`, - }, - { - TestName: "set-image should accept a SetImage functionConfig", - FunctionConfig: ` -apiVersion: fn.kpt.dev/v1alpha1 -kind: SetImage -metadata: - name: my-func-config -image: - name: nginx - newName: apache - newTag: 2.4.52 -additionalImageFields: - - kind: MyResource - create: false - group: dev.example.com - path: spec/manifest/images[]/image - version: v1 -`, - Input: ` -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: dev.example.com/v1 - kind: MyResource - metadata: - name: my-resource - namespace: my-namespace - spec: - containers: - - image: nginx:1.21.4 - name: my-server - - image: postgres:14.1 - name: my-store - manifest: - images: - - image: nginx:1.21.4 - - image: postgres:14.1 -`, - ExpectedOutput: `apiVersion: dev.example.com/v1 -kind: MyResource -metadata: - name: my-resource - namespace: my-namespace -spec: - containers: - - image: apache:2.4.52 - name: my-server - - image: postgres:14.1 - name: my-store - manifest: - images: - - image: apache:2.4.52 - - image: postgres:14.1 -`, - }, - } - for _, tc := range testCases { - t.Run(tc.TestName, func(t *testing.T) { - output := runImageTransformer(t, tc.Input, tc.FunctionConfig) - assert.Equal(t, tc.ExpectedOutput, output) - }) - } - -} - -func TestFunctionConfigErrors(t *testing.T) { - testCases := []struct { - TestName string - FunctionConfig string - ExpectedError string - }{ - { - TestName: "set-image should return an error if image name is unset", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - newName: bar - newTag: v1.0 -`, - ExpectedError: `missing image name`, - }, - { - TestName: "set-image should return an error if image newName, newTag, and digest are unset", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - name: foo -`, - ExpectedError: `missing image newName, newTag, or digest`, - }, - { - TestName: "set-image should return an error when both image newTag and digest are set", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - name: foo - newName: bar - newTag: v1.0 - digest: 12345 -`, - ExpectedError: `image newTag and digest both set`, - }, - { - TestName: "set-image should return an error when data is missing from functionConfig", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -`, - ExpectedError: `missing image name`, - }, - { - TestName: "set-image should return an error when an invalid ConfigMap is used as the functionConfig", - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -data: - name: - unexpected: object -`, - ExpectedError: "SubObject has unmatched field type: `data", - }, - { - TestName: "set-image should return an error when an invalid SetImage is used as the functionConfig", - FunctionConfig: ` -apiVersion: fn.kpt.dev/v1alpha1 -kind: SetImage -image: - name: - unexpected: object -`, - ExpectedError: "Resource(apiVersion=fn.kpt.dev/v1alpha1, kind=SetImage, Name=) has unmatched field type: `", - }, - } - - input := ` -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: v1 - kind: ConfigMap -` - - for _, tc := range testCases { - t.Run(tc.TestName, func(t *testing.T) { - _, err := runImageTransformerE(input, tc.FunctionConfig) - assert.EqualError(t, err, tc.ExpectedError) - }) - } -} - -func TestAnnotationsTransformerResults(t *testing.T) { - testCases := []struct { - TestName string - FunctionConfig string - Input string - ExpectedResults string - }{ - { - TestName: `record which image fields were updated`, - FunctionConfig: ` -apiVersion: v1 -kind: ConfigMap -metadata: - name: my-func-config -data: - name: foo - newName: bar - newTag: 4.5.6 -`, - Input: ` -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: v1 - kind: Pod - metadata: - name: the-pod - namespace: the-namespace - spec: - containers: - - image: foo:1.2.3 - name: test-container -- apiVersion: v1 - kind: Pod - metadata: - name: the-pod2 - namespace: the-namespace - spec: - containers: - - image: foo:1.2.3 - name: test-container - - image: foo:latest - name: test-container2 -`, - ExpectedResults: ` -[info]: set image from foo:1.2.3 to bar:4.5.6 -[info]: set image from foo:1.2.3 to bar:4.5.6 -[info]: set image from foo:latest to bar:4.5.6 -`, - }, - } - for _, tc := range testCases { - t.Run(tc.TestName, func(t *testing.T) { - rl, err := runImageTransformerResults(tc.Input, tc.FunctionConfig) - assert.Equal(t, nil, err) - rl.Results.Sort() - resultStr := "\n" - for _, r := range rl.Results { - resultStr += fmt.Sprintf("%s\n", r.String()) - } - assert.Equal(t, tc.ExpectedResults, resultStr) - }) - } -} diff --git a/functions/go/set-image/main.go b/functions/go/set-image/main.go index b53e54730..ce799d533 100644 --- a/functions/go/set-image/main.go +++ b/functions/go/set-image/main.go @@ -3,29 +3,12 @@ package main import ( "os" + "github.com/GoogleContainerTools/kpt-functions-catalog/functions/go/set-image/transformer" "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" ) func main() { - if err := fn.AsMain(fn.ResourceListProcessorFunc(setImageTags)); err != nil { + if err := fn.AsMain(&transformer.SetImage{}); err != nil { os.Exit(1) } } - -func setImageTags(rl *fn.ResourceList) (bool, error) { - si := SetImage{} - err, ok := si.Config(rl.FunctionConfig) - if !ok { - return false, err - } - if err != nil { - rl.Results = append(rl.Results, fn.ErrorConfigObjectResult(err, rl.FunctionConfig)) - return true, nil - } - err = si.Transform(rl) - if err != nil { - return false, err - } - rl.Results = append(rl.Results, si.SdkResults()...) - return true, nil -} diff --git a/functions/go/set-image/third_party/README.md b/functions/go/set-image/third_party/README.md new file mode 100644 index 000000000..d5613ff94 --- /dev/null +++ b/functions/go/set-image/third_party/README.md @@ -0,0 +1,3 @@ +This package is forked from +`sigs.k8s.io/kustomize/api/` +with version `api/v0.12.1`. \ No newline at end of file diff --git a/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/image/image.go b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/image/image.go new file mode 100644 index 000000000..4a88050b4 --- /dev/null +++ b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/image/image.go @@ -0,0 +1,66 @@ +// Copyright 2020 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package image + +import ( + "regexp" + "strings" +) + +// IsImageMatched returns true if the value of t is identical to the +// image name in the full image name and tag as given by s. +func IsImageMatched(s, t string) bool { + // Tag values are limited to [a-zA-Z0-9_.{}-]. + // Some tools like Bazel rules_k8s allow tag patterns with {} characters. + // More info: https://github.com/bazelbuild/rules_k8s/pull/423 + pattern, _ := regexp.Compile("^" + t + "(:[a-zA-Z0-9_.{}-]*)?(@sha256:[a-zA-Z0-9_.{}-]*)?$") + return pattern.MatchString(s) +} + +// Split separates and returns the name and tag parts +// from the image string using either colon `:` or at `@` separators. +// image reference pattern: [[host[:port]/]component/]component[:tag][@digest] +func Split(imageName string) (name string, tag string, digest string) { + // check if image name contains a domain + // if domain is present, ignore domain and check for `:` + searchName := imageName + slashIndex := strings.Index(imageName, "/") + if slashIndex > 0 { + searchName = imageName[slashIndex:] + } else { + slashIndex = 0 + } + + id := strings.Index(searchName, "@") + ic := strings.Index(searchName, ":") + + // no tag or digest + if ic < 0 && id < 0 { + return imageName, "", "" + } + + // digest only + if id >= 0 && (id < ic || ic < 0) { + id += slashIndex + name = imageName[:id] + digest = strings.TrimPrefix(imageName[id:], "@") + return name, "", digest + } + + // tag and digest + if id >= 0 && ic >= 0 { + id += slashIndex + ic += slashIndex + name = imageName[:ic] + tag = strings.TrimPrefix(imageName[ic:id], ":") + digest = strings.TrimPrefix(imageName[id:], "@") + return name, tag, digest + } + + // tag only + ic += slashIndex + name = imageName[:ic] + tag = strings.TrimPrefix(imageName[ic:], ":") + return name, tag, "" +} diff --git a/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/fieldspec.go b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/fieldspec.go new file mode 100644 index 000000000..8d3579544 --- /dev/null +++ b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/fieldspec.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "fmt" + + "sigs.k8s.io/kustomize/kyaml/resid" +) + +// FieldSpec completely specifies a kustomizable field in a k8s API object. +// It helps define the operands of transformations. +// +// For example, a directive to add a common label to objects +// will need to know that a 'Deployment' object (in API group +// 'apps', any version) can have labels at field path +// 'spec/template/metadata/labels', and further that it is OK +// (or not OK) to add that field path to the object if the +// field path doesn't exist already. +// +// This would look like +// { +// group: apps +// kind: Deployment +// path: spec/template/metadata/labels +// create: true +// } +type FieldSpec struct { + resid.Gvk `json:",inline,omitempty" yaml:",inline,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + CreateIfNotPresent bool `json:"create,omitempty" yaml:"create,omitempty"` +} + +func (fs FieldSpec) String() string { + return fmt.Sprintf( + "%s:%v:%s", fs.Gvk.String(), fs.CreateIfNotPresent, fs.Path) +} + +// If true, the primary key is the same, but other fields might not be. +func (fs FieldSpec) effectivelyEquals(other FieldSpec) bool { + return fs.IsSelected(&other.Gvk) && fs.Path == other.Path +} + +type FsSlice []FieldSpec + +func (s FsSlice) Len() int { return len(s) } +func (s FsSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s FsSlice) Less(i, j int) bool { + return s[i].Gvk.IsLessThan(s[j].Gvk) +} + +// MergeAll merges the argument into this, returning the result. +// Items already present are ignored. +// Items that conflict (primary key matches, but remain data differs) +// result in an error. +func (s FsSlice) MergeAll(incoming FsSlice) (result FsSlice, err error) { + result = s + for _, x := range incoming { + result, err = result.MergeOne(x) + if err != nil { + return nil, err + } + } + return result, nil +} + +// MergeOne merges the argument into this, returning the result. +// If the item's primary key is already present, and there are no +// conflicts, it is ignored (we don't want duplicates). +// If there is a conflict, the merge fails. +func (s FsSlice) MergeOne(x FieldSpec) (FsSlice, error) { + i := s.index(x) + if i > -1 { + // It's already there. + if s[i].CreateIfNotPresent != x.CreateIfNotPresent { + return nil, fmt.Errorf("conflicting fieldspecs") + } + return s, nil + } + return append(s, x), nil +} + +func (s FsSlice) index(fs FieldSpec) int { + for i, x := range s { + if x.effectivelyEquals(fs) { + return i + } + } + return -1 +} diff --git a/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/image.go b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/image.go new file mode 100644 index 000000000..e40ed324d --- /dev/null +++ b/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types/image.go @@ -0,0 +1,25 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package types + +// Image contains an image name, a new name, a new tag or digest, +// which will replace the original name and tag. +type Image struct { + // Name is a tag-less image name. + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // NewName is the value used to replace the original name. + NewName string `json:"newName,omitempty" yaml:"newName,omitempty"` + + // TagSuffix is the value used to suffix the original tag + // If Digest and NewTag is present an error is thrown + TagSuffix string `json:"tagSuffix,omitempty" yaml:"tagSuffix,omitempty"` + + // NewTag is the value used to replace the original tag. + NewTag string `json:"newTag,omitempty" yaml:"newTag,omitempty"` + + // Digest is the value used to replace the original image tag. + // If digest is present NewTag value is ignored. + Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` +} diff --git a/functions/go/set-image/transformer/images_transformer.go b/functions/go/set-image/transformer/images_transformer.go new file mode 100644 index 000000000..682991ed6 --- /dev/null +++ b/functions/go/set-image/transformer/images_transformer.go @@ -0,0 +1,206 @@ +package transformer + +import ( + "fmt" + + "github.com/GoogleContainerTools/kpt-functions-catalog/functions/go/set-image/custom" + "github.com/GoogleContainerTools/kpt-functions-catalog/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/image" + "github.com/GoogleContainerTools/kpt-functions-catalog/functions/go/set-image/third_party/sigs.k8s.io/kustomize/api/types" + "github.com/GoogleContainerTools/kpt-functions-sdk/go/fn" +) + +// Image contains an image name, a new name, a new tag or digest, which will replace the original name and tag. +type Image struct { + // Name is a tag-less image name. + Name string `json:"name,omitempty" yaml:"name,omitempty"` + + // NewName is the value used to replace the original name. + NewName string `json:"newName,omitempty" yaml:"newName,omitempty"` + + // NewTag is the value used to replace the original tag. + NewTag string `json:"newTag,omitempty" yaml:"newTag,omitempty"` + + // Digest is the value used to replace the original image tag. + // If digest is present NewTag value is ignored. + Digest string `json:"digest,omitempty" yaml:"digest,omitempty"` +} + +// setImageResult keeps the old value and new value for logging +type setImageResult struct { + currentValue string + proposedValue string +} + +// SetImage supports the set-image workflow, it uses Config to parse functionConfig, Transform to change the image +type SetImage struct { + // Image is the desired image + Image Image `json:"image,omitempty" yaml:"image,omitempty"` + // ConfigMap keeps the data field that holds image information + DataFromDefaultConfig map[string]string `json:"data,omitempty" yaml:"data,omitempty"` + // ONLY for kustomize, AdditionalImageFields is the user supplied fieldspec + AdditionalImageFields types.FsSlice `json:"additionalImageFields,omitempty" yaml:"additionalImageFields,omitempty"` + // resultCount logs the total count image change + resultCount int +} + +// Run implements the Runner interface that transforms the resource and log the results +func (t SetImage) Run(ctx *fn.Context, functionConfig *fn.KubeObject, items fn.KubeObjects) { + err := t.configDefaultData() + if err != nil { + ctx.ResultErrAndDie(err.Error(), nil) + } + err = t.validateInput() + if err != nil { + ctx.ResultErrAndDie(err.Error(), nil) + } + + for _, o := range items.Where(t.hasPodContainers) { + err, result := t.setPodContainers(o) + t.logResult(ctx, err, result, o) + } + + for _, o := range items.Where(t.hasPodSpecContainers) { + err, result := t.setPodSpecContainers(o) + t.logResult(ctx, err, result, o) + } + + if t.AdditionalImageFields != nil { + custom.SetAdditionalFieldSpec(functionConfig.GetMap("image"), items, functionConfig.GetSlice("additionalImageFields"), ctx) + } + + summary := fmt.Sprintf("summary: updated a total of %v image(s)", t.resultCount) + ctx.ResultInfo(summary, nil) +} + +// Config transforms the data from ConfigMap to SetImage struct +func (t *SetImage) configDefaultData() error { + for key, val := range t.DataFromDefaultConfig { + switch key { + case "name": + t.Image.Name = val + case "newName": + t.Image.NewName = val + case "newTag": + t.Image.NewTag = val + case "digest": + t.Image.Digest = val + default: + return fmt.Errorf("ConfigMap has wrong field name %v", key) + } + } + return nil +} + +// validateInput validates the inputs passed into via the functionConfig +func (t *SetImage) validateInput() error { + // TODO: support container name and only one argument input in the next PR + if t.Image.Name == "" { + return fmt.Errorf("must specify `name`") + } + if t.Image.NewName == "" && t.Image.NewTag == "" && t.Image.Digest == "" { + return fmt.Errorf("must specify one of `newName`, `newTag`, or `digest`") + } + if t.Image.NewTag != "" && t.Image.Digest != "" { + return fmt.Errorf("image `newTag` and `digest` both set, set only one") + } + return nil +} + +// updateContainerImages updates the images inside containers, return potential error, and a list of logging results +func (t *SetImage) updateContainerImages(pod *fn.SubObject) (error, []setImageResult) { + var containers fn.SliceSubObjects + containers = append(containers, pod.GetSlice("iniContainers")...) + containers = append(containers, pod.GetSlice("containers")...) + + var result []setImageResult + for _, o := range containers { + oldValue := o.NestedStringOrDie("image") + if !image.IsImageMatched(oldValue, t.Image.Name) { + continue + } + newName := getNewImageName(oldValue, t.Image) + if oldValue == newName { + return nil, nil + } + + if err := o.SetNestedString(newName, "image"); err != nil { + return err, nil + } + t.resultCount += 1 + + result = append(result, setImageResult{ + currentValue: oldValue, + proposedValue: newName, + }) + } + return nil, result +} + +func (t *SetImage) setPodSpecContainers(o *fn.KubeObject) (error, []setImageResult) { + spec := o.GetMap("spec") + if spec == nil { + return nil, nil + } + template := spec.GetMap("template") + if template == nil { + return nil, nil + } + podSpec := template.GetMap("spec") + err, result := t.updateContainerImages(podSpec) + if err != nil { + return err, nil + } + return nil, result +} + +func (t *SetImage) setPodContainers(o *fn.KubeObject) (error, []setImageResult) { + spec := o.GetMap("spec") + if spec == nil { + return nil, nil + } + err, result := t.updateContainerImages(spec) + if err != nil { + return err, nil + } + return nil, result +} + +func (t *SetImage) hasPodSpecContainers(o *fn.KubeObject) bool { + return o.IsGVK("", "", "PodTemplate") +} + +func (t *SetImage) hasPodContainers(o *fn.KubeObject) bool { + return o.IsGVK("", "", "Pod") +} + +// getNewImageName return the new name for image field +func getNewImageName(oldValue string, newImage Image) string { + name, tag, digest := image.Split(oldValue) + if newImage.NewName != "" { + name = newImage.NewName + } + if newImage.NewTag != "" { + tag = ":" + newImage.NewTag + } + if newImage.Digest != "" { + tag = "@" + newImage.Digest + } + var newName string + if tag == "" { + newName = name + digest + } else { + newName = name + tag + } + + return newName +} + +func (t SetImage) logResult(ctx *fn.Context, err error, result []setImageResult, o *fn.KubeObject) { + if err != nil { + ctx.ResultErr(err.Error(), o) + } + for _, val := range result { + msg := fmt.Sprintf("updated image from %v to %v", val.currentValue, val.proposedValue) + ctx.ResultInfo(msg, o) + } +} diff --git a/tests/set-image/no-image-name/.expected/config.yaml b/tests/set-image/no-image-name/.expected/config.yaml new file mode 100644 index 000000000..2a1d13956 --- /dev/null +++ b/tests/set-image/no-image-name/.expected/config.yaml @@ -0,0 +1,5 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 \ No newline at end of file diff --git a/tests/set-image/no-image-name/.expected/results.yaml b/tests/set-image/no-image-name/.expected/results.yaml new file mode 100644 index 000000000..eca13cd4e --- /dev/null +++ b/tests/set-image/no-image-name/.expected/results.yaml @@ -0,0 +1,14 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 +items: + - image: gcr.io/kpt-fn/set-image:unstable + stderr: 'failed to evaluate function: function is terminated: must specify `name`' + exitCode: 1 + results: + - message: must specify `name` + severity: error + - message: 'function is terminated: must specify `name`' + severity: error \ No newline at end of file diff --git a/tests/set-image/no-image-name/.krmignore b/tests/set-image/no-image-name/.krmignore new file mode 100644 index 000000000..9d7a4007d --- /dev/null +++ b/tests/set-image/no-image-name/.krmignore @@ -0,0 +1 @@ +.expected diff --git a/tests/set-image/no-image-name/Kptfile b/tests/set-image/no-image-name/Kptfile new file mode 100644 index 000000000..3bbda3777 --- /dev/null +++ b/tests/set-image/no-image-name/Kptfile @@ -0,0 +1,10 @@ +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: example +pipeline: + mutators: + - image: gcr.io/kpt-fn/set-image:unstable + configMap: + newName: bar + newTag: v1.0 diff --git a/tests/set-image/no-image-name/resources.yaml b/tests/set-image/no-image-name/resources.yaml new file mode 100644 index 000000000..ee6f8a24b --- /dev/null +++ b/tests/set-image/no-image-name/resources.yaml @@ -0,0 +1,7 @@ +apiVersion: config.kubernetes.io/v1 +kind: ResourceList +metadata: + name: my-resource +items: +- apiVersion: v1 + kind: ConfigMap diff --git a/tests/set-image/no-newName-or-newTag/.expected/config.yaml b/tests/set-image/no-newName-or-newTag/.expected/config.yaml new file mode 100644 index 000000000..2a1d13956 --- /dev/null +++ b/tests/set-image/no-newName-or-newTag/.expected/config.yaml @@ -0,0 +1,5 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 \ No newline at end of file diff --git a/tests/set-image/no-newName-or-newTag/.expected/results.yaml b/tests/set-image/no-newName-or-newTag/.expected/results.yaml new file mode 100644 index 000000000..9c3c52a72 --- /dev/null +++ b/tests/set-image/no-newName-or-newTag/.expected/results.yaml @@ -0,0 +1,14 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 +items: + - image: gcr.io/kpt-fn/set-image:unstable + stderr: 'failed to evaluate function: function is terminated: must specify one of `newName`, `newTag`, or `digest`' + exitCode: 1 + results: + - message: must specify one of `newName`, `newTag`, or `digest` + severity: error + - message: 'function is terminated: must specify one of `newName`, `newTag`, or `digest`' + severity: error \ No newline at end of file diff --git a/tests/set-image/no-newName-or-newTag/.krmignore b/tests/set-image/no-newName-or-newTag/.krmignore new file mode 100644 index 000000000..9d7a4007d --- /dev/null +++ b/tests/set-image/no-newName-or-newTag/.krmignore @@ -0,0 +1 @@ +.expected diff --git a/tests/set-image/no-newName-or-newTag/Kptfile b/tests/set-image/no-newName-or-newTag/Kptfile new file mode 100644 index 000000000..da7c51e37 --- /dev/null +++ b/tests/set-image/no-newName-or-newTag/Kptfile @@ -0,0 +1,9 @@ +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: example +pipeline: + mutators: + - image: gcr.io/kpt-fn/set-image:unstable + configMap: + name: foo diff --git a/tests/set-image/no-newName-or-newTag/resources.yaml b/tests/set-image/no-newName-or-newTag/resources.yaml new file mode 100644 index 000000000..7dedd38a7 --- /dev/null +++ b/tests/set-image/no-newName-or-newTag/resources.yaml @@ -0,0 +1,7 @@ +apiVersion: config.kubernetes.io/v1 +kind: ResourceList +metadata: + name: my-resource +items: + - apiVersion: v1 + kind: ConfigMap \ No newline at end of file diff --git a/tests/set-image/set-both-tag-and-digest/.expected/config.yaml b/tests/set-image/set-both-tag-and-digest/.expected/config.yaml new file mode 100644 index 000000000..2a1d13956 --- /dev/null +++ b/tests/set-image/set-both-tag-and-digest/.expected/config.yaml @@ -0,0 +1,5 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 \ No newline at end of file diff --git a/tests/set-image/set-both-tag-and-digest/.expected/results.yaml b/tests/set-image/set-both-tag-and-digest/.expected/results.yaml new file mode 100644 index 000000000..d65beeab0 --- /dev/null +++ b/tests/set-image/set-both-tag-and-digest/.expected/results.yaml @@ -0,0 +1,14 @@ +apiVersion: kpt.dev/v1 +kind: FunctionResultList +metadata: + name: fnresults +exitCode: 1 +items: + - image: gcr.io/kpt-fn/set-image:unstable + stderr: 'failed to evaluate function: function is terminated: image `newTag` and `digest` both set, set only one' + exitCode: 1 + results: + - message: image `newTag` and `digest` both set, set only one + severity: error + - message: 'function is terminated: image `newTag` and `digest` both set, set only one' + severity: error \ No newline at end of file diff --git a/tests/set-image/set-both-tag-and-digest/.krmignore b/tests/set-image/set-both-tag-and-digest/.krmignore new file mode 100644 index 000000000..9d7a4007d --- /dev/null +++ b/tests/set-image/set-both-tag-and-digest/.krmignore @@ -0,0 +1 @@ +.expected diff --git a/tests/set-image/set-both-tag-and-digest/Kptfile b/tests/set-image/set-both-tag-and-digest/Kptfile new file mode 100644 index 000000000..45e849d9f --- /dev/null +++ b/tests/set-image/set-both-tag-and-digest/Kptfile @@ -0,0 +1,12 @@ +apiVersion: kpt.dev/v1 +kind: Kptfile +metadata: + name: example +pipeline: + mutators: + - image: gcr.io/kpt-fn/set-image:unstable + configMap: + name: foo + newName: bar + newTag: v1.0 + digest: 12345 diff --git a/tests/set-image/set-both-tag-and-digest/resources.yaml b/tests/set-image/set-both-tag-and-digest/resources.yaml new file mode 100644 index 000000000..7dedd38a7 --- /dev/null +++ b/tests/set-image/set-both-tag-and-digest/resources.yaml @@ -0,0 +1,7 @@ +apiVersion: config.kubernetes.io/v1 +kind: ResourceList +metadata: + name: my-resource +items: + - apiVersion: v1 + kind: ConfigMap \ No newline at end of file