From 0c8c517941821aacac72dd466b96882241390316 Mon Sep 17 00:00:00 2001 From: Jonas Rutishauser Date: Sun, 8 Sep 2019 00:34:49 +0200 Subject: [PATCH] support helm 3 --- cmd/helpers.go | 141 ++++++++- cmd/release.go | 17 +- cmd/revision.go | 25 +- cmd/rollback.go | 17 +- cmd/upgrade.go | 189 ++++++++--- glide.lock | 693 +++++++++++++++++++++++++++++++++++++++-- glide.yaml | 24 +- manifest/parse.go | 45 ++- manifest/parse_test.go | 40 ++- manifest/release.go | 20 ++ 10 files changed, 1086 insertions(+), 125 deletions(-) create mode 100644 manifest/release.go diff --git a/cmd/helpers.go b/cmd/helpers.go index 28ceaf47..d9f052a6 100644 --- a/cmd/helpers.go +++ b/cmd/helpers.go @@ -2,14 +2,27 @@ package cmd import ( "fmt" + "log" "os" "path/filepath" + "sync" flag "github.com/spf13/pflag" + "helm.sh/helm/pkg/action" + "helm.sh/helm/pkg/cli" + "helm.sh/helm/pkg/cli/values" + "helm.sh/helm/pkg/kube" + rspb "helm.sh/helm/pkg/release" + "helm.sh/helm/pkg/storage" + "helm.sh/helm/pkg/storage/driver" + "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/client-go/util/homedir" "k8s.io/helm/pkg/helm" helm_env "k8s.io/helm/pkg/helm/environment" + rls "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/tlsutil" + + "github.com/databus23/helm-diff/manifest" ) const ( @@ -22,13 +35,135 @@ var ( settings helm_env.EnvSettings // DefaultHelmHome to hold default home path of .helm dir DefaultHelmHome = filepath.Join(homedir.HomeDir(), ".helm") + settingsV3 *cli.EnvSettings + config genericclioptions.RESTClientGetter + configOnce sync.Once ) +type clientHolder struct { + client helm.Interface + actionConfig action.Configuration +} + func addCommonCmdOptions(f *flag.FlagSet) { - settings.AddFlagsTLS(f) - settings.InitTLS(f) + if isHelm3() { + settingsV3 = cli.New() + settingsV3.AddFlags(f) + settingsV3.Init(f) + } else { + settings.AddFlagsTLS(f) + settings.InitTLS(f) + + f.StringVar((*string)(&settings.Home), "home", DefaultHelmHome, "location of your Helm config. Overrides $HELM_HOME") + } +} + +func (cmd *clientHolder) deployedRelease(release string) (releaseResponse manifest.ReleaseResponse, err error) { + if isHelm3() { + var response *rspb.Release + response, err = cmd.actionConfig.Releases.Deployed(release) + releaseResponse.ReleaseV3 = response + } else { + var response *rls.GetReleaseContentResponse + response, err = cmd.client.ReleaseContent(release) + releaseResponse.Release = response.Release + } + return +} + +func (cmd *clientHolder) deployedReleaseRevision(release string, version int) (releaseResponse manifest.ReleaseResponse, err error) { + if isHelm3() { + var response *rspb.Release + response, err = cmd.actionConfig.Releases.Get(release, version) + releaseResponse.ReleaseV3 = response + } else { + var response *rls.GetReleaseContentResponse + response, err = cmd.client.ReleaseContent(release, helm.ContentReleaseVersion(int32(version))) + releaseResponse.Release = response.Release + } + return +} + +func (cmd *clientHolder) init() { + if isHelm3() { + if cmd.actionConfig.Releases == nil { + initActionConfig(&cmd.actionConfig) + } + } else { + if cmd.client == nil { + cmd.client = createHelmClient() + } + } +} + +func isHelm3() bool { + return os.Getenv("TILLER_HOST") == "" +} + +func addValueOptionsFlags(f *flag.FlagSet, v *values.Options) { + f.StringSliceVarP(&v.ValueFiles, "values", "f", []string{}, "specify values in a YAML file or a URL(can specify multiple)") + f.StringArrayVar(&v.Values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") + f.StringArrayVar(&v.StringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") +} + +func initActionConfig(actionConfig *action.Configuration) { + kc := kube.New(kubeConfig()) + kc.Log = debugV3 + + clientset, err := kc.Factory.KubernetesClientSet() + if err != nil { + // TODO return error + log.Fatal(err) + } + namespace := getNamespace() + + var store *storage.Storage + switch os.Getenv("HELM_DRIVER") { + case "secret", "secrets", "": + d := driver.NewSecrets(clientset.CoreV1().Secrets(namespace)) + d.Log = debugV3 + store = storage.Init(d) + case "configmap", "configmaps": + d := driver.NewConfigMaps(clientset.CoreV1().ConfigMaps(namespace)) + d.Log = debugV3 + store = storage.Init(d) + case "memory": + d := driver.NewMemory() + store = storage.Init(d) + default: + // Not sure what to do here. + panic("Unknown driver in HELM_DRIVER: " + os.Getenv("HELM_DRIVER")) + } + + actionConfig.RESTClientGetter = kubeConfig() + actionConfig.KubeClient = kc + actionConfig.Releases = store + actionConfig.Log = debugV3 +} + +func getNamespace() string { + if settingsV3.Namespace != "" { + return settingsV3.Namespace + } - f.StringVar((*string)(&settings.Home), "home", DefaultHelmHome, "location of your Helm config. Overrides $HELM_HOME") + if ns, _, err := kubeConfig().ToRawKubeConfigLoader().Namespace(); err == nil { + return ns + } + return "default" +} + +func kubeConfig() genericclioptions.RESTClientGetter { + configOnce.Do(func() { + config = kube.GetConfig(settingsV3.KubeConfig, settingsV3.KubeContext, settingsV3.Namespace) + }) + return config +} + +func debugV3(format string, v ...interface{}) { + if settingsV3.Debug { + format = fmt.Sprintf("[debug] %s\n", format) + log.Output(2, fmt.Sprintf(format, v...)) + } } func createHelmClient() helm.Interface { diff --git a/cmd/release.go b/cmd/release.go index 4635cd03..dfd7d787 100644 --- a/cmd/release.go +++ b/cmd/release.go @@ -6,14 +6,13 @@ import ( "os" "github.com/spf13/cobra" - "k8s.io/helm/pkg/helm" "github.com/databus23/helm-diff/diff" "github.com/databus23/helm-diff/manifest" ) type release struct { - client helm.Interface + clientHolder detailedExitCode bool suppressedKinds []string releases []string @@ -60,9 +59,7 @@ func releaseCmd() *cobra.Command { } diff.releases = args[0:] - if diff.client == nil { - diff.client = createHelmClient() - } + diff.init() return diff.differentiate() }, } @@ -80,20 +77,20 @@ func releaseCmd() *cobra.Command { func (d *release) differentiate() error { - releaseResponse1, err := d.client.ReleaseContent(d.releases[0]) + releaseResponse1, err := d.deployedRelease(d.releases[0]) if err != nil { return prettyError(err) } - releaseResponse2, err := d.client.ReleaseContent(d.releases[1]) + releaseResponse2, err := d.deployedRelease(d.releases[1]) if err != nil { return prettyError(err) } - if releaseResponse1.Release.Chart.Metadata.Name == releaseResponse2.Release.Chart.Metadata.Name { + if releaseResponse1.ChartName() == releaseResponse2.ChartName() { seenAnyChanges := diff.Releases( - manifest.ParseRelease(releaseResponse1.Release, d.includeTests), - manifest.ParseRelease(releaseResponse2.Release, d.includeTests), + manifest.ParseRelease(releaseResponse1, d.includeTests), + manifest.ParseRelease(releaseResponse2, d.includeTests), d.suppressedKinds, d.outputContext, os.Stdout) diff --git a/cmd/revision.go b/cmd/revision.go index 22be25ec..295c08a4 100644 --- a/cmd/revision.go +++ b/cmd/revision.go @@ -7,15 +7,14 @@ import ( "strconv" "github.com/spf13/cobra" - "k8s.io/helm/pkg/helm" "github.com/databus23/helm-diff/diff" "github.com/databus23/helm-diff/manifest" ) type revision struct { - release string - client helm.Interface + release string + clientHolder detailedExitCode bool suppressedKinds []string revisions []string @@ -70,9 +69,7 @@ func revisionCmd() *cobra.Command { diff.release = args[0] diff.revisions = args[1:] - if diff.client == nil { - diff.client = createHelmClient() - } + diff.init() return diff.differentiate() }, } @@ -92,21 +89,21 @@ func (d *revision) differentiate() error { switch len(d.revisions) { case 1: - releaseResponse, err := d.client.ReleaseContent(d.release) + releaseResponse, err := d.deployedRelease(d.release) if err != nil { return prettyError(err) } revision, _ := strconv.Atoi(d.revisions[0]) - revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) + revisionResponse, err := d.deployedReleaseRevision(d.release, revision) if err != nil { return prettyError(err) } diff.Manifests( - manifest.ParseRelease(revisionResponse.Release, d.includeTests), - manifest.ParseRelease(releaseResponse.Release, d.includeTests), + manifest.ParseRelease(revisionResponse, d.includeTests), + manifest.ParseRelease(releaseResponse, d.includeTests), d.suppressedKinds, d.outputContext, os.Stdout) @@ -118,19 +115,19 @@ func (d *revision) differentiate() error { revision1, revision2 = revision2, revision1 } - revisionResponse1, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision1))) + revisionResponse1, err := d.deployedReleaseRevision(d.release, revision1) if err != nil { return prettyError(err) } - revisionResponse2, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision2))) + revisionResponse2, err := d.deployedReleaseRevision(d.release, revision2) if err != nil { return prettyError(err) } seenAnyChanges := diff.Manifests( - manifest.ParseRelease(revisionResponse1.Release, d.includeTests), - manifest.ParseRelease(revisionResponse2.Release, d.includeTests), + manifest.ParseRelease(revisionResponse1, d.includeTests), + manifest.ParseRelease(revisionResponse2, d.includeTests), d.suppressedKinds, d.outputContext, os.Stdout) diff --git a/cmd/rollback.go b/cmd/rollback.go index 59f89966..3fa335ae 100644 --- a/cmd/rollback.go +++ b/cmd/rollback.go @@ -7,15 +7,14 @@ import ( "strconv" "github.com/spf13/cobra" - "k8s.io/helm/pkg/helm" "github.com/databus23/helm-diff/diff" "github.com/databus23/helm-diff/manifest" ) type rollback struct { - release string - client helm.Interface + release string + clientHolder detailedExitCode bool suppressedKinds []string revisions []string @@ -60,9 +59,7 @@ func rollbackCmd() *cobra.Command { diff.release = args[0] diff.revisions = args[1:] - if diff.client == nil { - diff.client = createHelmClient() - } + diff.init() return diff.backcast() }, @@ -82,7 +79,7 @@ func rollbackCmd() *cobra.Command { func (d *rollback) backcast() error { // get manifest of the latest release - releaseResponse, err := d.client.ReleaseContent(d.release) + releaseResponse, err := d.deployedRelease(d.release) if err != nil { return prettyError(err) @@ -90,15 +87,15 @@ func (d *rollback) backcast() error { // get manifest of the release to rollback revision, _ := strconv.Atoi(d.revisions[0]) - revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) + revisionResponse, err := d.deployedReleaseRevision(d.release, revision) if err != nil { return prettyError(err) } // create a diff between the current manifest and the version of the manifest that a user is intended to rollback seenAnyChanges := diff.Manifests( - manifest.ParseRelease(releaseResponse.Release, d.includeTests), - manifest.ParseRelease(revisionResponse.Release, d.includeTests), + manifest.ParseRelease(releaseResponse, d.includeTests), + manifest.ParseRelease(revisionResponse, d.includeTests), d.suppressedKinds, d.outputContext, os.Stdout) diff --git a/cmd/upgrade.go b/cmd/upgrade.go index 7dde2ec2..8b1fab05 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -1,12 +1,17 @@ package cmd import ( - "errors" "fmt" "os" "strings" + "github.com/pkg/errors" "github.com/spf13/cobra" + "helm.sh/helm/pkg/action" + "helm.sh/helm/pkg/chart" + "helm.sh/helm/pkg/chart/loader" + "helm.sh/helm/pkg/cli/values" + "helm.sh/helm/pkg/getter" "k8s.io/helm/pkg/helm" "github.com/databus23/helm-diff/diff" @@ -14,10 +19,11 @@ import ( ) type diffCmd struct { - release string - chart string - chartVersion string - client helm.Interface + release string + chart string + chartVersion string + clientHolder + valueOpts *values.Options detailedExitCode bool devel bool namespace string // namespace to assume the release to be installed into. Defaults to the current kube config namespace. @@ -43,7 +49,7 @@ perform. ` func newChartCommand() *cobra.Command { - diff := diffCmd{} + diff := diffCmd{valueOpts: &values.Options{}} cmd := &cobra.Command{ Use: "upgrade [flags] [RELEASE] [CHART]", @@ -66,9 +72,7 @@ func newChartCommand() *cobra.Command { diff.release = args[0] diff.chart = args[1] - if diff.client == nil { - diff.client = createHelmClient() - } + diff.init() return diff.run() }, } @@ -77,19 +81,23 @@ func newChartCommand() *cobra.Command { f.StringVar(&diff.chartVersion, "version", "", "specify the exact chart version to use. If this is not specified, the latest version is used") f.BoolVar(&diff.detailedExitCode, "detailed-exitcode", false, "return a non-zero exit code when there are changes") f.BoolP("suppress-secrets", "q", false, "suppress secrets in the output") - f.VarP(&diff.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") - f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") - f.StringArrayVar(&diff.stringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") - f.StringArrayVar(&diff.fileValues, "set-file", []string{}, "set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)") - f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") - f.BoolVar(&diff.resetValues, "reset-values", false, "reset the values to the ones built into the chart and merge in any new values") f.BoolVar(&diff.allowUnreleased, "allow-unreleased", false, "enables diffing of releases that are not yet deployed via Helm") f.BoolVar(&diff.noHooks, "no-hooks", false, "disable diffing of hooks") f.BoolVar(&diff.includeTests, "include-tests", false, "enable the diffing of the helm test hooks") f.BoolVar(&diff.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output") f.IntVarP(&diff.outputContext, "context", "C", -1, "output NUM lines of context around changes") - f.StringVar(&diff.namespace, "namespace", "default", "namespace to assume the release to be installed into") + if isHelm3() { + addValueOptionsFlags(f, diff.valueOpts) + } else { + f.VarP(&diff.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") + f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") + f.StringArrayVar(&diff.stringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") + f.StringArrayVar(&diff.fileValues, "set-file", []string{}, "set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)") + f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") + f.BoolVar(&diff.resetValues, "reset-values", false, "reset the values to the ones built into the chart and merge in any new values") + f.StringVar(&diff.namespace, "namespace", "default", "namespace to assume the release to be installed into") + } addCommonCmdOptions(f) @@ -102,11 +110,6 @@ func (d *diffCmd) run() error { d.chartVersion = ">0.0.0-0" } - chartPath, err := locateChartPath(d.chart, d.chartVersion, false, "") - if err != nil { - return err - } - if err := d.valueFiles.Valid(); err != nil { return err } @@ -116,10 +119,16 @@ func (d *diffCmd) run() error { return err } - releaseResponse, err := d.client.ReleaseContent(d.release) + releaseResponse, err := d.deployedRelease(d.release) + var notDeployed string + if isHelm3() { + notDeployed = fmt.Sprintf("%q has no deployed releases", d.release) + } else { + notDeployed = fmt.Sprintf("release: %q not found", d.release) + } var newInstall bool - if err != nil && strings.Contains(err.Error(), fmt.Sprintf("release: %q not found", d.release)) { + if err != nil && strings.Contains(err.Error(), notDeployed) { if d.allowUnreleased { fmt.Printf("********************\n\n\tRelease was not present in Helm. Diff will show entire contents as new.\n\n********************\n") newInstall = true @@ -136,38 +145,113 @@ func (d *diffCmd) run() error { var currentSpecs, newSpecs map[string]*manifest.MappingResult if newInstall { - installResponse, err := d.client.InstallRelease( - chartPath, - d.namespace, - helm.ReleaseName(d.release), - helm.ValueOverrides(rawVals), - helm.InstallDryRun(true), - ) - if err != nil { - return prettyError(err) + var installResponse manifest.ReleaseResponse + if isHelm3() { + client := action.NewInstall(&d.actionConfig) + client.DryRun = true + client.ReleaseName = d.release + client.Version = d.chartVersion + vals, err := d.valueOpts.MergeValues(getter.All(settingsV3)) + if err != nil { + return err + } + chartPath, err := client.LocateChart(d.chart, settingsV3) + if err != nil { + return err + } + // Check chart dependencies to make sure all are present in /charts + chart, err := loader.Load(chartPath) + if err != nil { + return err + } + validInstallableChart, err := isChartInstallable(chart) + if !validInstallableChart { + return err + } + if req := chart.Metadata.Dependencies; req != nil { + if err := action.CheckDependencies(chart, req); err != nil { + return err + } + } + release, err := client.Run(chart, vals) + if err != nil { + return err + } + installResponse.ReleaseV3 = release + } else { + chartPath, err := locateChartPath(d.chart, d.chartVersion, false, "") + if err != nil { + return err + } + response, err := d.client.InstallRelease( + chartPath, + d.namespace, + helm.ReleaseName(d.release), + helm.ValueOverrides(rawVals), + helm.InstallDryRun(true), + ) + if err != nil { + return prettyError(err) + } + installResponse.Release = response.Release } currentSpecs = make(map[string]*manifest.MappingResult) - newSpecs = manifest.Parse(installResponse.Release.Manifest, installResponse.Release.Namespace) + newSpecs = manifest.Parse(installResponse) } else { - upgradeResponse, err := d.client.UpdateRelease( - d.release, - chartPath, - helm.UpdateValueOverrides(rawVals), - helm.ReuseValues(d.reuseValues), - helm.ResetValues(d.resetValues), - helm.UpgradeDryRun(true), - ) - if err != nil { - return prettyError(err) + var upgradeResponse manifest.ReleaseResponse + if isHelm3() { + client := action.NewUpgrade(&d.actionConfig) + client.DryRun = true + client.Version = d.chartVersion + vals, err := d.valueOpts.MergeValues(getter.All(settingsV3)) + if err != nil { + return err + } + chartPath, err := client.LocateChart(d.chart, settingsV3) + if err != nil { + return err + } + // Check chart dependencies to make sure all are present in /charts + chart, err := loader.Load(chartPath) + if err != nil { + return err + } + if req := chart.Metadata.Dependencies; req != nil { + if err := action.CheckDependencies(chart, req); err != nil { + return err + } + } + release, err := client.Run(d.release, chart, vals) + if err != nil { + return err + } + upgradeResponse.ReleaseV3 = release + } else { + chartPath, err := locateChartPath(d.chart, d.chartVersion, false, "") + if err != nil { + return err + } + response, err := d.client.UpdateRelease( + d.release, + chartPath, + helm.UpdateValueOverrides(rawVals), + helm.ReuseValues(d.reuseValues), + helm.ResetValues(d.resetValues), + helm.UpgradeDryRun(true), + ) + if err != nil { + return prettyError(err) + } + upgradeResponse.Release = response.Release } if d.noHooks { - currentSpecs = manifest.Parse(releaseResponse.Release.Manifest, releaseResponse.Release.Namespace) - newSpecs = manifest.Parse(upgradeResponse.Release.Manifest, upgradeResponse.Release.Namespace) + currentSpecs = manifest.Parse(releaseResponse) + newSpecs = manifest.Parse(upgradeResponse) } else { - currentSpecs = manifest.ParseRelease(releaseResponse.Release, d.includeTests) - newSpecs = manifest.ParseRelease(upgradeResponse.Release, d.includeTests) + currentSpecs = manifest.ParseRelease(releaseResponse, d.includeTests) + newSpecs = manifest.ParseRelease(upgradeResponse, d.includeTests) } } @@ -182,3 +266,14 @@ func (d *diffCmd) run() error { return nil } + +// isChartInstallable validates if a chart can be installed +// +// Application chart type is only installable +func isChartInstallable(ch *chart.Chart) (bool, error) { + switch ch.Metadata.Type { + case "", "application": + return true, nil + } + return false, errors.Errorf("%s charts are not installable", ch.Metadata.Type) +} diff --git a/glide.lock b/glide.lock index 592b15e3..b6e92f8d 100644 --- a/glide.lock +++ b/glide.lock @@ -1,12 +1,151 @@ -hash: 41869ddd7c45fba60173a6fcf13ef7aa202e3f2581dfebed02e4f9fd57a364be -updated: 2019-04-09T14:30:32.482000193-07:00 +hash: 91d03a19a7d91f3b8d55d136363761ba6d48e6cadda3c02bc5d042a77b0bbdb1 +updated: 2019-09-07T12:08:52.268673285+02:00 imports: - name: github.com/aryann/difflib - version: a1a4dd44eb11820695fbe83e00fb2301ee6eb54c + version: e206f873d14a916d3d26c40ab667bca123f365a3 +- name: github.com/asaskevich/govalidator + version: 7664702784775e51966f0885f5cd27435916517b +- name: github.com/Azure/go-ansiterm + version: d6e3b3328b783f23731bc4d058875b0371ff8109 + subpackages: + - winterm - name: github.com/BurntSushi/toml version: 3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005 +- name: github.com/containerd/containerd + version: 640860a042b93c26c0a33081ee02230def486f81 + subpackages: + - archive/compression + - content + - content/local + - errdefs + - filters + - images + - labels + - log + - platforms + - reference + - remotes + - remotes/docker + - remotes/docker/schema1 + - sys + - version +- name: github.com/containerd/continuity + version: 75bee3e2ccb6402e3a986ab8bd3b17003fc0fdec + subpackages: + - pathdriver +- name: github.com/cyphar/filepath-securejoin + version: a261ee33d7a517f054effbf451841abaafe3e0fd +- name: github.com/davecgh/go-spew + version: 782f4967f2dc4564575ca782fe2d04090b5faca8 + subpackages: + - spew +- name: github.com/deislabs/oras + version: 281ff98485d3c59a9692cfd7134927a33887b792 + subpackages: + - pkg/artifact + - pkg/auth + - pkg/auth/docker + - pkg/content + - pkg/context + - pkg/oras +- name: github.com/docker/cli + version: 016a3232168d01923cbc6c47d6f05d008e1c7edf + subpackages: + - cli/config + - cli/config/configfile + - cli/config/credentials + - cli/config/types +- name: github.com/docker/distribution + version: edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c + subpackages: + - context + - digestset + - reference + - registry/api/errcode + - registry/api/v2 + - registry/client + - registry/client/auth + - registry/client/auth/challenge + - registry/client/transport + - registry/storage/cache + - registry/storage/cache/memory + - uuid +- name: github.com/docker/docker + version: a9fbbdc8dd8794b20af358382ab780559bca589d + subpackages: + - api + - api/types + - api/types/blkiodev + - api/types/container + - api/types/events + - api/types/filters + - api/types/image + - api/types/mount + - api/types/network + - api/types/registry + - api/types/strslice + - api/types/swarm + - api/types/swarm/runtime + - api/types/time + - api/types/versions + - api/types/volume + - client + - daemon/logger/jsonfilelog/jsonlog + - errdefs + - pkg/homedir + - pkg/idtools + - pkg/ioutils + - pkg/jsonmessage + - pkg/longpath + - pkg/mount + - pkg/parsers + - pkg/parsers/operatingsystem + - pkg/stdcopy + - pkg/stringid + - pkg/sysinfo + - pkg/system + - pkg/tarsum + - pkg/term + - pkg/term/windows + - registry + - registry/resumable +- name: github.com/docker/docker-credential-helpers + version: f78081d1f7fef6ad74ad6b79368de6348386e591 + subpackages: + - client + - credentials +- name: github.com/docker/go-connections + version: 3ede32e2033de7505e6500d6c868c2b9ed9f169d + subpackages: + - nat + - sockets + - tlsconfig +- name: github.com/docker/go-units + version: 47565b4f722fb6ceae66b95f853feed578a4a51c +- name: github.com/docker/spdystream + version: 449fdfce4d962303d702fec724ef0ad181c92528 + subpackages: + - spdy +- name: github.com/emicklei/go-restful + version: ff4f55a206334ef123e4f79bbf348980da81ca46 + subpackages: + - log +- name: github.com/evanphx/json-patch + version: 5858425f75500d40c52783dce87d085a483ce135 +- name: github.com/exponent-io/jsonpath + version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5 +- name: github.com/fatih/color + version: 3f9d52f7176a6927daacff70a3e8d1dc2025c53e - name: github.com/ghodss/yaml - version: 73d445a93680fa1a78ae23a5839bad48f32ba1ee + version: c7ce16629ff4cd059ed96ed06419dd3856fd3577 +- name: github.com/go-openapi/jsonpointer + version: ef5f0afec364d3b9396b7b77b43dbe26bf1f8004 +- name: github.com/go-openapi/jsonreference + version: 8483a886a90412cd6858df4ea3483dce9c8e35a3 +- name: github.com/go-openapi/spec + version: 5bae59e25b21498baea7f9d46e9c147ec106a42e +- name: github.com/go-openapi/swag + version: 5899d5c5e619fda5fa86e14795a835f473ca284c - name: github.com/gobwas/glob version: 5ccd90ef52e1e632236f7326478d4faa74f99438 subpackages: @@ -17,6 +156,15 @@ imports: - syntax/lexer - util/runes - util/strings +- name: github.com/gogo/protobuf + version: 342cbe0a04158f6dcb03ca0079991a51a4248c02 + subpackages: + - proto + - sortkeys +- name: github.com/golang/groupcache + version: 02826c3e79038b59d737d3b1c0a1d937f71a4433 + subpackages: + - lru - name: github.com/golang/protobuf version: b4deda0973fb4c70b50d226b1af49f3da59f5265 subpackages: @@ -25,34 +173,152 @@ imports: - ptypes/any - ptypes/duration - ptypes/timestamp +- name: github.com/google/btree + version: 7d79101e329e5a3adf994758c578dab82b90c017 +- name: github.com/google/gofuzz + version: 24818f796faf91cd76ec7bddd72458fbced7a6c1 - name: github.com/google/uuid version: 064e2069ce9c359c118179501254f67d7d37ba24 +- name: github.com/googleapis/gnostic + version: 0c5108395e2debce0d731cf0287ddf7242066aba + subpackages: + - OpenAPIv2 + - compiler + - extensions +- name: github.com/gorilla/mux + version: 884b5ffcbd3a11b730f0b75f5c86ac408753c34d +- name: github.com/gosuri/uitable + version: 2cf933346b8370a3a3d8867ef5cf54b2129d8ecf + subpackages: + - util/strutil + - util/wordwrap +- name: github.com/gregjones/httpcache + version: 787624de3eb7bd915c329cba748687a3b22666a6 + subpackages: + - diskcache +- name: github.com/hashicorp/golang-lru + version: 20f1fb78b0740ba8c3cb143a61e86ba5c8669768 + subpackages: + - simplelru - name: github.com/huandu/xstrings version: f02667b379e2fb5916c3cda2cf31e0eb885d79f8 - name: github.com/imdario/mergo - version: 7c29201646fa3de8506f701213473dd407f19646 + version: 9316a62528ac99aaecb4e47eadd6dc8aa6533d58 - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 +- name: github.com/json-iterator/go + version: ab8a2e0c74be9d3be70b3184d9acc634935ded82 +- name: github.com/konsorten/go-windows-terminal-sequences + version: 5c8c8bd35d3832f5d134ae1e1e375b69a4d25242 +- name: github.com/mailru/easyjson + version: 2f5df55504ebc322e4d52d34df6a1f5b503bf26d + subpackages: + - buffer + - jlexer + - jwriter +- name: github.com/MakeNowJust/heredoc + version: bb23615498cded5e105af4ce27de75b089cbe851 - name: github.com/Masterminds/goutils version: 41ac8693c5c10a92ea1ff5ac3a7f95646f6123b0 - name: github.com/Masterminds/semver version: 517734cc7d6470c0d07130e40fd40bdeb9bcd3fd - name: github.com/Masterminds/sprig - version: 9f8fceff796fb9f4e992cd2bece016be0121ab74 + version: 258b00ffa7318e8b109a141349980ffbd30a35db - name: github.com/mattn/go-colorable - version: ded68f7a9561c023e790de24279db7ebf473ea80 + version: 388941e3ea99c461d2bc2747eaf27741b6dda096 - name: github.com/mattn/go-isatty - version: fc9e8d8ef48496124e79ae0df75490096eccf6fe + version: bf9a1dea1961e1d831824fb135332bfb8c10e8b8 +- name: github.com/mattn/go-runewidth + version: 703b5e6b11ae25aeb2af9ebb5d5fdf8fa2575211 - name: github.com/mgutz/ansi version: 9520e82c474b0a04dd04f8a40959027271bab992 +- name: github.com/Microsoft/go-winio + version: 97e4973ce50b2ff5f09635a57e2b88a037aae829 +- name: github.com/Microsoft/hcsshim + version: 69ac8d3f7fc10a0623f3a2655958a1a5bb71f58f + subpackages: + - hcn + - internal/cni + - internal/guestrequest + - internal/guid + - internal/hcs + - internal/hcserror + - internal/hns + - internal/interop + - internal/logfields + - internal/longpath + - internal/mergemaps + - internal/regstate + - internal/runhcs + - internal/safefile + - internal/schema1 + - internal/schema2 + - internal/timeout + - internal/wclayer +- name: github.com/mitchellh/go-wordwrap + version: ad45545899c7b13c020ea92b2072220eefad42b8 +- name: github.com/modern-go/concurrent + version: bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 +- name: github.com/modern-go/reflect2 + version: 94122c33edd36123c84d5368cfb2b69df93a0ec8 +- name: github.com/Nvveen/Gotty + version: cd527374f1e5bff4938207604a14f2e38a9cf512 +- name: github.com/opencontainers/go-digest + version: a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb +- name: github.com/opencontainers/image-spec + version: 372ad780f63454fbbbbcc7cf80e5b90245c13e13 + subpackages: + - specs-go + - specs-go/v1 +- name: github.com/opencontainers/runc + version: f000fe11ece1b79f744edd9c8e1a53ba0f5e0f24 + subpackages: + - libcontainer + - libcontainer/apparmor + - libcontainer/cgroups + - libcontainer/cgroups/fs + - libcontainer/cgroups/systemd + - libcontainer/configs + - libcontainer/configs/validate + - libcontainer/criurpc + - libcontainer/intelrdt + - libcontainer/keys + - libcontainer/mount + - libcontainer/seccomp + - libcontainer/stacktrace + - libcontainer/system + - libcontainer/user + - libcontainer/utils +- name: github.com/peterbourgon/diskv + version: 5f041e8faa004a95c88a202771f4cc3e991971e6 +- name: github.com/pkg/errors + version: 27936f6d90f9c8e1145f11ed52ffffbfdb9e0af7 +- name: github.com/PuerkitoBio/purell + version: 8a290539e2e8629dbc4e6bad948158f790ec31f4 +- name: github.com/PuerkitoBio/urlesc + version: 5bd2802263f21d8788851d5305584c82a5c75d7e +- name: github.com/russross/blackfriday + version: 300106c228d52c8941d4b3de6054a6062a86dda3 +- name: github.com/shurcooL/sanitized_anchor_name + version: 10ef21a441db47d8b13ebcc5fd2310f636973c77 +- name: github.com/sirupsen/logrus + version: 839c75faf7f98a33d445d181f3018b5c3409a45e - name: github.com/spf13/cobra version: 615425954c3b0d9485a7027d4d451fdcdfdee84e - name: github.com/spf13/pflag version: 583c0c0531f06d5278b7d917446061adc344b5cd +- name: github.com/xeipuuv/gojsonpointer + version: 02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb +- name: github.com/xeipuuv/gojsonreference + version: bd5ef7bd5415a7ac448318e64f11a24cd21e594b +- name: github.com/xeipuuv/gojsonschema + version: be0936907f66b716b8a0410d12dcaf72070a5fc7 - name: golang.org/x/crypto - version: 49796115aa4b964c318aad4f3084fdb41e9aa067 + version: de0752318171da717af4ce24d0a2e8626afaeb11 subpackages: - cast5 + - ed25519 + - ed25519/internal/edwards25519 - openpgp - openpgp/armor - openpgp/clearsign @@ -64,65 +330,359 @@ imports: - scrypt - ssh/terminal - name: golang.org/x/net - version: 1c05540f6879653db88113bc4a2b70aec4bd491f + version: 65e2d4e15006aab9813ff8769e768bbf4bb667a0 subpackages: - context + - context/ctxhttp + - http/httpguts - http2 - http2/hpack - idna + - internal/socks - internal/timeseries - - lex/httplex + - proxy - trace +- name: golang.org/x/oauth2 + version: a6bd8cefa1811bd24b86f8902872e4e8225f74c4 + subpackages: + - internal +- name: golang.org/x/sync + version: 42b317875d0fa942474b76e1b46a6060d720ae6e + subpackages: + - errgroup + - semaphore - name: golang.org/x/sys - version: 95c6576299259db960f6c5b9b69ea52422860fce + version: b90733256f2e882e81d52f9126de08df5615afd9 subpackages: - unix - windows - name: golang.org/x/text version: b19bf474d317b857955b12035d2c5acb57ce8b01 subpackages: + - cases + - encoding + - encoding/internal + - encoding/internal/identifier + - encoding/unicode + - internal + - internal/tag + - internal/utf8internal + - language + - runes - secure/bidirule + - secure/precis - transform - unicode/bidi - unicode/norm + - width +- name: golang.org/x/time + version: f51c12702a4d776e4c1fa9b0fabab841babae631 + subpackages: + - rate +- name: google.golang.org/appengine + version: 54a98f90d1c46b7731eb8fb305d2a321c30ef610 + subpackages: + - internal + - internal/base + - internal/datastore + - internal/log + - internal/remote_api + - internal/urlfetch + - urlfetch - name: google.golang.org/genproto - version: d831d65fe17df2e52bcc4316d4a9f7a418701f43 + version: e7d98fc518a78c9f8b5ee77be7b0b317475d89e1 subpackages: - googleapis/rpc/status - name: google.golang.org/grpc - version: 5ffe3083946d5603a0578721101dc8165b1d5b5f + version: a02b0774206b209466313a0b525d2c738fe407eb subpackages: - balancer + - balancer/base + - balancer/roundrobin + - binarylog/grpc_binarylog_v1 - codes - connectivity - credentials - - grpclb/grpc_lb_v1/messages + - credentials/internal + - encoding + - encoding/proto - grpclog - health/grpc_health_v1 - internal + - internal/backoff + - internal/binarylog + - internal/channelz + - internal/envconfig + - internal/grpcrand + - internal/grpcsync + - internal/syscall + - internal/transport - keepalive - metadata - naming - peer - resolver + - resolver/dns + - resolver/passthrough - stats - status - tap - - transport +- name: gopkg.in/inf.v0 + version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4 +- name: gopkg.in/square/go-jose.v2 + version: 89060dee6a84df9a4dae49f676f0c755037834f1 + subpackages: + - cipher + - json + - jwt - name: gopkg.in/yaml.v2 - version: 53feefa2559fb8dfa8d81baad31be332c97d6c77 + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 +- name: helm.sh/helm + version: 5cb923eecbe80d1ad76399aee234717c11931d9a + subpackages: + - internal/experimental/registry + - internal/ignore + - internal/resolver + - internal/sympath + - internal/tlsutil + - internal/urlutil + - internal/version + - pkg/action + - pkg/chart + - pkg/chart/loader + - pkg/chartutil + - pkg/cli + - pkg/downloader + - pkg/engine + - pkg/getter + - pkg/helmpath + - pkg/helmpath/xdg + - pkg/kube + - pkg/kube/fake + - pkg/lint + - pkg/lint/rules + - pkg/lint/support + - pkg/plugin + - pkg/provenance + - pkg/release + - pkg/releaseutil + - pkg/repo + - pkg/storage + - pkg/storage/driver - name: k8s.io/api - version: 2d6f90ab1293a1fb871cf149423ebb72aa7423aa + version: 6e4e0e4f393bf5e8bbff570acd13217aa5a770cd + subpackages: + - admission/v1beta1 + - admissionregistration/v1beta1 + - apps/v1 + - apps/v1beta1 + - apps/v1beta2 + - auditregistration/v1alpha1 + - authentication/v1 + - authentication/v1beta1 + - authorization/v1 + - authorization/v1beta1 + - autoscaling/v1 + - autoscaling/v2beta1 + - autoscaling/v2beta2 + - batch/v1 + - batch/v1beta1 + - batch/v2alpha1 + - certificates/v1beta1 + - coordination/v1 + - coordination/v1beta1 + - core/v1 + - events/v1beta1 + - extensions/v1beta1 + - imagepolicy/v1alpha1 + - networking/v1 + - networking/v1beta1 + - node/v1alpha1 + - node/v1beta1 + - policy/v1beta1 + - rbac/v1 + - rbac/v1alpha1 + - rbac/v1beta1 + - scheduling/v1 + - scheduling/v1alpha1 + - scheduling/v1beta1 + - settings/v1alpha1 + - storage/v1 + - storage/v1alpha1 + - storage/v1beta1 +- name: k8s.io/apiextensions-apiserver + version: 727a075fdec8319bf095330e344b3ccc668abc73 + subpackages: + - pkg/apis/apiextensions + - pkg/apis/apiextensions/v1beta1 + - pkg/features - name: k8s.io/apimachinery - version: 103fd098999dc9c0c88536f5c9ad2e5da39373ae + version: 6a84e37a896db9780c75367af8d2ed2bb944022e subpackages: + - pkg/api/equality + - pkg/api/errors + - pkg/api/meta + - pkg/api/resource + - pkg/api/validation + - pkg/apis/meta/internalversion + - pkg/apis/meta/v1 + - pkg/apis/meta/v1/unstructured + - pkg/apis/meta/v1/unstructured/unstructuredscheme + - pkg/apis/meta/v1/validation + - pkg/apis/meta/v1beta1 + - pkg/conversion + - pkg/conversion/queryparams + - pkg/fields + - pkg/labels + - pkg/runtime + - pkg/runtime/schema + - pkg/runtime/serializer + - pkg/runtime/serializer/json + - pkg/runtime/serializer/protobuf + - pkg/runtime/serializer/recognizer + - pkg/runtime/serializer/streaming + - pkg/runtime/serializer/versioning + - pkg/selection + - pkg/types + - pkg/util/cache + - pkg/util/clock + - pkg/util/diff + - pkg/util/errors + - pkg/util/framer + - pkg/util/httpstream + - pkg/util/httpstream/spdy + - pkg/util/intstr + - pkg/util/json + - pkg/util/mergepatch + - pkg/util/naming + - pkg/util/net + - pkg/util/rand + - pkg/util/remotecommand + - pkg/util/runtime + - pkg/util/sets + - pkg/util/strategicpatch + - pkg/util/validation + - pkg/util/validation/field + - pkg/util/wait + - pkg/util/yaml - pkg/version + - pkg/watch + - third_party/forked/golang/json + - third_party/forked/golang/netutil + - third_party/forked/golang/reflect +- name: k8s.io/apiserver + version: 1ec86e4da56ce0573788fc12bb3a5530600c0e5d + subpackages: + - pkg/authentication/authenticator + - pkg/authentication/serviceaccount + - pkg/authentication/user + - pkg/features + - pkg/util/feature +- name: k8s.io/cli-runtime + version: d644b00f3b79346b7627329269bb25f2135f941c + subpackages: + - pkg/genericclioptions + - pkg/kustomize + - pkg/kustomize/k8sdeps + - pkg/kustomize/k8sdeps/configmapandsecret + - pkg/kustomize/k8sdeps/kunstruct + - pkg/kustomize/k8sdeps/kv + - pkg/kustomize/k8sdeps/transformer + - pkg/kustomize/k8sdeps/transformer/hash + - pkg/kustomize/k8sdeps/transformer/patch + - pkg/kustomize/k8sdeps/validator + - pkg/printers + - pkg/resource - name: k8s.io/client-go - version: 59698c7d9724b0f95f9dc9e7f7dfdcc3dfeceb82 + version: 1a26190bd76a9017e289958b9fba936430aa3704 subpackages: + - discovery + - discovery/cached/disk + - dynamic + - kubernetes + - kubernetes/scheme + - kubernetes/typed/admissionregistration/v1beta1 + - kubernetes/typed/apps/v1 + - kubernetes/typed/apps/v1beta1 + - kubernetes/typed/apps/v1beta2 + - kubernetes/typed/auditregistration/v1alpha1 + - kubernetes/typed/authentication/v1 + - kubernetes/typed/authentication/v1beta1 + - kubernetes/typed/authorization/v1 + - kubernetes/typed/authorization/v1beta1 + - kubernetes/typed/autoscaling/v1 + - kubernetes/typed/autoscaling/v2beta1 + - kubernetes/typed/autoscaling/v2beta2 + - kubernetes/typed/batch/v1 + - kubernetes/typed/batch/v1beta1 + - kubernetes/typed/batch/v2alpha1 + - kubernetes/typed/certificates/v1beta1 + - kubernetes/typed/coordination/v1 + - kubernetes/typed/coordination/v1beta1 + - kubernetes/typed/core/v1 + - kubernetes/typed/events/v1beta1 + - kubernetes/typed/extensions/v1beta1 + - kubernetes/typed/networking/v1 + - kubernetes/typed/networking/v1beta1 + - kubernetes/typed/node/v1alpha1 + - kubernetes/typed/node/v1beta1 + - kubernetes/typed/policy/v1beta1 + - kubernetes/typed/rbac/v1 + - kubernetes/typed/rbac/v1alpha1 + - kubernetes/typed/rbac/v1beta1 + - kubernetes/typed/scheduling/v1 + - kubernetes/typed/scheduling/v1alpha1 + - kubernetes/typed/scheduling/v1beta1 + - kubernetes/typed/settings/v1alpha1 + - kubernetes/typed/storage/v1 + - kubernetes/typed/storage/v1alpha1 + - kubernetes/typed/storage/v1beta1 + - pkg/apis/clientauthentication + - pkg/apis/clientauthentication/v1alpha1 + - pkg/apis/clientauthentication/v1beta1 + - pkg/version + - plugin/pkg/client/auth/exec + - rest + - rest/watch + - restmapper + - scale + - scale/scheme + - scale/scheme/appsint + - scale/scheme/appsv1beta1 + - scale/scheme/appsv1beta2 + - scale/scheme/autoscalingv1 + - scale/scheme/extensionsint + - scale/scheme/extensionsv1beta1 + - third_party/forked/golang/template + - tools/auth + - tools/cache + - tools/clientcmd + - tools/clientcmd/api + - tools/clientcmd/api/latest + - tools/clientcmd/api/v1 + - tools/metrics + - tools/pager + - tools/record + - tools/record/util + - tools/reference + - tools/remotecommand + - tools/watch + - transport + - transport/spdy + - util/cert + - util/connrotation + - util/exec + - util/flowcontrol - util/homedir + - util/jsonpath + - util/keyutil + - util/retry +- name: k8s.io/cloud-provider + version: 1bc0c81fa51dbc42d811a06f0622c1751c7085ae + subpackages: + - features - name: k8s.io/helm - version: 2e55dbe1fdb5fdb96b75ff144a339489417b146b + version: 05811b84a3f93603dd6c2fcfe57944dfa7ab7fd0 subpackages: - pkg/chartutil - pkg/downloader @@ -149,17 +709,96 @@ imports: - pkg/tlsutil - pkg/urlutil - pkg/version -testImports: -- name: github.com/davecgh/go-spew - version: 782f4967f2dc4564575ca782fe2d04090b5faca8 +- name: k8s.io/klog + version: 8e90cee79f823779174776412c13478955131846 +- name: k8s.io/kube-openapi + version: b3a7cee44a305be0a69e1b9ac03018307287e1b0 subpackages: - - spew + - pkg/common + - pkg/util/proto + - pkg/util/proto/validation +- name: k8s.io/kubernetes + version: b7394102d6ef778017f2ca4046abbaa23b88c290 + subpackages: + - pkg/api/legacyscheme + - pkg/api/service + - pkg/api/v1/pod + - pkg/apis/apps + - pkg/apis/autoscaling + - pkg/apis/core + - pkg/apis/core/helper + - pkg/apis/core/install + - pkg/apis/core/pods + - pkg/apis/core/v1 + - pkg/apis/core/v1/helper + - pkg/apis/core/validation + - pkg/apis/scheduling + - pkg/capabilities + - pkg/controller + - pkg/controller/deployment/util + - pkg/features + - pkg/fieldpath + - pkg/kubectl/cmd/util + - pkg/kubectl/cmd/util/openapi + - pkg/kubectl/cmd/util/openapi/validation + - pkg/kubectl/scheme + - pkg/kubectl/util/templates + - pkg/kubectl/util/term + - pkg/kubectl/validation + - pkg/kubelet/types + - pkg/master/ports + - pkg/security/apparmor + - pkg/serviceaccount + - pkg/util/hash + - pkg/util/interrupt + - pkg/util/labels + - pkg/util/parsers + - pkg/util/taints + - pkg/version +- name: k8s.io/utils + version: c2654d5206da6b7b6ace12841e8f359bb89b443c + subpackages: + - buffer + - exec + - integer + - net + - path + - pointer + - trace +- name: sigs.k8s.io/kustomize + version: a6f65144121d1955266b0cd836ce954c04122dc8 + subpackages: + - pkg/commands/build + - pkg/constants + - pkg/expansion + - pkg/factory + - pkg/fs + - pkg/git + - pkg/gvk + - pkg/ifc + - pkg/ifc/transformer + - pkg/image + - pkg/internal/error + - pkg/loader + - pkg/patch + - pkg/patch/transformer + - pkg/resid + - pkg/resmap + - pkg/resource + - pkg/target + - pkg/transformers + - pkg/transformers/config + - pkg/transformers/config/defaultconfig + - pkg/types +- name: sigs.k8s.io/yaml + version: fd68e9863619f6ec2fdd8625fe1f02e7c877e480 +testImports: - name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + version: 5d4384ee4fb2527b0a1256a821ebfc92f91efefc subpackages: - difflib - name: github.com/stretchr/testify - version: ffdc059bfe9ce6a4e144ba849dbedead332c6053 + version: 221dbe5ed46703ee255b1da0dec05086f5035f62 subpackages: - assert - require diff --git a/glide.yaml b/glide.yaml index 5f26fd2f..08cf489d 100644 --- a/glide.yaml +++ b/glide.yaml @@ -5,16 +5,28 @@ import: - package: github.com/spf13/pflag version: 583c0c0531f06d5278b7d917446061adc344b5cd - package: k8s.io/helm - version: v2.11.0 + version: v2.14.0 +- package: helm.sh/helm + version: v3.0.0-beta.3 +- package: k8s.io/client-go + version: kubernetes-1.14.1 +- package: k8s.io/kubernetes + version: v1.14.1 +- package: k8s.io/cli-runtime + version: kubernetes-1.14.1 +- package: k8s.io/cloud-provider + version: kubernetes-1.14.1 +- package: github.com/containerd/containerd + version: v1.3.0-beta.2 #taken from k8s.io/helm glide.yaml - package: k8s.io/api - version: kubernetes-1.11.1 + version: kubernetes-1.14.1 - package: k8s.io/apimachinery - version: kubernetes-1.11.1 + version: kubernetes-1.14.1 - package: google.golang.org/grpc - version: 1.7.2 -- package: golang.org/x/net - version: 1c05540f6879653db88113bc4a2b70aec4bd491f + version: 1.18.0 +- package: golang.org/x/sys + version: b90733256f2e882e81d52f9126de08df5615afd9 testImport: - package: github.com/stretchr/testify version: ^1.2.2 diff --git a/manifest/parse.go b/manifest/parse.go index a2287c86..19ce6d2f 100644 --- a/manifest/parse.go +++ b/manifest/parse.go @@ -8,6 +8,7 @@ import ( "strings" yaml "gopkg.in/yaml.v2" + rspb "helm.sh/helm/pkg/release" "k8s.io/helm/pkg/proto/hapi/release" ) @@ -63,7 +64,14 @@ func splitSpec(token string) (string, string) { } // ParseRelease parses release objects into MappingResult -func ParseRelease(release *release.Release, includeTests bool) map[string]*MappingResult { +func ParseRelease(release ReleaseResponse, includeTests bool) map[string]*MappingResult { + if release.Release == nil { + return parseReleaseV3(release.ReleaseV3, includeTests) + } + return parseReleaseV2(release.Release, includeTests) +} + +func parseReleaseV2(release *release.Release, includeTests bool) map[string]*MappingResult { manifest := release.Manifest for _, hook := range release.Hooks { if !includeTests && isTestHook(hook.Events) { @@ -74,11 +82,32 @@ func ParseRelease(release *release.Release, includeTests bool) map[string]*Mappi manifest += fmt.Sprintf("# Source: %s\n", hook.Path) manifest += hook.Manifest } - return Parse(manifest, release.Namespace) + return parse(manifest, release.Namespace) +} + +func parseReleaseV3(release *rspb.Release, includeTests bool) map[string]*MappingResult { + manifest := release.Manifest + for _, hook := range release.Hooks { + if !includeTests && isTestHookV3(hook.Events) { + continue + } + + manifest += "\n---\n" + manifest += fmt.Sprintf("# Source: %s\n", hook.Path) + manifest += hook.Manifest + } + return parse(manifest, release.Namespace) } // Parse parses manifest strings into MappingResult -func Parse(manifest string, defaultNamespace string) map[string]*MappingResult { +func Parse(release ReleaseResponse) map[string]*MappingResult { + if release.Release == nil { + return parse(release.ReleaseV3.Manifest, release.ReleaseV3.Namespace) + } + return parse(release.Release.Manifest, release.Release.Namespace) +} + +func parse(manifest string, defaultNamespace string) map[string]*MappingResult { scanner := bufio.NewScanner(strings.NewReader(manifest)) scanner.Split(scanYamlSpecs) //Allow for tokens (specs) up to 1M in size @@ -133,3 +162,13 @@ func isTestHook(hookEvents []release.Hook_Event) bool { return false } + +func isTestHookV3(hookEvents []rspb.HookEvent) bool { + for _, event := range hookEvents { + if event == rspb.HookTest { + return true + } + } + + return false +} diff --git a/manifest/parse_test.go b/manifest/parse_test.go index 9c4cb3cf..60a272dd 100644 --- a/manifest/parse_test.go +++ b/manifest/parse_test.go @@ -6,6 +6,8 @@ import ( "testing" "github.com/stretchr/testify/require" + rspb "helm.sh/helm/pkg/release" + rel "k8s.io/helm/pkg/proto/hapi/release" . "github.com/databus23/helm-diff/manifest" ) @@ -19,13 +21,25 @@ func foundObjects(result map[string]*MappingResult) []string { return objs } +func releaseV2(manifest string, namespace string) ReleaseResponse { + return ReleaseResponse{Release: &rel.Release{Manifest: manifest, Namespace: namespace}} +} + +func releaseV3(manifest string, namespace string) ReleaseResponse { + return ReleaseResponse{ReleaseV3: &rspb.Release{Manifest: manifest, Namespace: namespace}} +} + func TestPod(t *testing.T) { spec, err := ioutil.ReadFile("testdata/pod.yaml") require.NoError(t, err) require.Equal(t, []string{"default, nginx, Pod (v1)"}, - foundObjects(Parse(string(spec), "default")), + foundObjects(Parse(releaseV2(string(spec), "default"))), + ) + require.Equal(t, + []string{"default, nginx, Pod (v1)"}, + foundObjects(Parse(releaseV3(string(spec), "default"))), ) } @@ -35,7 +49,11 @@ func TestPodNamespace(t *testing.T) { require.Equal(t, []string{"batcave, nginx, Pod (v1)"}, - foundObjects(Parse(string(spec), "default")), + foundObjects(Parse(releaseV2(string(spec), "default"))), + ) + require.Equal(t, + []string{"batcave, nginx, Pod (v1)"}, + foundObjects(Parse(releaseV3(string(spec), "default"))), ) } @@ -45,7 +63,11 @@ func TestDeployV1(t *testing.T) { require.Equal(t, []string{"default, nginx, Deployment (apps)"}, - foundObjects(Parse(string(spec), "default")), + foundObjects(Parse(releaseV2(string(spec), "default"))), + ) + require.Equal(t, + []string{"default, nginx, Deployment (apps)"}, + foundObjects(Parse(releaseV3(string(spec), "default"))), ) } @@ -55,7 +77,11 @@ func TestDeployV1Beta1(t *testing.T) { require.Equal(t, []string{"default, nginx, Deployment (apps)"}, - foundObjects(Parse(string(spec), "default")), + foundObjects(Parse(releaseV2(string(spec), "default"))), + ) + require.Equal(t, + []string{"default, nginx, Deployment (apps)"}, + foundObjects(Parse(releaseV3(string(spec), "default"))), ) } @@ -65,6 +91,10 @@ func TestEmpty(t *testing.T) { require.Equal(t, []string{}, - foundObjects(Parse(string(spec), "default")), + foundObjects(Parse(releaseV2(string(spec), "default"))), + ) + require.Equal(t, + []string{}, + foundObjects(Parse(releaseV3(string(spec), "default"))), ) } diff --git a/manifest/release.go b/manifest/release.go new file mode 100644 index 00000000..87f8974e --- /dev/null +++ b/manifest/release.go @@ -0,0 +1,20 @@ +package manifest + +import ( + rspb "helm.sh/helm/pkg/release" + rel "k8s.io/helm/pkg/proto/hapi/release" +) + +// ReleaseResponse represents a deployed release revision +type ReleaseResponse struct { + Release *rel.Release + ReleaseV3 *rspb.Release +} + +// ChartName returns the chart name +func (release ReleaseResponse) ChartName() string { + if release.Release == nil { + return release.ReleaseV3.Chart.Metadata.Name + } + return release.Release.Chart.Metadata.Name +}