Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pluto for openSUSE:Factory checked in at 2023-02-07 18:49:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pluto (Old) and /work/SRC/openSUSE:Factory/.pluto.new.4462 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pluto" Tue Feb 7 18:49:01 2023 rev:22 rq:1063481 version:5.13.0 Changes: -------- --- /work/SRC/openSUSE:Factory/pluto/pluto.changes 2023-01-06 17:06:10.512390117 +0100 +++ /work/SRC/openSUSE:Factory/.pluto.new.4462/pluto.changes 2023-02-07 18:49:07.755145916 +0100 @@ -1,0 +2,12 @@ +Mon Feb 06 17:27:04 UTC 2023 - ka...@b1-systems.de + +- Update to version 5.13.0: + * fix: add removed-in to storage.k8s.io/v1beta1.CSIStorageCapacity (#448) + * feat: add namespace and context to API Resources method (#410) + * Fixed a linter error causing lack of compilation in Go 1.19 by removing deprecated io/ioutil functions and replacing them with their Go 1.16 counterparts. (#439) + * Update alpine and other build dependencies (#433) + * Remove experimental features in build (#429) + * feat: allow hiding headers in output (#417) + * Bump helm.sh/helm/v3 from 3.10.1 to 3.10.3 (#426) + +------------------------------------------------------------------- Old: ---- pluto-5.12.0.tar.gz New: ---- pluto-5.13.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pluto.spec ++++++ --- /var/tmp/diff_new_pack.30yQ0y/_old 2023-02-07 18:49:08.423149507 +0100 +++ /var/tmp/diff_new_pack.30yQ0y/_new 2023-02-07 18:49:08.427149528 +0100 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: pluto -Version: 5.12.0 +Version: 5.13.0 Release: 0 Summary: A cli tool to help discover deprecated apiVersions in Kubernetes License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.30yQ0y/_old 2023-02-07 18:49:08.471149764 +0100 +++ /var/tmp/diff_new_pack.30yQ0y/_new 2023-02-07 18:49:08.475149786 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/FairwindsOps/pluto</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v5.12.0</param> + <param name="revision">v5.13.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> @@ -16,7 +16,7 @@ <param name="compression">gz</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">pluto-5.12.0.tar.gz</param> + <param name="archive">pluto-5.13.0.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.30yQ0y/_old 2023-02-07 18:49:08.499149915 +0100 +++ /var/tmp/diff_new_pack.30yQ0y/_new 2023-02-07 18:49:08.499149915 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/FairwindsOps/pluto</param> - <param name="changesrevision">dc11ba13c840de0034510bff4712f651bf5ff45c</param></service></servicedata> + <param name="changesrevision">87c17f983a8d9dc22e53db6f1b21e3d575081aa2</param></service></servicedata> (No newline at EOF) ++++++ pluto-5.12.0.tar.gz -> pluto-5.13.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/.circleci/config.yml new/pluto-5.13.0/.circleci/config.yml --- old/pluto-5.12.0/.circleci/config.yml 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/.circleci/config.yml 2023-02-04 14:57:00.000000000 +0100 @@ -8,7 +8,7 @@ executors: golang-exec: docker: - - image: cimg/go:1.18 + - image: cimg/go:1.19 references: e2e_config: &e2e_config @@ -25,25 +25,15 @@ only: /.*/ tags: ignore: /.*/ - enable_experimental_features: &enable_experimental_docker_features - run: - name: enable experimental features - command: | - set -ex - apk --update add openssh - ssh remote-docker \<<EOF - sudo bash -c 'echo "{\"experimental\": true}" > /etc/docker/daemon.json' - sudo systemctl restart docker - EOF install_vault_alpine: &install_vault_alpine run: name: install hashicorp vault command: | apk --update add curl yq cd /tmp - curl -LO https://releases.hashicorp.com/vault/1.9.7/vault_1.9.7_linux_amd64.zip - sha256sum vault_1.9.7_linux_amd64.zip | grep d312f6852cdec8d29e50b72af5d36c6890e1e8bfcbedfdb71785dfc11e907c3d - unzip vault_1.9.7_linux_amd64.zip + curl -LO https://releases.hashicorp.com/vault/1.12.2/vault_1.12.2_linux_amd64.zip + sha256sum vault_1.12.2_linux_amd64.zip | grep 116c143de377a77a7ea455a367d5e9fe5290458e8a941a6e2dd85d92aaedba67 + unzip vault_1.12.2_linux_amd64.zip mv vault /usr/bin/vault install_circleci: &install_circleci run: @@ -58,7 +48,7 @@ test: working_directory: /home/circleci/go/src/github.com/fairwindsops/pluto docker: - - image: cimg/go:1.18 + - image: cimg/go:1.19 steps: - checkout - run: go mod download && go mod verify @@ -68,14 +58,12 @@ resource_class: large shell: /bin/bash docker: - - image: goreleaser/goreleaser:v1.10.3 + - image: goreleaser/goreleaser:v1.14.1 environment: GO111MODULE: "on" steps: - checkout - - setup_remote_docker: - version: 20.10.6 - - *enable_experimental_docker_features + - setup_remote_docker - *install_vault_alpine - rok8s/get_vault_env: vault_path: repo/global/env @@ -91,12 +79,10 @@ working_directory: /home/circleci/go/src/github.com/fairwindsops/pluto resource_class: large docker: - - image: goreleaser/goreleaser:v1.10.3 + - image: goreleaser/goreleaser:v1.14.1 steps: - checkout - - setup_remote_docker: - version: 20.10.6 - - *enable_experimental_docker_features + - setup_remote_docker - run: goreleaser --snapshot --skip-sign - store_artifacts: path: dist diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/Dockerfile new/pluto-5.13.0/Dockerfile --- old/pluto-5.12.0/Dockerfile 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/Dockerfile 2023-02-04 14:57:00.000000000 +0100 @@ -1,4 +1,4 @@ -FROM alpine:3.16.3 +FROM alpine:3.17 USER nobody COPY pluto / diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/cmd/root.go new/pluto-5.13.0/cmd/root.go --- old/pluto-5.12.0/cmd/root.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/cmd/root.go 2023-02-04 14:57:00.000000000 +0100 @@ -31,7 +31,7 @@ import ( "flag" "fmt" - "io/ioutil" + "io" "os" "strings" @@ -63,6 +63,7 @@ componentsFromUser []string onlyShowRemoved bool kubeContext string + noHeaders bool exitCode int ) @@ -84,6 +85,7 @@ rootCmd.PersistentFlags().BoolVar(&ignoreDeprecations, "ignore-deprecations", false, "Ignore the default behavior to exit 2 if deprecated apiVersions are found.") rootCmd.PersistentFlags().BoolVar(&ignoreRemovals, "ignore-removals", false, "Ignore the default behavior to exit 3 if removed apiVersions are found.") rootCmd.PersistentFlags().BoolVarP(&onlyShowRemoved, "only-show-removed", "r", false, "Only display the apiVersions that have been removed in the target version.") + rootCmd.PersistentFlags().BoolVarP(&noHeaders, "no-headers", "H", false, "When using the default or custom-column output format, don't print headers (default print headers).") rootCmd.PersistentFlags().StringVarP(&additionalVersionsFile, "additional-versions", "f", "", "Additional deprecated versions file to add to the list. Cannot contain any existing versions") rootCmd.PersistentFlags().StringToStringVarP(&targetVersions, "target-versions", "t", targetVersions, "A map of targetVersions to use. This flag supersedes all defaults in version files.") rootCmd.PersistentFlags().StringVarP(&outputFormat, "output", "o", "normal", "The output format to use. (normal|wide|custom|json|yaml|markdown|csv)") @@ -97,11 +99,13 @@ detectHelmCmd.PersistentFlags().StringVarP(&namespace, "namespace", "n", "", "Only detect releases in a specific namespace.") detectHelmCmd.PersistentFlags().StringVar(&kubeContext, "kube-context", "", "The kube context to use. If blank, defaults to current context.") + rootCmd.AddCommand(detectApiResourceCmd) + detectApiResourceCmd.PersistentFlags().StringVarP(&namespace, "namespace", "n", "", "Only detect resources in a specific namespace.") + detectApiResourceCmd.PersistentFlags().StringVar(&kubeContext, "kube-context", "", "The kube context to use. If blank, defaults to current context.") + rootCmd.AddCommand(listVersionsCmd) rootCmd.AddCommand(detectCmd) - rootCmd.AddCommand(detectApiResourceCmd) - klog.InitFlags(nil) pflag.CommandLine.AddGoFlag(flag.CommandLine.Lookup("v")) } @@ -193,7 +197,7 @@ var deprecatedVersionList []api.Version if additionalVersionsFile != "" { klog.V(2).Infof("looking for versions file: %s", additionalVersionsFile) - data, err := ioutil.ReadFile(additionalVersionsFile) + data, err := os.ReadFile(additionalVersionsFile) if err != nil { return err } @@ -270,6 +274,7 @@ IgnoreDeprecations: ignoreDeprecations, IgnoreRemovals: ignoreRemovals, OnlyShowRemoved: onlyShowRemoved, + NoHeaders: noHeaders, DeprecatedVersions: deprecatedVersionList, Components: componentList, } @@ -283,14 +288,12 @@ Short: "detect-files", Long: `Detect Kubernetes apiVersions in a directory.`, Run: func(cmd *cobra.Command, args []string) { - dir := finder.NewFinder(directory, apiInstance) err := dir.FindVersions() if err != nil { fmt.Println("Error running finder:", err) os.Exit(1) } - err = apiInstance.DisplayOutput() if err != nil { fmt.Println("Error Parsing Output:", err) @@ -316,7 +319,32 @@ fmt.Println("Error running helm-detect:", err) os.Exit(1) } + err = apiInstance.DisplayOutput() + if err != nil { + fmt.Println("Error Parsing Output:", err) + os.Exit(1) + } + retCode := apiInstance.GetReturnCode() + klog.V(5).Infof("retCode: %d", retCode) + os.Exit(retCode) + }, +} +var detectApiResourceCmd = &cobra.Command{ + Use: "detect-api-resources", + Short: "detect-api-resources", + Long: `Detect Kubernetes apiVersions from an active cluster (using last-applied-configuration annotation)`, + Run: func(cmd *cobra.Command, args []string) { + disCl, err := discoveryapi.NewDiscoveryClient(namespace, kubeContext, apiInstance) + if err != nil { + fmt.Println("Error creating Discovery REST Client: ", err) + os.Exit(1) + } + err = disCl.GetApiResources() + if err != nil { + fmt.Println("Error getting API resources using discovery client:", err) + os.Exit(1) + } err = apiInstance.DisplayOutput() if err != nil { fmt.Println("Error Parsing Output:", err) @@ -346,7 +374,7 @@ if args[0] == "-" { //stdin - fileData, err := ioutil.ReadAll(os.Stdin) + fileData, err := io.ReadAll(os.Stdin) if err != nil { fmt.Println("Error reading stdin:", err) os.Exit(1) @@ -400,33 +428,6 @@ }, } -var detectApiResourceCmd = &cobra.Command{ - Use: "detect-api-resources", - Short: "detect-api-resources", - Long: `Detect Kubernetes apiVersions from an active cluster.`, - Run: func(cmd *cobra.Command, args []string) { - - disCl, err := discoveryapi.NewDiscoveryClient(apiInstance) - if err != nil { - fmt.Println("Error creating Discovery REST Client: ", err) - os.Exit(1) - } - err = disCl.GetApiResources() - if err != nil { - fmt.Println("Error getting API resources using discovery client:", err) - os.Exit(1) - } - - err = apiInstance.DisplayOutput() - if err != nil { - fmt.Println("Error Parsing Output:", err) - os.Exit(1) - } - exitCode = apiInstance.GetReturnCode() - klog.V(5).Infof("retCode: %d", exitCode) - }, -} - // Execute the stuff func Execute(VERSION string, COMMIT string, versionsFile []byte) { version = VERSION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/docs/advanced.md new/pluto-5.13.0/docs/advanced.md --- old/pluto-5.12.0/docs/advanced.md 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/docs/advanced.md 2023-02-04 14:57:00.000000000 +0100 @@ -9,22 +9,23 @@ ## Display Options -In addition to the standard output, Pluto can output yaml, json, wide, custom columns or markdown. +In addition to the standard output, Pluto can output in the following modes: Wide, YAML, JSON, CSV or Markdown. + +`--no-headers` option hides headers in the outputs for Text, CSV and Markdown output. ### Wide The wide output provides more information about when an apiVersion was removed or deprecated. -``` +```shell $ pluto detect-helm -owide -ââî° pluto detect-helm -owide NAME NAMESPACE KIND VERSION REPLACEMENT DEPRECATED DEPRECATED IN REMOVED REMOVED IN cert-manager/cert-manager-webhook cert-manager MutatingWebhookConfiguration admissionregistration.k8s.io/v1beta1 admissionregistration.k8s.io/v1 true v1.16.0 false v1.19.0 ``` ### JSON -``` +```shell $ pluto detect-helm -ojson | jq . { "items": [ @@ -74,17 +75,17 @@ ``` ### Custom columns -``` + +```shell $ pluto detect-helm -ocustom --columns NAMESPACE,NAME -ââî° pluto detect-helm -ocustom --columns NAMESPACE,NAME NAME NAMESPACE cert-manager/cert-manager-webhook cert-manager ``` ### Markdown -``` -pluto detect-files -o markdown +```shell +$ pluto detect-files -o markdown | NAME | NAMESPACE | KIND | VERSION | REPLACEMENT | DEPRECATED | DEPRECATED IN | REMOVED | REMOVED IN | |-----------|----------------|------------|--------------------|-------------|------------|---------------|---------|------------| | utilities | <UNKNOWN> | Deployment | extensions/v1beta1 | apps/v1 | true | v1.9.0 | true | v1.16.0 | @@ -92,8 +93,8 @@ | utilities | yaml-namespace | Deployment | extensions/v1beta1 | apps/v1 | true | v1.9.0 | true | v1.16.0 | ``` -``` -pluto detect-files -o markdown --columns NAMESPACE,NAME,DEPRECATED IN,DEPRECATED,REPLACEMENT,VERSION,KIND,COMPONENT,FILEPATH +```shell +$ pluto detect-files -o markdown --columns NAMESPACE,NAME,DEPRECATED IN,DEPRECATED,REPLACEMENT,VERSION,KIND,COMPONENT,FILEPATH | NAME | NAMESPACE | KIND | VERSION | REPLACEMENT | DEPRECATED | DEPRECATED IN | COMPONENT | FILEPATH | |---------------|-----------------|------------|--------------------|-------------|------------|---------------|-----------|--------------| | some name one | pluto-namespace | Deployment | extensions/v1beta1 | apps/v1 | true | v1.9.0 | foo | path-to-file | @@ -102,17 +103,20 @@ ### CSV -``` -pluto detect-helm -o csv +```shell +$ pluto detect-helm -o csv NAME,NAMESPACE,KIND,VERSION,REPLACEMENT,DEPRECATED,DEPRECATED IN,REMOVED,REMOVED IN -some name one,pluto-namespace,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 -some name two,<UNKNOWN>,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 +deploy1,pluto-namespace,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 +deploy1,other-namespace,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 +``` -pluto detect-helm -o csv --columns "NAMESPACE,NAME,DEPRECATED IN,DEPRECATED,REPLACEMENT,VERSION,KIND,COMPONENT,FILEPATH" -NAME,NAMESPACE,KIND,VERSION,REPLACEMENT,DEPRECATED,DEPRECATED IN,COMPONENT,FILEPATH -some name one,pluto-namespace,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,foo,path-to-file -some name two,<UNKNOWN>,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,foo,<UNKNOWN> +```shell +$ pluto detect-helm -o csv --columns "KIND,NAMESPACE,NAME,VERSION,REPLACEMENT" +KIND,NAMESPACE,NAME,VERSION,REPLACEMENT +Deployment,pluto-namespace,deploy1,extensions/v1beta1,apps/v1 +Deployment,other-namespace,deploy1,extensions/v1beta1,apps/v1 ``` + ## CI Pipelines Pluto has specific exit codes that is uses to indicate certain results: @@ -123,7 +127,7 @@ If you wish to bypass the generation of exit codes 2 and 3, you may do so with two different flags: -``` +```shell --ignore-deprecations Ignore the default behavior to exit 2 if deprecated apiVersions are found. --ignore-removals Ignore the default behavior to exit 3 if removed apiVersions are found. ``` @@ -138,7 +142,7 @@ For example: -``` +```shell $ pluto detect-helm --target-versions k8s=v1.15.0 No output to display @@ -162,7 +166,7 @@ The file should look something like this: -``` +```yaml target-versions: custom: v1.0.0 deprecated-versions: @@ -176,11 +180,12 @@ You can test that it's working by using `list-versions`: -``` +```shell $ pluto list-versions -f new.yaml KIND NAME DEPRECATED IN REMOVED IN REPLACEMENT COMPONENT AnotherCRD someother/v1beta1 v1.9.0 v1.16.0 apps/v1 custom ``` + _NOTE: This output is truncated to show only the additional version. Normally this will include the defaults as well_ The `target-versions` field in this custom file will set the default target version for that component. You can still override this with `--target-versions custom=vX.X.X` when you run Pluto. @@ -213,3 +218,4 @@ | --output | PLUTO_OUTPUT | | --columns | PLUTO_COLUMNS | | --components | PLUTO_COMPONENTS | +| --no-headers | PLUTO_NO_HEADERS | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/go.mod new/pluto-5.13.0/go.mod --- old/pluto-5.12.0/go.mod 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/go.mod 2023-02-04 14:57:00.000000000 +0100 @@ -1,6 +1,6 @@ module github.com/fairwindsops/pluto/v5 -go 1.18 +go 1.19 require ( github.com/mattn/go-runewidth v0.0.14 // indirect @@ -15,7 +15,7 @@ golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.10.1 + helm.sh/helm/v3 v3.10.3 k8s.io/api v0.25.4 k8s.io/apimachinery v0.25.4 k8s.io/client-go v0.25.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/go.sum new/pluto-5.13.0/go.sum --- old/pluto-5.12.0/go.sum 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/go.sum 2023-02-04 14:57:00.000000000 +0100 @@ -831,8 +831,8 @@ 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= -helm.sh/helm/v3 v3.10.1 h1:uTnNlYx8QcTSNA4ZJ50Llwife4CSohUY4ehumyVf2QE= -helm.sh/helm/v3 v3.10.1/go.mod h1:CXOcs02AYvrlPMWARNYNRgf2rNP7gLJQsi/Ubd4EDrI= +helm.sh/helm/v3 v3.10.3 h1:wL7IUZ7Zyukm5Kz0OUmIFZgKHuAgByCrUcJBtY0kDyw= +helm.sh/helm/v3 v3.10.3/go.mod h1:CXOcs02AYvrlPMWARNYNRgf2rNP7gLJQsi/Ubd4EDrI= 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= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/api/output.go new/pluto-5.13.0/pkg/api/output.go --- old/pluto-5.12.0/pkg/api/output.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/api/output.go 2023-02-04 14:57:00.000000000 +0100 @@ -55,6 +55,7 @@ IgnoreDeprecations bool `json:"-" yaml:"-"` IgnoreRemovals bool `json:"-" yaml:"-"` OnlyShowRemoved bool `json:"-" yaml:"-"` + NoHeaders bool `json:"-" yaml:"-"` OutputFormat string `json:"-" yaml:"-"` TargetVersions map[string]string `json:"target-versions,omitempty" yaml:"target-versions,omitempty"` DeprecatedVersions []Version `json:"-" yaml:"-"` @@ -188,15 +189,17 @@ } sort.Ints(columnIndexes) - var headers string - for _, k := range columnIndexes { - if k == 0 { - headers = fmt.Sprintf("%s\t", columns[k].header()) - } else { - headers = fmt.Sprintf("%s %s\t", headers, columns[k].header()) + if !instance.NoHeaders { + var headers string + for _, k := range columnIndexes { + if k == 0 { + headers = fmt.Sprintf("%s\t", columns[k].header()) + } else { + headers = fmt.Sprintf("%s %s\t", headers, columns[k].header()) + } } + _, _ = fmt.Fprintln(w, headers) } - _, _ = fmt.Fprintln(w, headers) var rows string for _, o := range instance.Outputs { @@ -230,12 +233,14 @@ } sort.Ints(columnIndexes) - var headers []string - for _, k := range columnIndexes { - headers = append(headers, columns[k].header()) - } + if !instance.NoHeaders { + var headers []string + for _, k := range columnIndexes { + headers = append(headers, columns[k].header()) + } - table.SetHeader(headers) + table.SetHeader(headers) + } for _, o := range instance.Outputs { var row []string @@ -263,12 +268,14 @@ var csvData [][]string - var headers []string - for _, k := range columnIndexes { - headers = append(headers, columns[k].header()) - } + if !instance.NoHeaders { + var headers []string + for _, k := range columnIndexes { + headers = append(headers, columns[k].header()) + } - csvData = append(csvData, headers) + csvData = append(csvData, headers) + } for _, o := range instance.Outputs { var row []string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/api/output_test.go new/pluto-5.13.0/pkg/api/output_test.go --- old/pluto-5.12.0/pkg/api/output_test.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/api/output_test.go 2023-02-04 14:57:00.000000000 +0100 @@ -316,6 +316,26 @@ // <UNKNOWN>,some name two,v1.9.0,true,apps/v1,extensions/v1beta1,Deployment,foo,<UNKNOWN> } +func ExampleInstance_DisplayOutput_csv_noHeaders() { + instance := &Instance{ + TargetVersions: map[string]string{ + "foo": "v1.16.0", + }, + Outputs: []*Output{ + testOutput1, + testOutput2, + }, + Components: []string{"foo"}, + OutputFormat: "csv", + NoHeaders: true, + } + _ = instance.DisplayOutput() + + // Output: + // some name one,pluto-namespace,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 + // some name two,<UNKNOWN>,Deployment,extensions/v1beta1,apps/v1,true,v1.9.0,true,v1.16.0 +} + func ExampleInstance_DisplayOutput_noOutput() { instance := &Instance{ TargetVersions: map[string]string{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/api/versions.go new/pluto-5.13.0/pkg/api/versions.go --- old/pluto-5.12.0/pkg/api/versions.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/api/versions.go 2023-02-04 14:57:00.000000000 +0100 @@ -244,12 +244,7 @@ // in a specific format func (instance *Instance) PrintVersionList(outputFormat string) error { switch outputFormat { - case "normal": - err := instance.printVersionsTabular() - if err != nil { - return err - } - case "wide": + case "normal", "wide": err := instance.printVersionsTabular() if err != nil { return err @@ -275,7 +270,7 @@ } fmt.Println(string(data)) default: - errText := "The output format must one of (normal|json|yaml)" + errText := "The output format must one of (normal|wide|json|yaml)" fmt.Println(errText) return fmt.Errorf(errText) } @@ -286,7 +281,9 @@ w := new(tabwriter.Writer) w.Init(os.Stdout, 0, 15, 2, padChar, 0) - _, _ = fmt.Fprintln(w, "KIND\t NAME\t DEPRECATED IN\t REMOVED IN\t REPLACEMENT\t COMPONENT\t") + if !instance.NoHeaders { + fmt.Fprintln(w, "KIND\t NAME\t DEPRECATED IN\t REMOVED IN\t REPLACEMENT\t COMPONENT\t") + } for _, version := range instance.DeprecatedVersions { deprecatedIn := version.DeprecatedIn diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/api/versions_test.go new/pluto-5.13.0/pkg/api/versions_test.go --- old/pluto-5.12.0/pkg/api/versions_test.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/api/versions_test.go 2023-02-04 14:57:00.000000000 +0100 @@ -440,6 +440,21 @@ // testkind---- testname------------ n/a------------ n/a--------- n/a---------- custom----- } +func ExampleInstance_printVersionsTabular_noHeaders() { + instance := Instance{ + DeprecatedVersions: []Version{ + testVersionDeployment, + {Kind: "testkind", Name: "testname", DeprecatedIn: "", RemovedIn: "", Component: "custom"}, + }, + NoHeaders: true, + } + _ = instance.printVersionsTabular() + + // Output: + // Deployment-- extensions/v1beta1-- v1.9.0-- v1.16.0-- apps/v1-- k8s----- + // testkind---- testname------------ n/a----- n/a------ n/a------ custom-- +} + func ExampleInstance_PrintVersionList_json() { instance := Instance{ DeprecatedVersions: []Version{testVersionDeployment}, @@ -495,7 +510,7 @@ _ = instance.PrintVersionList("foo") // Output: - // The output format must one of (normal|json|yaml) + // The output format must one of (normal|wide|json|yaml) } func Test_isDuplicate(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/discovery-api/discovery_api.go new/pluto-5.13.0/pkg/discovery-api/discovery_api.go --- old/pluto-5.12.0/pkg/discovery-api/discovery_api.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/discovery-api/discovery_api.go 2023-02-04 14:57:00.000000000 +0100 @@ -38,10 +38,10 @@ "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" "k8s.io/klog/v2" "github.com/fairwindsops/pluto/v5/pkg/api" + kube "github.com/fairwindsops/pluto/v5/pkg/kube" ) // DiscoveryClient is the declaration to hold objects needed for client-go/discovery. @@ -50,16 +50,17 @@ restConfig *rest.Config DiscoveryClient discovery.DiscoveryInterface Instance *api.Instance + namespace string } // NewDiscoveryClient returns a new struct with config portions complete. -func NewDiscoveryClient(instance *api.Instance) (*DiscoveryClient, error) { +func NewDiscoveryClient(namespace string, kubeContext string, instance *api.Instance) (*DiscoveryClient, error) { cl := &DiscoveryClient{ Instance: instance, } var err error - cl.restConfig, err = NewRestClientConfig(rest.InClusterConfig) + cl.ClientSet, cl.restConfig, err = kube.GetKubeDynamicClient(kubeContext) if err != nil { return nil, err } @@ -68,41 +69,13 @@ return nil, err } - cl.ClientSet, err = dynamic.NewForConfig(cl.restConfig) - if err != nil { - return nil, err - } - return cl, nil -} - -// NewRestClientConfig returns a new Rest Client config portions complete. -func NewRestClientConfig(inClusterFn func() (*rest.Config, error)) (*rest.Config, error) { + cl.namespace = namespace - if restConfig, err := inClusterFn(); err == nil { - return restConfig, nil - } - - pathOptions := clientcmd.NewDefaultPathOptions() - - config, err := pathOptions.GetStartingConfig() - if err != nil { - return nil, err - } - - configOverrides := clientcmd.ConfigOverrides{} - - clientConfig := clientcmd.NewDefaultClientConfig(*config, &configOverrides) - restConfig, err := clientConfig.ClientConfig() - if err != nil { - return nil, err - } - - return restConfig, nil + return cl, nil } // GetApiResources discovers the api-resources for a cluster func (cl *DiscoveryClient) GetApiResources() error { - resourcelist, err := cl.DiscoveryClient.ServerPreferredResources() if err != nil { if apierrors.IsNotFound(err) { @@ -117,6 +90,9 @@ gvrs := []schema.GroupVersionResource{} for _, rl := range resourcelist { for i := range rl.APIResources { + if cl.namespace != "" && !rl.APIResources[i].Namespaced { + continue + } gv, _ := schema.ParseGroupVersion(rl.GroupVersion) ResourceName := rl.APIResources[i].Name g := schema.GroupVersionResource{Group: gv.Group, Version: gv.Version, Resource: ResourceName} @@ -126,7 +102,11 @@ var results []map[string]interface{} for _, g := range gvrs { - ri := cl.ClientSet.Resource(g) + nri := cl.ClientSet.Resource(g) + var ri dynamic.ResourceInterface = nri + if cl.namespace != "" { + ri = nri.Namespace(cl.namespace) + } klog.V(2).Infof("Retrieving : %s.%s.%s", g.Resource, g.Version, g.Group) rs, err := ri.List(context.TODO(), metav1.ListOptions{}) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/finder/finder.go new/pluto-5.13.0/pkg/finder/finder.go --- old/pluto-5.12.0/pkg/finder/finder.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/finder/finder.go 2023-02-04 14:57:00.000000000 +0100 @@ -30,7 +30,6 @@ import ( "fmt" - "io/ioutil" "os" "path/filepath" @@ -122,7 +121,7 @@ // it is an api-versioned Kubernetes object. // Returns the File object if it is. func (dir *Dir) CheckForAPIVersion(file string) ([]*api.Output, error) { - data, err := ioutil.ReadFile(file) + data, err := os.ReadFile(file) if err != nil { return nil, err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/helm.go new/pluto-5.13.0/pkg/helm/helm.go --- old/pluto-5.12.0/pkg/helm/helm.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/helm.go 2023-02-04 14:57:00.000000000 +0100 @@ -43,12 +43,13 @@ "k8s.io/klog/v2" "github.com/fairwindsops/pluto/v5/pkg/api" + kube "github.com/fairwindsops/pluto/v5/pkg/kube" ) // Helm represents all current releases that we can find in the cluster type Helm struct { Releases []*Release - Kube *kube + Kube *kube.Kube Namespace string Instance *api.Instance } @@ -73,8 +74,8 @@ } // NewHelm returns a basic helm struct with the version of helm requested -func NewHelm(namespace, kubeContext string, instance *api.Instance) (*Helm, error) { - config, err := getConfigInstance(kubeContext) +func NewHelm(namespace string, kubeContext string, instance *api.Instance) (*Helm, error) { + config, err := kube.GetConfigInstance(kubeContext) if err != nil { return nil, err } @@ -88,9 +89,9 @@ // NewHelmWithKubeClient returns a helm struct with version of helm requested // and uses the passed in kube client as the cluster to operate on -func NewHelmWithKubeClient(version, store, namespace string, instance *api.Instance, kubeClient kubernetes.Interface) *Helm { +func NewHelmWithKubeClient(version string, store string, namespace string, instance *api.Instance, kubeClient kubernetes.Interface) *Helm { return &Helm{ - Kube: &kube{ + Kube: &kube.Kube{ Client: kubeClient, }, Namespace: namespace, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/helm_test.go new/pluto-5.13.0/pkg/helm/helm_test.go --- old/pluto-5.12.0/pkg/helm/helm_test.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/helm_test.go 2023-02-04 14:57:00.000000000 +0100 @@ -33,10 +33,13 @@ "testing" "github.com/fairwindsops/pluto/v5/pkg/api" + kube "github.com/fairwindsops/pluto/v5/pkg/kube" "github.com/stretchr/testify/assert" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + testclient "k8s.io/client-go/kubernetes/fake" + _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/client-go/rest" ) @@ -150,6 +153,13 @@ } ) +func getMockConfigInstance() *kube.Kube { + kubeClient := &kube.Kube{ + Client: testclient.NewSimpleClientset(), + } + return kubeClient +} + func newMockHelm(namespace string) *Helm { return &Helm{ Namespace: namespace, @@ -185,10 +195,10 @@ } } -func newBadKubeClient() (k *kube) { +func newBadKubeClient() (k *kube.Kube) { conf := new(rest.Config) conf.Host = "127.0.0.1:9999" - k = new(kube) + k = new(kube.Kube) k.Client, _ = kubernetes.NewForConfig(conf) return } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/kube.go new/pluto-5.13.0/pkg/helm/kube.go --- old/pluto-5.12.0/pkg/helm/kube.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/kube.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,84 +0,0 @@ -// Copyright 2022 FairwindsOps Inc -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Copyright 2020 Fairwinds -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package helm - -import ( - "sync" - - "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - - // This is required to auth to cloud providers (i.e. GKE) - _ "k8s.io/client-go/plugin/pkg/client/auth" - "sigs.k8s.io/controller-runtime/pkg/client/config" -) - -type kube struct { - Client kubernetes.Interface -} - -var kubeClient *kube -var once sync.Once - -// GetConfigInstance returns a Kubernetes interface based on the current configuration -func getConfigInstance(kubeContext string) (*kube, error) { - var err error - var client kubernetes.Interface - - once.Do(func() { - if kubeClient == nil { - client, err = getKubeClient(kubeContext) - - kubeClient = &kube{ - Client: client, - } - } - }) - if err != nil { - return nil, err - } - return kubeClient, nil -} - -func getKubeClient(kubeContext string) (kubernetes.Interface, error) { - if kubeContext != "" { - klog.V(3).Infof("using kube context: %s", kubeContext) - } - - kubeConfig, err := config.GetConfigWithContext(kubeContext) - - if err != nil { - return nil, err - } - clientset, err := kubernetes.NewForConfig(kubeConfig) - if err != nil { - return nil, err - } - return clientset, nil -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/kube_test.go new/pluto-5.13.0/pkg/helm/kube_test.go --- old/pluto-5.12.0/pkg/helm/kube_test.go 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/kube_test.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,70 +0,0 @@ -// Copyright 2022 FairwindsOps Inc -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package helm - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - testclient "k8s.io/client-go/kubernetes/fake" - _ "k8s.io/client-go/plugin/pkg/client/auth" -) - -func getMockConfigInstance() *kube { - kubeClient = &kube{ - Client: testclient.NewSimpleClientset(), - } - return kubeClient -} - -func Test_getKubeClient(t *testing.T) { - tests := []struct { - name string - kubeContext string - kubeConfig string - wantErr bool - }{ - { - name: "context does not exist", - kubeContext: "farglebargle", - kubeConfig: "testdata/kubeconfig", - wantErr: true, - }, - { - name: "context exists", - kubeContext: "kind-kind", - kubeConfig: "testdata/kubeconfig", - wantErr: false, - }, - { - name: "invalid kubeconfig", - kubeContext: "kind-kind", - kubeConfig: "testdata/kubeconfig_invalid", - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - os.Setenv("KUBECONFIG", tt.kubeConfig) - _, err := getKubeClient(tt.kubeContext) - if tt.wantErr { - assert.Error(t, err) - } else { - assert.NoError(t, err) - } - }) - } -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/testdata/kubeconfig new/pluto-5.13.0/pkg/helm/testdata/kubeconfig --- old/pluto-5.12.0/pkg/helm/testdata/kubeconfig 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/testdata/kubeconfig 1970-01-01 01:00:00.000000000 +0100 @@ -1,19 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1ETXdNekU1TURNek5sb1hEVE15TURJeU9URTVNRE16Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0haCjhyVXFhN1JadVNNUlU2eXNNcDJLc1U3cnJHQTdGWmpMVjZzRG1qUG5Xb2U3enZEdGlkQUhwQ2FpM0lxblBMOVgKMTBmV2RFQnU3MjN1YWFYV3VTNVRBQWNkZSt4NU45WmE5S3hTRXV2OG1zeE1wUjl0ZmJsR2ltSURiNSs3YW5PTgo4ZVV2UzBVR05pNENIWUl2aGM3c2wxbTNBaDRIUWVBMzBnL2xORHJOTytkVlYwaVczbkpNNE8yL1JBOW54UlVZCmQxbmxwQ1R1SkZmaThKeXlkZnpwd0x0QnROMW5zNVRLUThsdlJEWStZTER3OGY0aVhMSzB5YVVhUkZmVkhWSzkKRk43WWRCM2tnbXAxU25YYUNFVngrWkZRd0VkR2EzcEZ1ZHJiL01DMDZ6cFhnQzluTCtoRy82U1dCK3VXS2hiQwpmYXVFcnRNeVBVbmJJUUFzMTEwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZCUVI2WXpWRDJUOVVlK0tacVJyNU1ZSEY4bm1NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBZ3VkelhtYXpRb1gyWDB0QnY0WG9ieWN6ZmMyUTFSd 29PUVY2TW5aNUE5NnJrS0kzawpHNklRS3ptWTFWNDhRRDhPTlZxdGdaRnNrU1ZrK05tSGM1c1Q2eE1YSWtDa2xFcUJLbFh4NHk5WDNHdkRjbERqClFtc044V0lHTThhbmFNRmtkajRqcDhZZEZWWktxcEpuaXljOVpIL1ozRjlITnFyMWlaL2VwbkZXczRMcnl4bkcKOWZjNlBjVnEvQVROdUhxalpGNjRFTkxxeHUwVUJvTFlCMFFuU1ZlalM3RnpRMzV4RHI5dGRpVnFKUzhhcmJRcgo0RHpuaU1rendzNUlQcGlvelNVSUlTeVVSc0pra2R0bW5OU3pwcWc3Y09Xc3NlYktXUU8rbURMSHcyMVVxb0JrCkZZbUhDVnNTRHlOaXdGYWtadUhZRGN5dDdjbDMwY1cvYjhmcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - server: https://127.0.0.1:54753 - name: kind-kind -contexts: -- context: - cluster: kind-kind - user: kind-kind - name: kind-kind -current-context: kind-kind -kind: Config -preferences: {} -users: -- name: kind-kind - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJU2pHek1STjQ4aTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBek1ETXhPVEF6TXpaYUZ3MHlNekF6TURNeE9UQXpNemxhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBaVXlOUXdRYk1hbFppRkUKUCthZThxY091TFF3QXUzU3FVNGRkcjNWL0hHeVJRWk4vZXRCTDRBaGFnK0E1ZHl3L3g5bnFJK1pTZStjNXVQUwpHUHNqaE96SFdnYi9XNHdvcXZ4cXdLQXd2cEFrZW9CeTEwYWxWaEVOcHVTbWk5cDRxalVpNm84ZmdSUDJCK1BlCkI5QmFLSDBQcUtMZDc4Q1hJci9rcVhkY0dqWHNZMjZNU1FSYVF0VFExY0xaR0VOakRNbnBxNnppb256NHoxZXEKTXlZRnB6eHJDZ0dqVTZvVU45cTJBRFpQZ1pyREJUdzFudTB6ZEJTRHZhVkQrV2pqN3VPMUI1WCt0Qml3NjJnZApPUEZnOE9LcThZUitSNUZpSzQrNE5jSjgvVzVkVWg3ZlZQRHVZL2VSMDg2M1NMdUlQS0srcDZaMW9mSEx5YnZWCm1jMm50d0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JRVUVlbU0xUTlr L1ZIdmltYWthK1RHQnhmSgo1akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBRTdNL21iSDh5UzIrelRCYTMycCtxMXl2TUFGbC9tbHVVaVZGCjJjVks5SWRDbHpYTGZMWTJWdVphbGdWOEdJdmYxTi9IK1dpQW5DYUdKeUN0R0c0VTVQQWJoVlRaNHFkVGRDcG8KU1R6Y0JXczJJeXRMSU1OclMzU2cwQXVLZ2ovZzZRVGxSaXN6SHZvazkrQURzenQvem1LeFZlbEM0aGFnYXVRVwpOaktZenFFWEN1SmFnUkQxY1lhYksxQlgyQ2cxYytpY0F3ZTdBazFKSmcxQ2JFVTNZSUZ2Yks1THJvK0hDSjArCk1RdUZ1T1VpQm1ScFlwY1ZUMkpCbHVmdjYvNENvcmZtdUdCeXUyN3E1ZmNUVkFGSmlKaGgxYWRBTGY5cURpY1kKUFpoYXNNTysvcTlpSkhRUk1KWklvNVNLWnBUMzg3WEE4SUI3THMvUjg2QVVTL3BVUWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcGdJQkFBS0NBUUVBMFpVeU5Rd1FiTWFsWmlGRVArYWU4cWNPdUxRd0F1M1NxVTRkZHIzVi9IR3lSUVpOCi9ldEJMNEFoYWcrQTVkeXcveDlucUkrWlNlK2M1dVBTR1BzamhPekhXZ2IvVzR3b3F2eHF3S0F3dnBBa2VvQnkKMTBhbFZoRU5wdVNtaTlwNHFqVWk2bzhmZ1JQMkIrUGVCOUJhS0gwUHFLTGQ3OENYSXIva3FYZGNHalhzWTI2TQpTUVJhUXRUUTFjTFpHRU5qRE1ucHE2emlvbno0ejFlcU15WUZwenhyQ2dHalU2b1VOOXEyQURaUGdackRCVHcxCm51MHpkQlNEdmFWRCtXamo3dU8xQjVYK3RCaXc2MmdkT1BGZzhPS3E4WVIrUjVGaUs0KzROY0o4L1c1ZFVoN2YKVlBEdVkvZVIwODYzU0x1SVBLSytwNloxb2ZITHlidlZtYzJudHdJREFRQUJBb0lCQVFDeHR5Vi92ZDhmbmNJYQp2QkszYk1OVFZ6MHdlZnBNUVlYa2NveWhaNC9RSkVqYUp1SnpjYzB3amlISFlhWVhRL0FDSllzc2I3ZTM3aXJKCnpsMFZPYitBczViSFRDKzBYVUVPM0VOWlczeDUycGhVR0I5SlZHcFdkTmR5c1doWUpzVXk3eVBRYWRSNUM0Z1EKWUxTaFE1ZHZ4YnhGYnZWcW01Q01zdE1lc0V1MUhJT0VmMUNEVHMzVTJON2VrVVJFUXdXcXlyVmUyWFN2R3grZAp4SHpiUzFMRzZjcGdpT1BCVXBxUitpcDZBZFlkd0FoWW9kQ1ZXUWVtQWw5TDhNMW5TNUVRME0xcUNzR0VidUpCClZ1cGszaWlmeUViL2VqZ1kvUkMrY01aelZkNEFVTVlsenJGaFNvYk9RQk1NMHFRbFky VHQ2bGR1OHR4YzNMRDYKTG9oL2pWUmhBb0dCQU8ydW9tbmMvYk81bGRpSTBJZUt6bzQvcEUvYWlJUlRxUjRuTjVOUVdkLzkya3NSenNtNApRL0tiMjJhNVlwRU93TWphZVFpdjJ3UGdrUzRJYTBVaVJyZlA3VjdEMzRwVG5wTytBVGtqV1B3TkJNMjNzc01pClpNZnJlWUMzSjlnQUhDQ0hjZW5VSXRGSW9zeUtncXhxVExCbEFqTTYvNHVydHNlc3ovUFFBMGxkQW9HQkFPRzgKTEdQY2FhSDN5dlVycjU2dDFjaHBEVm5MeEZUVmhzZ2lTdmxzUWpjQ1dCT1RnRDE4dFRmd2phY1VENEFyTjdRUgp4QndUMHhhNUppNitXT1ArRUhaNFpXYmovR3dXc2YxQzlLRVJhUEJhQ0MxWWViV2FPNU5Ka2NmMVNibzA5T1ZLCll0bm1kdjRYWCtUd1laUWd5Z0hMSXlWUkppY0NvSEliTVFyNit5QWpBb0dCQUw4LzdCUCs3RzIzZ1dtUS9TcHoKZUsxaGJGZU00cGlIc09kQWF5bXdXQUV5aEhvdlJCTnduOHdSdVVNNUhLVFlHQ3dHRDZuN3h1R2h5M0FjK2lQUQo1dEoxRHUxWDh3R2RNMVp5WncyUThjTXV2cFRCb2FmK2Z0V1hGbGVLQ1JkM1R5cWxrZld5NnFrNEp6Y3FwT2NUClNjNE9HTzBjSmhBL0JYNDZBY0tQdUhWSkFvR0JBS2IzZzdIOWgxaVpLMUw3RkRSL2lpQnBxOGxla2dMWnlZN2cKNXFuazdIazV6Nkh6T1NqQnhGenpIaU9XRC8wU2VtcER0ZFc2eUNrSG0vbDVLOUMvekxlRVNDUzV2NnpIZ0xHKwp3NmtiY281TldiMElzMFdqSml2RWdBTHlLSzJGbkJxNVViS3c2QlQ3ZngrY3VlQlIvSGtsSXdMb0toc3lzekNUCmNrd1g1b1lYQW9HQkFMVHhmQ 2cwaGY4bGJwUmlNeVFQc2NBMlJUS003T3pmZCtFZ1NFOHNxWHU0akxiQ3FJR2kKSC95TlhIRHZ6Y2tkZ1BkRW1BOVRqWit4SXVnK2JDMnVidGNCeHpMS1VPSko1MVplNEZNNU81eFY0MWpiTDdIcgo5QUdYdFA2UlEwU0hTeEQvZjBtQkMwdGdQZHcrajN4SHd4R3FKTTZkSWp2U0EwUmJFNG9HU0FWNAotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/helm/testdata/kubeconfig_invalid new/pluto-5.13.0/pkg/helm/testdata/kubeconfig_invalid --- old/pluto-5.12.0/pkg/helm/testdata/kubeconfig_invalid 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/pkg/helm/testdata/kubeconfig_invalid 1970-01-01 01:00:00.000000000 +0100 @@ -1,19 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1ETXdNekU1TURNek5sb1hEVE15TURJeU9URTVNRE16Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0haCjhyVXFhN1JadVNNUlU2eXNNcDJLc1U3cnJHQTdGWmpMVjZzRG1qUG5Xb2U3enZEdGlkQUhwQ2FpM0lxblBMOVgKMTBmV2RFQnU3MjN1YWFYV3VTNVRBQWNkZSt4NU45WmE5S3hTRXV2OG1zeE1wUjl0ZmJsR2ltSURiNSs3YW5PTgo4ZVV2UzBVR05pNENIWUl2aGM3c2wxbTNBaDRIUWVBMzBnL2xORHJOTytkVlYwaVczbkpNNE8yL1JBOW54UlVZCmQxbmxwQ1R1SkZmaThKeXlkZnpwd0x0QnROMW5zNVRLUThsdlJEWStZTER3OGY0aVhMSzB5YVVhUkZmVkhWSzkKRk43WWRCM2tnbXAxU25YYUNFVngrWkZRd0VkR2EzcEZ1ZHJiL01DMDZ6cFhnQzluTCtoRy82U1dCK3VXS2hiQwpmYXVFcnRNeVBVbmJJUUFzMTEwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZCUVI2WXpWRDJUOVVlK0tacVJyNU1ZSEY4bm1NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBZ3VkelhtYXpRb1gyWDB0QnY0WG9ieWN6ZmMyUTFSd 29PUVY2TW5aNUE5NnJrS0kzawpHNklRS3ptWTFWNDhRRDhPTlZxdGdaRnNrU1ZrK05tSGM1c1Q2eE1YSWtDa2xFcUJLbFh4NHk5WDNHdkRjbERqClFtc044V0lHTThhbmFNRmtkajRqcDhZZEZWWktxcEpuaXljOVpIL1ozRjlITnFyMWlaL2VwbkZXczRMcnl4bkcKOWZjNlBjVnEvQVROdUhxalpGNjRFTkxxeHUwVUJvTFlCMFFuU1ZlalM3RnpRMzV4RHI5dGRpVnFKUzhhcmJRcgo0RHpuaU1rendzNUlQcGlvelNVSUlTeVVSc0pra2R0bW5OU3pwcWc3Y09Xc3NlYktXUU8rbURMSHcyMVVxb0JrCkZZbUhDVnNTRHlOaXdGYWtadUhZRGN5dDdjbDMwY1cvYjhmcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - server: https://127.0.0.1:54753 - name: kind-kind -contexts: -- context: - cluster: kind-kind - user: kind-kind - name: kind-kind -current-context: kind-kind -kind: Config -preferences: {} -users: -- name: kind-kind - user: - client-certificate-data: fargle - client-key-data: bargle diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/kube/kube.go new/pluto-5.13.0/pkg/kube/kube.go --- old/pluto-5.12.0/pkg/kube/kube.go 1970-01-01 01:00:00.000000000 +0100 +++ new/pluto-5.13.0/pkg/kube/kube.go 2023-02-04 14:57:00.000000000 +0100 @@ -0,0 +1,105 @@ +// Copyright 2022 FairwindsOps Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright 2020 Fairwinds +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License + +package helm + +import ( + "sync" + + "k8s.io/client-go/dynamic" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/klog/v2" + + // This is required to auth to cloud providers (i.e. GKE) + _ "k8s.io/client-go/plugin/pkg/client/auth" + "sigs.k8s.io/controller-runtime/pkg/client/config" +) + +type Kube struct { + Client kubernetes.Interface +} + +var kubeClient *Kube +var once sync.Once + +// GetConfigInstance returns a Pluto Kubernetes interface based on the current configuration +func GetConfigInstance(kubeContext string) (*Kube, error) { + var err error + var client kubernetes.Interface + + once.Do(func() { + if kubeClient == nil { + client, err = GetKubeClient(kubeContext) + + kubeClient = &Kube{ + Client: client, + } + } + }) + if err != nil { + return nil, err + } + return kubeClient, nil +} + +// GetKubeClient returns a Kubernetes.Interface based on the current configuration +func GetKubeClient(kubeContext string) (kubernetes.Interface, error) { + if kubeContext != "" { + klog.V(3).Infof("using kube context: %s", kubeContext) + } + + config, err := config.GetConfigWithContext(kubeContext) + if err != nil { + return nil, err + } + + clientset, err := kubernetes.NewForConfig(config) + if err != nil { + return nil, err + } + return clientset, nil +} + +// GetKubeDynamicClient returns a dynamic.Interface, rest.Config based on the current configuration +func GetKubeDynamicClient(kubeContext string) (dynamic.Interface, *rest.Config, error) { + if kubeContext != "" { + klog.V(3).Infof("using kube context: %s", kubeContext) + } + + config, err := config.GetConfigWithContext(kubeContext) + if err != nil { + return nil, nil, err + } + + clientset, err := dynamic.NewForConfig(config) + if err != nil { + return nil, nil, err + } + return clientset, config, nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/kube/kube_test.go new/pluto-5.13.0/pkg/kube/kube_test.go --- old/pluto-5.12.0/pkg/kube/kube_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/pluto-5.13.0/pkg/kube/kube_test.go 2023-02-04 14:57:00.000000000 +0100 @@ -0,0 +1,61 @@ +// Copyright 2022 FairwindsOps Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package helm + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_getKubeClient(t *testing.T) { + tests := []struct { + name string + kubeContext string + kubeConfig string + wantErr bool + }{ + { + name: "context does not exist", + kubeContext: "farglebargle", + kubeConfig: "testdata/kubeconfig", + wantErr: true, + }, + { + name: "context exists", + kubeContext: "kind-kind", + kubeConfig: "testdata/kubeconfig", + wantErr: false, + }, + { + name: "invalid kubeconfig", + kubeContext: "kind-kind", + kubeConfig: "testdata/kubeconfig_invalid", + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + os.Setenv("KUBECONFIG", tt.kubeConfig) + _, err := GetKubeClient(tt.kubeContext) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/kube/testdata/kubeconfig new/pluto-5.13.0/pkg/kube/testdata/kubeconfig --- old/pluto-5.12.0/pkg/kube/testdata/kubeconfig 1970-01-01 01:00:00.000000000 +0100 +++ new/pluto-5.13.0/pkg/kube/testdata/kubeconfig 2023-02-04 14:57:00.000000000 +0100 @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1ETXdNekU1TURNek5sb1hEVE15TURJeU9URTVNRE16Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0haCjhyVXFhN1JadVNNUlU2eXNNcDJLc1U3cnJHQTdGWmpMVjZzRG1qUG5Xb2U3enZEdGlkQUhwQ2FpM0lxblBMOVgKMTBmV2RFQnU3MjN1YWFYV3VTNVRBQWNkZSt4NU45WmE5S3hTRXV2OG1zeE1wUjl0ZmJsR2ltSURiNSs3YW5PTgo4ZVV2UzBVR05pNENIWUl2aGM3c2wxbTNBaDRIUWVBMzBnL2xORHJOTytkVlYwaVczbkpNNE8yL1JBOW54UlVZCmQxbmxwQ1R1SkZmaThKeXlkZnpwd0x0QnROMW5zNVRLUThsdlJEWStZTER3OGY0aVhMSzB5YVVhUkZmVkhWSzkKRk43WWRCM2tnbXAxU25YYUNFVngrWkZRd0VkR2EzcEZ1ZHJiL01DMDZ6cFhnQzluTCtoRy82U1dCK3VXS2hiQwpmYXVFcnRNeVBVbmJJUUFzMTEwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZCUVI2WXpWRDJUOVVlK0tacVJyNU1ZSEY4bm1NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBZ3VkelhtYXpRb1gyWDB0QnY0WG9ieWN6ZmMyUTFSd 29PUVY2TW5aNUE5NnJrS0kzawpHNklRS3ptWTFWNDhRRDhPTlZxdGdaRnNrU1ZrK05tSGM1c1Q2eE1YSWtDa2xFcUJLbFh4NHk5WDNHdkRjbERqClFtc044V0lHTThhbmFNRmtkajRqcDhZZEZWWktxcEpuaXljOVpIL1ozRjlITnFyMWlaL2VwbkZXczRMcnl4bkcKOWZjNlBjVnEvQVROdUhxalpGNjRFTkxxeHUwVUJvTFlCMFFuU1ZlalM3RnpRMzV4RHI5dGRpVnFKUzhhcmJRcgo0RHpuaU1rendzNUlQcGlvelNVSUlTeVVSc0pra2R0bW5OU3pwcWc3Y09Xc3NlYktXUU8rbURMSHcyMVVxb0JrCkZZbUhDVnNTRHlOaXdGYWtadUhZRGN5dDdjbDMwY1cvYjhmcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + server: https://127.0.0.1:54753 + name: kind-kind +contexts: +- context: + cluster: kind-kind + user: kind-kind + name: kind-kind +current-context: kind-kind +kind: Config +preferences: {} +users: +- name: kind-kind + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJU2pHek1STjQ4aTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBek1ETXhPVEF6TXpaYUZ3MHlNekF6TURNeE9UQXpNemxhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBaVXlOUXdRYk1hbFppRkUKUCthZThxY091TFF3QXUzU3FVNGRkcjNWL0hHeVJRWk4vZXRCTDRBaGFnK0E1ZHl3L3g5bnFJK1pTZStjNXVQUwpHUHNqaE96SFdnYi9XNHdvcXZ4cXdLQXd2cEFrZW9CeTEwYWxWaEVOcHVTbWk5cDRxalVpNm84ZmdSUDJCK1BlCkI5QmFLSDBQcUtMZDc4Q1hJci9rcVhkY0dqWHNZMjZNU1FSYVF0VFExY0xaR0VOakRNbnBxNnppb256NHoxZXEKTXlZRnB6eHJDZ0dqVTZvVU45cTJBRFpQZ1pyREJUdzFudTB6ZEJTRHZhVkQrV2pqN3VPMUI1WCt0Qml3NjJnZApPUEZnOE9LcThZUitSNUZpSzQrNE5jSjgvVzVkVWg3ZlZQRHVZL2VSMDg2M1NMdUlQS0srcDZaMW9mSEx5YnZWCm1jMm50d0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JRVUVlbU0xUTlr L1ZIdmltYWthK1RHQnhmSgo1akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBRTdNL21iSDh5UzIrelRCYTMycCtxMXl2TUFGbC9tbHVVaVZGCjJjVks5SWRDbHpYTGZMWTJWdVphbGdWOEdJdmYxTi9IK1dpQW5DYUdKeUN0R0c0VTVQQWJoVlRaNHFkVGRDcG8KU1R6Y0JXczJJeXRMSU1OclMzU2cwQXVLZ2ovZzZRVGxSaXN6SHZvazkrQURzenQvem1LeFZlbEM0aGFnYXVRVwpOaktZenFFWEN1SmFnUkQxY1lhYksxQlgyQ2cxYytpY0F3ZTdBazFKSmcxQ2JFVTNZSUZ2Yks1THJvK0hDSjArCk1RdUZ1T1VpQm1ScFlwY1ZUMkpCbHVmdjYvNENvcmZtdUdCeXUyN3E1ZmNUVkFGSmlKaGgxYWRBTGY5cURpY1kKUFpoYXNNTysvcTlpSkhRUk1KWklvNVNLWnBUMzg3WEE4SUI3THMvUjg2QVVTL3BVUWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcGdJQkFBS0NBUUVBMFpVeU5Rd1FiTWFsWmlGRVArYWU4cWNPdUxRd0F1M1NxVTRkZHIzVi9IR3lSUVpOCi9ldEJMNEFoYWcrQTVkeXcveDlucUkrWlNlK2M1dVBTR1BzamhPekhXZ2IvVzR3b3F2eHF3S0F3dnBBa2VvQnkKMTBhbFZoRU5wdVNtaTlwNHFqVWk2bzhmZ1JQMkIrUGVCOUJhS0gwUHFLTGQ3OENYSXIva3FYZGNHalhzWTI2TQpTUVJhUXRUUTFjTFpHRU5qRE1ucHE2emlvbno0ejFlcU15WUZwenhyQ2dHalU2b1VOOXEyQURaUGdackRCVHcxCm51MHpkQlNEdmFWRCtXamo3dU8xQjVYK3RCaXc2MmdkT1BGZzhPS3E4WVIrUjVGaUs0KzROY0o4L1c1ZFVoN2YKVlBEdVkvZVIwODYzU0x1SVBLSytwNloxb2ZITHlidlZtYzJudHdJREFRQUJBb0lCQVFDeHR5Vi92ZDhmbmNJYQp2QkszYk1OVFZ6MHdlZnBNUVlYa2NveWhaNC9RSkVqYUp1SnpjYzB3amlISFlhWVhRL0FDSllzc2I3ZTM3aXJKCnpsMFZPYitBczViSFRDKzBYVUVPM0VOWlczeDUycGhVR0I5SlZHcFdkTmR5c1doWUpzVXk3eVBRYWRSNUM0Z1EKWUxTaFE1ZHZ4YnhGYnZWcW01Q01zdE1lc0V1MUhJT0VmMUNEVHMzVTJON2VrVVJFUXdXcXlyVmUyWFN2R3grZAp4SHpiUzFMRzZjcGdpT1BCVXBxUitpcDZBZFlkd0FoWW9kQ1ZXUWVtQWw5TDhNMW5TNUVRME0xcUNzR0VidUpCClZ1cGszaWlmeUViL2VqZ1kvUkMrY01aelZkNEFVTVlsenJGaFNvYk9RQk1NMHFRbFky VHQ2bGR1OHR4YzNMRDYKTG9oL2pWUmhBb0dCQU8ydW9tbmMvYk81bGRpSTBJZUt6bzQvcEUvYWlJUlRxUjRuTjVOUVdkLzkya3NSenNtNApRL0tiMjJhNVlwRU93TWphZVFpdjJ3UGdrUzRJYTBVaVJyZlA3VjdEMzRwVG5wTytBVGtqV1B3TkJNMjNzc01pClpNZnJlWUMzSjlnQUhDQ0hjZW5VSXRGSW9zeUtncXhxVExCbEFqTTYvNHVydHNlc3ovUFFBMGxkQW9HQkFPRzgKTEdQY2FhSDN5dlVycjU2dDFjaHBEVm5MeEZUVmhzZ2lTdmxzUWpjQ1dCT1RnRDE4dFRmd2phY1VENEFyTjdRUgp4QndUMHhhNUppNitXT1ArRUhaNFpXYmovR3dXc2YxQzlLRVJhUEJhQ0MxWWViV2FPNU5Ka2NmMVNibzA5T1ZLCll0bm1kdjRYWCtUd1laUWd5Z0hMSXlWUkppY0NvSEliTVFyNit5QWpBb0dCQUw4LzdCUCs3RzIzZ1dtUS9TcHoKZUsxaGJGZU00cGlIc09kQWF5bXdXQUV5aEhvdlJCTnduOHdSdVVNNUhLVFlHQ3dHRDZuN3h1R2h5M0FjK2lQUQo1dEoxRHUxWDh3R2RNMVp5WncyUThjTXV2cFRCb2FmK2Z0V1hGbGVLQ1JkM1R5cWxrZld5NnFrNEp6Y3FwT2NUClNjNE9HTzBjSmhBL0JYNDZBY0tQdUhWSkFvR0JBS2IzZzdIOWgxaVpLMUw3RkRSL2lpQnBxOGxla2dMWnlZN2cKNXFuazdIazV6Nkh6T1NqQnhGenpIaU9XRC8wU2VtcER0ZFc2eUNrSG0vbDVLOUMvekxlRVNDUzV2NnpIZ0xHKwp3NmtiY281TldiMElzMFdqSml2RWdBTHlLSzJGbkJxNVViS3c2QlQ3ZngrY3VlQlIvSGtsSXdMb0toc3lzekNUCmNrd1g1b1lYQW9HQkFMVHhmQ 2cwaGY4bGJwUmlNeVFQc2NBMlJUS003T3pmZCtFZ1NFOHNxWHU0akxiQ3FJR2kKSC95TlhIRHZ6Y2tkZ1BkRW1BOVRqWit4SXVnK2JDMnVidGNCeHpMS1VPSko1MVplNEZNNU81eFY0MWpiTDdIcgo5QUdYdFA2UlEwU0hTeEQvZjBtQkMwdGdQZHcrajN4SHd4R3FKTTZkSWp2U0EwUmJFNG9HU0FWNAotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/pkg/kube/testdata/kubeconfig_invalid new/pluto-5.13.0/pkg/kube/testdata/kubeconfig_invalid --- old/pluto-5.12.0/pkg/kube/testdata/kubeconfig_invalid 1970-01-01 01:00:00.000000000 +0100 +++ new/pluto-5.13.0/pkg/kube/testdata/kubeconfig_invalid 2023-02-04 14:57:00.000000000 +0100 @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1ETXdNekU1TURNek5sb1hEVE15TURJeU9URTVNRE16Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0haCjhyVXFhN1JadVNNUlU2eXNNcDJLc1U3cnJHQTdGWmpMVjZzRG1qUG5Xb2U3enZEdGlkQUhwQ2FpM0lxblBMOVgKMTBmV2RFQnU3MjN1YWFYV3VTNVRBQWNkZSt4NU45WmE5S3hTRXV2OG1zeE1wUjl0ZmJsR2ltSURiNSs3YW5PTgo4ZVV2UzBVR05pNENIWUl2aGM3c2wxbTNBaDRIUWVBMzBnL2xORHJOTytkVlYwaVczbkpNNE8yL1JBOW54UlVZCmQxbmxwQ1R1SkZmaThKeXlkZnpwd0x0QnROMW5zNVRLUThsdlJEWStZTER3OGY0aVhMSzB5YVVhUkZmVkhWSzkKRk43WWRCM2tnbXAxU25YYUNFVngrWkZRd0VkR2EzcEZ1ZHJiL01DMDZ6cFhnQzluTCtoRy82U1dCK3VXS2hiQwpmYXVFcnRNeVBVbmJJUUFzMTEwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZCUVI2WXpWRDJUOVVlK0tacVJyNU1ZSEY4bm1NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBZ3VkelhtYXpRb1gyWDB0QnY0WG9ieWN6ZmMyUTFSd 29PUVY2TW5aNUE5NnJrS0kzawpHNklRS3ptWTFWNDhRRDhPTlZxdGdaRnNrU1ZrK05tSGM1c1Q2eE1YSWtDa2xFcUJLbFh4NHk5WDNHdkRjbERqClFtc044V0lHTThhbmFNRmtkajRqcDhZZEZWWktxcEpuaXljOVpIL1ozRjlITnFyMWlaL2VwbkZXczRMcnl4bkcKOWZjNlBjVnEvQVROdUhxalpGNjRFTkxxeHUwVUJvTFlCMFFuU1ZlalM3RnpRMzV4RHI5dGRpVnFKUzhhcmJRcgo0RHpuaU1rendzNUlQcGlvelNVSUlTeVVSc0pra2R0bW5OU3pwcWc3Y09Xc3NlYktXUU8rbURMSHcyMVVxb0JrCkZZbUhDVnNTRHlOaXdGYWtadUhZRGN5dDdjbDMwY1cvYjhmcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + server: https://127.0.0.1:54753 + name: kind-kind +contexts: +- context: + cluster: kind-kind + user: kind-kind + name: kind-kind +current-context: kind-kind +kind: Config +preferences: {} +users: +- name: kind-kind + user: + client-certificate-data: fargle + client-key-data: bargle diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pluto-5.12.0/versions.yaml new/pluto-5.13.0/versions.yaml --- old/pluto-5.12.0/versions.yaml 2023-01-04 21:59:36.000000000 +0100 +++ new/pluto-5.13.0/versions.yaml 2023-02-04 14:57:00.000000000 +0100 @@ -284,6 +284,7 @@ - version: storage.k8s.io/v1beta1 kind: CSIStorageCapacity deprecated-in: v1.24.0 + removed-in: v1.27.0 replacement-api: storage.k8s.io/v1 component: k8s - version: storage.k8s.io/v1beta1 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/pluto/vendor.tar.gz /work/SRC/openSUSE:Factory/.pluto.new.4462/vendor.tar.gz differ: char 5, line 1