From 677f052a3e9db95f608e78c123f11d12c73472ea Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 22 Jan 2023 11:20:45 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9C=A8=20Allowing=20generators?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 113 ++++++++++-------- .../builtinplugintype_string.go | 2 +- .../tranformers.go => plugins/factories.go} | 52 +++++++- tests/functions2/01_configmap-generator.yaml | 12 ++ .../02_replacement-transformer.yaml | 29 +++++ tests/test_krmfnbuiltin.sh | 6 +- 6 files changed, 158 insertions(+), 56 deletions(-) rename pkg/{transformers => plugins}/builtinplugintype_string.go (98%) rename pkg/{transformers/tranformers.go => plugins/factories.go} (67%) create mode 100644 tests/functions2/01_configmap-generator.yaml create mode 100644 tests/functions2/02_replacement-transformer.yaml diff --git a/main.go b/main.go index 6a1d950..77bed10 100644 --- a/main.go +++ b/main.go @@ -4,18 +4,16 @@ import ( "fmt" "os" - "github.com/kaweezle/krmfnbuiltin/pkg/transformers" + "github.com/kaweezle/krmfnbuiltin/pkg/plugins" "sigs.k8s.io/kustomize/api/konfig" - fLdr "sigs.k8s.io/kustomize/api/loader" - "sigs.k8s.io/kustomize/api/provider" "sigs.k8s.io/kustomize/api/resmap" "sigs.k8s.io/kustomize/api/resource" - "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/errors" - "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/fn/framework" "sigs.k8s.io/kustomize/kyaml/fn/framework/command" + "sigs.k8s.io/kustomize/kyaml/kio/filters" + "sigs.k8s.io/kustomize/kyaml/kio/kioutil" "sigs.k8s.io/kustomize/kyaml/resid" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -43,34 +41,6 @@ var BuildAnnotations = []string{ BuildAnnotationsGenAddHashSuffix, } -func makeBuiltinPlugin(r resid.Gvk) (resmap.Configurable, error) { - bpt := transformers.GetBuiltinPluginType(r.Kind) - if f, ok := transformers.TransformerFactories[bpt]; ok { - return f(), nil - } - return nil, errors.Errorf("unable to load builtin %s", r) -} - -func NewPluginHelpers() (*resmap.PluginHelpers, error) { - depProvider := provider.NewDepProvider() - - fSys := filesys.MakeFsOnDisk() - path, err := os.Getwd() - if err != nil { - return nil, err - } - resmapFactory := resmap.NewFactory(depProvider.GetResourceFactory()) - - lr := fLdr.RestrictionNone - - ldr, err := fLdr.NewLoader(lr, path, fSys) - if err != nil { - return nil, err - } - - return resmap.NewPluginHelpers(ldr, depProvider.GetFieldValidator(), resmapFactory, types.DisabledPluginConfig()), nil -} - func RemoveBuildAnnotations(r *resource.Resource) { annotations := r.GetAnnotations() if len(annotations) == 0 { @@ -92,46 +62,83 @@ func main() { res := resource.Resource{RNode: *config} - plugin, err := makeBuiltinPlugin(resid.GvkFromNode(config)) + plugin, err := plugins.MakeBuiltinPlugin(resid.GvkFromNode(config)) if err != nil { return errors.WrapPrefixf(err, "creating plugin") } yamlNode := config.YNode() - yaml, err := yaml.Marshal(yamlNode) + yamlBytes, err := yaml.Marshal(yamlNode) if err != nil { return errors.WrapPrefixf(err, "marshalling yaml from res %s", res.OrgId()) } - helpers, err := NewPluginHelpers() + helpers, err := plugins.NewPluginHelpers() if err != nil { return errors.WrapPrefixf(err, "Cannot build Plugin helpers") } - err = plugin.Config(helpers, yaml) + err = plugin.Config(helpers, yamlBytes) if err != nil { return errors.WrapPrefixf( err, "plugin %s fails configuration", res.OrgId()) } transformer, ok := plugin.(resmap.Transformer) - if !ok { - return fmt.Errorf("plugin %s not a transformer", res.OrgId()) - } + if ok { + rm, err := helpers.ResmapFactory().NewResMapFromRNodeSlice(rl.Items) + if err != nil { + return errors.WrapPrefixf(err, "getting resource maps") + } + err = transformer.Transform(rm) + if err != nil { + return errors.WrapPrefixf(err, "Transforming resources") + } + + for _, r := range rm.Resources() { + RemoveBuildAnnotations(r) + } + + rl.Items = rm.ToRNodeSlice() + + // kustomize fn don't remove config.kubernetes.io/local-config resources upon completion. + // As it always add a filename by default, the local resources keep saved. + // To avoid this, an annotation `config.kubernetes.io/prune-local` present in a + // transformer makes all the local resources disappear. + if _, ok := config.GetAnnotations()["config.kubernetes.io/prune-local"]; ok { + filter := &filters.IsLocalConfig{IncludeLocalConfig: false, ExcludeNonLocalConfig: false} + err = rl.Filter(filter) + if err != nil { + return errors.WrapPrefixf(err, "filtering local configs") + } + } + + } else { + generator, ok := plugin.(resmap.Generator) + + if !ok { + return fmt.Errorf("plugin %s is neither a generator nor a transformer", res.OrgId()) + } + + rm, err := generator.Generate() + if err != nil { + return errors.WrapPrefixf(err, "generating resource(s)") + } + + for _, r := range rm.Resources() { + r.RemoveBuildAnnotations() + // We add the annotation config.kubernetes.io/local-config to be able to delete + // The generated resource at the end of the process. Unfortunately, kustomize doesn't + // do that on functions. So we have added a special annotation + // `config.kubernetes.io/prune-local` to add on the last transformer. + // We set the filename of the generated resource in case it is forgotten. + r.Pipe(yaml.SetAnnotation(filters.LocalConfigAnnotation, "true")) + r.Pipe(yaml.SetAnnotation(kioutil.PathAnnotation, ".generated.yaml")) + r.Pipe(yaml.SetAnnotation(kioutil.LegacyPathAnnotation, ".generated.yaml")) + } + + rl.Items = append(rl.Items, rm.ToRNodeSlice()...) - rm, err := helpers.ResmapFactory().NewResMapFromRNodeSlice(rl.Items) - if err != nil { - return errors.WrapPrefixf(err, "getting resource maps") } - err = transformer.Transform(rm) - if err != nil { - return errors.WrapPrefixf(err, "Transforming resources") - } - - for _, r := range rm.Resources() { - RemoveBuildAnnotations(r) - } - - rl.Items = rm.ToRNodeSlice() return nil diff --git a/pkg/transformers/builtinplugintype_string.go b/pkg/plugins/builtinplugintype_string.go similarity index 98% rename from pkg/transformers/builtinplugintype_string.go rename to pkg/plugins/builtinplugintype_string.go index d22f907..36785e3 100644 --- a/pkg/transformers/builtinplugintype_string.go +++ b/pkg/plugins/builtinplugintype_string.go @@ -1,6 +1,6 @@ // Code generated by "stringer -type=BuiltinPluginType"; DO NOT EDIT. -package transformers +package plugins import "strconv" diff --git a/pkg/transformers/tranformers.go b/pkg/plugins/factories.go similarity index 67% rename from pkg/transformers/tranformers.go rename to pkg/plugins/factories.go index c09b4fe..fc0ba94 100644 --- a/pkg/transformers/tranformers.go +++ b/pkg/plugins/factories.go @@ -1,8 +1,16 @@ -package transformers +package plugins import ( + "os" + "sigs.k8s.io/kustomize/api/builtins" + "sigs.k8s.io/kustomize/api/filesys" + fLdr "sigs.k8s.io/kustomize/api/loader" + "sigs.k8s.io/kustomize/api/provider" "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/kustomize/kyaml/resid" ) //go:generate go run golang.org/x/tools/cmd/stringer -type=BuiltinPluginType @@ -41,6 +49,9 @@ func makeStringToBuiltinPluginTypeMap() (result map[string]BuiltinPluginType) { for k := range TransformerFactories { result[k.String()] = k } + for k := range GeneratorFactories { + result[k.String()] = k + } return } @@ -100,3 +111,42 @@ var TransformerFactories = map[BuiltinPluginType]func() resmap.TransformerPlugin // We only want it to be available in the top-level kustomization. // See: https://github.com/kubernetes-sigs/kustomize/issues/3913 } + +var GeneratorFactories = map[BuiltinPluginType]func() resmap.GeneratorPlugin{ + ConfigMapGenerator: builtins.NewConfigMapGeneratorPlugin, + IAMPolicyGenerator: builtins.NewIAMPolicyGeneratorPlugin, + SecretGenerator: builtins.NewSecretGeneratorPlugin, + HelmChartInflationGenerator: builtins.NewHelmChartInflationGeneratorPlugin, +} + +func MakeBuiltinPlugin(r resid.Gvk) (resmap.Configurable, error) { + bpt := GetBuiltinPluginType(r.Kind) + if f, ok := TransformerFactories[bpt]; ok { + return f(), nil + } + if f, ok := GeneratorFactories[bpt]; ok { + return f(), nil + } + return nil, errors.Errorf("unable to load builtin %s", r) +} + +func NewPluginHelpers() (*resmap.PluginHelpers, error) { + depProvider := provider.NewDepProvider() + + fSys := filesys.MakeFsOnDisk() + path, err := os.Getwd() + if err != nil { + return nil, err + } + resmapFactory := resmap.NewFactory(depProvider.GetResourceFactory()) + resmapFactory.RF().IncludeLocalConfigs = true + + lr := fLdr.RestrictionNone + + ldr, err := fLdr.NewLoader(lr, path, fSys) + if err != nil { + return nil, err + } + + return resmap.NewPluginHelpers(ldr, depProvider.GetFieldValidator(), resmapFactory, types.DisabledPluginConfig()), nil +} diff --git a/tests/functions2/01_configmap-generator.yaml b/tests/functions2/01_configmap-generator.yaml new file mode 100644 index 0000000..2e5359f --- /dev/null +++ b/tests/functions2/01_configmap-generator.yaml @@ -0,0 +1,12 @@ +apiVersion: builtin +kind: ConfigMapGenerator +metadata: + name: configuration-map + namespace: argocd + annotations: + config.kubernetes.io/function: | + exec: + path: ../krmfnbuiltin +literals: + - repoURL=https://github.com/antoinemartin/autocloud.git + - targetRevision=deploy/citest diff --git a/tests/functions2/02_replacement-transformer.yaml b/tests/functions2/02_replacement-transformer.yaml new file mode 100644 index 0000000..b7e5768 --- /dev/null +++ b/tests/functions2/02_replacement-transformer.yaml @@ -0,0 +1,29 @@ +apiVersion: builtin +kind: ReplacementTransformer +metadata: + name: replacement-transformer + namespace: argocd + annotations: + config.kubernetes.io/prune-local: "true" + config.kubernetes.io/function: | + exec: + path: ../krmfnbuiltin +replacements: + - source: + kind: ConfigMap + fieldPath: data.repoURL + targets: + - select: + kind: Application + annotationSelector: "autocloud/local=true" + fieldPaths: + - spec.source.repoURL + - source: + kind: ConfigMap + fieldPath: data.targetRevision + targets: + - select: + kind: Application + annotationSelector: "autocloud/local=true" + fieldPaths: + - spec.source.targetRevision diff --git a/tests/test_krmfnbuiltin.sh b/tests/test_krmfnbuiltin.sh index f433a55..969731d 100755 --- a/tests/test_krmfnbuiltin.sh +++ b/tests/test_krmfnbuiltin.sh @@ -11,7 +11,11 @@ set -e pipefail trap "cp compare/argocd.original.yaml applications/argocd.yaml" EXIT -echo "Running kustomize with transformer..." +echo "Running kustomize with patch transformer..." kustomize fn run --enable-exec --fn-path functions applications diff <(yq eval -P compare/argocd.expected.yaml) <(yq eval -P applications/argocd.yaml) +cp compare/argocd.original.yaml applications/argocd.yaml +echo "Running kustomize with replacement transformer..." +kustomize fn run --enable-exec --fn-path functions2 applications +diff <(yq eval -P compare/argocd.expected.yaml) <(yq eval -P applications/argocd.yaml) echo "Done ok 🎉" From 9af57f54f8295d166831a7c9d9e047536cbb6d8c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 22 Jan 2023 17:21:09 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9C=A8=20Add=20config=20map=20generator?= =?UTF-8?q?=20to=20inject=20git=20properties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 22 ++++- go.sum | 99 ++++++++++++++++++-- pkg/extras/GitConfigMapGenerator.go | 68 ++++++++++++++ pkg/plugins/builtinplugintype_string.go | 5 +- pkg/plugins/factories.go | 3 + tests/functions2/01_configmap-generator.yaml | 3 + 6 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 pkg/extras/GitConfigMapGenerator.go diff --git a/go.mod b/go.mod index baa2605..333d365 100644 --- a/go.mod +++ b/go.mod @@ -3,43 +3,57 @@ module github.com/kaweezle/krmfnbuiltin go 1.18 require ( + github.com/go-git/go-git/v5 v5.5.2 golang.org/x/tools v0.5.0 sigs.k8s.io/kustomize/api v0.12.1 sigs.k8s.io/kustomize/kyaml v0.13.10 + sigs.k8s.io/yaml v1.2.0 ) require ( + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect + github.com/cloudflare/circl v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch v4.11.0+incompatible // indirect github.com/go-errors/errors v1.4.2 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.4.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.5 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.7 // indirect - github.com/imdario/mergo v0.3.6 // indirect + github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/mapstructure v1.4.3 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/pjbgf/sha1cd v0.2.3 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/skeema/knownhosts v1.1.0 // indirect github.com/spf13/cobra v1.4.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xlab/treeprint v1.1.0 // indirect + golang.org/x/crypto v0.3.0 // indirect golang.org/x/mod v0.7.0 // indirect golang.org/x/net v0.5.0 // indirect golang.org/x/sys v0.4.0 // indirect golang.org/x/text v0.6.0 // indirect - golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661 // indirect k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index 2fb4256..3c91dce 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,55 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4 h1:ra2OtmuW0AE5csawV4YXMNGNQQXvLRps3z2Z59OPO+I= +github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= 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-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/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 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/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= 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-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.4.0 h1:Vaw7LaSTRJOUric7pe4vnzBSgyuf2KrLsu2Y4ZpQBDE= +github.com/go-git/go-billy/v5 v5.4.0/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlKnXHuzrfjTQ= +github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= +github.com/go-git/go-git/v5 v5.5.2 h1:v8lgZa5k9ylUw+OR/roJHTxR4QItsNFI5nKtAXFuynw= +github.com/go-git/go-git/v5 v5.5.2/go.mod h1:BE5hUJ5yaV2YMxhmaP4l6RBQ08kMxKSPD4BlxtH7OjI= 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-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -54,8 +81,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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= @@ -63,23 +90,32 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= 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/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 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= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -88,8 +124,11 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb 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/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/pjbgf/sha1cd v0.2.3 h1:uKQP/7QOzNtKYH7UTohZLcjF5/55EnTw0jO/Ru4jZwI= +github.com/pjbgf/sha1cd v0.2.3/go.mod h1:HOK9QrgzdHpbc2Kzip0Q1yi3M2MFGPADtR6HjG65m5M= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -97,6 +136,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= +github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= @@ -105,23 +148,35 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An 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.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= 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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/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.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -132,7 +187,12 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn 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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -141,19 +201,41 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= golang.org/x/sys v0.4.0/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/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -164,14 +246,13 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= 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/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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -197,9 +278,14 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw 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/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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -207,6 +293,7 @@ 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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/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= diff --git a/pkg/extras/GitConfigMapGenerator.go b/pkg/extras/GitConfigMapGenerator.go new file mode 100644 index 0000000..5ee2665 --- /dev/null +++ b/pkg/extras/GitConfigMapGenerator.go @@ -0,0 +1,68 @@ +package extras + +import ( + "fmt" + + git "github.com/go-git/go-git/v5" + "sigs.k8s.io/kustomize/api/kv" + "sigs.k8s.io/kustomize/api/resmap" + "sigs.k8s.io/kustomize/api/types" + "sigs.k8s.io/kustomize/kyaml/errors" + "sigs.k8s.io/yaml" +) + +type GitConfigMapGeneratorPlugin struct { + h *resmap.PluginHelpers + types.ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + types.ConfigMapArgs + RemoteName string `json:"remoteName,omitempty" yaml:"remoteName,omitempty"` +} + +func (p *GitConfigMapGeneratorPlugin) Config(h *resmap.PluginHelpers, config []byte) (err error) { + p.ConfigMapArgs = types.ConfigMapArgs{} + err = yaml.Unmarshal(config, p) + if p.ConfigMapArgs.Name == "" { + p.ConfigMapArgs.Name = p.Name + } + if p.ConfigMapArgs.Namespace == "" { + p.ConfigMapArgs.Namespace = p.Namespace + } + p.h = h + return +} + +func (p *GitConfigMapGeneratorPlugin) Generate() (resmap.ResMap, error) { + // Add git repository properties + + repo, err := git.PlainOpenWithOptions(p.h.Loader().Root(), &git.PlainOpenOptions{DetectDotGit: true}) + if err != nil { + return resmap.New(), errors.WrapPrefixf(err, "opening git repo") + } + // TODO: Should come from config + remoteName := p.RemoteName + if remoteName == "" { + remoteName = "origin" + } + origin, err := repo.Remote(remoteName) + if err != nil { + return resmap.New(), errors.WrapPrefixf(err, "getting remote %s", remoteName) + } + + p.ConfigMapArgs.KvPairSources.LiteralSources = append(p.ConfigMapArgs.KvPairSources.LiteralSources, + fmt.Sprintf("repoURL=%s", origin.Config().URLs[0])) + + head, err := repo.Head() + if err != nil { + return resmap.New(), errors.WrapPrefixf(err, "getting current branch") + } + + p.ConfigMapArgs.KvPairSources.LiteralSources = append(p.ConfigMapArgs.KvPairSources.LiteralSources, + fmt.Sprintf("targetRevision=%s", head.Name().Short())) + + return p.h.ResmapFactory().FromConfigMapArgs( + kv.NewLoader(p.h.Loader(), p.h.Validator()), p.ConfigMapArgs) +} + +func NewGitConfigMapGeneratorPlugin() resmap.GeneratorPlugin { + return &GitConfigMapGeneratorPlugin{} +} diff --git a/pkg/plugins/builtinplugintype_string.go b/pkg/plugins/builtinplugintype_string.go index 36785e3..0b304a4 100644 --- a/pkg/plugins/builtinplugintype_string.go +++ b/pkg/plugins/builtinplugintype_string.go @@ -27,11 +27,12 @@ func _() { _ = x[ValueAddTransformer-16] _ = x[HelmChartInflationGenerator-17] _ = x[ReplacementTransformer-18] + _ = x[GitConfigMapGenerator-19] } -const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorIAMPolicyGeneratorHashTransformerImageTagTransformerLabelTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerPrefixTransformerSuffixTransformerReplicaCountTransformerSecretGeneratorValueAddTransformerHelmChartInflationGeneratorReplacementTransformer" +const _BuiltinPluginType_name = "UnknownAnnotationsTransformerConfigMapGeneratorIAMPolicyGeneratorHashTransformerImageTagTransformerLabelTransformerNamespaceTransformerPatchJson6902TransformerPatchStrategicMergeTransformerPatchTransformerPrefixSuffixTransformerPrefixTransformerSuffixTransformerReplicaCountTransformerSecretGeneratorValueAddTransformerHelmChartInflationGeneratorReplacementTransformerGitConfigMapGenerator" -var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 65, 80, 99, 115, 135, 159, 189, 205, 228, 245, 262, 285, 300, 319, 346, 368} +var _BuiltinPluginType_index = [...]uint16{0, 7, 29, 47, 65, 80, 99, 115, 135, 159, 189, 205, 228, 245, 262, 285, 300, 319, 346, 368, 389} func (i BuiltinPluginType) String() string { if i < 0 || i >= BuiltinPluginType(len(_BuiltinPluginType_index)-1) { diff --git a/pkg/plugins/factories.go b/pkg/plugins/factories.go index fc0ba94..58041c2 100644 --- a/pkg/plugins/factories.go +++ b/pkg/plugins/factories.go @@ -3,6 +3,7 @@ package plugins import ( "os" + "github.com/kaweezle/krmfnbuiltin/pkg/extras" "sigs.k8s.io/kustomize/api/builtins" "sigs.k8s.io/kustomize/api/filesys" fLdr "sigs.k8s.io/kustomize/api/loader" @@ -36,6 +37,7 @@ const ( ValueAddTransformer HelmChartInflationGenerator ReplacementTransformer + GitConfigMapGenerator ) var stringToBuiltinPluginTypeMap map[string]BuiltinPluginType @@ -117,6 +119,7 @@ var GeneratorFactories = map[BuiltinPluginType]func() resmap.GeneratorPlugin{ IAMPolicyGenerator: builtins.NewIAMPolicyGeneratorPlugin, SecretGenerator: builtins.NewSecretGeneratorPlugin, HelmChartInflationGenerator: builtins.NewHelmChartInflationGeneratorPlugin, + GitConfigMapGenerator: extras.NewGitConfigMapGeneratorPlugin, } func MakeBuiltinPlugin(r resid.Gvk) (resmap.Configurable, error) { diff --git a/tests/functions2/01_configmap-generator.yaml b/tests/functions2/01_configmap-generator.yaml index 2e5359f..926742b 100644 --- a/tests/functions2/01_configmap-generator.yaml +++ b/tests/functions2/01_configmap-generator.yaml @@ -1,4 +1,6 @@ apiVersion: builtin +# Use this to inject current git values +# kind: GitConfigMapGenerator kind: ConfigMapGenerator metadata: name: configuration-map @@ -7,6 +9,7 @@ metadata: config.kubernetes.io/function: | exec: path: ../krmfnbuiltin +# When using GitConfigMapGenerator, these are automatically injected literals: - repoURL=https://github.com/antoinemartin/autocloud.git - targetRevision=deploy/citest From 6de1d1e25ba37ef39e7d003dcac4cc1f904bd14a Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 22 Jan 2023 19:21:30 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=93=9D=20Add=20documentation=20for=20?= =?UTF-8?q?generators?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 212 +++++++++++++++++- tests/applications/argocd.yaml | 6 + tests/compare/argocd.expected.yaml | 6 + tests/compare/argocd.original.yaml | 6 + tests/functions/patch-transformer.yaml | 6 + .../02_replacement-transformer.yaml | 2 + 6 files changed, 237 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 308283e..b570752 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,22 @@ krmfnbuiltin is a [kustomize plugin](https://kubectl.docs.kubernetes.io/guides/extending_kustomize/) that you can use to perform in place transformation in your kustomize projects. + + + +
+ Table of Contents +
    +
  1. Rationale
  2. +
  3. Usage Example
  4. +
  5. Use of generators
  6. +
  7. Installation
  8. +
  9. Argo CD integration
  10. +
  11. Related projects
  12. +
+
+ + ## Rationale `kustomize fn run` allows performing _in place_ transformation of KRM @@ -16,7 +32,7 @@ a `container` or `exec` annotation in the transformer resource pointing to a krm function docker image or executable. `krmfnbuiltin` provides both the image and executable allowing the use of any -builtin transformer. +builtin transformer or generator. ## Usage Example @@ -142,6 +158,200 @@ source: You now can commit the 10 modified manifests in your branch and deploy the applications. +## Use of generators + +Let's imagine that one or more of your applications use an Helm chart that in +turn creates applications. You pass the repo URL and target branch as values to +the Helm Chart with the following: + +```yaml +helm: + parameters: + - name: common.targetRevision + value: main + - name: common.repoURL + value: https://github.com/kaweezle/autocloud.git +``` + +For that particular transformation, JSON patches are not practical: + +```yaml +patch: |- + - op: replace + path: /spec/source/repoURL + value: https://github.com/antoinemartin/autocloud.git + - op: replace + path: /spec/source/targetRevision + value: deploy/citest + - op: replace + path: /spec/source/helm/parameters/1/value + value: https://github.com/antoinemartin/autocloud.git + - op: replace + path: /spec/source/helm/parameters/0/value + value: deploy/citest +``` + +You need to hardcode the index of the value to replace in the array, which is +error prone, and you start duplicating values. + +It would be better to have a unique _source_ with the right values, and do +`replacements` where needed. You can inject the values with a +`ConfigMapGenerator` + +```yaml +# 01_configmap-generator.yaml +apiVersion: builtin +# Use this to inject current git values +# kind: GitConfigMapGenerator +kind: ConfigMapGenerator +metadata: + name: configuration-map + annotations: + config.kubernetes.io/function: | + exec: + path: krmfnbuiltin +# When using GitConfigMapGenerator, these are automatically injected +literals: + - repoURL=https://github.com/kaweezle/autocloud.git + - targetRevision=deploy/citest +``` + +And then use a `ReplacementTransformer` to inject the values: + +```yaml +# 02_replacement-transformer.yaml +apiVersion: builtin +kind: ReplacementTransformer +metadata: + name: replacement-transformer + namespace: argocd + annotations: + # Put this annotation in the last transformation to remove generated resources + config.kubernetes.io/prune-local: "true" + config.kubernetes.io/function: | + exec: + path: krmfnbuiltin +replacements: + - source: + kind: ConfigMap + fieldPath: data.repoURL + targets: + - select: + kind: Application + annotationSelector: "autocloud/local=true" + fieldPaths: + - spec.source.repoURL + # This field specification is not related to the index + - spec.source.helm.parameters.[name=common.repoURL].value + - source: + kind: ConfigMap + fieldPath: data.targetRevision + targets: + - select: + kind: Application + annotationSelector: "autocloud/local=true" + fieldPaths: + - spec.source.targetRevision + - spec.source.helm.parameters.[name=common.targetRevision].value +``` + +Some remarks: + +- ✔️ The actual values (repo url and revision) are only specified once. +- ✔️ `spec.source.helm.parameters.[name=common.repoURL].value` is path more + specific than `/spec/source/helm/parameters/1/value`. +- ✔️ The functions file names are prefixed with a number prefix (`01_`, `02_`) + in order to ensure that the functions are executed in the right order. +- ✔️ In the last transformation, we add the following annotation: + + ```yaml + config.kubernetes.io/prune-local: "true" + ``` + + In order to avoid saving the generated resources. This is due to an issue in + kustomize that doesn't filter out resources annotated with + `config.kubernetes.io/local-config` in the case you are using + `kustomize fn run` (although it works with `kustomize build`). + +As a convenience, for this specific use case, we have added a +`GitConfigMapGenerator` that automatically adds the relevant resources, while +some people may consider this overkill. + +## Installation + +With each [Release](https://github.com/kaweezle/krmfnbuiltin/releases), we +provide binaries for most platforms as well as Alpine based packages. Typically, +you would install it on linux with the following command: + +```console +> KRMFNBUILTIN_VERSION="v0.1.0" +> curl -sLo /usr/local/bin/krmfnbuiltin https://github.com/kaweezle/krmfnbuiltin/releases/download/${KRMFNBUILTIN_VERSION}/krmfnbuiltin_${KRMFNBUILTIN_VERSION}_linux_amd64 +``` + +## Argo CD integration + +`krmfnbuiltin` is **NOT** primarily meant to be used inside Argo CD, but instead +to perform _structural_ modifications to the source **BEFORE** the commit. + +Anyway, to use `krmfnbuiltin` with Argo CD, you need to: + +- Make the `krmfnbuiltin` binary available to the `argo-repo-server` pod. +- Have Argo CD run kustomize with the `--enable-alpha-plugins --enable-exec` + parameters. + +To add krmfnbuiltin on argo-repo-server, the +[Argo CD documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/custom_tools/) +provides different methods to make custom tools available. + +If you get serious about Argo CD, you will probably end up cooking your own +image. This +[docker file](https://github.com/antoinemartin/autocloud/blob/deploy/citest/repo-server/Dockerfile#L45) +shows how to use the above installation instructions in your image. To +summarize: + +```Dockerfile +FROM argoproj/argocd:latest + +ARG KRMFNBUILTIN_VERSION=v0.1.0 + +# Switch to root for the ability to perform install +USER root + +# Install tools +RUN apt-get update && \ + apt-get install -y curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + curl -sLo /usr/local/bin/krmfnbuiltin https://github.com/kaweezle/krmfnbuiltin/releases/download/${KRMFNBUILTIN_VERSION}/krmfnbuiltin_${KRMFNBUILTIN_VERSION}_linux_amd64 + +USER argocd +``` + +You also need to patch the `argo-cm` config map to add the parameters. The +following is a strategic merge patch for it: + +```yaml +# argocd-cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: argocd-cm +data: + # Options to enable exec plugins (krmfnsops). + kustomize.buildOptions: "--enable-alpha-plugins --enable-exec" + ... +``` + +## Related projects + +[kpt], from Google, takes this in place transformation principle to another +level by making resource configuration packages similar to docker images. In +this model, a generator or a transformer along its parameters in much like a +line in a dockerfile. It takes a current configuration as source and generates a +new configuration after transformation. + +While it has not been tested, krmfnbuiltin should work with [kpt]. + [kpt]: https://kpt.dev/guides/rationale diff --git a/tests/applications/argocd.yaml b/tests/applications/argocd.yaml index bc8cf97..e88b9e7 100644 --- a/tests/applications/argocd.yaml +++ b/tests/applications/argocd.yaml @@ -19,6 +19,12 @@ spec: path: packages/argocd repoURL: https://github.com/anotherproject/anothergit targetRevision: main + helm: + parameters: + - name: common.targetRevision + value: main + - name: common.repoURL + value: https://github.com/anotherproject/anothergit syncPolicy: automated: allowEmpty: true diff --git a/tests/compare/argocd.expected.yaml b/tests/compare/argocd.expected.yaml index f371d87..0d94d20 100644 --- a/tests/compare/argocd.expected.yaml +++ b/tests/compare/argocd.expected.yaml @@ -19,6 +19,12 @@ spec: path: packages/argocd repoURL: https://github.com/antoinemartin/autocloud.git targetRevision: deploy/citest + helm: + parameters: + - name: common.targetRevision + value: deploy/citest + - name: common.repoURL + value: https://github.com/antoinemartin/autocloud.git syncPolicy: automated: allowEmpty: true diff --git a/tests/compare/argocd.original.yaml b/tests/compare/argocd.original.yaml index bc8cf97..e88b9e7 100644 --- a/tests/compare/argocd.original.yaml +++ b/tests/compare/argocd.original.yaml @@ -19,6 +19,12 @@ spec: path: packages/argocd repoURL: https://github.com/anotherproject/anothergit targetRevision: main + helm: + parameters: + - name: common.targetRevision + value: main + - name: common.repoURL + value: https://github.com/anotherproject/anothergit syncPolicy: automated: allowEmpty: true diff --git a/tests/functions/patch-transformer.yaml b/tests/functions/patch-transformer.yaml index 9b14c18..9ad6376 100644 --- a/tests/functions/patch-transformer.yaml +++ b/tests/functions/patch-transformer.yaml @@ -13,6 +13,12 @@ patch: |- - op: replace path: /spec/source/targetRevision value: deploy/citest + - op: replace + path: /spec/source/helm/parameters/1/value + value: https://github.com/antoinemartin/autocloud.git + - op: replace + path: /spec/source/helm/parameters/0/value + value: deploy/citest target: group: argoproj.io version: v1alpha1 diff --git a/tests/functions2/02_replacement-transformer.yaml b/tests/functions2/02_replacement-transformer.yaml index b7e5768..4d69b70 100644 --- a/tests/functions2/02_replacement-transformer.yaml +++ b/tests/functions2/02_replacement-transformer.yaml @@ -18,6 +18,7 @@ replacements: annotationSelector: "autocloud/local=true" fieldPaths: - spec.source.repoURL + - spec.source.helm.parameters.[name=common.repoURL].value - source: kind: ConfigMap fieldPath: data.targetRevision @@ -27,3 +28,4 @@ replacements: annotationSelector: "autocloud/local=true" fieldPaths: - spec.source.targetRevision + - spec.source.helm.parameters.[name=common.targetRevision].value From ab61acd334058ac6b828800383ad9d6e1d79bf1c Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Sun, 22 Jan 2023 19:22:38 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=94=96=20Prepare=200.1.0=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 77bed10..922370d 100644 --- a/main.go +++ b/main.go @@ -146,7 +146,7 @@ func main() { cmd := command.Build(processor, command.StandaloneDisabled, false) command.AddGenerateDockerfile(cmd) - cmd.Version = "v0.0.2" // <---VERSION---> + cmd.Version = "v0.1.0" // <---VERSION---> if err := cmd.Execute(); err != nil { os.Exit(1)