From fbe80437a499e6b5c7301588522b03dde593ce10 Mon Sep 17 00:00:00 2001 From: Justin Scott Date: Tue, 9 Jan 2018 00:51:03 -0800 Subject: [PATCH 001/483] fix(helm): fix importValues warnings from disabled charts ImportValues incorrectly processes charts that should be disabled. This patch excludes those charts. Closes #2620 --- pkg/chartutil/requirements.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index ce761a6fc65..546160b0c06 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -394,6 +394,21 @@ func processImportValues(c *chart.Chart) error { b := make(map[string]interface{}, 0) // import values from each dependency if specified in import-values for _, r := range reqs.Dependencies { + // only process raw requirement that is found in chart's dependencies (enabled) + found := false + name := r.Name + for _, v := range c.Dependencies { + if v.Metadata.Name == r.Name { + found = true + } + if v.Metadata.Name == r.Alias { + found = true + name = r.Alias + } + } + if !found { + continue + } if len(r.ImportValues) > 0 { var outiv []interface{} for _, riv := range r.ImportValues { @@ -404,7 +419,7 @@ func processImportValues(c *chart.Chart) error { "parent": iv["parent"].(string), } outiv = append(outiv, nm) - s := r.Name + "." + nm["child"] + s := name + "." + nm["child"] // get child table vv, err := cvals.Table(s) if err != nil { @@ -420,7 +435,7 @@ func processImportValues(c *chart.Chart) error { "parent": ".", } outiv = append(outiv, nm) - s := r.Name + "." + nm["child"] + s := name + "." + nm["child"] vm, err := cvals.Table(s) if err != nil { log.Printf("Warning: ImportValues missing table: %v", err) From af80059b45804a3c9eb51b98f2bb8eded091d677 Mon Sep 17 00:00:00 2001 From: ryane Date: Wed, 21 Feb 2018 16:27:50 -0500 Subject: [PATCH 002/483] fix(helm): add service, secret manifests in `init -o` When `helm init -o yaml|json` is run, the service and optional secret manifests will be included in the output. The manifests are included in a Kubernetes [List](https://godoc.org/k8s.io/apimachinery/pkg/apis/meta/v1#List) object. This also includes some refactoring and consolidates how manifests are output in `--dry-run` and removes some unnecessary marshaling between Kubernetes objects and strings. Fixes #3145 --- cmd/helm/init.go | 65 +++------------------- cmd/helm/init_test.go | 16 +++--- cmd/helm/installer/install.go | 89 ++++++++++++++++++++---------- cmd/helm/installer/install_test.go | 84 +++++++++++----------------- 4 files changed, 109 insertions(+), 145 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index c8753874f57..91441ab5301 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -176,58 +176,29 @@ func (i *initCmd) run() error { i.opts.ServiceAccount = i.serviceAccount i.opts.MaxHistory = i.maxHistory - writeYAMLManifest := func(apiVersion, kind, body string, first, last bool) error { - w := i.out - if !first { - // YAML starting document boundary marker - if _, err := fmt.Fprintln(w, "---"); err != nil { - return err - } - } - if _, err := fmt.Fprintln(w, "apiVersion:", apiVersion); err != nil { - return err - } - if _, err := fmt.Fprintln(w, "kind:", kind); err != nil { - return err - } - if _, err := fmt.Fprint(w, body); err != nil { - return err - } - if !last { - return nil - } - // YAML ending document boundary marker - _, err := fmt.Fprintln(w, "...") - return err - } if len(i.opts.Output) > 0 { - var body string + var body []byte var err error - const tm = `{"apiVersion":"extensions/v1beta1","kind":"Deployment",` - if body, err = installer.DeploymentManifest(&i.opts); err != nil { + if body, err = installer.TillerManifests(&i.opts); err != nil { return err } switch i.opts.Output.String() { case "json": var out bytes.Buffer - jsonb, err := yaml.ToJSON([]byte(body)) + jsonb, err := yaml.ToJSON(body) if err != nil { return err } - buf := bytes.NewBuffer(make([]byte, 0, len(tm)+len(jsonb)-1)) - buf.WriteString(tm) - // Drop the opening object delimiter ('{'). - buf.Write(jsonb[1:]) + buf := bytes.NewBuffer(jsonb) if err := json.Indent(&out, buf.Bytes(), "", " "); err != nil { return err } if _, err = i.out.Write(out.Bytes()); err != nil { return err } - return nil case "yaml": - if err := writeYAMLManifest("extensions/v1beta1", "Deployment", body, true, false); err != nil { + if _, err = i.out.Write(body); err != nil { return err } return nil @@ -236,35 +207,17 @@ func (i *initCmd) run() error { } } if settings.Debug { - - var body string + var body []byte var err error - // write Deployment manifest - if body, err = installer.DeploymentManifest(&i.opts); err != nil { - return err - } - if err := writeYAMLManifest("extensions/v1beta1", "Deployment", body, true, false); err != nil { + // write Tiller manifests + if body, err = installer.TillerManifests(&i.opts); err != nil { return err } - // write Service manifest - if body, err = installer.ServiceManifest(i.namespace); err != nil { - return err - } - if err := writeYAMLManifest("v1", "Service", body, false, !i.opts.EnableTLS); err != nil { + if _, err = i.out.Write(body); err != nil { return err } - - // write Secret manifest - if i.opts.EnableTLS { - if body, err = installer.SecretManifest(&i.opts); err != nil { - return err - } - if err := writeYAMLManifest("v1", "Secret", body, false, true); err != nil { - return err - } - } } if i.dryRun { diff --git a/cmd/helm/init_test.go b/cmd/helm/init_test.go index 4513315b760..269b0b09a6a 100644 --- a/cmd/helm/init_test.go +++ b/cmd/helm/init_test.go @@ -167,15 +167,13 @@ func TestInitCmd_dryRun(t *testing.T) { t.Errorf("expected no server calls, got %d", got) } - docs := bytes.Split(buf.Bytes(), []byte("\n---")) - if got, want := len(docs), 2; got != want { - t.Fatalf("Expected document count of %d, got %d", want, got) - } - for _, doc := range docs { - var y map[string]interface{} - if err := yaml.Unmarshal(doc, &y); err != nil { - t.Errorf("Expected parseable YAML, got %q\n\t%s", doc, err) - } + list := &metav1.List{} + if err := yaml.Unmarshal(buf.Bytes(), &list); err != nil { + t.Errorf("Expected parseable List, got %q\n\t%s", buf.String(), err) + } + + if got, want := len(list.Items), 2; got != want { + t.Fatalf("Expected resource count of %d, got %d", want, got) } } diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 230c7b39be3..720a18522d8 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -27,7 +27,9 @@ import ( "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" + meta "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/kubernetes" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" @@ -104,7 +106,7 @@ func semverCompare(image string) int { // createDeployment creates the Tiller Deployment resource. func createDeployment(client extensionsclient.DeploymentsGetter, opts *Options) error { - obj, err := deployment(opts) + obj, err := generateDeployment(opts) if err != nil { return err } @@ -113,40 +115,66 @@ func createDeployment(client extensionsclient.DeploymentsGetter, opts *Options) } -// deployment gets the deployment object that installs Tiller. -func deployment(opts *Options) (*v1beta1.Deployment, error) { - return generateDeployment(opts) +// Deployment gets the deployment object that installs Tiller. +func Deployment(opts *Options) (*v1beta1.Deployment, error) { + dep, err := generateDeployment(opts) + if err != nil { + return nil, err + } + dep.TypeMeta = metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "extensions/v1beta1", + } + return dep, nil } // createService creates the Tiller service resource func createService(client corev1.ServicesGetter, namespace string) error { - obj := service(namespace) + obj := generateService(namespace) _, err := client.Services(obj.Namespace).Create(obj) return err } -// service gets the service object that installs Tiller. -func service(namespace string) *v1.Service { - return generateService(namespace) +// Service gets the service object that installs Tiller. +func Service(namespace string) *v1.Service { + svc := generateService(namespace) + svc.TypeMeta = metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + } + return svc } -// DeploymentManifest gets the manifest (as a string) that describes the Tiller Deployment -// resource. -func DeploymentManifest(opts *Options) (string, error) { - obj, err := deployment(opts) +// TillerManifests gets the Deployment, Service, and Secret (if tls-enabled) manifests +func TillerManifests(opts *Options) ([]byte, error) { + dep, err := Deployment(opts) if err != nil { - return "", err + return []byte{}, err } - buf, err := yaml.Marshal(obj) - return string(buf), err -} -// ServiceManifest gets the manifest (as a string) that describes the Tiller Service -// resource. -func ServiceManifest(namespace string) (string, error) { - obj := service(namespace) - buf, err := yaml.Marshal(obj) - return string(buf), err + svc := Service(opts.Namespace) + + objs := []runtime.Object{dep, svc} + + if opts.EnableTLS { + secret, err := Secret(opts) + if err != nil { + return []byte{}, err + } + objs = append(objs, secret) + } + + list := &metav1.List{ + TypeMeta: metav1.TypeMeta{ + Kind: "List", + APIVersion: "v1", + }, + } + if err := meta.SetList(list, objs); err != nil { + return []byte{}, err + } + buf, err := yaml.Marshal(list) + return buf, err } func generateLabels(labels map[string]string) map[string]string { @@ -320,14 +348,19 @@ func generateService(namespace string) *v1.Service { return s } -// SecretManifest gets the manifest (as a string) that describes the Tiller Secret resource. -func SecretManifest(opts *Options) (string, error) { - o, err := generateSecret(opts) +// Secret gets the Tiller secret resource. +func Secret(opts *Options) (*v1.Secret, error) { + secret, err := generateSecret(opts) if err != nil { - return "", err + return nil, err + } + + secret.TypeMeta = metav1.TypeMeta{ + Kind: "Secret", + APIVersion: "v1", } - buf, err := yaml.Marshal(o) - return string(buf), err + + return secret, nil } // createSecret creates the Tiller secret resource. diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index eaea0587078..3a760a2904b 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -34,7 +34,7 @@ import ( "k8s.io/helm/pkg/version" ) -func TestDeploymentManifest(t *testing.T) { +func TestDeployment(t *testing.T) { tests := []struct { name string image string @@ -48,14 +48,10 @@ func TestDeploymentManifest(t *testing.T) { } for _, tt := range tests { - o, err := DeploymentManifest(&Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary}) + dep, err := Deployment(&Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary}) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } - var dep v1beta1.Deployment - if err := yaml.Unmarshal([]byte(o), &dep); err != nil { - t.Fatalf("%s: error %q", tt.name, err) - } if got := dep.Spec.Template.Spec.Containers[0].Image; got != tt.expect { t.Errorf("%s: expected image %q, got %q", tt.name, tt.expect, got) @@ -71,7 +67,7 @@ func TestDeploymentManifest(t *testing.T) { } } -func TestDeploymentManifestForServiceAccount(t *testing.T) { +func TestDeploymentForServiceAccount(t *testing.T) { tests := []struct { name string image string @@ -84,22 +80,18 @@ func TestDeploymentManifestForServiceAccount(t *testing.T) { {"withoutSA", "", false, "gcr.io/kubernetes-helm/tiller:latest", "IfNotPresent", ""}, } for _, tt := range tests { - o, err := DeploymentManifest(&Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary, ServiceAccount: tt.serviceAccount}) + d, err := Deployment(&Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary, ServiceAccount: tt.serviceAccount}) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } - var d v1beta1.Deployment - if err := yaml.Unmarshal([]byte(o), &d); err != nil { - t.Fatalf("%s: error %q", tt.name, err) - } if got := d.Spec.Template.Spec.ServiceAccountName; got != tt.serviceAccount { t.Errorf("%s: expected service account value %q, got %q", tt.name, tt.serviceAccount, got) } } } -func TestDeploymentManifest_WithTLS(t *testing.T) { +func TestDeployment_WithTLS(t *testing.T) { tests := []struct { opts Options name string @@ -126,15 +118,11 @@ func TestDeploymentManifest_WithTLS(t *testing.T) { }, } for _, tt := range tests { - o, err := DeploymentManifest(&tt.opts) + d, err := Deployment(&tt.opts) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } - var d v1beta1.Deployment - if err := yaml.Unmarshal([]byte(o), &d); err != nil { - t.Fatalf("%s: error %q", tt.name, err) - } // verify environment variable in deployment reflect the use of tls being enabled. if got := d.Spec.Template.Spec.Containers[0].Env[2].Value; got != tt.verify { t.Errorf("%s: expected tls verify env value %q, got %q", tt.name, tt.verify, got) @@ -146,14 +134,7 @@ func TestDeploymentManifest_WithTLS(t *testing.T) { } func TestServiceManifest(t *testing.T) { - o, err := ServiceManifest(v1.NamespaceDefault) - if err != nil { - t.Fatalf("error %q", err) - } - var svc v1.Service - if err := yaml.Unmarshal([]byte(o), &svc); err != nil { - t.Fatalf("error %q", err) - } + svc := Service(v1.NamespaceDefault) if got := svc.ObjectMeta.Namespace; got != v1.NamespaceDefault { t.Errorf("expected namespace %s, got %s", v1.NamespaceDefault, got) @@ -161,7 +142,7 @@ func TestServiceManifest(t *testing.T) { } func TestSecretManifest(t *testing.T) { - o, err := SecretManifest(&Options{ + obj, err := Secret(&Options{ VerifyTLS: true, EnableTLS: true, Namespace: v1.NamespaceDefault, @@ -174,11 +155,6 @@ func TestSecretManifest(t *testing.T) { t.Fatalf("error %q", err) } - var obj v1.Secret - if err := yaml.Unmarshal([]byte(o), &obj); err != nil { - t.Fatalf("error %q", err) - } - if got := obj.ObjectMeta.Namespace; got != v1.NamespaceDefault { t.Errorf("expected namespace %s, got %s", v1.NamespaceDefault, got) } @@ -335,13 +311,13 @@ func TestInstall_canary(t *testing.T) { func TestUpgrade(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" serviceAccount := "newServiceAccount" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace:v1.0.0", ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := service(v1.NamespaceDefault) + existingService := generateService(v1.NamespaceDefault) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -376,7 +352,7 @@ func TestUpgrade(t *testing.T) { func TestUpgrade_serviceNotFound(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace", UseCanary: false, @@ -419,13 +395,13 @@ func TestUpgrade_serviceNotFound(t *testing.T) { func TestUgrade_newerVersion(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" serviceAccount := "newServiceAccount" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace:v100.5.0", ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := service(v1.NamespaceDefault) + existingService := generateService(v1.NamespaceDefault) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -479,13 +455,13 @@ func TestUgrade_newerVersion(t *testing.T) { func TestUpgrade_identical(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" serviceAccount := "newServiceAccount" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace:v2.0.0", ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := service(v1.NamespaceDefault) + existingService := generateService(v1.NamespaceDefault) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -520,13 +496,13 @@ func TestUpgrade_identical(t *testing.T) { func TestUpgrade_canaryClient(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:canary" serviceAccount := "newServiceAccount" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace:v1.0.0", ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := service(v1.NamespaceDefault) + existingService := generateService(v1.NamespaceDefault) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -561,13 +537,13 @@ func TestUpgrade_canaryClient(t *testing.T) { func TestUpgrade_canaryServer(t *testing.T) { image := "gcr.io/kubernetes-helm/tiller:v2.0.0" serviceAccount := "newServiceAccount" - existingDeployment, _ := deployment(&Options{ + existingDeployment, _ := generateDeployment(&Options{ Namespace: v1.NamespaceDefault, ImageSpec: "imageToReplace:canary", ServiceAccount: "serviceAccountToReplace", UseCanary: false, }) - existingService := service(v1.NamespaceDefault) + existingService := generateService(v1.NamespaceDefault) fc := &fake.Clientset{} fc.AddReactor("get", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { @@ -607,7 +583,8 @@ func tlsTestFile(t *testing.T, path string) string { } return path } -func TestDeploymentManifest_WithNodeSelectors(t *testing.T) { + +func TestDeployment_WithNodeSelectors(t *testing.T) { tests := []struct { opts Options name string @@ -631,15 +608,11 @@ func TestDeploymentManifest_WithNodeSelectors(t *testing.T) { }, } for _, tt := range tests { - o, err := DeploymentManifest(&tt.opts) + d, err := Deployment(&tt.opts) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } - var d v1beta1.Deployment - if err := yaml.Unmarshal([]byte(o), &d); err != nil { - t.Fatalf("%s: error %q", tt.name, err) - } // Verify that environment variables in Deployment reflect the use of TLS being enabled. got := d.Spec.Template.Spec.NodeSelector for k, v := range tt.expect { @@ -649,7 +622,8 @@ func TestDeploymentManifest_WithNodeSelectors(t *testing.T) { } } } -func TestDeploymentManifest_WithSetValues(t *testing.T) { + +func TestDeployment_WithSetValues(t *testing.T) { tests := []struct { opts Options name string @@ -676,11 +650,17 @@ func TestDeploymentManifest_WithSetValues(t *testing.T) { }, } for _, tt := range tests { - o, err := DeploymentManifest(&tt.opts) + d, err := Deployment(&tt.opts) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } - values, err := chartutil.ReadValues([]byte(o)) + + o, err := yaml.Marshal(d) + if err != nil { + t.Errorf("Error marshaling Deployment: %s", err) + } + + values, err := chartutil.ReadValues(o) if err != nil { t.Errorf("Error converting Deployment manifest to Values: %s", err) } From 61e88cbc412a0a77e4eba3dc03b888cc18ea647e Mon Sep 17 00:00:00 2001 From: ryane Date: Fri, 23 Feb 2018 20:40:25 -0500 Subject: [PATCH 003/483] don't wrap helm init -o/--dry-run output in List Manifests in yaml are separated by `---`. In json, manifests are separated by newlines (see https://github.com/kubernetes/kubernetes/blob/master/hack/testdata/multi-resource-json.json) --- cmd/helm/init.go | 56 ++++++++++++++++++++++------------- cmd/helm/init_test.go | 51 +++++++++++++++---------------- cmd/helm/installer/install.go | 26 ++++++++-------- 3 files changed, 72 insertions(+), 61 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 91441ab5301..ef39450d78d 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -176,46 +176,62 @@ func (i *initCmd) run() error { i.opts.ServiceAccount = i.serviceAccount i.opts.MaxHistory = i.maxHistory + writeYAMLManifests := func(manifests []string) error { + w := i.out + for _, manifest := range manifests { + if _, err := fmt.Fprintln(w, "---"); err != nil { + return err + } + + if _, err := fmt.Fprintln(w, manifest); err != nil { + return err + } + } + + // YAML ending document boundary marker + _, err := fmt.Fprintln(w, "...") + return err + } if len(i.opts.Output) > 0 { - var body []byte + var manifests []string var err error - if body, err = installer.TillerManifests(&i.opts); err != nil { + if manifests, err = installer.TillerManifests(&i.opts); err != nil { return err } switch i.opts.Output.String() { case "json": - var out bytes.Buffer - jsonb, err := yaml.ToJSON(body) - if err != nil { - return err - } - buf := bytes.NewBuffer(jsonb) - if err := json.Indent(&out, buf.Bytes(), "", " "); err != nil { - return err - } - if _, err = i.out.Write(out.Bytes()); err != nil { - return err + for _, manifest := range manifests { + var out bytes.Buffer + jsonb, err := yaml.ToJSON([]byte(manifest)) + if err != nil { + return err + } + buf := bytes.NewBuffer(jsonb) + if err := json.Indent(&out, buf.Bytes(), "", " "); err != nil { + return err + } + if _, err = i.out.Write(out.Bytes()); err != nil { + return err + } + fmt.Fprint(i.out, "\n") } return nil case "yaml": - if _, err = i.out.Write(body); err != nil { - return err - } - return nil + return writeYAMLManifests(manifests) default: return fmt.Errorf("unknown output format: %q", i.opts.Output) } } if settings.Debug { - var body []byte + var manifests []string var err error // write Tiller manifests - if body, err = installer.TillerManifests(&i.opts); err != nil { + if manifests, err = installer.TillerManifests(&i.opts); err != nil { return err } - if _, err = i.out.Write(body); err != nil { + if err = writeYAMLManifests(manifests); err != nil { return err } } diff --git a/cmd/helm/init_test.go b/cmd/helm/init_test.go index 269b0b09a6a..8ffdca57fc2 100644 --- a/cmd/helm/init_test.go +++ b/cmd/helm/init_test.go @@ -18,6 +18,7 @@ package main import ( "bytes" + "io" "io/ioutil" "os" "path/filepath" @@ -32,11 +33,10 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + yamlutil "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes/fake" testcore "k8s.io/client-go/testing" - "encoding/json" - "k8s.io/helm/cmd/helm/installer" "k8s.io/helm/pkg/helm/helmpath" ) @@ -167,13 +167,15 @@ func TestInitCmd_dryRun(t *testing.T) { t.Errorf("expected no server calls, got %d", got) } - list := &metav1.List{} - if err := yaml.Unmarshal(buf.Bytes(), &list); err != nil { - t.Errorf("Expected parseable List, got %q\n\t%s", buf.String(), err) + docs := bytes.Split(buf.Bytes(), []byte("\n---")) + if got, want := len(docs), 2; got != want { + t.Fatalf("Expected document count of %d, got %d", want, got) } - - if got, want := len(list.Items), 2; got != want { - t.Fatalf("Expected resource count of %d, got %d", want, got) + for _, doc := range docs { + var y map[string]interface{} + if err := yaml.Unmarshal(doc, &y); err != nil { + t.Errorf("Expected parseable YAML, got %q\n\t%s", doc, err) + } } } @@ -304,7 +306,7 @@ func TestInitCmd_tlsOptions(t *testing.T) { } } -// TestInitCmd_output tests that init -o formats are unmarshal-able +// TestInitCmd_output tests that init -o can be decoded func TestInitCmd_output(t *testing.T) { // This is purely defensive in this case. home, err := ioutil.TempDir("", "helm_home") @@ -318,26 +320,14 @@ func TestInitCmd_output(t *testing.T) { settings.Debug = dbg }() fc := fake.NewSimpleClientset() - tests := []struct { - expectF func([]byte, interface{}) error - expectName string - }{ - { - json.Unmarshal, - "json", - }, - { - yaml.Unmarshal, - "yaml", - }, - } + tests := []string{"json", "yaml"} for _, s := range tests { var buf bytes.Buffer cmd := &initCmd{ out: &buf, home: helmpath.Home(home), kubeClient: fc, - opts: installer.Options{Output: installer.OutputFormat(s.expectName)}, + opts: installer.Options{Output: installer.OutputFormat(s)}, namespace: v1.NamespaceDefault, } if err := cmd.run(); err != nil { @@ -346,10 +336,17 @@ func TestInitCmd_output(t *testing.T) { if got := len(fc.Actions()); got != 0 { t.Errorf("expected no server calls, got %d", got) } - d := &v1beta1.Deployment{} - if err = s.expectF(buf.Bytes(), &d); err != nil { - t.Errorf("error unmarshalling init %s output %s %s", s.expectName, err, buf.String()) + + var obj interface{} + decoder := yamlutil.NewYAMLOrJSONDecoder(&buf, 4096) + for { + err := decoder.Decode(&obj) + if err != nil { + if err == io.EOF { + break + } + t.Errorf("error decoding init %s output %s %s", s, err, buf.String()) + } } } - } diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 720a18522d8..35092d47405 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -27,7 +27,6 @@ import ( "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" - meta "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" @@ -146,10 +145,10 @@ func Service(namespace string) *v1.Service { } // TillerManifests gets the Deployment, Service, and Secret (if tls-enabled) manifests -func TillerManifests(opts *Options) ([]byte, error) { +func TillerManifests(opts *Options) ([]string, error) { dep, err := Deployment(opts) if err != nil { - return []byte{}, err + return []string{}, err } svc := Service(opts.Namespace) @@ -159,22 +158,21 @@ func TillerManifests(opts *Options) ([]byte, error) { if opts.EnableTLS { secret, err := Secret(opts) if err != nil { - return []byte{}, err + return []string{}, err } objs = append(objs, secret) } - list := &metav1.List{ - TypeMeta: metav1.TypeMeta{ - Kind: "List", - APIVersion: "v1", - }, - } - if err := meta.SetList(list, objs); err != nil { - return []byte{}, err + manifests := make([]string, len(objs)) + for i, obj := range objs { + o, err := yaml.Marshal(obj) + if err != nil { + return []string{}, err + } + manifests[i] = string(o) } - buf, err := yaml.Marshal(list) - return buf, err + + return manifests, err } func generateLabels(labels map[string]string) map[string]string { From 8bb4984f94fb9cbc90daa95276afd9bc781c833c Mon Sep 17 00:00:00 2001 From: ryane Date: Tue, 27 Feb 2018 17:22:33 -0500 Subject: [PATCH 004/483] update docstrings on Deployment, Service, and Secret --- cmd/helm/installer/install.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 35092d47405..d4d22581eae 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -114,7 +114,9 @@ func createDeployment(client extensionsclient.DeploymentsGetter, opts *Options) } -// Deployment gets the deployment object that installs Tiller. +// Deployment gets a deployment object that can be used to generate a manifest +// as a string. This object should not be submitted directly to the Kubernetes +// api func Deployment(opts *Options) (*v1beta1.Deployment, error) { dep, err := generateDeployment(opts) if err != nil { @@ -134,7 +136,8 @@ func createService(client corev1.ServicesGetter, namespace string) error { return err } -// Service gets the service object that installs Tiller. +// Service gets a service object that can be used to generate a manifest as a +// string. This object should not be submitted directly to the Kubernetes api func Service(namespace string) *v1.Service { svc := generateService(namespace) svc.TypeMeta = metav1.TypeMeta{ @@ -346,7 +349,8 @@ func generateService(namespace string) *v1.Service { return s } -// Secret gets the Tiller secret resource. +// Secret gets a secret object that can be used to generate a manifest as a +// string. This object should not be submitted directly to the Kubernetes api func Secret(opts *Options) (*v1.Secret, error) { secret, err := generateSecret(opts) if err != nil { From 99da9fb54817a00e0138a08ce0b0643b923e5b6e Mon Sep 17 00:00:00 2001 From: Ali Rizwan Date: Thu, 15 Mar 2018 16:07:29 +0100 Subject: [PATCH 005/483] Fixed SIGSEGV when running helm create with -p and no values.yaml file --- pkg/chartutil/create.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 319a75e2f50..c6c1308ca7e 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -305,8 +305,9 @@ func CreateFrom(chartfile *chart.Metadata, dest string, src string) error { } schart.Templates = updatedTemplates - schart.Values = &chart.Config{Raw: string(Transform(schart.Values.Raw, "", schart.Metadata.Name))} - + if schart.Values != nil { + schart.Values = &chart.Config{Raw: string(Transform(schart.Values.Raw, "", schart.Metadata.Name))} + } return SaveDir(schart, dest) } From 332dc83c46b1cb135bc42b7afa1c9b50629e0e15 Mon Sep 17 00:00:00 2001 From: Morgan Parry Date: Wed, 13 Dec 2017 15:50:25 +0000 Subject: [PATCH 006/483] (fix) Handle caFile alone being set for repos Previously it was only respected if certFile and keyFile were also specified. However, these are independent features. --- pkg/getter/httpgetter.go | 15 +++---------- pkg/getter/httpgetter_test.go | 20 +++++++++++++---- pkg/tlsutil/tls.go | 42 ++++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/pkg/getter/httpgetter.go b/pkg/getter/httpgetter.go index dd462ce5f0f..d04b1076c8a 100644 --- a/pkg/getter/httpgetter.go +++ b/pkg/getter/httpgetter.go @@ -23,7 +23,6 @@ import ( "strings" "k8s.io/helm/pkg/tlsutil" - "k8s.io/helm/pkg/urlutil" "k8s.io/helm/pkg/version" ) @@ -80,19 +79,11 @@ func newHTTPGetter(URL, CertFile, KeyFile, CAFile string) (Getter, error) { // NewHTTPGetter constructs a valid http/https client as HttpGetter func NewHTTPGetter(URL, CertFile, KeyFile, CAFile string) (*HttpGetter, error) { var client HttpGetter - if CertFile != "" && KeyFile != "" { - tlsConf, err := tlsutil.NewClientTLS(CertFile, KeyFile, CAFile) + if (CertFile != "" && KeyFile != "") || CAFile != "" { + tlsConf, err := tlsutil.NewTLSConfig(URL, CertFile, KeyFile, CAFile) if err != nil { - return &client, fmt.Errorf("can't create TLS config for client: %s", err.Error()) + return &client, fmt.Errorf("can't create TLS config: %s", err.Error()) } - tlsConf.BuildNameToCertificate() - - sni, err := urlutil.ExtractHostname(URL) - if err != nil { - return &client, err - } - tlsConf.ServerName = sni - client.client = &http.Client{ Transport: &http.Transport{ TLSClientConfig: tlsConf, diff --git a/pkg/getter/httpgetter_test.go b/pkg/getter/httpgetter_test.go index fe3fde22a94..ec730f4014b 100644 --- a/pkg/getter/httpgetter_test.go +++ b/pkg/getter/httpgetter_test.go @@ -28,7 +28,7 @@ func TestHTTPGetter(t *testing.T) { } if hg, ok := g.(*HttpGetter); !ok { - t.Fatal("Expected newHTTPGetter to produce an httpGetter") + t.Fatal("Expected newHTTPGetter to produce an HttpGetter") } else if hg.client != http.DefaultClient { t.Fatal("Expected newHTTPGetter to return a default HTTP client.") } @@ -37,12 +37,24 @@ func TestHTTPGetter(t *testing.T) { cd := "../../testdata" join := filepath.Join ca, pub, priv := join(cd, "ca.pem"), join(cd, "crt.pem"), join(cd, "key.pem") - g, err = newHTTPGetter("http://example.com/", pub, priv, ca) + g, err = newHTTPGetter("https://example.com/", pub, priv, ca) if err != nil { t.Fatal(err) } + if hg, ok := g.(*HttpGetter); !ok { + t.Fatal("Expected newHTTPGetter to produce an HttpGetter") + } else if hg.client == http.DefaultClient { + t.Fatal("Expected newHTTPGetter to return a non-default HTTP client") + } - if _, ok := g.(*HttpGetter); !ok { - t.Fatal("Expected newHTTPGetter to produce an httpGetter") + // Test with SSL, caFile only + g, err = newHTTPGetter("https://example.com/", "", "", ca) + if err != nil { + t.Fatal(err) + } + if hg, ok := g.(*HttpGetter); !ok { + t.Fatal("Expected newHTTPGetter to produce an HttpGetter") + } else if hg.client == http.DefaultClient { + t.Fatal("Expected newHTTPGetter to return a non-default HTTP client") } } diff --git a/pkg/tlsutil/tls.go b/pkg/tlsutil/tls.go index df698fd4ebb..c166a1662fc 100644 --- a/pkg/tlsutil/tls.go +++ b/pkg/tlsutil/tls.go @@ -21,17 +21,20 @@ import ( "crypto/x509" "fmt" "io/ioutil" + "k8s.io/helm/pkg/urlutil" ) -// NewClientTLS returns tls.Config appropriate for client auth. -func NewClientTLS(certFile, keyFile, caFile string) (*tls.Config, error) { - cert, err := CertFromFilePair(certFile, keyFile) - if err != nil { - return nil, err - } - config := tls.Config{ - Certificates: []tls.Certificate{*cert}, +func newTLSConfigCommon(certFile, keyFile, caFile string) (*tls.Config, error) { + config := tls.Config{} + + if certFile != "" && keyFile != "" { + cert, err := CertFromFilePair(certFile, keyFile) + if err != nil { + return nil, err + } + config.Certificates = []tls.Certificate{*cert} } + if caFile != "" { cp, err := CertPoolFromFile(caFile) if err != nil { @@ -39,9 +42,32 @@ func NewClientTLS(certFile, keyFile, caFile string) (*tls.Config, error) { } config.RootCAs = cp } + return &config, nil } +// NewClientTLS returns tls.Config appropriate for client auth. +func NewClientTLS(certFile, keyFile, caFile string) (*tls.Config, error) { + return newTLSConfigCommon(certFile, keyFile, caFile) +} + +// NewTLSConfig returns tls.Config appropriate for client and/or server auth. +func NewTLSConfig(url, certFile, keyFile, caFile string) (*tls.Config, error) { + config, err := newTLSConfigCommon(certFile, keyFile, caFile) + if err != nil { + return nil, err + } + config.BuildNameToCertificate() + + serverName, err := urlutil.ExtractHostname(url) + if err != nil { + return nil, err + } + config.ServerName = serverName + + return config, nil +} + // CertPoolFromFile returns an x509.CertPool containing the certificates // in the given PEM-encoded file. // Returns an error if the file could not be read, a certificate could not From dfc6d74637ba5fc2c9b9e95fdb32639449f1d726 Mon Sep 17 00:00:00 2001 From: fqsghostcloud Date: Thu, 22 Mar 2018 23:28:04 +0800 Subject: [PATCH 007/483] Update CONTRIBUTING.md "Semantic Versioning" will be better --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34b4f8b1694..ec3db568ce5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,7 +53,7 @@ An issue that we are not sure we will be doing will not be added to any mileston A milestone (and hence release) is considered done when all outstanding issues/PRs have been closed or moved to another milestone. -## Semver +## Semantic Versioning Helm maintains a strong commitment to backward compatibility. All of our changes to protocols and formats are backward compatible from Helm 2.0 until Helm 3.0. No features, flags, or commands are removed or substantially modified (other than bug fixes). From 00376d4d1f7ea78e81cd2a9c1905c3d606402b2c Mon Sep 17 00:00:00 2001 From: Derek Bassett Date: Mon, 26 Feb 2018 20:03:43 -0700 Subject: [PATCH 008/483] The default defined role does not allow Tiller to launch Kubernetes jobs. --- docs/rbac.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rbac.md b/docs/rbac.md index bc138ceee4f..b6d40786308 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -71,7 +71,7 @@ metadata: name: tiller-manager namespace: tiller-world rules: -- apiGroups: ["", "extensions", "apps"] +- apiGroups: ["", "batch", "extensions", "apps"] resources: ["*"] verbs: ["*"] ``` From 6a59683c01f053ab6490a82f64985aeea9894358 Mon Sep 17 00:00:00 2001 From: cameronconradt <16780811+cameronconradt@users.noreply.github.com> Date: Fri, 23 Mar 2018 23:57:35 -0600 Subject: [PATCH 009/483] Update files.go Should suppress the warnings about the naming of these two functions. Added TODO --- pkg/chartutil/files.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/files.go b/pkg/chartutil/files.go index a711a336626..f9fc0a26dba 100644 --- a/pkg/chartutil/files.go +++ b/pkg/chartutil/files.go @@ -211,7 +211,8 @@ func ToToml(v interface{}) string { // always return a string, even on marshal error (empty string). // // This is designed to be called from a template. -func ToJson(v interface{}) string { +//TODO:change the function signature in Helm 3 +func ToJson(v interface{}) string { //nolint data, err := json.Marshal(v) if err != nil { // Swallow errors inside of a template. @@ -226,7 +227,8 @@ func ToJson(v interface{}) string { // JSON documents. Additionally, because its intended use is within templates // it tolerates errors. It will insert the returned error message string into // m["Error"] in the returned map. -func FromJson(str string) map[string]interface{} { +//TODO:change the function signature in Helm 3 +func FromJson(str string) map[string]interface{} { //nolint m := map[string]interface{}{} if err := json.Unmarshal([]byte(str), &m); err != nil { From 62f85322ef114089724835e545d8d32d9bc30e12 Mon Sep 17 00:00:00 2001 From: Chance Zibolski Date: Wed, 11 Apr 2018 14:46:18 -0700 Subject: [PATCH 010/483] Update helm template -x to support children chart manifests in more cases The previous code validated the manifests exist within the file system, which only works when a chart is unpacked, meaning children charts stored as tgz's in the parent chart's `charts/` directory don't exist as individual files in the filesystem, causing validation to file. Instead, we validate against the paths within the chart itself rather than the filesystem, handling both chart.tgz's and charts that are unpacked as directories in the chart/ directory. --- cmd/helm/template.go | 78 ++++++++++++++++++++------------------- cmd/helm/template_test.go | 7 ++++ 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/cmd/helm/template.go b/cmd/helm/template.go index c04bc2dc8f8..fc1f44392f2 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -117,31 +117,10 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } else { return err } - // verify specified templates exist relative to chart - rf := []string{} - var af string - var err error - if len(t.renderFiles) > 0 { - for _, f := range t.renderFiles { - if !filepath.IsAbs(f) { - af, err = filepath.Abs(filepath.Join(t.chartPath, f)) - if err != nil { - return fmt.Errorf("could not resolve template path: %s", err) - } - } else { - af = f - } - rf = append(rf, af) - - if _, err := os.Stat(af); err != nil { - return fmt.Errorf("could not resolve template path: %s", err) - } - } - } // verify that output-dir exists if provided if t.outputDir != "" { - _, err = os.Stat(t.outputDir) + _, err := os.Stat(t.outputDir) if os.IsNotExist(err) { return fmt.Errorf("output-dir '%s' does not exist", t.outputDir) } @@ -232,19 +211,7 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { m := tiller.Manifest{Name: k, Content: v, Head: &util.SimpleHead{Kind: h}} listManifests = append(listManifests, m) } - in := func(needle string, haystack []string) bool { - // make needle path absolute - d := strings.Split(needle, string(os.PathSeparator)) - dd := d[1:] - an := filepath.Join(t.chartPath, strings.Join(dd, string(os.PathSeparator))) - - for _, h := range haystack { - if h == an { - return true - } - } - return false - } + if settings.Debug { rel := &release.Release{ Name: t.releaseName, @@ -257,10 +224,45 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { printRelease(os.Stdout, rel) } - for _, m := range tiller.SortByKind(listManifests) { - if len(t.renderFiles) > 0 && !in(m.Name, rf) { - continue + var manifestsToRender []tiller.Manifest + + // if we have a list of files to render, then check that each of the + // provided files exists in the chart. + if len(t.renderFiles) > 0 { + for _, f := range t.renderFiles { + missing := true + if !filepath.IsAbs(f) { + newF, err := filepath.Abs(filepath.Join(t.chartPath, f)) + if err != nil { + return fmt.Errorf("could not turn template path %s into absolute path: %s", f, err) + } + f = newF + } + + for _, manifest := range listManifests { + manifestPathSplit := strings.Split(manifest.Name, string(filepath.Separator)) + // remove the chart name from the path + manifestPathSplit = manifestPathSplit[1:] + toJoin := append([]string{t.chartPath}, manifestPathSplit...) + manifestPath := filepath.Join(toJoin...) + + // if the filepath provided matches a manifest path in the + // chart, render that manifest + if f == manifestPath { + manifestsToRender = append(manifestsToRender, manifest) + missing = false + } + } + if missing { + return fmt.Errorf("could not find template %s in chart", f) + } } + } else { + // no renderFiles provided, render all manifests in the chart + manifestsToRender = listManifests + } + + for _, m := range tiller.SortByKind(manifestsToRender) { data := m.Content b := filepath.Base(m.Name) if !t.showNotes && b == "NOTES.txt" { diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index eefa46774d0..bbcc9f3af84 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -69,6 +69,13 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, + { + name: "check_execute_subchart_template", + desc: "verify --execute single template on a subchart template", + args: []string{chartPath, "-x", "charts/subcharta/templates/service.yaml", "--set", "subcharta.service.name=foobar"}, + expectKey: "subchart1/charts/subcharta/templates/service.yaml", + expectValue: "protocol: TCP\n name: foobar", + }, { name: "check_namespace", desc: "verify --namespace", From d7e71709935b2f3b93c90c85ecdbf3d247cc7ebf Mon Sep 17 00:00:00 2001 From: Chance Zibolski Date: Wed, 11 Apr 2018 16:26:15 -0700 Subject: [PATCH 011/483] Add working template to mariner chart for use in testing subcharts --- pkg/chartutil/testdata/frobnitz-1.2.3.tgz | Bin 2070 -> 3654 bytes .../frobnitz/charts/mariner-4.3.2.tgz | Bin 1034 -> 1012 bytes .../mariner/charts/albatross-0.1.0.tgz | Bin 347 -> 292 bytes .../mariner/templates/placeholder.tpl | 2 ++ 4 files changed, 2 insertions(+) diff --git a/pkg/chartutil/testdata/frobnitz-1.2.3.tgz b/pkg/chartutil/testdata/frobnitz-1.2.3.tgz index fb21cd08fb08fd2f4e45e940634ce1cdb0421457..cd12d2c1ef7d96805820389c38a21d03add7f06d 100644 GIT binary patch literal 3654 zcmV-M4!Q9kiwFR5n9f=N1MOT3eA84H-+ti4f}qF;D$HFn{Rzs_cgxCnOg4}=Y`kAv z+T5*SX;YGPUBNK~kqPn;KINs;!KWZ^##B&n2r4=RR1i@ZQxPVQjhD(mpx;f>m90D~ z&=t`9e~hHL=RT5?bMCq4oSQV3G21DAj54hDpi-%fdOZ-22I;8M=%k|;K&{mnv^t$Z ztP;|UfG#bPDw7IQsL^W?|MfbpDh#NCJ&>#6U(SDt<4VQt9*2zE1E2hN zwh}Cly9pZ|^gaT~zd@_^)Bk#nRx8VYC_p%+6a zDt5-qknS3lIL66ZptnaW&pSAiQdx~anZ__mGr=mXjL@<`QIkMHS%iDOT2+HC%b>#@ z_H+edw=+B;JUX!_n8mXMdO9ZQER&#}!Z-;;WQD9);60a$Ld1Wc{96S1=W4|a{CoCa z_4!|?H)>`3FBI_cpJXhx!~L7$zea16`5y}S_%En5oXbqFg+2n!|9XSLpZ`XKQJ()p zfw+!YHX3-R@%CsIS79AHDB{qI08jy%y3kpB%sU0TTrS+D#ThnTsX;fXL}i#nc3l#2 zI+j|?qA7dE)ri%xv9U_AR3fi2BH*G(-r641=nWXM0jP8<@BKlM?J*v5Jk|l#iWAJ0 z4vEri41^atPAOgz%2;UOMe;O?Mf4yGwSWP)_`kP#o$7My26UcA(R6#vPGq_g|BCqkE)jWSU!?HfZN@(GIuJ6gmes!VO4@bI|C>qdNE<^bX6odHCeNXSdFY zy^|AbqmO{{uhIL@|5~+Lmj6(|%XWYS+XAf&O+r={?SBz`@}HC#pU^82w~@i`Bar-S zME_sS^}j(Q%YP^k4Z2kM=oHm#0k2C7h+ZLFp@@zK12`fbUX2I`-FRRnIACXhQy`M) z6JRE!8HZp=C=^{77Ld{f$RbN4jcEfo2$3m){uoCLEtCNkIv9@P8P+Z9pb)_)|12Es zq*y4hi^FNgk`cT<0?EHt6!7t1j5-Hf^GgV% z|J6Ew{jb*S<0|^U>I~-{!BGVP{l7Z@_>a+`mF>Tf;8{r13>Z5W z7e)6uK*BV_N%H`6F)U4D+1auH|D#be|EG4Gzyal7f5rT-SIhq2kl=DsXSE0rNE6(( z-Y~G&0Jz-)l~F73&;Lx3HUy;Dg18GLp#87%&;K$Q)Uy2_5{UB8Ss5oy0yDDRMed_h zw-}nC83L(;Ho)wZGC%|hyM=a=h(t8=z44*jeHSur7XI=t`Tc_H1G;hlk3prA^S?s^ zfBt*jv@xP%7U$E)1fh=r`X8sD<^PP9xiYAwksCdSRpI?idpxvzb@bTC!-=}&k67%|MeIzPU1CyE+6WpJyQ_7B<0{v7#i(x{;u zhR5ufF>&5U3*MMllAh=B45@G4(q$c9m|Jhc0|S~oP&jJke=v6C_Bsiz7j`dLKBb^R z-F}Vl(bxU&XZ!nymqtIZYlXG7HRHEE2Y*{lo{l>FWog$n8@sMPeJW-4gt;dv>%6y9 zCU$5v;58;Pr{BxpR@R^LRF7|Rv2QA$p78jj@qN#)*#DI$?vkOfZ-Za^gfEWnv*pDe z4Yp2yKH}@#p7pIi%nqN`Fk*Da=T}dwcY0k+y|JHwd2=f3&0!1HzOZF~$;XkOM<#vY z0mTP?*}JLyi0Al)#gQ)^$%$?CY1E>IrJKHZ#&D{;txo-;MUCe*%Ng(>e8+RBQ&+se zNoGWxHn#|S50usWx@V^ekvkU^g^z#bSXRVnhbbcIg>@sBuWV?W_*w=wl3V`a`llKX zPvUb|Z<@Mc)AFB-y0v8Mev|slsPd_);UA3f>{{L|F?NY(p<TGBA;nIvt4+6zUTP-&tE*;Yo}4SV#Idt)zswTlVKM- zo$TIu*XKh`ncnZob2ocT#pupAp}0dcm=>7Oh(hZ+dv$kdL;Rnnos=$EQZAr>^JhdvboX zwmLM|v^j2ckNk-GdvYdd26>`+u*_4u`S|g?NcZ$%C)$p|rgchxvUHYqGX2$Rdl!sZw`}U6l8xIoob{N0NNL``JdVmaQ@UzR-%Hzm-)X+I4Ew{g1e@B%v+a|m zy81 zuD^6}&C~PBx39{h+pTHo-aW5H#f5g-wHJ0L>|8(RV_Uy_f8t9!xsG1g(Wuez{l?hJ z)MNa`8R_GWJ~C$EFJ-Uf*_2V)KP8^!53l;}$SV~ck0}TA*?wWoqRrckY|3Tdi8rc7@_4of7W&eL@P$Sw~ zW4mVpbkK|&+4yFHqbwj^Bmq4syE6+o81nMgPcbT7ZLg#dxXozG;S{43_G`+EgF6}5 zkpH0W2EB3n->B8d`~O0MYw$m)j^IH0Uw=jZpHVCOe?kM%|5KIi>moRi4$<BuEAeQ4scPJtoWL_SI@K>uEsU=!XjK)+W?12} zB2^k<4C+lZWm17Jw5d=GVVuBHZPycD{Xs~#F5PamZBblRLQ<8Sq~7(euWQJEP_uz< zSpREODxF%^|DnJ&_#f14pg{Ux<)8nfQE4>t{;!ZATHNF*=wo3eP?hClbH_+8f}Fqe z4@W@#?>C3uOdo;d-=Ou||EbX!4YK@)1b*Lt%Ao9|3G_wFdt`tSB*7Dxv-`%5#giZn z2@Z!;7 zaMF?<-P#n-cPDDf-(UEp8-y*AIDc@!qf2=j3_bdig-#B@>Ph`Djl?qj4P@ zHve!@*OKO=<`lnWFZ^9+doQx^d%WGKW1An}k+|ar`|v%3SFJ4?_ekZMtV^AX@d3>% zD=tRu%vtk#&dSFtJUw#HjkPu0IDbawtj3jzmy!%$cp958b^Wf-k8ht3uUzWkhP-jn z^W{5fzk7PD%fGke-FMG6$pD4t`!J;{1_hFT zwfYMCPb2UD4GpR`=OI4V4FAMSU*Hs91kt0`!)b=B9ilbC)k8m+yjHvm@pt6^R-HkC zDc zVQyr3R8em|NM&qo0PLOLZ`(K$$NQ|mVxYXPWl8>ZHInWHO%_{RHdt(P2P_VU3oVT; zB9y2lX*<4b{`UhZS$33ol{Svjr2IZKvPhA##1Cgk4&ABXlZ>kWbw4IVC~rkl_HN(u zecvAq2IjBt`}M#6&>vOD=6n#2g26l3`;9!Lxl}~F^ZlomQ~z?WL?p|&B8u`%jvWA! zah0IB!qs?vydZ3j4gg*&K}>=VGe5Bfok|6b7V zTmIY70USf|>S0P5Lc|R^QXfp|Y%WaS;5lV8cXiW;bCRO#I1(d6dc}pS6M$wwpiFaL zu4P+2Miu`G)0`27vO4lqzMrn3iGRNz*7zUvf}Z8S4gHLaak#nh47z_pj8iga3fv_Z zEOu{iEx>PD75|?0kLWDp0{2}D`@ZGB4IRKw>zQk3%NHo8tRXV1LXLBA0RNO^h7V=(;FE%cNXR(Mb*3W! z2`-TFTze9Z^Ai^k7bj2v&8GYZkcglX1jX|X(`g_u=aMQeR<;jnNfrMwkK{9T0*&^6 zaDV=PWchDJn?<@U4*;eb*K!z8E&#mrjaog6D*kE2GfysN&rnAb|AXPMZvXpzyZ+yb z4u8B(8I-HhM{eNx?vEdwL%Ep2b;>e1mW$buTQ1lymrHNi^SGFGL*Mtiaxrs@Y=4=> z0f4f!YeuuHhcXB6-@osg)FS(xJAx&RRdVEpgP{uv(pjR)4>Ue<6-woPZ~zWtl+lON z(sj`d`mk$G=`?|nGTEn8Nae!yksG?OGXIvv_x(-jL*IodW$eh!$YSMo@0KAk;#q78 z2?nN=enTk&V_nFhejp#dq0Y48U*I2eDp2?M(qlZj+Fu<_{P+C2{qOe%cKyE<#h7Cj zV-`^~0YIH{DW9;MX1I;w7+l}eG@6qeSN-9r9W!u{TLq>>&X+ z3rp;`tR4LCH5#~yfB#wm52z%26TJT_)}9p#&@Iz>aU@w;zaJNVy30~aSc zIgh`(H)!I2*sHDohkn0j`ENzF4Lnygi^uRQkDU}1iHRbc=>D4A&fB${C1+uP2~ zjaN8|#b*bAkqI(0kN`+fP(@~Uul$T+L8Brw6w8a}>(XmwmC4oZRXNHt@F)B+=c>qD z+s6dpYQMyjNjDNm6vplt+^ze#psBu@h-b09y>%U#W27$>sM~}3l`|Txbe&Z|^f@k2 zxZssJ{+pXDrt)&rgxPPj8SyL$Rpo$(rsg@g1x(|f*DJ<65l>U1pZLGs?u2Gt$q;k* z2lu`2`|f|*=zDkYzt@GpCjJNa=l@0{>;JbRv;MbU?OzfJGt5wEU|=q3HZv>qWiy3K z%@hh_<30)%JrZzIyR> zx56UjdO~8&$>pnG7u~^s`6(q*1y7y~XdM6h{TlzH(IB+^x1l@Z|KnmGta|EEp{H1Qt>y}JJ&27%?j4IRMAedB3fyXPEiZQ=j@_?NTJ zl#7%o?HgzttTUWo#E3xS@fPg_azcd!#bKh4rNkI$rZ}wlTvP^F>WlS7a0ITo&dxNv zh?@BiU&j91^}km174|>0_W$kZG5kNb{r7wQ`}W`R-->qH|M1lhZLJ=mI{#&u#$E#e zn(co*{&z6!+4%of^u_kSh~lX{029Dtdx}@9UHtDe0HAUFKdAFR^zHnAJKACYO(STY z0jOeuW>h8fiHXxwJY^k5vY9#B#~i`fP7yqtcJaSi&e`4>{&l|y*6jZWb^m|l+xfp% zv`x7E4S?@YyZGPdc7R6ze^CGZpOO9jzm~K+{(nN0;8H#+HhXdFct$FCMzS*7)(8lmGQQS%|2-P@PLQ%XW@8+wgs zC{cqN=XU3ETlOupvu)3qh#>i3n-2{XEL0(gmeQ(NX#^|8)Y=AHVz8k>LqKV1T8daG zEj<%$=k{JmQfgYfTrJLzgPFUVotfQdp8x+@3u41YxGuDa2!aq*6cDs(t`#D3uFV5P zDWXcUtctP>1W^(NH3XE!+*ASIBM{TAXenrG=+@)tuw?Qd=E>hjvAsvI^6_7jf|&4W zXqly7gFX*cmTw(@QH;{~3yLaB(TF0^_$z`Wg@91{t=!E2JpMMcPz>Zx0jDER!-h)? z$Buyp(1=V6XxWnik`4xOKY_4~2=cfs2z$XGnV0womvXYRgu~q3z8%ILQpo=x%HHDG z!0qY(?EI%4iRphiD8wJ54&T7YLN@VAZ37GHzY>`je^n7>rvK$YM=r8;WNQZUVjKXq zAm<3sOhAGi&!fKqfRXEX261pY22zB$UaYPTZG)C;B3^T>y16P6TvBw1u)vGFz^viF zNg;9s(O^Pq?TcUmw_X3!tQSQ&sQ;o0)Bkc%i2oL7`l#f}pJO5YmqcaW`=1ht3QYgY zK_z$&C82K;kUIfEq5tff#)jri&o?x!UCncqU{lKQ0R2GlN<-7eS~|jlgdiOx4XXb| zLufZh%1;D-Kpe}gHKE-e^tkLInh7xq%q4f$fC~-m0pfr}w(og#KEtM8(~gfpQI4|f z=Nu^Y)DCL+s!aQ+Hp#}@qe}Xbs|08rDtN+Tv z?ChQ$d5&A}IC>(DKxZf4k~4>F9)h=ko)?VpRtKAUxT}lh-M!1a_y1zqUmH~IJZXRP z->${wV*aZl_5Y|Mi!A@k!K&@|hdSOLX$>v?eJsBDJK>>aZ+z~*H?-WXjvpL4 z+}G5<_l3u*R}8o8JX`OyO}(?U->9kT8ofSoa@}xcZ+FF4a?Q1eR~7Y2d{^PMLneEN5o@_g@A$io99Pa!(Gqe2EM9;aGzHLzl;B?va8(XMXA#dZOazk)CZYAAR6O_jKm3)#;J$KkF}5PtE+Xqr&>;_{v|u zobg_3J2%*OU*`IX%QJf~eIop_=ZoIU@iULE(~pg1Mn{i4Q!%i=ckS0p=02G2kD@hK icf1~Y>h8pa!C){L36ZtiaDKCZKKh4VpUVhPw(Vq+5%p#1{`AAuCqVmyct4N85WAVyGp#n=>Wj1n4S z;p*((BjusRcz0-+&)sGA_I7u6_dCDuclIoZ4IANLpo|EDpsOnITP@cLl9Frl08!F) zQI-`+mw+HDk|+d#TF#Ryka7vc^i(WJNH|3z353tP9o;Mz`UG2>HDDfLsOK$)?XBLPk%{~bzM;vs=p>GasUXWKb3R2#PzqKg+d@d3b-h8BiKk1 z!?8nP9+;0z3q-t;0b&jY&8aZLHX_L7+7WjBjTBzyB`)E3N2#gdF81Xx{vn0>_f>Yw z69X6O|EeIVvL?{_R~21m{$B|S`eW3VGBC1`P25t)z?A;4N@wN2u8Au1|4I-=Nn}Tn z9Wjs_;sB@zxkP|w7!vHbE?oxzMoGsth=bE1kRT-KhJrz~0$NEE@e#)gp6Md~F2#hX z5qOaoSTy`MDJVw}6%*2EFGB=ep#M*v|4Cl`Gyg9?1^wHhnL;IZ{v1>Jzocru{;DFY zvZ8zXD}u!QzY@#>_o5g~nFQoUfIrdC4+@@}1r{d^7tl8ZOXofKKt27{yHO|#Vg~j8 zVi?2?l1PR9EFg|$)|=3d`%9eHLBxa@`N5JKXCMg;>;mF|u(#~G^mv9%zowlO21P6K z`p>0NjlUbqkkWIm|I;Rd5{?vdH?_;X^S7q6M{?qA4k~LcYf~K+m|0+Ut*A;=jm8X{kE*t&)SnE4r zM%A}7hwC=o@X3?4*}Ff!Z$VXtJ9Kn&ORKnfAk%L&Pun>D;)phO*KK{PKizeFOIz=n zy*o!wAB(P@-@O0Xt)Vxb?^^Wuz7^Z9s$0DG<(79l=RDI;yJg+Mmmb}CrBT z-!}KT=4?9KaOjJkYcgQjk@g!0$KO1e>6trl|4%m!{=B?u+4!Emw}w`2=pOv&TJ81s z9#V$gq1JEK%Ii?$Zt#20ucxXP^=-QPiQlpZ?i{{l`pMzO-oRHAJB1&st=E><&K!N! zdCK`A=yslR;D-|}568cpeRH7ta7WJ{hsPI;tY0|c!1o)c|1u-g@WGDm6TNL{-wPw* z(Wd>^e|==&5o^vX4U=!@9%pP?@baZ~f!i;ZpbQ3s!C){L3#Uqb*v{OB-fRab*UwBA(c`Y z>HD>GHpXPa)Jof#p|#i7P0QBn5B52oW3GRMndiUgOi0D6>D{frG2KU{)b;s`Qe4bm z%SvX%Z{5gy{`vd|)7ysTSHM;_wqg5{wti^nk)EvUsolQ}TKhoH^`Tah5&VKqp@FnN`?~EI5yvGmVv;1>iU*^A(0{Q~{uR`@o*M z%7&edw#^PUw8u^~=X1(x-;Xn!Wk0%GbA5)&B41Dtb&pGEL74_#ol>prTw=m`( zZL@bK9qp@cfp6q5bA|kGVa)$vTxZ)U9snQJf0Fvu`%medQ2%dX$UhbD7&<%4vW@eV tab?Ds>0<3e$rj$(uw88|syhGx0000000000006*m_5v>lSt Date: Wed, 11 Apr 2018 16:28:14 -0700 Subject: [PATCH 012/483] test helm template -x against subcharts stored as tgz's --- cmd/helm/template_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index bbcc9f3af84..46adecca7bd 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -27,7 +27,10 @@ import ( "testing" ) -var chartPath = "./../../pkg/chartutil/testdata/subpop/charts/subchart1" +var ( + chartPath = "./../../pkg/chartutil/testdata/subpop/charts/subchart1" + frobnitzChartPath = "./../../pkg/chartutil/testdata/frobnitz" +) func TestTemplateCmd(t *testing.T) { absChartPath, err := filepath.Abs(chartPath) @@ -76,6 +79,13 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/charts/subcharta/templates/service.yaml", expectValue: "protocol: TCP\n name: foobar", }, + { + name: "check_execute_subchart_template_for_tgz_subchart", + desc: "verify --execute single template on a subchart template where the subchart is a .tgz in the chart directory", + args: []string{frobnitzChartPath, "-x", "charts/mariner/templates/placeholder.tpl", "--set", "mariner.name=moon"}, + expectKey: "frobnitz/charts/mariner/templates/placeholder.tpl", + expectValue: "Goodbye moon", + }, { name: "check_namespace", desc: "verify --namespace", From ced20f6f4ebacbc120cd7e580668e3797aa7f2a9 Mon Sep 17 00:00:00 2001 From: Chance Zibolski Date: Wed, 11 Apr 2018 16:28:56 -0700 Subject: [PATCH 013/483] Disambigutate chartPaths variables in helm template tests --- cmd/helm/template_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 46adecca7bd..d2469525e83 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -28,12 +28,12 @@ import ( ) var ( - chartPath = "./../../pkg/chartutil/testdata/subpop/charts/subchart1" - frobnitzChartPath = "./../../pkg/chartutil/testdata/frobnitz" + subchart1ChartPath = "./../../pkg/chartutil/testdata/subpop/charts/subchart1" + frobnitzChartPath = "./../../pkg/chartutil/testdata/frobnitz" ) func TestTemplateCmd(t *testing.T) { - absChartPath, err := filepath.Abs(chartPath) + subchart1AbsChartPath, err := filepath.Abs(subchart1ChartPath) if err != nil { t.Fatal(err) } @@ -47,35 +47,35 @@ func TestTemplateCmd(t *testing.T) { { name: "check_name", desc: "check for a known name in chart", - args: []string{chartPath}, + args: []string{subchart1ChartPath}, expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: nginx", }, { name: "check_set_name", desc: "verify --set values exist", - args: []string{chartPath, "-x", "templates/service.yaml", "--set", "service.name=apache"}, + args: []string{subchart1ChartPath, "-x", "templates/service.yaml", "--set", "service.name=apache"}, expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, { name: "check_execute", desc: "verify --execute single template", - args: []string{chartPath, "-x", "templates/service.yaml", "--set", "service.name=apache"}, + args: []string{subchart1ChartPath, "-x", "templates/service.yaml", "--set", "service.name=apache"}, expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, { name: "check_execute_absolute", desc: "verify --execute single template", - args: []string{chartPath, "-x", absChartPath + "/" + "templates/service.yaml", "--set", "service.name=apache"}, + args: []string{subchart1ChartPath, "-x", subchart1AbsChartPath + "/" + "templates/service.yaml", "--set", "service.name=apache"}, expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, { name: "check_execute_subchart_template", desc: "verify --execute single template on a subchart template", - args: []string{chartPath, "-x", "charts/subcharta/templates/service.yaml", "--set", "subcharta.service.name=foobar"}, + args: []string{subchart1ChartPath, "-x", "charts/subcharta/templates/service.yaml", "--set", "subcharta.service.name=foobar"}, expectKey: "subchart1/charts/subcharta/templates/service.yaml", expectValue: "protocol: TCP\n name: foobar", }, @@ -89,42 +89,42 @@ func TestTemplateCmd(t *testing.T) { { name: "check_namespace", desc: "verify --namespace", - args: []string{chartPath, "--namespace", "test"}, + args: []string{subchart1ChartPath, "--namespace", "test"}, expectKey: "subchart1/templates/service.yaml", expectValue: "namespace: \"test\"", }, { name: "check_release_name", desc: "verify --release exists", - args: []string{chartPath, "--name", "test"}, + args: []string{subchart1ChartPath, "--name", "test"}, expectKey: "subchart1/templates/service.yaml", expectValue: "release-name: \"test\"", }, { name: "check_notes", desc: "verify --notes shows notes", - args: []string{chartPath, "--notes", "true"}, + args: []string{subchart1ChartPath, "--notes", "true"}, expectKey: "subchart1/templates/NOTES.txt", expectValue: "Sample notes for subchart1", }, { name: "check_values_files", desc: "verify --values files values exist", - args: []string{chartPath, "--values", chartPath + "/charts/subchartA/values.yaml"}, + args: []string{subchart1ChartPath, "--values", subchart1ChartPath + "/charts/subchartA/values.yaml"}, expectKey: "subchart1/templates/service.yaml", expectValue: "name: apache", }, { name: "check_name_template", desc: "verify --name-template result exists", - args: []string{chartPath, "--name-template", "foobar-{{ b64enc \"abc\" }}-baz"}, + args: []string{subchart1ChartPath, "--name-template", "foobar-{{ b64enc \"abc\" }}-baz"}, expectKey: "subchart1/templates/service.yaml", expectValue: "release-name: \"foobar-YWJj-baz\"", }, { name: "check_kube_version", desc: "verify --kube-version overrides the kubernetes version", - args: []string{chartPath, "--kube-version", "1.6"}, + args: []string{subchart1ChartPath, "--kube-version", "1.6"}, expectKey: "subchart1/templates/service.yaml", expectValue: "kube-version/major: \"1\"\n kube-version/minor: \"6\"\n kube-version/gitversion: \"v1.6.0\"", }, From b9adc356e8d1fe68b139a0b4c2495aa1e5fdebf8 Mon Sep 17 00:00:00 2001 From: Chance Zibolski Date: Wed, 11 Apr 2018 16:46:24 -0700 Subject: [PATCH 014/483] Correctly use subtests in helm template tests The testing.T in the subtest wasn't being used, so subtests were effectively not being used. Additionally, in case subtests run in parallel, we assign tt := tt to fix closure captures on range variables, since the variables produced by a range are re-used between iterations. --- cmd/helm/template_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index d2469525e83..7505b047438 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -132,7 +132,8 @@ func TestTemplateCmd(t *testing.T) { var buf bytes.Buffer for _, tt := range tests { - t.Run(tt.name, func(T *testing.T) { + tt := tt + t.Run(tt.name, func(t *testing.T) { // capture stdout old := os.Stdout r, w, _ := os.Pipe() From fb1dd48b5a1994e8a81a9b734cb6503d024799cd Mon Sep 17 00:00:00 2001 From: Chance Zibolski Date: Wed, 11 Apr 2018 16:48:53 -0700 Subject: [PATCH 015/483] test helm template -x with non-existent manifest --- cmd/helm/template_test.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 7505b047438..68ed87cd2fd 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -43,6 +43,7 @@ func TestTemplateCmd(t *testing.T) { args []string expectKey string expectValue string + expectError string }{ { name: "check_name", @@ -65,6 +66,12 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, + { + name: "check_execute_non_existent", + desc: "verify --execute fails on a template that doesnt exist", + args: []string{subchart1ChartPath, "-x", "templates/thisdoesntexist.yaml"}, + expectError: "could not find template", + }, { name: "check_execute_absolute", desc: "verify --execute single template", @@ -143,8 +150,21 @@ func TestTemplateCmd(t *testing.T) { cmd := newTemplateCmd(out) cmd.SetArgs(tt.args) err := cmd.Execute() - if err != nil { - t.Errorf("expected: %v, got %v", tt.expectValue, err) + + if tt.expectError != "" { + if err == nil { + t.Errorf("expected err: %s, but no error occurred", tt.expectError) + } + // non nil error, check if it contains the expected error + if strings.Contains(err.Error(), tt.expectError) { + // had the error we were looking for, this test case is + // done + return + } else { + t.Fatalf("expected err: %q, got: %q", tt.expectError, err) + } + } else if err != nil { + t.Errorf("expected no error, got %v", err) } // restore stdout w.Close() From 4ce35363d40fa6e8d8789121384d397748571e57 Mon Sep 17 00:00:00 2001 From: Jesse Weinstein Date: Fri, 13 Apr 2018 09:57:35 -0700 Subject: [PATCH 016/483] Document apiVersion field Added in https://github.com/kubernetes/helm/issues/1264 --- docs/charts.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/charts.md b/docs/charts.md index a19c1a477a4..a55038e3ef3 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -41,6 +41,7 @@ the listed file names. Other files will be left as they are. The `Chart.yaml` file is required for a chart. It contains the following fields: ```yaml +apiVersion: The chart API version, always "v1" (required) name: The name of the chart (required) version: A SemVer 2 version (required) kubeVersion: A SemVer range of compatible Kubernetes versions (optional) From 75682ed5844400e5dcd24ec7532c0fa454defd4d Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Sat, 14 Apr 2018 05:52:34 -0400 Subject: [PATCH 017/483] fix(helm): resolve linter's warning on template command unit tests Signed-off-by: Arash Deshmeh --- cmd/helm/template_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 68ed87cd2fd..cad42db16df 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -160,9 +160,8 @@ func TestTemplateCmd(t *testing.T) { // had the error we were looking for, this test case is // done return - } else { - t.Fatalf("expected err: %q, got: %q", tt.expectError, err) } + t.Fatalf("expected err: %q, got: %q", tt.expectError, err) } else if err != nil { t.Errorf("expected no error, got %v", err) } From 7631b8a926d1cc533a94951b6a96c948081e78e7 Mon Sep 17 00:00:00 2001 From: Sergii Manannikov Date: Sat, 14 Apr 2018 15:51:01 +0200 Subject: [PATCH 018/483] Create PodSecurityPolicy before Pods and ServiceAccounts --- pkg/tiller/kind_sorter.go | 2 ++ pkg/tiller/kind_sorter_test.go | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/kind_sorter.go b/pkg/tiller/kind_sorter.go index f367e65c872..43726d53e43 100644 --- a/pkg/tiller/kind_sorter.go +++ b/pkg/tiller/kind_sorter.go @@ -30,6 +30,7 @@ var InstallOrder SortOrder = []string{ "Namespace", "ResourceQuota", "LimitRange", + "PodSecurityPolicy", "Secret", "ConfigMap", "StorageClass", @@ -80,6 +81,7 @@ var UninstallOrder SortOrder = []string{ "StorageClass", "ConfigMap", "Secret", + "PodSecurityPolicy", "LimitRange", "ResourceQuota", "Namespace", diff --git a/pkg/tiller/kind_sorter_test.go b/pkg/tiller/kind_sorter_test.go index ef7296e890d..8d01fac17d7 100644 --- a/pkg/tiller/kind_sorter_test.go +++ b/pkg/tiller/kind_sorter_test.go @@ -85,6 +85,10 @@ func TestKindSorter(t *testing.T) { Name: "o", Head: &util.SimpleHead{Kind: "Pod"}, }, + { + Name: "3", + Head: &util.SimpleHead{Kind: "PodSecurityPolicy"}, + }, { Name: "q", Head: &util.SimpleHead{Kind: "ReplicaSet"}, @@ -136,8 +140,8 @@ func TestKindSorter(t *testing.T) { order SortOrder expected string }{ - {"install", InstallOrder, "abcde1fgh2ijklmnopqrstuvw!"}, - {"uninstall", UninstallOrder, "wvmutsrqponlkji2hgf1edcba!"}, + {"install", InstallOrder, "abc3de1fgh2ijklmnopqrstuvw!"}, + {"uninstall", UninstallOrder, "wvmutsrqponlkji2hgf1ed3cba!"}, } { var buf bytes.Buffer t.Run(test.description, func(t *testing.T) { From 223c89e6aac873a8fe9b0228d39364f566881831 Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Sat, 14 Apr 2018 15:37:42 -0400 Subject: [PATCH 019/483] feat(helm): support removing multiple repositories with repo remove command Signed-off-by: Arash Deshmeh --- cmd/helm/repo_remove.go | 15 ++++++--- cmd/helm/repo_remove_test.go | 64 ++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/cmd/helm/repo_remove.go b/cmd/helm/repo_remove.go index 201ee9ca80e..728852fa1e2 100644 --- a/cmd/helm/repo_remove.go +++ b/cmd/helm/repo_remove.go @@ -41,13 +41,18 @@ func newRepoRemoveCmd(out io.Writer) *cobra.Command { Aliases: []string{"rm"}, Short: "remove a chart repository", RunE: func(cmd *cobra.Command, args []string) error { - if err := checkArgsLength(len(args), "name of chart repository"); err != nil { - return err + if len(args) == 0 { + return fmt.Errorf("need at least one argument, name of chart repository") } - remove.name = args[0] - remove.home = settings.Home - return remove.run() + remove.home = settings.Home + for i := 0; i < len(args); i++ { + remove.name = args[i] + if err := remove.run(); err != nil { + return err + } + } + return nil }, } diff --git a/cmd/helm/repo_remove_test.go b/cmd/helm/repo_remove_test.go index 174a4449557..bc071b989bc 100644 --- a/cmd/helm/repo_remove_test.go +++ b/cmd/helm/repo_remove_test.go @@ -18,6 +18,7 @@ package main import ( "bytes" + "io/ioutil" "os" "strings" "testing" @@ -79,3 +80,66 @@ func TestRepoRemove(t *testing.T) { t.Errorf("%s was not successfully removed from repositories list", testName) } } + +func TestRepoRemove_NoArguments(t *testing.T) { + cmd := newRepoRemoveCmd(ioutil.Discard) + if err := cmd.RunE(cmd, []string{}); err == nil { + t.Errorf("Expected an error since no repo names were provided") + } +} + +func TestRepoRemove_MultipleRepos(t *testing.T) { + ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*") + if err != nil { + t.Fatal(err) + } + + hh := helmpath.Home(thome) + cleanup := resetEnv() + defer func() { + ts.Stop() + os.RemoveAll(thome.String()) + cleanup() + }() + if err := ensureTestHome(hh, t); err != nil { + t.Fatal(err) + } + + settings.Home = thome + + repoFoo := testName + "foo" + repoBar := testName + "bar" + + if err := addRepository(repoFoo, ts.URL(), "", "", hh, "", "", "", true); err != nil { + t.Error(err) + } + if err := addRepository(repoBar, ts.URL(), "", "", hh, "", "", "", true); err != nil { + t.Error(err) + } + + b := bytes.NewBuffer(nil) + + cmd := newRepoRemoveCmd(b) + if err := cmd.RunE(cmd, []string{repoFoo, repoBar}); err != nil { + t.Error(err) + } + + if !strings.Contains(b.String(), repoFoo) { + t.Errorf("Expected %q in output, found: %q", repoFoo, b.String()) + } + if !strings.Contains(b.String(), repoBar) { + t.Errorf("Expected %q in output, found: %q", repoBar, b.String()) + } + + f, err := repo.LoadRepositoriesFile(hh.RepositoryFile()) + if err != nil { + t.Error(err) + } + + if f.Has(repoFoo) { + t.Errorf("%s was not successfully removed from repositories list", repoFoo) + } + if f.Has(repoBar) { + t.Errorf("%s was not successfully removed from repositories list", repoBar) + } +} From f291fdbb43730dbb266d7aeb146c40aa978a0c66 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 15 Apr 2018 23:37:13 +0800 Subject: [PATCH 020/483] Typo fix in functions_and_pipelines.md useable->usable --- docs/chart_template_guide/functions_and_pipelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/functions_and_pipelines.md b/docs/chart_template_guide/functions_and_pipelines.md index 54eb8e24f53..66176fc59a5 100644 --- a/docs/chart_template_guide/functions_and_pipelines.md +++ b/docs/chart_template_guide/functions_and_pipelines.md @@ -1,6 +1,6 @@ # Template Functions and Pipelines -So far, we've seen how to place information into a template. But that information is placed into the template unmodified. Sometimes we want to transform the supplied data in a way that makes it more useable to us. +So far, we've seen how to place information into a template. But that information is placed into the template unmodified. Sometimes we want to transform the supplied data in a way that makes it more usable to us. Let's start with a best practice: When injecting strings from the `.Values` object into the template, we ought to quote these strings. We can do that by calling the `quote` function in the template directive: From 0209ac32ddb8da3fb70e82855970146eec4031f9 Mon Sep 17 00:00:00 2001 From: Derek Bassett Date: Thu, 22 Mar 2018 23:21:45 -0600 Subject: [PATCH 021/483] Add App Version to the helm ls command. --- cmd/helm/list.go | 5 +++-- cmd/helm/list_test.go | 27 ++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 4332ceb2169..c2633d21cc9 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -237,7 +237,7 @@ func formatList(rels []*release.Release, colWidth uint) string { table := uitable.New() table.MaxColWidth = colWidth - table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART", "NAMESPACE") + table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART", "APP VERSION", "NAMESPACE") for _, r := range rels { md := r.GetChart().GetMetadata() c := fmt.Sprintf("%s-%s", md.GetName(), md.GetVersion()) @@ -247,8 +247,9 @@ func formatList(rels []*release.Release, colWidth uint) string { } s := r.GetInfo().GetStatus().GetCode().String() v := r.GetVersion() + a := md.GetAppVersion() n := r.GetNamespace() - table.AddRow(r.GetName(), v, t, s, c, n) + table.AddRow(r.GetName(), v, t, s, c, a, n) } return table.String() } diff --git a/cmd/helm/list_test.go b/cmd/helm/list_test.go index d853fa6b155..e292b4b5a19 100644 --- a/cmd/helm/list_test.go +++ b/cmd/helm/list_test.go @@ -22,11 +22,29 @@ import ( "github.com/spf13/cobra" + "io/ioutil" + "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" + "os" ) func TestListCmd(t *testing.T) { + tmpChart, _ := ioutil.TempDir("testdata", "tmp") + defer os.RemoveAll(tmpChart) + cfile := &chart.Metadata{ + Name: "foo", + Description: "A Helm chart for Kubernetes", + Version: "0.1.0-beta.1", + AppVersion: "2.X.A", + } + chartPath, err := chartutil.Create(cfile, tmpChart) + if err != nil { + t.Errorf("Error creating chart for list: %v", err) + } + ch, _ := chartutil.Load(chartPath) + tests := []releaseCase{ { name: "with a release", @@ -40,7 +58,14 @@ func TestListCmd(t *testing.T) { rels: []*release.Release{ helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas"}), }, - expected: "NAME \tREVISION\tUPDATED \tSTATUS \tCHART \tNAMESPACE\natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\tdefault \n", + expected: "NAME \tREVISION\tUPDATED \tSTATUS \tCHART \tAPP VERSION\tNAMESPACE\natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\t \tdefault \n", + }, + { + name: "list with appVersion", + rels: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas", Chart: ch}), + }, + expected: "NAME \tREVISION\tUPDATED \tSTATUS \tCHART \tAPP VERSION\tNAMESPACE\natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\t2.X.A \tdefault \n", }, { name: "list, one deployed, one failed", From 7b8aae466761448522acbd3beb2a16ad2283013a Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 16 Apr 2018 16:46:47 -0700 Subject: [PATCH 022/483] Revert "feat: add --set and --values options to 'helm package'" This reverts commit a930eb7ff4dcba13831174496dda2445e81ebeaa. --- cmd/helm/package.go | 20 ----- cmd/helm/package_test.go | 152 -------------------------------------- docs/helm/helm_package.md | 21 +++--- 3 files changed, 9 insertions(+), 184 deletions(-) diff --git a/cmd/helm/package.go b/cmd/helm/package.go index bf171e534ae..ed44382c792 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -53,9 +53,6 @@ type packageCmd struct { save bool sign bool path string - valueFiles valueFiles - values []string - stringValues []string key string keyring string version string @@ -98,9 +95,6 @@ func newPackageCmd(out io.Writer) *cobra.Command { } f := cmd.Flags() - f.VarP(&pkg.valueFiles, "values", "f", "specify values in a YAML file or a URL(can specify multiple)") - f.StringArrayVar(&pkg.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") - f.StringArrayVar(&pkg.stringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.BoolVar(&pkg.save, "save", true, "save packaged chart to local chart repository") f.BoolVar(&pkg.sign, "sign", false, "use a PGP private key to sign this package") f.StringVar(&pkg.key, "key", "", "name of the key to use when signing. Used if --sign is true") @@ -139,20 +133,6 @@ func (p *packageCmd) run() error { return err } - overrideVals, err := vals(p.valueFiles, p.values, p.stringValues) - if err != nil { - return err - } - combinedVals, err := chartutil.CoalesceValues(ch, &chart.Config{Raw: string(overrideVals)}) - if err != nil { - return err - } - newVals, err := combinedVals.YAML() - if err != nil { - return err - } - ch.Values = &chart.Config{Raw: newVals} - // If version is set, modify the version. if len(p.version) != 0 { if err := setVersion(ch, p.version); err != nil { diff --git a/cmd/helm/package_test.go b/cmd/helm/package_test.go index 4a2df3f546b..4404586e0f8 100644 --- a/cmd/helm/package_test.go +++ b/cmd/helm/package_test.go @@ -21,7 +21,6 @@ import ( "os" "path/filepath" "regexp" - "strings" "testing" "github.com/spf13/cobra" @@ -123,13 +122,6 @@ func TestPackage(t *testing.T) { hasfile: "chart-missing-deps-0.1.0.tgz", err: true, }, - { - name: "package --values does-not-exist", - args: []string{"testdata/testcharts/alpine"}, - flags: map[string]string{"values": "does-not-exist"}, - expect: "does-not-exist: no such file or directory", - err: true, - }, } // Because these tests are destructive, we run them in a tempdir. @@ -253,150 +245,6 @@ func TestSetAppVersion(t *testing.T) { } } -func TestPackageValues(t *testing.T) { - testCases := []struct { - desc string - args []string - valuefilesContents []string - flags map[string]string - expected []string - }{ - { - desc: "helm package, single values file", - args: []string{"testdata/testcharts/alpine"}, - valuefilesContents: []string{"Name: chart-name-foo"}, - expected: []string{"Name: chart-name-foo"}, - }, - { - desc: "helm package, multiple values files", - args: []string{"testdata/testcharts/alpine"}, - valuefilesContents: []string{"Name: chart-name-foo", "foo: bar"}, - expected: []string{"Name: chart-name-foo", "foo: bar"}, - }, - { - desc: "helm package, with set option", - args: []string{"testdata/testcharts/alpine"}, - flags: map[string]string{"set": "Name=chart-name-foo"}, - expected: []string{"Name: chart-name-foo"}, - }, - { - desc: "helm package, set takes precedence over value file", - args: []string{"testdata/testcharts/alpine"}, - valuefilesContents: []string{"Name: chart-name-foo"}, - flags: map[string]string{"set": "Name=chart-name-bar"}, - expected: []string{"Name: chart-name-bar"}, - }, - } - - thome, err := tempHelmHome(t) - if err != nil { - t.Fatal(err) - } - cleanup := resetEnv() - defer func() { - os.RemoveAll(thome.String()) - cleanup() - }() - - settings.Home = thome - - for _, tc := range testCases { - var files []string - for _, contents := range tc.valuefilesContents { - f, err := createValuesFile(contents) - if err != nil { - t.Errorf("%q unexpected error creating temporary values file: %q", tc.desc, err) - } - defer os.RemoveAll(filepath.Dir(f)) - files = append(files, f) - } - valueFiles := strings.Join(files, ",") - - expected, err := chartutil.ReadValues([]byte(strings.Join(tc.expected, "\n"))) - if err != nil { - t.Errorf("unexpected error parsing values: %q", err) - } - - runAndVerifyPackageCommandValues(t, tc.args, tc.flags, valueFiles, expected) - } -} - -func runAndVerifyPackageCommandValues(t *testing.T, args []string, flags map[string]string, valueFiles string, expected chartutil.Values) { - outputDir, err := ioutil.TempDir("", "helm-package") - if err != nil { - t.Errorf("unexpected error creating temporary output directory: %q", err) - } - defer os.RemoveAll(outputDir) - - if len(flags) == 0 { - flags = make(map[string]string) - } - flags["destination"] = outputDir - - if len(valueFiles) > 0 { - flags["values"] = valueFiles - } - - cmd := newPackageCmd(&bytes.Buffer{}) - setFlags(cmd, flags) - err = cmd.RunE(cmd, args) - if err != nil { - t.Errorf("unexpected error: %q", err) - } - - outputFile := filepath.Join(outputDir, "alpine-0.1.0.tgz") - verifyOutputChartExists(t, outputFile) - - var actual chartutil.Values - actual, err = getChartValues(outputFile) - if err != nil { - t.Errorf("unexpected error extracting chart values: %q", err) - } - - verifyValues(t, actual, expected) -} - -func createValuesFile(data string) (string, error) { - outputDir, err := ioutil.TempDir("", "values-file") - if err != nil { - return "", err - } - - outputFile := filepath.Join(outputDir, "values.yaml") - if err = ioutil.WriteFile(outputFile, []byte(data), 0755); err != nil { - os.RemoveAll(outputFile) - return "", err - } - - return outputFile, nil -} - -func getChartValues(chartPath string) (chartutil.Values, error) { - - chart, err := chartutil.Load(chartPath) - if err != nil { - return nil, err - } - - return chartutil.ReadValues([]byte(chart.Values.Raw)) -} - -func verifyValues(t *testing.T, actual, expected chartutil.Values) { - for key, value := range expected.AsMap() { - if got := actual[key]; got != value { - t.Errorf("Expected %q, got %q (%v)", value, got, actual) - } - } -} - -func verifyOutputChartExists(t *testing.T, chartPath string) { - if chartFile, err := os.Stat(chartPath); err != nil { - t.Errorf("expected file %q, got err %q", chartPath, err) - } else if chartFile.Size() == 0 { - t.Errorf("file %q has zero bytes.", chartPath) - } -} - func setFlags(cmd *cobra.Command, flags map[string]string) { dest := cmd.Flags() for f, v := range flags { diff --git a/docs/helm/helm_package.md b/docs/helm/helm_package.md index 957f9c3b293..21090fa4580 100644 --- a/docs/helm/helm_package.md +++ b/docs/helm/helm_package.md @@ -23,17 +23,14 @@ helm package [flags] [CHART_PATH] [...] ### Options ``` - --app-version string set the appVersion on the chart to this version - -u, --dependency-update update dependencies from "requirements.yaml" to dir "charts/" before packaging - -d, --destination string location to write the chart. (default ".") - --key string name of the key to use when signing. Used if --sign is true - --keyring string location of a public keyring (default "~/.gnupg/pubring.gpg") - --save save packaged chart to local chart repository (default true) - --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) - --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) - --sign use a PGP private key to sign this package - -f, --values valueFiles specify values in a YAML file or a URL(can specify multiple) (default []) - --version string set the version on the chart to this semver version + --app-version string set the appVersion on the chart to this version + -u, --dependency-update update dependencies from "requirements.yaml" to dir "charts/" before packaging + -d, --destination string location to write the chart. (default ".") + --key string name of the key to use when signing. Used if --sign is true + --keyring string location of a public keyring (default "~/.gnupg/pubring.gpg") + --save save packaged chart to local chart repository (default true) + --sign use a PGP private key to sign this package + --version string set the version on the chart to this semver version ``` ### Options inherited from parent commands @@ -50,4 +47,4 @@ helm package [flags] [CHART_PATH] [...] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 6-Apr-2018 +###### Auto generated by spf13/cobra on 16-Apr-2018 From 9f78c33c644cbf4599c30605470b752126573471 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 17 Apr 2018 13:55:29 +0800 Subject: [PATCH 023/483] Correct the returned message Correct the returned message --- pkg/plugin/installer/vcs_installer_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/plugin/installer/vcs_installer_test.go b/pkg/plugin/installer/vcs_installer_test.go index 45389954361..d6eb32c1b14 100644 --- a/pkg/plugin/installer/vcs_installer_test.go +++ b/pkg/plugin/installer/vcs_installer_test.go @@ -133,9 +133,9 @@ func TestVCSInstallerNonExistentVersion(t *testing.T) { } if err := Install(i); err == nil { - t.Error("expected error for version does not exists, got none") + t.Error("expected error for version does not exist, got none") } else if err.Error() != fmt.Sprintf("requested version %q does not exist for plugin %q", version, source) { - t.Errorf("expected error for version does not exists, got (%v)", err) + t.Errorf("expected error for version does not exist, got (%v)", err) } } func TestVCSInstallerUpdate(t *testing.T) { From fac7caf5d266c33cc95d0413e73a9a4636e48317 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Tue, 17 Apr 2018 14:42:09 +0800 Subject: [PATCH 024/483] Correct the returned message in reset_test.go Correct the returned message --- cmd/helm/reset_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/reset_test.go b/cmd/helm/reset_test.go index ae6a0003609..189b692735b 100644 --- a/cmd/helm/reset_test.go +++ b/cmd/helm/reset_test.go @@ -123,7 +123,7 @@ func verifyResetCmd(t *testing.T, tc resetCase) { } _, err = os.Stat(home) if !tc.removeHelmHome && err != nil { - t.Errorf("Helm home directory %s does not exists", home) + t.Errorf("Helm home directory %s does not exist", home) } if tc.removeHelmHome && err == nil { t.Errorf("Helm home directory %s exists", home) From fed7e69c81eef1cf0686a5a73d01901c1584e169 Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Sat, 14 Apr 2018 11:29:27 -0400 Subject: [PATCH 025/483] ref(pkg/plugin): create clean path for extracting plugins --- glide.lock | 10 ++- glide.yaml | 2 + pkg/plugin/installer/http_installer.go | 16 ++-- pkg/plugin/installer/http_installer_test.go | 88 +++++++++++++++++++++ 4 files changed, 108 insertions(+), 8 deletions(-) diff --git a/glide.lock b/glide.lock index 6c54c927c7a..a91c31b7b1c 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 6837936360d447b64aa7a09d3c89c18ac5540b009a57fc4d3227af299bf40268 -updated: 2018-04-03T08:17:14.801847688-07:00 +hash: 4023a1644d60060fbf2fdbbe5b73cbb4b957eb686ce925640d102db2d1858676 +updated: 2018-04-14T11:27:34.604716498-04:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -31,6 +31,8 @@ imports: version: 71acacd42f85e5e82f70a55327789582a5200a90 subpackages: - md2man +- name: github.com/cyphar/filepath-securejoin + version: 06bda8370f45268db985f7af15732444d94ed51c - name: github.com/davecgh/go-spew version: 782f4967f2dc4564575ca782fe2d04090b5faca8 subpackages: @@ -210,6 +212,8 @@ imports: version: ca53cad383cad2479bbba7f7a1a05797ec1386e4 - name: github.com/peterbourgon/diskv version: 5f041e8faa004a95c88a202771f4cc3e991971e6 +- name: github.com/pkg/errors + version: 645ef00459ed84a119197bfb8d8205042c6df63d - name: github.com/prometheus/client_golang version: c5b7fccd204277076155f10851dad72b76a49317 subpackages: @@ -641,7 +645,7 @@ imports: - pkg/util/proto - pkg/util/proto/validation - name: k8s.io/kubernetes - version: a22f9fd34871d9dc9e5db2c02c713821d18ab2cd + version: baab3992147260d47cb59b9c485a24fdeff2e457 subpackages: - pkg/api/events - pkg/api/legacyscheme diff --git a/glide.yaml b/glide.yaml index 7fcb16d0b86..ce5d0e8c2ee 100644 --- a/glide.yaml +++ b/glide.yaml @@ -57,6 +57,8 @@ import: version: release-1.10 - package: k8s.io/apiserver version: release-1.10 +- package: github.com/cyphar/filepath-securejoin + version: ^0.2.1 testImports: - package: github.com/stretchr/testify diff --git a/pkg/plugin/installer/http_installer.go b/pkg/plugin/installer/http_installer.go index 91d49765100..b5c205de6fd 100644 --- a/pkg/plugin/installer/http_installer.go +++ b/pkg/plugin/installer/http_installer.go @@ -21,14 +21,17 @@ import ( "compress/gzip" "fmt" "io" - "k8s.io/helm/pkg/getter" - "k8s.io/helm/pkg/helm/environment" - "k8s.io/helm/pkg/helm/helmpath" - "k8s.io/helm/pkg/plugin/cache" "os" "path/filepath" "regexp" "strings" + + fp "github.com/cyphar/filepath-securejoin" + + "k8s.io/helm/pkg/getter" + "k8s.io/helm/pkg/helm/environment" + "k8s.io/helm/pkg/helm/helmpath" + "k8s.io/helm/pkg/plugin/cache" ) // HTTPInstaller installs plugins from an archive served by a web server. @@ -181,7 +184,10 @@ func (g *TarGzExtractor) Extract(buffer *bytes.Buffer, targetDir string) error { return err } - path := filepath.Join(targetDir, header.Name) + path, err := fp.SecureJoin(targetDir, header.Name) + if err != nil { + return err + } switch header.Typeflag { case tar.TypeDir: diff --git a/pkg/plugin/installer/http_installer_test.go b/pkg/plugin/installer/http_installer_test.go index ca1a71e3e43..bab5f7a92b3 100644 --- a/pkg/plugin/installer/http_installer_test.go +++ b/pkg/plugin/installer/http_installer_test.go @@ -16,12 +16,15 @@ limitations under the License. package installer // import "k8s.io/helm/pkg/plugin/installer" import ( + "archive/tar" "bytes" + "compress/gzip" "encoding/base64" "fmt" "io/ioutil" "k8s.io/helm/pkg/helm/helmpath" "os" + "path/filepath" "testing" ) @@ -187,3 +190,88 @@ func TestHTTPInstallerUpdate(t *testing.T) { t.Error("update method not implemented for http installer") } } + +func TestExtract(t *testing.T) { + //create a temp home + hh, err := ioutil.TempDir("", "helm-home-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(hh) + + home := helmpath.Home(hh) + if err := os.MkdirAll(home.Plugins(), 0755); err != nil { + t.Fatalf("Could not create %s: %s", home.Plugins(), err) + } + + cacheDir := filepath.Join(home.Cache(), "plugins", "plugin-key") + if err := os.MkdirAll(cacheDir, 0755); err != nil { + t.Fatalf("Could not create %s: %s", cacheDir, err) + } + + //{"plugin.yaml", "plugin metadata up in here"}, + //{"README.md", "so you know what's upp"}, + //{"script.sh", "echo script"}, + + var tarbuf bytes.Buffer + tw := tar.NewWriter(&tarbuf) + var files = []struct { + Name, Body string + }{ + {"../../plugin.yaml", "sneaky plugin metadata"}, + {"README.md", "some text"}, + } + for _, file := range files { + hdr := &tar.Header{ + Name: file.Name, + Typeflag: tar.TypeReg, + Mode: 0600, + Size: int64(len(file.Body)), + } + if err := tw.WriteHeader(hdr); err != nil { + t.Fatal(err) + } + if _, err := tw.Write([]byte(file.Body)); err != nil { + t.Fatal(err) + } + } + if err := tw.Close(); err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + gz := gzip.NewWriter(&buf) + if _, err := gz.Write(tarbuf.Bytes()); err != nil { + t.Fatal(err) + } + gz.Close() + + source := "https://repo.localdomain/plugins/fake-plugin-0.0.1.tgz" + extr, err := NewExtractor(source) + if err != nil { + t.Fatal(err) + } + + if err = extr.Extract(&buf, cacheDir); err != nil { + t.Errorf("Did not expect error but got error: %v", err) + } + + pluginYAMLFullPath := filepath.Join(cacheDir, "plugin.yaml") + if _, err := os.Stat(pluginYAMLFullPath); err != nil { + if os.IsNotExist(err) { + t.Errorf("Expected %s to exist but doesn't", pluginYAMLFullPath) + } else { + t.Error(err) + } + } + + readmeFullPath := filepath.Join(cacheDir, "README.md") + if _, err := os.Stat(readmeFullPath); err != nil { + if os.IsNotExist(err) { + t.Errorf("Expected %s to exist but doesn't", readmeFullPath) + } else { + t.Error(err) + } + } + +} From 1850aeade9efe7edb960b130daa46c727ad98bab Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Tue, 17 Apr 2018 15:04:53 -0400 Subject: [PATCH 026/483] fix(pkg/strvals): evaluate "null" values resolves #3891 Co-authored-by: Matthew Fisher --- pkg/strvals/parser.go | 8 ++++++++ pkg/strvals/parser_test.go | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index aa3d15904d5..8d20c3bc39d 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -82,6 +82,10 @@ func ParseIntoString(s string, dest map[string]interface{}) error { // parser is a simple parser that takes a strvals line and parses it into a // map representation. +// +// where sc is the source of the original data being parsed +// where data is the final parsed data from the parses with correct types +// where st is a boolean to figure out if we're forcing it to parse values as string type parser struct { sc *bytes.Buffer data map[string]interface{} @@ -329,6 +333,10 @@ func typedVal(v []rune, st bool) interface{} { return false } + if strings.EqualFold(val, "null") { + return nil + } + // If this value does not start with zero, and not returnString, try parsing it to an int if !st && len(val) != 0 && val[0] != '0' { if iv, err := strconv.ParseInt(val, 10, 64); err == nil { diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index fd287bf8a43..482377c3277 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -81,6 +81,11 @@ func TestParseSet(t *testing.T) { expect map[string]interface{} err bool }{ + { + "name1=null,f=false,t=true", + map[string]interface{}{"name1": nil, "f": false, "t": true}, + false, + }, { "name1=value1", map[string]interface{}{"name1": "value1"}, From 31ddd707e8f832c2ac429aa09284e196f1664ec6 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Tue, 17 Apr 2018 15:14:09 -0700 Subject: [PATCH 027/483] fix(kube): use correct object type in watch fixes #3902 --- pkg/kube/client.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 8a740293829..08707fa7667 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -47,7 +47,6 @@ import ( "k8s.io/client-go/tools/clientcmd" batchinternal "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/conditions" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -686,12 +685,27 @@ func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Inf c.Log("Watching pod %s for completion with timeout of %v", info.Name, timeout) _, err = watch.Until(timeout, w, func(e watch.Event) (bool, error) { - return conditions.PodCompleted(e) + return isPodComplete(e) }) return err } +func isPodComplete(event watch.Event) (bool, error) { + o, ok := event.Object.(*core.Pod) + if !ok { + return true, fmt.Errorf("expected a *core.Pod, got %T", event.Object) + } + if event.Type == watch.Deleted { + return false, fmt.Errorf("pod not found") + } + switch o.Status.Phase { + case core.PodFailed, core.PodSucceeded: + return true, nil + } + return false, nil +} + //get a kubernetes resources' relation pods // kubernetes resource used select labels to relate pods func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]core.Pod) (map[string][]core.Pod, error) { From aa2976f0cea3b80278c07c31ffc40072ff81b289 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 17 Apr 2018 16:36:50 -0700 Subject: [PATCH 028/483] swallow the error when returning the default HTTP client --- pkg/downloader/chart_downloader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index fe2f3ce92d7..8b386fc09b6 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -183,7 +183,7 @@ func (c *ChartDownloader) ResolveChartVersionAndGetRepo(ref, version string) (*u r := &repo.ChartRepository{} r.Client = g g.SetCredentials(c.getRepoCredentials(r)) - return u, r, g, err + return u, r, g, nil } return u, nil, nil, err } From 6ffff5fea9febb3c2522a391a80cb09b838288a7 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 18 Apr 2018 11:42:56 -0700 Subject: [PATCH 029/483] fix(kube): get correct versioned object from info helper fixes: #3826 --- pkg/kube/client.go | 85 ++++++++++++++++------------------------------ pkg/kube/wait.go | 2 +- 2 files changed, 30 insertions(+), 57 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 08707fa7667..34d979d478f 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -35,9 +35,7 @@ import ( extv1beta1 "k8s.io/api/extensions/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -393,12 +391,12 @@ func deleteResource(c *Client, info *resource.Info) error { return reaper.Stop(info.Namespace, info.Name, 0, nil) } -func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]byte, types.PatchType, error) { +func createPatch(target *resource.Info, current runtime.Object) ([]byte, types.PatchType, error) { oldData, err := json.Marshal(current) if err != nil { return nil, types.StrategicMergePatchType, fmt.Errorf("serializing current configuration: %s", err) } - newData, err := json.Marshal(target) + newData, err := json.Marshal(target.Object) if err != nil { return nil, types.StrategicMergePatchType, fmt.Errorf("serializing target configuration: %s", err) } @@ -412,7 +410,7 @@ func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]b } // Get a versioned object - versionedObject, err := mapping.ConvertToVersion(target, mapping.GroupVersionKind.GroupVersion()) + versionedObject, err := target.Versioned() // Unstructured objects, such as CRDs, may not have an not registered error // returned from ConvertToVersion. Anything that's unstructured should @@ -434,7 +432,7 @@ func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]b } func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, force bool, recreate bool) error { - patch, patchType, err := createPatch(target.Mapping, target.Object, currentObj) + patch, patchType, err := createPatch(target, currentObj) if err != nil { return fmt.Errorf("failed to create patch: %s", err) } @@ -484,16 +482,9 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, return nil } - versioned, err := c.AsVersionedObject(target.Object) - if runtime.IsNotRegisteredError(err) { - return nil - } - if err != nil { - return err - } - - selector, err := getSelectorFromObject(versioned) - if err != nil { + versioned := target.AsVersioned() + selector, ok := getSelectorFromObject(versioned) + if !ok { return nil } @@ -522,45 +513,45 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, return nil } -func getSelectorFromObject(obj runtime.Object) (map[string]string, error) { +func getSelectorFromObject(obj runtime.Object) (map[string]string, bool) { switch typed := obj.(type) { case *v1.ReplicationController: - return typed.Spec.Selector, nil + return typed.Spec.Selector, true case *extv1beta1.ReplicaSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1.ReplicaSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *extv1beta1.Deployment: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1beta1.Deployment: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1beta2.Deployment: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1.Deployment: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *extv1beta1.DaemonSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1beta2.DaemonSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1.DaemonSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *batch.Job: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1beta1.StatefulSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1beta2.StatefulSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true case *appsv1.StatefulSet: - return typed.Spec.Selector.MatchLabels, nil + return typed.Spec.Selector.MatchLabels, true default: - return nil, fmt.Errorf("Unsupported kind when getting selector: %v", obj) + return nil, false } } @@ -605,18 +596,6 @@ func (c *Client) watchUntilReady(timeout time.Duration, info *resource.Info) err return err } -// AsVersionedObject converts a runtime.object to a versioned object. -func (c *Client) AsVersionedObject(obj runtime.Object) (runtime.Object, error) { - json, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) - if err != nil { - return nil, err - } - versions := &runtime.VersionedObjects{} - decoder := unstructured.UnstructuredJSONScheme - err = runtime.DecodeInto(decoder, json, versions) - return versions.First(), err -} - // waitForJob is a helper that waits for a job to complete. // // This operates on an event returned from a watcher. @@ -715,22 +694,16 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] c.Log("get relation pod of object: %s/%s/%s", info.Namespace, info.Mapping.GroupVersionKind.Kind, info.Name) - versioned, err := c.AsVersionedObject(info.Object) - if runtime.IsNotRegisteredError(err) { + versioned, err := info.Versioned() + switch { + case runtime.IsNotRegisteredError(err): return objPods, nil - } - if err != nil { + case err != nil: return objPods, err } - // We can ignore this error because it will only error if it isn't a type that doesn't - // have pods. In that case, we don't care - selector, _ := getSelectorFromObject(versioned) - - selectorString := labels.Set(selector).AsSelector().String() - - // If we have an empty selector, this likely is a service or config map, so bail out now - if selectorString == "" { + selector, ok := getSelectorFromObject(versioned) + if !ok { return objPods, nil } diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 27ede15db96..88f3c7d34d5 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -56,7 +56,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { pvc := []v1.PersistentVolumeClaim{} deployments := []deployment{} for _, v := range created { - obj, err := c.AsVersionedObject(v.Object) + obj, err := v.Versioned() if err != nil && !runtime.IsNotRegisteredError(err) { return false, err } From 49c3d50e4eb4b61135d58a6cb52a5cd3304e2c51 Mon Sep 17 00:00:00 2001 From: Sean Eagan Date: Wed, 18 Apr 2018 13:27:37 -0500 Subject: [PATCH 030/483] feat(list): Optional output as JSON and YAML The choice of interface `--output (json|yaml)` is to match that of the status command, except that -o is not available as it is already used by --offset. WIP #1534 --- cmd/helm/list.go | 138 +++++++++++++++++++++++++++++++++-------- cmd/helm/list_test.go | 80 +++++++++++++++++++++++- docs/helm/helm_list.md | 3 +- pkg/helm/fake.go | 23 ++++++- 4 files changed, 215 insertions(+), 29 deletions(-) diff --git a/cmd/helm/list.go b/cmd/helm/list.go index c2633d21cc9..4614c7f6738 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -17,10 +17,12 @@ limitations under the License. package main import ( + "encoding/json" "fmt" "io" "strings" + "github.com/ghodss/yaml" "github.com/gosuri/uitable" "github.com/spf13/cobra" @@ -75,6 +77,22 @@ type listCmd struct { pending bool client helm.Interface colWidth uint + output string +} + +type listResult struct { + Next string + Releases []listRelease +} + +type listRelease struct { + Name string + Revision int32 + Updated string + Status string + Chart string + AppVersion string + Namespace string } func newListCmd(client helm.Interface, out io.Writer) *cobra.Command { @@ -114,6 +132,7 @@ func newListCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&list.pending, "pending", false, "show pending releases") f.StringVar(&list.namespace, "namespace", "", "show releases within a specific namespace") f.UintVar(&list.colWidth, "col-width", 60, "specifies the max column width of output") + f.StringVar(&list.output, "output", "", "output the specified format (json or yaml)") // TODO: Do we want this as a feature of 'helm list'? //f.BoolVar(&list.superseded, "history", true, "show historical releases") @@ -148,23 +167,17 @@ func (l *listCmd) run() error { return prettyError(err) } - if len(res.GetReleases()) == 0 { - return nil - } + rels := filterList(res.Releases) - if res.Next != "" && !l.short { - fmt.Fprintf(l.out, "\tnext: %s\n", res.Next) - } + result := getListResult(rels, res.Next) - rels := filterList(res.Releases) + output, err := formatResult(l.output, l.short, result, l.colWidth) - if l.short { - for _, r := range rels { - fmt.Fprintln(l.out, r.Name) - } - return nil + if err != nil { + return prettyError(err) } - fmt.Fprintln(l.out, formatList(rels, l.colWidth)) + + fmt.Fprintln(l.out, output) return nil } @@ -233,23 +246,98 @@ func (l *listCmd) statusCodes() []release.Status_Code { return status } -func formatList(rels []*release.Release, colWidth uint) string { - table := uitable.New() - - table.MaxColWidth = colWidth - table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART", "APP VERSION", "NAMESPACE") +func getListResult(rels []*release.Release, next string) listResult { + listReleases := []listRelease{} for _, r := range rels { md := r.GetChart().GetMetadata() - c := fmt.Sprintf("%s-%s", md.GetName(), md.GetVersion()) t := "-" if tspb := r.GetInfo().GetLastDeployed(); tspb != nil { t = timeconv.String(tspb) } - s := r.GetInfo().GetStatus().GetCode().String() - v := r.GetVersion() - a := md.GetAppVersion() - n := r.GetNamespace() - table.AddRow(r.GetName(), v, t, s, c, a, n) + + lr := listRelease{ + Name: r.GetName(), + Revision: r.GetVersion(), + Updated: t, + Status: r.GetInfo().GetStatus().GetCode().String(), + Chart: fmt.Sprintf("%s-%s", md.GetName(), md.GetVersion()), + AppVersion: md.GetAppVersion(), + Namespace: r.GetNamespace(), + } + listReleases = append(listReleases, lr) + } + + return listResult{ + Releases: listReleases, + Next: next, } - return table.String() +} + +func shortenListResult(result listResult) []string { + names := []string{} + for _, r := range result.Releases { + names = append(names, r.Name) + } + + return names +} + +func formatResult(format string, short bool, result listResult, colWidth uint) (string, error) { + var output string + var err error + + var shortResult []string + var finalResult interface{} + if short { + shortResult = shortenListResult(result) + finalResult = shortResult + } else { + finalResult = result + } + + switch format { + case "": + if short { + output = formatTextShort(shortResult) + } else { + output = formatText(result, colWidth) + } + case "json": + o, e := json.Marshal(finalResult) + if e != nil { + err = fmt.Errorf("Failed to Marshal JSON output: %s", e) + } else { + output = string(o) + } + case "yaml": + o, e := yaml.Marshal(finalResult) + if e != nil { + err = fmt.Errorf("Failed to Marshal YAML output: %s", e) + } else { + output = string(o) + } + default: + err = fmt.Errorf("Unknown output format \"%s\"", format) + } + return output, err +} + +func formatText(result listResult, colWidth uint) string { + nextOutput := "" + if result.Next != "" { + nextOutput = fmt.Sprintf("\tnext: %s\n", result.Next) + } + + table := uitable.New() + table.MaxColWidth = colWidth + table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART", "APP VERSION", "NAMESPACE") + for _, lr := range result.Releases { + table.AddRow(lr.Name, lr.Revision, lr.Updated, lr.Status, lr.Chart, lr.AppVersion, lr.Namespace) + } + + return fmt.Sprintf("%s%s", nextOutput, table.String()) +} + +func formatTextShort(shortResult []string) string { + return strings.Join(shortResult, "\n") } diff --git a/cmd/helm/list_test.go b/cmd/helm/list_test.go index e292b4b5a19..e0faee93505 100644 --- a/cmd/helm/list_test.go +++ b/cmd/helm/list_test.go @@ -18,16 +18,18 @@ package main import ( "io" + "regexp" "testing" "github.com/spf13/cobra" "io/ioutil" + "os" + "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" - "os" ) func TestListCmd(t *testing.T) { @@ -46,6 +48,11 @@ func TestListCmd(t *testing.T) { ch, _ := chartutil.Load(chartPath) tests := []releaseCase{ + { + name: "empty", + rels: []*release.Release{}, + expected: "", + }, { name: "with a release", rels: []*release.Release{ @@ -67,6 +74,77 @@ func TestListCmd(t *testing.T) { }, expected: "NAME \tREVISION\tUPDATED \tSTATUS \tCHART \tAPP VERSION\tNAMESPACE\natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\t2.X.A \tdefault \n", }, + { + name: "with json output", + flags: []string{"--max", "1", "--output", "json"}, + rels: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"}), + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas-guide"}), + }, + expected: regexp.QuoteMeta(`{"Next":"atlas-guide","Releases":[{"Name":"thomas-guide","Revision":1,"Updated":"`) + `([^"]*)` + regexp.QuoteMeta(`","Status":"DEPLOYED","Chart":"foo-0.1.0-beta.1","AppVersion":"","Namespace":"default"}]} +`), + }, + { + name: "with yaml output", + flags: []string{"--max", "1", "--output", "yaml"}, + rels: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"}), + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas-guide"}), + }, + expected: regexp.QuoteMeta(`Next: atlas-guide +Releases: +- AppVersion: "" + Chart: foo-0.1.0-beta.1 + Name: thomas-guide + Namespace: default + Revision: 1 + Status: DEPLOYED + Updated: `) + `(.*)` + ` + +`, + }, + { + name: "with short json output", + flags: []string{"-q", "--output", "json"}, + rels: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas"}), + }, + expected: regexp.QuoteMeta(`["atlas"] +`), + }, + { + name: "with short yaml output", + flags: []string{"-q", "--output", "yaml"}, + rels: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "atlas"}), + }, + expected: regexp.QuoteMeta(`- atlas + +`), + }, + { + name: "with json output without next", + flags: []string{"--output", "json"}, + rels: []*release.Release{}, + expected: regexp.QuoteMeta(`{"Next":"","Releases":[]} +`), + }, + { + name: "with yaml output without next", + flags: []string{"--output", "yaml"}, + rels: []*release.Release{}, + expected: regexp.QuoteMeta(`Next: "" +Releases: [] + +`), + }, + { + name: "with unknown output format", + flags: []string{"--output", "_unknown_"}, + rels: []*release.Release{}, + err: true, + expected: regexp.QuoteMeta(``), + }, { name: "list, one deployed, one failed", flags: []string{"-q"}, diff --git a/docs/helm/helm_list.md b/docs/helm/helm_list.md index 1d5bf7ea2a1..99872a41390 100755 --- a/docs/helm/helm_list.md +++ b/docs/helm/helm_list.md @@ -49,6 +49,7 @@ helm list [flags] [FILTER] -m, --max int maximum number of releases to fetch (default 256) --namespace string show releases within a specific namespace -o, --offset string next release name in the list, used to offset from start value + --output string output the specified format (json or yaml) --pending show pending releases -r, --reverse reverse the sort order -q, --short output short (quiet) listing format @@ -73,4 +74,4 @@ helm list [flags] [FILTER] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Apr-2018 diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 0a9e77c4406..68d39a6aba8 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -49,9 +49,28 @@ var _ Interface = (*FakeClient)(nil) // ListReleases lists the current releases func (c *FakeClient) ListReleases(opts ...ReleaseListOption) (*rls.ListReleasesResponse, error) { + reqOpts := c.Opts + for _, opt := range opts { + opt(&reqOpts) + } + req := &reqOpts.listReq + rels := c.Rels + count := int64(len(c.Rels)) + var next string + limit := req.GetLimit() + // TODO: Handle all other options. + if limit != 0 && limit < count { + rels = rels[:limit] + count = limit + next = c.Rels[limit].GetName() + } + resp := &rls.ListReleasesResponse{ - Count: int64(len(c.Rels)), - Releases: c.Rels, + Count: count, + Releases: rels, + } + if next != "" { + resp.Next = next } return resp, nil } From b0eb40b2ca67146b7bb76e0197bfba0c83c5dd60 Mon Sep 17 00:00:00 2001 From: Colin Dickson Date: Thu, 19 Apr 2018 19:20:42 -0400 Subject: [PATCH 031/483] fixed flag for tls ca cert option in the documentation --- docs/securing_installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index 5c420242efd..9f74f6049ca 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -95,10 +95,10 @@ If these steps are followed, an example `helm init` command might look something $ helm init \ --tiller-tls \ --tiller-tls-verify \ ---tiller-tls-ca-cert=ca.pem \ --tiller-tls-cert=cert.pem \ --tiller-tls-key=key.pem \ ---service-account=accountname +--tls-ca-cert=ca.pem \ +--service-account=accountname ``` This command will start Tiller with both strong authentication over gRPC, and a service account to which RBAC policies have been applied. From 28fb950588f64c4341886509a62d3b7670578e7a Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 23 Apr 2018 13:05:12 +0800 Subject: [PATCH 032/483] Typo fix in plugins.md "that that"->"that" "that that"->"that" --- docs/plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins.md b/docs/plugins.md index 82bcfe33bab..3087d1b395a 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -183,7 +183,7 @@ If a plugin specifies `useTunnel: true`, Helm will do the following (in order): 5. Close the tunnel The tunnel is removed as soon as the `command` returns. So, for example, a -command cannot background a process and assume that that process will be able +command cannot background a process and assume that process will be able to use the tunnel. ## A Note on Flag Parsing From bcf5688e9a9da64fe5c8580c435bd248ec499e99 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 23 Apr 2018 13:06:24 +0800 Subject: [PATCH 033/483] Update install.go --- cmd/helm/installer/install.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index a45179a48ce..0abd6774bbb 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -73,7 +73,7 @@ func Upgrade(client kubernetes.Interface, opts *Options) error { if _, err := client.ExtensionsV1beta1().Deployments(opts.Namespace).Update(obj); err != nil { return err } - // If the service does not exists that would mean we are upgrading from a Tiller version + // If the service does not exist that would mean we are upgrading from a Tiller version // that didn't deploy the service, so install it. _, err = client.CoreV1().Services(opts.Namespace).Get(serviceName, metav1.GetOptions{}) if apierrors.IsNotFound(err) { From 6b2384f8b4dbc64e0452dfb60b987e94e8c21f00 Mon Sep 17 00:00:00 2001 From: Julius Kammerl Date: Mon, 23 Apr 2018 15:42:07 +0200 Subject: [PATCH 034/483] Avoid to call 'go' with empty -tags argument go1.10.1 linux/amd64 complains: flag provided but not defined: -tags when compiling with: "make build-cross dist". This seems to fix it. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2dfbd2c3c98..a8f77837727 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ build: .PHONY: build-cross build-cross: LDFLAGS += -extldflags "-static" build-cross: - CGO_ENABLED=0 gox -parallel=3 -output="_dist/{{.OS}}-{{.Arch}}/{{.Dir}}" -osarch='$(TARGETS)' $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/$(APP) + CGO_ENABLED=0 gox -parallel=3 -output="_dist/{{.OS}}-{{.Arch}}/{{.Dir}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/$(APP) .PHONY: dist dist: From ed39f16ee57c094476ea61ef4983efcb501e7643 Mon Sep 17 00:00:00 2001 From: Fabian Ruff Date: Mon, 23 Apr 2018 20:12:40 +0200 Subject: [PATCH 035/483] Fix --tiller-namespace flag for plugins This fixes using `--tiller-namespace $namespace` flag (without the equal sign) for helm plugins. --- cmd/helm/load_plugins.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/load_plugins.go b/cmd/helm/load_plugins.go index ef24e7883f2..f4c97bde703 100644 --- a/cmd/helm/load_plugins.go +++ b/cmd/helm/load_plugins.go @@ -131,7 +131,7 @@ func manuallyProcessArgs(args []string) ([]string, []string) { switch a := args[i]; a { case "--debug": known = append(known, a) - case "--host", "--kube-context", "--home": + case "--host", "--kube-context", "--home", "--tiller-namespace": known = append(known, a, args[i+1]) i++ default: From cefee4b749122bc38d019c2791faf79a4ab1376f Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Mon, 23 Apr 2018 14:30:34 -0700 Subject: [PATCH 036/483] fix(kube): output internal object table fixes #3937 --- pkg/kube/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 34d979d478f..e4c6b6a9f1d 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -178,7 +178,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // versions per cluster, but this certainly won't hurt anything, so let's be safe. gvk := info.ResourceMapping().GroupVersionKind vk := gvk.Version + "/" + gvk.Kind - objs[vk] = append(objs[vk], info.Object) + objs[vk] = append(objs[vk], info.AsInternal()) //Get the relation pods objPods, err = c.getSelectRelationPod(info, objPods) From 7a65f7479acd2ae76289b0742d5e2349c22fec18 Mon Sep 17 00:00:00 2001 From: Marat Garafutdinov Date: Mon, 23 Apr 2018 16:35:29 -0700 Subject: [PATCH 037/483] add --col-width to `helm search` (#3949) * add customizeable --col-width * make docs. whitespacing --- cmd/helm/search.go | 8 +++++--- docs/helm/helm_search.md | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmd/helm/search.go b/cmd/helm/search.go index 845bfd0be8b..ab284a89804 100644 --- a/cmd/helm/search.go +++ b/cmd/helm/search.go @@ -47,6 +47,7 @@ type searchCmd struct { versions bool regexp bool version string + colWidth uint } func newSearchCmd(out io.Writer) *cobra.Command { @@ -66,6 +67,7 @@ func newSearchCmd(out io.Writer) *cobra.Command { f.BoolVarP(&sc.regexp, "regexp", "r", false, "use regular expressions for searching") f.BoolVarP(&sc.versions, "versions", "l", false, "show the long listing, with each version of each chart on its own line") f.StringVarP(&sc.version, "version", "v", "", "search using semantic versioning constraints") + f.UintVar(&sc.colWidth, "col-width", 60, "specifies the max column width of output") return cmd } @@ -93,7 +95,7 @@ func (s *searchCmd) run(args []string) error { return err } - fmt.Fprintln(s.out, s.formatSearchResults(data)) + fmt.Fprintln(s.out, s.formatSearchResults(data, s.colWidth)) return nil } @@ -126,12 +128,12 @@ func (s *searchCmd) applyConstraint(res []*search.Result) ([]*search.Result, err return data, nil } -func (s *searchCmd) formatSearchResults(res []*search.Result) string { +func (s *searchCmd) formatSearchResults(res []*search.Result, colWidth uint) string { if len(res) == 0 { return "No results found" } table := uitable.New() - table.MaxColWidth = 50 + table.MaxColWidth = colWidth table.AddRow("NAME", "CHART VERSION", "APP VERSION", "DESCRIPTION") for _, r := range res { table.AddRow(r.Name, r.Chart.Version, r.Chart.AppVersion, r.Chart.Description) diff --git a/docs/helm/helm_search.md b/docs/helm/helm_search.md index f59814b9a54..1ed04e88054 100644 --- a/docs/helm/helm_search.md +++ b/docs/helm/helm_search.md @@ -19,6 +19,7 @@ helm search [keyword] ### Options ``` + --col-width uint specifies the max column width of output (default 60) -r, --regexp use regular expressions for searching -v, --version string search using semantic versioning constraints -l, --versions show the long listing, with each version of each chart on its own line @@ -38,4 +39,4 @@ helm search [keyword] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 23-Apr-2018 From 718578036d4c13604ec557a32dfd31b5403aac31 Mon Sep 17 00:00:00 2001 From: BarryWilliams Date: Mon, 23 Apr 2018 22:25:11 -0400 Subject: [PATCH 038/483] Changed whitespacing in comments --- pkg/chartutil/files.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/chartutil/files.go b/pkg/chartutil/files.go index f9fc0a26dba..a09bb8f438e 100644 --- a/pkg/chartutil/files.go +++ b/pkg/chartutil/files.go @@ -211,8 +211,8 @@ func ToToml(v interface{}) string { // always return a string, even on marshal error (empty string). // // This is designed to be called from a template. -//TODO:change the function signature in Helm 3 -func ToJson(v interface{}) string { //nolint +// TODO: change the function signature in Helm 3 +func ToJson(v interface{}) string { // nolint data, err := json.Marshal(v) if err != nil { // Swallow errors inside of a template. @@ -227,8 +227,8 @@ func ToJson(v interface{}) string { //nolint // JSON documents. Additionally, because its intended use is within templates // it tolerates errors. It will insert the returned error message string into // m["Error"] in the returned map. -//TODO:change the function signature in Helm 3 -func FromJson(str string) map[string]interface{} { //nolint +// TODO: change the function signature in Helm 3 +func FromJson(str string) map[string]interface{} { // nolint m := map[string]interface{}{} if err := json.Unmarshal([]byte(str), &m); err != nil { From cf3ded91f2143fed6850dee70630c1049bf937ec Mon Sep 17 00:00:00 2001 From: Julien Bordellier Date: Tue, 24 Apr 2018 15:26:57 +0200 Subject: [PATCH 039/483] Add quoting support in ingress to allow wildcard domain --- pkg/chartutil/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 4c6b484a967..30c6310b2e0 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -143,14 +143,14 @@ spec: {{- range .Values.ingress.tls }} - hosts: {{- range .hosts }} - - {{ . }} + - {{ . | quote }} {{- end }} secretName: {{ .secretName }} {{- end }} {{- end }} rules: {{- range .Values.ingress.hosts }} - - host: {{ . }} + - host: {{ . | quote }} http: paths: - path: {{ $ingressPath }} From c2fa72ebcdc9a12381eec29b642374af75f5b45c Mon Sep 17 00:00:00 2001 From: eyalbe4 Date: Wed, 25 Apr 2018 03:44:47 +0300 Subject: [PATCH 040/483] Fix for - Downloader plugins not used when downloading new repo's index.yaml #3938 --- pkg/downloader/chart_downloader.go | 73 ++++++++++++++---------------- pkg/repo/chartrepo.go | 18 +++++--- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 8b386fc09b6..6861a82704b 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -23,6 +23,7 @@ import ( "net/url" "os" "path/filepath" + "reflect" "strings" "k8s.io/helm/pkg/getter" @@ -85,7 +86,7 @@ type ChartDownloader struct { // Returns a string path to the location where the file was downloaded and a verification // (if provenance was verified), or an error if something bad happened. func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *provenance.Verification, error) { - u, r, g, err := c.ResolveChartVersionAndGetRepo(ref, version) + u, g, err := c.ResolveChartVersion(ref, version) if err != nil { return "", nil, err } @@ -104,7 +105,7 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven // If provenance is requested, verify it. ver := &provenance.Verification{} if c.Verify > VerifyNever { - body, err := r.Client.Get(u.String() + ".prov") + body, err := g.Get(u.String() + ".prov") if err != nil { if c.Verify == VerifyAlways { return destfile, ver, fmt.Errorf("Failed to fetch provenance %q", u.String()+".prov") @@ -144,28 +145,14 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven // * If version is empty, this will return the URL for the latest version // * If no version can be found, an error is returned func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, getter.Getter, error) { - u, r, _, err := c.ResolveChartVersionAndGetRepo(ref, version) - if r != nil { - return u, r.Client, err - } - return u, nil, err -} - -// ResolveChartVersionAndGetRepo is the same as the ResolveChartVersion method, but returns the chart repositoryy. -func (c *ChartDownloader) ResolveChartVersionAndGetRepo(ref, version string) (*url.URL, *repo.ChartRepository, *getter.HttpGetter, error) { u, err := url.Parse(ref) if err != nil { - return nil, nil, nil, fmt.Errorf("invalid chart URL format: %s", ref) + return nil, nil, fmt.Errorf("invalid chart URL format: %s", ref) } rf, err := repo.LoadRepositoriesFile(c.HelmHome.RepositoryFile()) if err != nil { - return u, nil, nil, err - } - - g, err := getter.NewHTTPGetter(ref, "", "", "") - if err != nil { - return u, nil, nil, err + return u, nil, err } if u.IsAbs() && len(u.Host) > 0 && len(u.Path) > 0 { @@ -180,23 +167,26 @@ func (c *ChartDownloader) ResolveChartVersionAndGetRepo(ref, version string) (*u // If there is no special config, return the default HTTP client and // swallow the error. if err == ErrNoOwnerRepo { - r := &repo.ChartRepository{} - r.Client = g - g.SetCredentials(c.getRepoCredentials(r)) - return u, r, g, nil + getterConstructor, err := c.Getters.ByScheme(u.Scheme) + if err != nil { + return u, nil, err + } + getter, err := getterConstructor(ref, "", "", "") + return u, getter, err } - return u, nil, nil, err + return u, nil, err } r, err := repo.NewChartRepository(rc, c.Getters) + c.setCredentials(r) // If we get here, we don't need to go through the next phase of looking // up the URL. We have it already. So we just return. - return u, r, g, err + return u, r.Client, err } // See if it's of the form: repo/path_to_chart p := strings.SplitN(u.Path, "/", 2) if len(p) < 2 { - return u, nil, nil, fmt.Errorf("Non-absolute URLs should be in form of repo_name/path_to_chart, got: %s", u) + return u, nil, fmt.Errorf("Non-absolute URLs should be in form of repo_name/path_to_chart, got: %s", u) } repoName := p[0] @@ -204,56 +194,59 @@ func (c *ChartDownloader) ResolveChartVersionAndGetRepo(ref, version string) (*u rc, err := pickChartRepositoryConfigByName(repoName, rf.Repositories) if err != nil { - return u, nil, nil, err + return u, nil, err } r, err := repo.NewChartRepository(rc, c.Getters) if err != nil { - return u, nil, nil, err + return u, nil, err } - g.SetCredentials(c.getRepoCredentials(r)) + c.setCredentials(r) // Next, we need to load the index, and actually look up the chart. i, err := repo.LoadIndexFile(c.HelmHome.CacheIndex(r.Config.Name)) if err != nil { - return u, r, g, fmt.Errorf("no cached repo found. (try 'helm repo update'). %s", err) + return u, r.Client, fmt.Errorf("no cached repo found. (try 'helm repo update'). %s", err) } cv, err := i.Get(chartName, version) if err != nil { - return u, r, g, fmt.Errorf("chart %q matching %s not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) + return u, r.Client, fmt.Errorf("chart %q matching %s not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) } if len(cv.URLs) == 0 { - return u, r, g, fmt.Errorf("chart %q has no downloadable URLs", ref) + return u, r.Client, fmt.Errorf("chart %q has no downloadable URLs", ref) } // TODO: Seems that picking first URL is not fully correct u, err = url.Parse(cv.URLs[0]) if err != nil { - return u, r, g, fmt.Errorf("invalid chart URL format: %s", ref) + return u, r.Client, fmt.Errorf("invalid chart URL format: %s", ref) } // If the URL is relative (no scheme), prepend the chart repo's base URL if !u.IsAbs() { repoURL, err := url.Parse(rc.URL) if err != nil { - return repoURL, r, nil, err + return repoURL, r.Client, err } q := repoURL.Query() // We need a trailing slash for ResolveReference to work, but make sure there isn't already one repoURL.Path = strings.TrimSuffix(repoURL.Path, "/") + "/" u = repoURL.ResolveReference(u) u.RawQuery = q.Encode() - g, err := getter.NewHTTPGetter(rc.URL, "", "", "") - if err != nil { - return repoURL, r, nil, err - } - g.SetCredentials(c.getRepoCredentials(r)) - return u, r, g, err + return u, r.Client, err } - return u, r, g, nil + return u, r.Client, nil +} + +// If HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. +func (c *ChartDownloader) setCredentials(r *repo.ChartRepository) { + var t *getter.HttpGetter + if reflect.TypeOf(r.Client) == reflect.TypeOf(t) { + r.Client.(*getter.HttpGetter).SetCredentials(c.getRepoCredentials(r)) + } } // If this ChartDownloader is not configured to use credentials, and the chart repository sent as an argument is, diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index bf03a68bb5f..ba1e6f4ff0f 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -22,6 +22,7 @@ import ( "net/url" "os" "path/filepath" + "reflect" "strings" "github.com/ghodss/yaml" @@ -119,12 +120,9 @@ func (r *ChartRepository) DownloadIndexFile(cachePath string) error { parsedURL.Path = strings.TrimSuffix(parsedURL.Path, "/") + "/index.yaml" indexURL = parsedURL.String() - g, err := getter.NewHTTPGetter(indexURL, r.Config.CertFile, r.Config.KeyFile, r.Config.CAFile) - if err != nil { - return err - } - g.SetCredentials(r.Config.Username, r.Config.Password) - resp, err := g.Get(indexURL) + + r.setCredentials() + resp, err := r.Client.Get(indexURL) if err != nil { return err } @@ -152,6 +150,14 @@ func (r *ChartRepository) DownloadIndexFile(cachePath string) error { return ioutil.WriteFile(cp, index, 0644) } +// If HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. +func (r *ChartRepository) setCredentials() { + var t *getter.HttpGetter + if reflect.TypeOf(r.Client) == reflect.TypeOf(t) { + r.Client.(*getter.HttpGetter).SetCredentials(r.Config.Username, r.Config.Password) + } +} + // Index generates an index for the chart repository and writes an index.yaml file. func (r *ChartRepository) Index() error { err := r.generateIndex() From f0d78180d1b5b26955c70b80c4e38553b316d9ea Mon Sep 17 00:00:00 2001 From: Julien Bordellier Date: Wed, 25 Apr 2018 17:02:32 +0200 Subject: [PATCH 041/483] Change tiller's Dockerfile to use USER nobody + upgrades to alpine:3.7 --- rootfs/Dockerfile | 8 ++++---- rootfs/Dockerfile.experimental | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 53757cd8d5e..ca5ad222587 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM alpine:3.7 RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp -COPY tiller /tiller +COPY tiller /bin/tiller EXPOSE 44134 - -CMD ["/tiller"] +USER nobody +ENTRYPOINT ["/bin/tiller"] diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index 990bcde516c..66a21847726 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM alpine:3.7 RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp -COPY tiller /tiller +COPY tiller /bin/tiller EXPOSE 44134 - -CMD ["/tiller", "--experimental-release"] +USER nobody +ENTRYPOINT ["/bin/tiller", "--experimental-release"] From d9395bcc0668429a48cdfe8ff2389bb9d00f4e0e Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 25 Apr 2018 14:55:05 -0700 Subject: [PATCH 042/483] remove need for type reflection --- pkg/downloader/chart_downloader.go | 6 ++---- pkg/repo/chartrepo.go | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 6861a82704b..59b9d4d756d 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -23,7 +23,6 @@ import ( "net/url" "os" "path/filepath" - "reflect" "strings" "k8s.io/helm/pkg/getter" @@ -243,9 +242,8 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge // If HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. func (c *ChartDownloader) setCredentials(r *repo.ChartRepository) { - var t *getter.HttpGetter - if reflect.TypeOf(r.Client) == reflect.TypeOf(t) { - r.Client.(*getter.HttpGetter).SetCredentials(c.getRepoCredentials(r)) + if t, ok := r.Client.(*getter.HttpGetter); ok { + t.SetCredentials(c.getRepoCredentials(r)) } } diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index ba1e6f4ff0f..438f66d7cd7 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -22,7 +22,6 @@ import ( "net/url" "os" "path/filepath" - "reflect" "strings" "github.com/ghodss/yaml" @@ -152,9 +151,8 @@ func (r *ChartRepository) DownloadIndexFile(cachePath string) error { // If HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. func (r *ChartRepository) setCredentials() { - var t *getter.HttpGetter - if reflect.TypeOf(r.Client) == reflect.TypeOf(t) { - r.Client.(*getter.HttpGetter).SetCredentials(r.Config.Username, r.Config.Password) + if t, ok := r.Client.(*getter.HttpGetter); ok { + t.SetCredentials(r.Config.Username, r.Config.Password) } } From 0a3580e8d934cf8fa810f3cab2053d4612e5b7e7 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 8 Feb 2017 13:56:49 -0800 Subject: [PATCH 043/483] build helm binary in tiller image --- .gitignore | 1 + Makefile | 1 + rootfs/Dockerfile | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b94f87b2685..7fdfdcf2a70 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ _dist/ _proto/*.pb.go bin/ +rootfs/helm rootfs/tiller rootfs/rudder vendor/ diff --git a/Makefile b/Makefile index a8f77837727..54cc1ff1860 100644 --- a/Makefile +++ b/Makefile @@ -60,6 +60,7 @@ check-docker: docker-binary: BINDIR = ./rootfs docker-binary: GOFLAGS += -a -installsuffix cgo docker-binary: + GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/helm $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/helm GOOS=linux GOARCH=amd64 CGO_ENABLED=0 $(GO) build -o $(BINDIR)/tiller $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/tiller .PHONY: docker-build diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index ca5ad222587..ef426616af0 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -14,10 +14,11 @@ FROM alpine:3.7 -RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* +RUN apk update && apk add ca-certificates socat && rm -rf /var/cache/apk/* ENV HOME /tmp +COPY helm /bin/helm COPY tiller /bin/tiller EXPOSE 44134 From c67fab5934bb76ccd7ab2420a4d2fc8da4ae4af1 Mon Sep 17 00:00:00 2001 From: Julien Bordellier Date: Thu, 26 Apr 2018 10:41:54 +0200 Subject: [PATCH 044/483] docs(helm): update Globs examples to work correctly --- docs/chart_template_guide/accessing_files.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/chart_template_guide/accessing_files.md b/docs/chart_template_guide/accessing_files.md index 250fd9520f6..11747d4f0d5 100644 --- a/docs/chart_template_guide/accessing_files.md +++ b/docs/chart_template_guide/accessing_files.md @@ -119,9 +119,10 @@ You have multiple options with Globs: ```yaml -{{ range $path := .Files.Glob "**.yaml" }} -{{ $path }}: | -{{ .Files.Get $path }} +{{ $root := . }} +{{ range $path, $bytes := .Files.Glob "**.yaml" }} +{{ $path }}: |- +{{ $root.Files.Get $path }} {{ end }} ``` @@ -129,7 +130,7 @@ Or ```yaml {{ range $path, $bytes := .Files.Glob "foo/*" }} -{{ $path }}: '{{ b64enc $bytes }}' +{{ $path.base }}: '{{ $root.Files.Get $path | b64enc }}' {{ end }} ``` From dcdeefbd63d04a8254d3eee0a2557f6f513005e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herbert=20M=C3=BChlburger?= Date: Fri, 27 Apr 2018 14:14:37 +0200 Subject: [PATCH 045/483] #3763 replace backslash with forward slash --- pkg/chartutil/save.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index bff32dde519..dd835a92461 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -24,6 +24,7 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "github.com/ghodss/yaml" @@ -204,6 +205,7 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { // writeToTar writes a single file to a tar archive. func writeToTar(out *tar.Writer, name string, body []byte) error { // TODO: Do we need to create dummy parent directory names if none exist? + name = strings.Replace(name, "\\", "/", -1) h := &tar.Header{ Name: name, Mode: 0755, From f7f686f7d065218ef6df3fbb75ce6348e699a0f3 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 27 Apr 2018 12:30:46 -0700 Subject: [PATCH 046/483] Revert "toYaml - Fix #3470 and #3410's trailing \n issues" --- pkg/chartutil/files.go | 2 +- pkg/chartutil/files_test.go | 8 ++++---- pkg/strvals/parser.go | 2 +- pkg/strvals/parser_test.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/chartutil/files.go b/pkg/chartutil/files.go index b71ef57591b..a09bb8f438e 100644 --- a/pkg/chartutil/files.go +++ b/pkg/chartutil/files.go @@ -175,7 +175,7 @@ func ToYaml(v interface{}) string { // Swallow errors inside of a template. return "" } - return strings.TrimSuffix(string(data), "\n") + return string(data) } // FromYaml converts a YAML document into a map[string]interface{}. diff --git a/pkg/chartutil/files_test.go b/pkg/chartutil/files_test.go index 5cec358839b..731c82e6f50 100644 --- a/pkg/chartutil/files_test.go +++ b/pkg/chartutil/files_test.go @@ -72,10 +72,10 @@ func TestToConfig(t *testing.T) { f := NewFiles(getTestFiles()) out := f.Glob("**/captain.txt").AsConfig() - as.Equal("captain.txt: The Captain", out) + as.Equal("captain.txt: The Captain\n", out) out = f.Glob("ship/**").AsConfig() - as.Equal("captain.txt: The Captain\nstowaway.txt: Legatt", out) + as.Equal("captain.txt: The Captain\nstowaway.txt: Legatt\n", out) } func TestToSecret(t *testing.T) { @@ -84,7 +84,7 @@ func TestToSecret(t *testing.T) { f := NewFiles(getTestFiles()) out := f.Glob("ship/**").AsSecrets() - as.Equal("captain.txt: VGhlIENhcHRhaW4=\nstowaway.txt: TGVnYXR0", out) + as.Equal("captain.txt: VGhlIENhcHRhaW4=\nstowaway.txt: TGVnYXR0\n", out) } func TestLines(t *testing.T) { @@ -99,7 +99,7 @@ func TestLines(t *testing.T) { } func TestToYaml(t *testing.T) { - expect := "foo: bar" + expect := "foo: bar\n" v := struct { Foo string `json:"foo"` }{ diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index 8d20c3bc39d..90670a4dd56 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -36,7 +36,7 @@ func ToYAML(s string) (string, error) { return "", err } d, err := yaml.Marshal(m) - return strings.TrimSuffix(string(d), "\n"), err + return string(d), err } // Parse parses a set line. diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index 482377c3277..c897cf0a7cf 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -370,7 +370,7 @@ func TestToYAML(t *testing.T) { if err != nil { t.Fatal(err) } - expect := "name: value" + expect := "name: value\n" if o != expect { t.Errorf("Expected %q, got %q", expect, o) } From 4d1a401a9fb52cfbad97c31a9d038935434b413c Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 27 Apr 2018 15:33:48 -0700 Subject: [PATCH 047/483] Revert "Fix tiller deployment on RBAC clusters" --- cmd/helm/installer/install.go | 4 +--- cmd/helm/installer/install_test.go | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 0abd6774bbb..becf412a179 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -176,7 +176,6 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { return nil, err } } - automountServiceAccountToken := opts.ServiceAccount != "" d := &v1beta1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Namespace: opts.Namespace, @@ -190,8 +189,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Labels: labels, }, Spec: v1.PodSpec{ - ServiceAccountName: opts.ServiceAccount, - AutomountServiceAccountToken: &automountServiceAccountToken, + ServiceAccountName: opts.ServiceAccount, Containers: []v1.Container{ { Name: "tiller", diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index 80219505a0a..dbb7143e33d 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -96,9 +96,6 @@ func TestDeploymentManifestForServiceAccount(t *testing.T) { if got := d.Spec.Template.Spec.ServiceAccountName; got != tt.serviceAccount { t.Errorf("%s: expected service account value %q, got %q", tt.name, tt.serviceAccount, got) } - if got := *d.Spec.Template.Spec.AutomountServiceAccountToken; got != (tt.serviceAccount != "") { - t.Errorf("%s: unexpected automountServiceAccountToken = %t for serviceAccount %q", tt.name, got, tt.serviceAccount) - } } } From a1b5b69248a7e112bc970e50cbf1e757c2530b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herbert=20M=C3=BChlburger?= Date: Sat, 28 Apr 2018 09:16:46 +0200 Subject: [PATCH 048/483] Refactor to be more precise --- pkg/chartutil/save.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index dd835a92461..201372a0f10 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -24,7 +24,6 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "github.com/ghodss/yaml" @@ -205,9 +204,8 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { // writeToTar writes a single file to a tar archive. func writeToTar(out *tar.Writer, name string, body []byte) error { // TODO: Do we need to create dummy parent directory names if none exist? - name = strings.Replace(name, "\\", "/", -1) h := &tar.Header{ - Name: name, + Name: filepath.ToSlash(name), Mode: 0755, Size: int64(len(body)), } From 07bebe6bff7885cafc800c063e52bf4669ed1c93 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sun, 29 Apr 2018 13:46:46 +0800 Subject: [PATCH 049/483] Typo fix: evalutes->evaluates --- pkg/ignore/rules.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/ignore/rules.go b/pkg/ignore/rules.go index 76f45fc7a2f..185d289bb0c 100644 --- a/pkg/ignore/rules.go +++ b/pkg/ignore/rules.go @@ -77,7 +77,7 @@ func (r *Rules) Len() int { return len(r.patterns) } -// Ignore evalutes the file at the given path, and returns true if it should be ignored. +// Ignore evaluates the file at the given path, and returns true if it should be ignored. // // Ignore evaluates path against the rules in order. Evaluation stops when a match // is found. Matching a negative rule will stop evaluation. From ddb536aa7a9287a6bf45994f4430891d00c1f529 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Mon, 7 May 2018 00:15:35 +0800 Subject: [PATCH 050/483] Typo fix: usa helm->use helm usa helm->use helm --- docs/securing_installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index 9f74f6049ca..4083bf188ed 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -53,7 +53,7 @@ This situation may change in the future. While the community has several methods In the default installation the gRPC endpoint that Tiller offers is available inside the cluster (not external to the cluster) without authentication configuration applied. Without applying authentication, any process in the cluster can use the gRPC endpoint to perform operations inside the cluster. In a local or secured private cluster, this enables rapid usage and is normal. (When running outside the cluster, Helm authenticates through the Kubernetes API server to reach Tiller, leveraging existing Kubernetes authentication support.) -Shared and production clusters -- for the most part -- should use Helm 2.7.2 at a minimum and configure TLS for each Tiller gRPC endpoint to ensure that within the cluster usage of gRPC endpoints is only for the properly authenticated identity for that endpoint. Doing so enables any number of Tiller instances to be deployed in any number of namespaces and yet no unauthenticated usage of any gRPC endpoint is possible. Finally, usa Helm `init` with the `--tiller-tls-verify` option to install Tiller with TLS enabled and to verify remote certificates, and all other Helm commands should use the `--tls` option. +Shared and production clusters -- for the most part -- should use Helm 2.7.2 at a minimum and configure TLS for each Tiller gRPC endpoint to ensure that within the cluster usage of gRPC endpoints is only for the properly authenticated identity for that endpoint. Doing so enables any number of Tiller instances to be deployed in any number of namespaces and yet no unauthenticated usage of any gRPC endpoint is possible. Finally, use Helm `init` with the `--tiller-tls-verify` option to install Tiller with TLS enabled and to verify remote certificates, and all other Helm commands should use the `--tls` option. For more information about the proper steps to configure Tiller and use Helm properly with TLS configured, see [Using SSL between Helm and Tiller](tiller_ssl.md). From b133da06e5767312273f4c9abc0b79d578d975fe Mon Sep 17 00:00:00 2001 From: Taylor Thomas Date: Thu, 10 May 2018 14:30:09 -0700 Subject: [PATCH 051/483] docs(release_checklist): Adds information about new release meetings We have decided to start having release meetings to define clear objectives for a release. This documents the process. --- docs/release_checklist.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 26506985ca5..de047971efc 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -2,9 +2,36 @@ **IMPORTANT**: If your experience deviates from this document, please document the changes to keep it up-to-date. +## Release Meetings +As part of the release process, two of the weekly developer calls will be co-opted +as "release meetings." + +### Start of the Release Cycle +The first developer call after a release will be used as the release meeting to +start the next release cycle. During this meeting, the following items must be +identified: + +- Release date +- Goals/Objectives for this release +- The release manager (basically whoever is going to cut the release) +- Any other important details for the community + +All of this information should be added to the GitHub milestone for the given +release. This should give the community and maintainers a clear set of guidelines +to follow when choosing whether or not to add issues and PRs to a given release. + +### End (almost) of the Release Cycle +The developer call closest to two weeks before the scheduled release date will +be used to review any remaining PRs that should be pulled into the release. This +is the place to debate whether or not we should wait before cutting a release and +any other concerns. At the end of this meeting, if the release date has not been +pushed out, the first RC should be cut. Subsequent developer calls in between this +meeting and the release date should have some time set aside to see if any bugs +were found. Once the release date is reached, the final release can be cut + ## A Maintainer's Guide to Releasing Helm -So you're in charge of a new release for helm? Cool. Here's what to do... +So you're in charge of a new release for Helm? Cool. Here's what to do... ![TODO: Nothing](images/nothing.png) From 0699ec4248f3809b16b0e486f1aacf498c9a88c5 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Fri, 11 May 2018 12:09:38 -0600 Subject: [PATCH 052/483] feat(tiller): support CRD installation (#3982) This adds support for installing CRDs well before any other resource kinds are installed. This PR introduces a new hook, `crd-install`, that fires before manifests are even validated. It is used to install a CRD before any other part of a chart is installed. Currently, this hook is _only implemented for install_. That means we currently cannot add new CRDs during `helm upgrade`, nor can they be rolled back. This is the safest configuration, as the update/rollback cycle gets very challenging when CRDs are added and removed. --- _proto/hapi/release/hook.proto | 1 + _proto/hapi/services/tiller.proto | 2 + cmd/helm/install.go | 51 +++++---- docs/charts_hooks.md | 61 +++++++++- docs/helm/helm_install.md | 3 +- pkg/helm/client.go | 1 + pkg/helm/option.go | 9 ++ pkg/hooks/hooks.go | 1 + pkg/proto/hapi/release/hook.pb.go | 58 +++++----- pkg/proto/hapi/services/tiller.pb.go | 165 ++++++++++++++------------- pkg/tiller/hooks.go | 6 +- pkg/tiller/release_install.go | 43 ++++++- pkg/tiller/release_install_test.go | 82 +++++++++++++ pkg/tiller/release_server.go | 21 ++-- pkg/tiller/release_server_test.go | 19 +++ 15 files changed, 378 insertions(+), 145 deletions(-) diff --git a/_proto/hapi/release/hook.proto b/_proto/hapi/release/hook.proto index f0332ecb851..0d96dd9ae93 100644 --- a/_proto/hapi/release/hook.proto +++ b/_proto/hapi/release/hook.proto @@ -34,6 +34,7 @@ message Hook { POST_ROLLBACK = 8; RELEASE_TEST_SUCCESS = 9; RELEASE_TEST_FAILURE = 10; + CRD_INSTALL = 11; } enum DeletePolicy { SUCCEEDED = 0; diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 5897676aba7..8daef0cb3e1 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -271,6 +271,8 @@ message InstallReleaseRequest { // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // before marking the release as successful. It will wait for as long as timeout bool wait = 9; + + bool disable_crd_hook = 10; } // InstallReleaseResponse is the response from a release installation. diff --git a/cmd/helm/install.go b/cmd/helm/install.go index d52dbc6677b..2dafd85ba80 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -106,28 +106,29 @@ charts in a repository, use 'helm search'. ` type installCmd struct { - name string - namespace string - valueFiles valueFiles - chartPath string - dryRun bool - disableHooks bool - replace bool - verify bool - keyring string - out io.Writer - client helm.Interface - values []string - stringValues []string - nameTemplate string - version string - timeout int64 - wait bool - repoURL string - username string - password string - devel bool - depUp bool + name string + namespace string + valueFiles valueFiles + chartPath string + dryRun bool + disableHooks bool + disableCRDHook bool + replace bool + verify bool + keyring string + out io.Writer + client helm.Interface + values []string + stringValues []string + nameTemplate string + version string + timeout int64 + wait bool + repoURL string + username string + password string + devel bool + depUp bool certFile string keyFile string @@ -190,6 +191,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.namespace, "namespace", "", "namespace to install the release into. Defaults to the current kube config namespace.") f.BoolVar(&inst.dryRun, "dry-run", false, "simulate an install") f.BoolVar(&inst.disableHooks, "no-hooks", false, "prevent hooks from running during install") + f.BoolVar(&inst.disableCRDHook, "no-crd-hook", false, "prevent CRD hooks from running, but run other hooks") f.BoolVar(&inst.replace, "replace", false, "re-use the given name, even if that name is already used. This is unsafe in production") f.StringArrayVar(&inst.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&inst.stringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") @@ -273,6 +275,7 @@ func (i *installCmd) run() error { helm.InstallDryRun(i.dryRun), helm.InstallReuseName(i.replace), helm.InstallDisableHooks(i.disableHooks), + helm.InstallDisableCRDHook(i.disableCRDHook), helm.InstallTimeout(i.timeout), helm.InstallWait(i.wait)) if err != nil { @@ -287,6 +290,10 @@ func (i *installCmd) run() error { // If this is a dry run, we can't display status. if i.dryRun { + // This is special casing to avoid breaking backward compatibility: + if res.Release.Info.Description != "Dry run complete" { + fmt.Fprintf(os.Stdout, "WARNING: %s\n", res.Release.Info.Description) + } return nil } diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index 4142f2ce0db..f51749f57be 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -16,6 +16,17 @@ Hooks work like regular templates, but they have special annotations that cause Helm to utilize them differently. In this section, we cover the basic usage pattern for hooks. +Hooks are declared as an annotation in the metadata section of a manifest: + +```yaml +apiVersion: ... +kind: .... +metadata: + annotations: + "helm.sh/hook": "pre-install" +# ... +``` + ## The Available Hooks The following hooks are defined: @@ -36,6 +47,8 @@ The following hooks are defined: rendered, but before any resources have been rolled back. - post-rollback: Executes on a rollback request after all resources have been modified. +- crd-install: Adds CRD resources before any other checks are run. This is used + only on CRD definitions that are used by other manifests in the chart. ## Hooks and the Release Lifecycle @@ -62,7 +75,7 @@ hooks, the lifecycle is altered like this: Kubernetes) 5. Tiller sorts hooks by weight (assigning a weight of 0 by default) and by name for those hooks with the same weight in ascending order. 6. Tiller then loads the hook with the lowest weight first (negative to positive) -7. Tiller waits until the hook is "Ready" +7. Tiller waits until the hook is "Ready" (except for CRDs) 8. Tiller loads the resulting resources into Kubernetes. Note that if the `--wait` flag is set, Tiller will wait until all resources are in a ready state and will not run the `post-install` hook until they are ready. @@ -185,6 +198,52 @@ You can choose one or more defined annotation values: * `"hook-failed"` specifies Tiller should delete the hook if the hook failed during execution. * `"before-hook-creation"` specifies Tiller should delete the previous hook before the new hook is launched. +### Defining a CRD with the `crd-install` Hook + +Custom Resource Definitions (CRDs) are a special kind in Kubernetes. They provide +a way to define other kinds. + +On occasion, a chart needs to both define a kind and then use it. This is done +with the `crd-install` hook. + +The `crd-install` hook is executed very early during an installation, before +the rest of the manifests are verified. CRDs can be annotated with this hook so +that they are installed before any instances of that CRD are referenced. In this +way, when verification happens later, the CRDs will be available. + +Here is an example of defining a CRD with a hook, and an instance of the CRD: + +```yaml +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: crontabs.stable.example.com + annotations: + "helm.sh/hook": crd-install +spec: + group: stable.example.com + version: v1 + scope: Namespaced + names: + plural: crontabs + singular: crontab + kind: CronTab + shortNames: + - ct +``` + +And: + +```yaml +apiVersion: stable.example.com/v1 +kind: CronTab +metadata: + name: {{ .Release.Name }}-inst +``` + +Both of these can now be in the same chart, provided that the CRD is correctly +annotated. + ### Automatically delete hook from previous release When helm release being updated it is possible, that hook resource already exists in cluster. By default helm will try to create resource and fail with `"... already exists"` error. diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 25ccea1bd03..9f1ad86b0cf 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -84,6 +84,7 @@ helm install [CHART] -n, --name string release name. If unspecified, it will autogenerate one for you --name-template string specify template used to name the release --namespace string namespace to install the release into. Defaults to the current kube config namespace. + --no-crd-hook prevent CRD hooks from running, but run other hooks --no-hooks prevent hooks from running during install --password string chart repository password where to locate the requested chart --replace re-use the given name, even if that name is already used. This is unsafe in production @@ -117,4 +118,4 @@ helm install [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 20-Mar-2018 +###### Auto generated by spf13/cobra on 27-Apr-2018 diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 43e9f4dafa2..465ca0af8c3 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -97,6 +97,7 @@ func (h *Client) InstallReleaseFromChart(chart *chart.Chart, ns string, opts ... req.Namespace = ns req.DryRun = reqOpts.dryRun req.DisableHooks = reqOpts.disableHooks + req.DisableCrdHook = reqOpts.disableCRDHook req.ReuseName = reqOpts.reuseName ctx := NewContext() diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 3381e3f80fc..602e1e3a389 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -51,6 +51,8 @@ type options struct { force bool // if set, skip running hooks disableHooks bool + // if set, skip CRD hook only + disableCRDHook bool // name of release releaseName string // tls.Config to use for rpc if tls enabled @@ -295,6 +297,13 @@ func InstallDisableHooks(disable bool) InstallOption { } } +// InstallDisableCRDHook disables CRD hook during installation. +func InstallDisableCRDHook(disable bool) InstallOption { + return func(opts *options) { + opts.disableCRDHook = disable + } +} + // InstallReuseName will (if true) instruct Tiller to re-use an existing name. func InstallReuseName(reuse bool) InstallOption { return func(opts *options) { diff --git a/pkg/hooks/hooks.go b/pkg/hooks/hooks.go index 80f838368c7..64118333de9 100644 --- a/pkg/hooks/hooks.go +++ b/pkg/hooks/hooks.go @@ -41,6 +41,7 @@ const ( PostRollback = "post-rollback" ReleaseTestSuccess = "test-success" ReleaseTestFailure = "test-failure" + CRDInstall = "crd-install" ) // Type of policy for deleting the hook diff --git a/pkg/proto/hapi/release/hook.pb.go b/pkg/proto/hapi/release/hook.pb.go index 00fa5c18857..0a44165c830 100644 --- a/pkg/proto/hapi/release/hook.pb.go +++ b/pkg/proto/hapi/release/hook.pb.go @@ -52,6 +52,7 @@ const ( Hook_POST_ROLLBACK Hook_Event = 8 Hook_RELEASE_TEST_SUCCESS Hook_Event = 9 Hook_RELEASE_TEST_FAILURE Hook_Event = 10 + Hook_CRD_INSTALL Hook_Event = 11 ) var Hook_Event_name = map[int32]string{ @@ -66,6 +67,7 @@ var Hook_Event_name = map[int32]string{ 8: "POST_ROLLBACK", 9: "RELEASE_TEST_SUCCESS", 10: "RELEASE_TEST_FAILURE", + 11: "CRD_INSTALL", } var Hook_Event_value = map[string]int32{ "UNKNOWN": 0, @@ -79,6 +81,7 @@ var Hook_Event_value = map[string]int32{ "POST_ROLLBACK": 8, "RELEASE_TEST_SUCCESS": 9, "RELEASE_TEST_FAILURE": 10, + "CRD_INSTALL": 11, } func (x Hook_Event) String() string { @@ -199,33 +202,34 @@ func init() { func init() { proto.RegisterFile("hapi/release/hook.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 445 bytes of a gzipped FileDescriptorProto + // 453 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0x51, 0x8f, 0x9a, 0x40, - 0x10, 0x80, 0x8f, 0x13, 0x41, 0x47, 0xcf, 0xdb, 0x6e, 0x9a, 0x76, 0xe3, 0xcb, 0x19, 0x9f, 0x7c, + 0x10, 0x80, 0x8f, 0x53, 0x41, 0x47, 0xcf, 0xdb, 0x6e, 0x9a, 0x76, 0xe3, 0xcb, 0x19, 0x9f, 0x7c, 0xc2, 0xe6, 0x9a, 0xfe, 0x00, 0x84, 0xb9, 0x6a, 0x24, 0x60, 0x16, 0x4c, 0x93, 0xbe, 0x10, 0xae, - 0xee, 0x29, 0x11, 0x81, 0x08, 0xb6, 0xe9, 0x0f, 0xec, 0x3f, 0xe8, 0x0f, 0x6a, 0x76, 0x45, 0x7b, - 0x49, 0xfb, 0x36, 0xf3, 0xcd, 0x37, 0xc3, 0x0c, 0x0b, 0xef, 0x77, 0x49, 0x99, 0x4e, 0x8f, 0x22, - 0x13, 0x49, 0x25, 0xa6, 0xbb, 0xa2, 0xd8, 0x5b, 0xe5, 0xb1, 0xa8, 0x0b, 0xda, 0x97, 0x05, 0xab, - 0x29, 0x0c, 0x1f, 0xb6, 0x45, 0xb1, 0xcd, 0xc4, 0x54, 0xd5, 0x9e, 0x4f, 0x2f, 0xd3, 0x3a, 0x3d, - 0x88, 0xaa, 0x4e, 0x0e, 0xe5, 0x59, 0x1f, 0xff, 0xd2, 0x41, 0x9f, 0x17, 0xc5, 0x9e, 0x52, 0xd0, - 0xf3, 0xe4, 0x20, 0x98, 0x36, 0xd2, 0x26, 0x5d, 0xae, 0x62, 0xc9, 0xf6, 0x69, 0xbe, 0x61, 0xb7, - 0x67, 0x26, 0x63, 0xc9, 0xca, 0xa4, 0xde, 0xb1, 0xd6, 0x99, 0xc9, 0x98, 0x0e, 0xa1, 0x73, 0x48, - 0xf2, 0xf4, 0x45, 0x54, 0x35, 0xd3, 0x15, 0xbf, 0xe6, 0xf4, 0x03, 0x18, 0xe2, 0xbb, 0xc8, 0xeb, - 0x8a, 0xb5, 0x47, 0xad, 0xc9, 0xe0, 0x91, 0x59, 0xaf, 0x17, 0xb4, 0xe4, 0xb7, 0x2d, 0x94, 0x02, - 0x6f, 0x3c, 0xfa, 0x09, 0x3a, 0x59, 0x52, 0xd5, 0xf1, 0xf1, 0x94, 0x33, 0x63, 0xa4, 0x4d, 0x7a, - 0x8f, 0x43, 0xeb, 0x7c, 0x86, 0x75, 0x39, 0xc3, 0x8a, 0x2e, 0x67, 0x70, 0x53, 0xba, 0xfc, 0x94, - 0xd3, 0x77, 0x60, 0xfc, 0x10, 0xe9, 0x76, 0x57, 0x33, 0x73, 0xa4, 0x4d, 0xda, 0xbc, 0xc9, 0xe8, - 0x1c, 0xee, 0x37, 0x22, 0x13, 0xb5, 0x88, 0xcb, 0x22, 0x4b, 0xbf, 0xa5, 0xa2, 0x62, 0x1d, 0xb5, - 0xc9, 0xc3, 0x7f, 0x36, 0x71, 0x95, 0xb9, 0x92, 0xe2, 0x4f, 0x3e, 0xd8, 0xfc, 0xcd, 0x52, 0x51, - 0x8d, 0x7f, 0x6b, 0xd0, 0x56, 0xab, 0xd2, 0x1e, 0x98, 0x6b, 0x7f, 0xe9, 0x07, 0x5f, 0x7c, 0x72, - 0x43, 0xef, 0xa1, 0xb7, 0xe2, 0x18, 0x2f, 0xfc, 0x30, 0xb2, 0x3d, 0x8f, 0x68, 0x94, 0x40, 0x7f, - 0x15, 0x84, 0xd1, 0x95, 0xdc, 0xd2, 0x01, 0x80, 0x54, 0x5c, 0xf4, 0x30, 0x42, 0xd2, 0x52, 0x2d, - 0xd2, 0x68, 0x80, 0x7e, 0x99, 0xb1, 0x5e, 0x7d, 0xe6, 0xb6, 0x8b, 0xa4, 0x7d, 0x9d, 0x71, 0x21, - 0x86, 0x22, 0x1c, 0x63, 0x1e, 0x78, 0xde, 0xcc, 0x76, 0x96, 0xc4, 0xa4, 0x6f, 0xe0, 0x4e, 0x39, - 0x57, 0xd4, 0xa1, 0x0c, 0xde, 0x72, 0xf4, 0xd0, 0x0e, 0x31, 0x8e, 0x30, 0x8c, 0xe2, 0x70, 0xed, - 0x38, 0x18, 0x86, 0xa4, 0xfb, 0x4f, 0xe5, 0xc9, 0x5e, 0x78, 0x6b, 0x8e, 0x04, 0xc6, 0x0e, 0xf4, - 0x5f, 0x9f, 0x4d, 0xef, 0xa0, 0xab, 0xda, 0xd0, 0x45, 0x97, 0xdc, 0x50, 0x00, 0x43, 0xba, 0xe8, - 0x12, 0x4d, 0x0e, 0x99, 0xe1, 0x53, 0xc0, 0x31, 0x9e, 0x07, 0xc1, 0x32, 0x76, 0x38, 0xda, 0xd1, - 0x22, 0xf0, 0xc9, 0xed, 0xac, 0xfb, 0xd5, 0x6c, 0x7e, 0xe4, 0xb3, 0xa1, 0x5e, 0xe9, 0xe3, 0x9f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x13, 0x64, 0x75, 0x6c, 0xa3, 0x02, 0x00, 0x00, + 0xee, 0x29, 0x11, 0x81, 0x08, 0xb6, 0xe9, 0x1f, 0xed, 0x3f, 0xe8, 0xff, 0x68, 0x76, 0x45, 0x7a, + 0x49, 0xfb, 0x36, 0xf3, 0xcd, 0xb7, 0xb3, 0x33, 0xbb, 0xf0, 0x7e, 0x1f, 0x17, 0xc9, 0xec, 0x24, + 0x52, 0x11, 0x97, 0x62, 0xb6, 0xcf, 0xf3, 0x83, 0x59, 0x9c, 0xf2, 0x2a, 0xa7, 0x03, 0x59, 0x30, + 0xeb, 0xc2, 0xe8, 0x61, 0x97, 0xe7, 0xbb, 0x54, 0xcc, 0x54, 0xed, 0xf9, 0xfc, 0x32, 0xab, 0x92, + 0xa3, 0x28, 0xab, 0xf8, 0x58, 0x5c, 0xf4, 0xc9, 0xaf, 0x36, 0xb4, 0x17, 0x79, 0x7e, 0xa0, 0x14, + 0xda, 0x59, 0x7c, 0x14, 0x4c, 0x1b, 0x6b, 0xd3, 0x1e, 0x57, 0xb1, 0x64, 0x87, 0x24, 0xdb, 0xb2, + 0xdb, 0x0b, 0x93, 0xb1, 0x64, 0x45, 0x5c, 0xed, 0x59, 0xeb, 0xc2, 0x64, 0x4c, 0x47, 0xd0, 0x3d, + 0xc6, 0x59, 0xf2, 0x22, 0xca, 0x8a, 0xb5, 0x15, 0x6f, 0x72, 0xfa, 0x01, 0x74, 0xf1, 0x5d, 0x64, + 0x55, 0xc9, 0x3a, 0xe3, 0xd6, 0x74, 0xf8, 0xc8, 0xcc, 0xd7, 0x03, 0x9a, 0xf2, 0x6e, 0x13, 0xa5, + 0xc0, 0x6b, 0x8f, 0x7e, 0x82, 0x6e, 0x1a, 0x97, 0x55, 0x74, 0x3a, 0x67, 0x4c, 0x1f, 0x6b, 0xd3, + 0xfe, 0xe3, 0xc8, 0xbc, 0xac, 0x61, 0x5e, 0xd7, 0x30, 0xc3, 0xeb, 0x1a, 0xdc, 0x90, 0x2e, 0x3f, + 0x67, 0xf4, 0x1d, 0xe8, 0x3f, 0x44, 0xb2, 0xdb, 0x57, 0xcc, 0x18, 0x6b, 0xd3, 0x0e, 0xaf, 0x33, + 0xba, 0x80, 0xfb, 0xad, 0x48, 0x45, 0x25, 0xa2, 0x22, 0x4f, 0x93, 0x6f, 0x89, 0x28, 0x59, 0x57, + 0x4d, 0xf2, 0xf0, 0x9f, 0x49, 0x1c, 0x65, 0xae, 0xa5, 0xf8, 0x93, 0x0f, 0xb7, 0x7f, 0xb3, 0x44, + 0x94, 0x93, 0xdf, 0x1a, 0x74, 0xd4, 0xa8, 0xb4, 0x0f, 0xc6, 0xc6, 0x5b, 0x79, 0xfe, 0x17, 0x8f, + 0xdc, 0xd0, 0x7b, 0xe8, 0xaf, 0x39, 0x46, 0x4b, 0x2f, 0x08, 0x2d, 0xd7, 0x25, 0x1a, 0x25, 0x30, + 0x58, 0xfb, 0x41, 0xd8, 0x90, 0x5b, 0x3a, 0x04, 0x90, 0x8a, 0x83, 0x2e, 0x86, 0x48, 0x5a, 0xea, + 0x88, 0x34, 0x6a, 0xd0, 0xbe, 0xf6, 0xd8, 0xac, 0x3f, 0x73, 0xcb, 0x41, 0xd2, 0x69, 0x7a, 0x5c, + 0x89, 0xae, 0x08, 0xc7, 0x88, 0xfb, 0xae, 0x3b, 0xb7, 0xec, 0x15, 0x31, 0xe8, 0x1b, 0xb8, 0x53, + 0x4e, 0x83, 0xba, 0x94, 0xc1, 0x5b, 0x8e, 0x2e, 0x5a, 0x01, 0x46, 0x21, 0x06, 0x61, 0x14, 0x6c, + 0x6c, 0x1b, 0x83, 0x80, 0xf4, 0xfe, 0xa9, 0x3c, 0x59, 0x4b, 0x77, 0xc3, 0x91, 0x80, 0xbc, 0xdb, + 0xe6, 0x4e, 0x33, 0x6d, 0x7f, 0x62, 0xc3, 0xe0, 0xf5, 0x3b, 0xd0, 0x3b, 0xe8, 0xa9, 0x3e, 0xe8, + 0xa0, 0x43, 0x6e, 0x28, 0x80, 0x2e, 0x0f, 0xa3, 0x43, 0x34, 0xd9, 0x75, 0x8e, 0x4f, 0x3e, 0xc7, + 0x68, 0xe1, 0xfb, 0xab, 0xc8, 0xe6, 0x68, 0x85, 0x4b, 0xdf, 0x23, 0xb7, 0xf3, 0xde, 0x57, 0xa3, + 0x7e, 0xd9, 0x67, 0x5d, 0x7d, 0xdb, 0xc7, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3b, 0xcf, 0xed, + 0xd9, 0xb4, 0x02, 0x00, 0x00, } diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 37535aac719..4d23bcdad3e 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -599,7 +599,8 @@ type InstallReleaseRequest struct { Timeout int64 `protobuf:"varint,8,opt,name=timeout" json:"timeout,omitempty"` // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // before marking the release as successful. It will wait for as long as timeout - Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` + Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` + DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook" json:"disable_crd_hook,omitempty"` } func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } @@ -670,6 +671,13 @@ func (m *InstallReleaseRequest) GetWait() bool { return false } +func (m *InstallReleaseRequest) GetDisableCrdHook() bool { + if m != nil { + return m.DisableCrdHook + } + return false +} + // InstallReleaseResponse is the response from a release installation. type InstallReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -1368,82 +1376,83 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1217 bytes of a gzipped FileDescriptorProto + // 1235 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4, - 0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x36, 0xff, 0x74, 0x9a, 0xb6, 0xae, 0xff, 0x0b, 0x2a, 0x46, 0xb0, - 0xd9, 0x85, 0x4d, 0x21, 0x70, 0x83, 0x84, 0x90, 0xba, 0xdd, 0xa8, 0x2d, 0x94, 0xae, 0xe4, 0x6c, - 0x17, 0x09, 0x01, 0x91, 0x9b, 0x4c, 0x5a, 0xb3, 0x8e, 0x27, 0x78, 0xc6, 0x65, 0x7b, 0xcb, 0x1d, - 0x8f, 0xc2, 0x5b, 0xf0, 0x1e, 0x5c, 0xc2, 0x83, 0x20, 0xcf, 0x87, 0xeb, 0x49, 0xed, 0xd6, 0xf4, - 0x26, 0x9e, 0x99, 0xf3, 0xfd, 0x3b, 0x67, 0xce, 0x9c, 0x80, 0x75, 0xe9, 0x2e, 0xbc, 0x3d, 0x8a, - 0xc3, 0x2b, 0x6f, 0x82, 0xe9, 0x1e, 0xf3, 0x7c, 0x1f, 0x87, 0xfd, 0x45, 0x48, 0x18, 0x41, 0xdd, - 0x98, 0xd6, 0x57, 0xb4, 0xbe, 0xa0, 0x59, 0x5b, 0x5c, 0x62, 0x72, 0xe9, 0x86, 0x4c, 0xfc, 0x0a, - 0x6e, 0x6b, 0x3b, 0x7d, 0x4e, 0x82, 0x99, 0x77, 0x21, 0x09, 0xc2, 0x44, 0x88, 0x7d, 0xec, 0x52, - 0xac, 0xbe, 0x9a, 0x90, 0xa2, 0x79, 0xc1, 0x8c, 0x48, 0xc2, 0xff, 0x35, 0x02, 0xc3, 0x94, 0x8d, - 0xc3, 0x28, 0x90, 0xc4, 0x1d, 0x8d, 0x48, 0x99, 0xcb, 0x22, 0xaa, 0x19, 0xbb, 0xc2, 0x21, 0xf5, - 0x48, 0xa0, 0xbe, 0x82, 0x66, 0xff, 0x59, 0x82, 0x8d, 0x13, 0x8f, 0x32, 0x47, 0x08, 0x52, 0x07, - 0xff, 0x12, 0x61, 0xca, 0x50, 0x17, 0xaa, 0xbe, 0x37, 0xf7, 0x98, 0x69, 0xec, 0x1a, 0xbd, 0xb2, - 0x23, 0x36, 0x68, 0x0b, 0x6a, 0x64, 0x36, 0xa3, 0x98, 0x99, 0xa5, 0x5d, 0xa3, 0xd7, 0x74, 0xe4, - 0x0e, 0x7d, 0x05, 0x75, 0x4a, 0x42, 0x36, 0x3e, 0xbf, 0x36, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, - 0xa0, 0x9f, 0x85, 0x53, 0x3f, 0xb6, 0x34, 0x22, 0x21, 0xeb, 0xc7, 0x3f, 0xcf, 0xaf, 0x9d, 0x1a, - 0xe5, 0xdf, 0x58, 0xef, 0xcc, 0xf3, 0x19, 0x0e, 0xcd, 0x8a, 0xd0, 0x2b, 0x76, 0xe8, 0x10, 0x80, - 0xeb, 0x25, 0xe1, 0x14, 0x87, 0x66, 0x95, 0xab, 0xee, 0x15, 0x50, 0xfd, 0x32, 0xe6, 0x77, 0x9a, - 0x54, 0x2d, 0xd1, 0x97, 0xb0, 0x2a, 0x20, 0x19, 0x4f, 0xc8, 0x14, 0x53, 0xb3, 0xb6, 0x5b, 0xee, - 0xb5, 0x07, 0x3b, 0x42, 0x95, 0x82, 0x7f, 0x24, 0x40, 0x3b, 0x20, 0x53, 0xec, 0xb4, 0x04, 0x7b, - 0xbc, 0xa6, 0xe8, 0x11, 0x34, 0x03, 0x77, 0x8e, 0xe9, 0xc2, 0x9d, 0x60, 0xb3, 0xce, 0x3d, 0xbc, - 0x39, 0xb0, 0x7f, 0x82, 0x86, 0x32, 0x6e, 0x0f, 0xa0, 0x26, 0x42, 0x43, 0x2d, 0xa8, 0x9f, 0x9d, - 0x7e, 0x73, 0xfa, 0xf2, 0xbb, 0xd3, 0xce, 0x0a, 0x6a, 0x40, 0xe5, 0x74, 0xff, 0xdb, 0x61, 0xc7, - 0x40, 0xeb, 0xb0, 0x76, 0xb2, 0x3f, 0x7a, 0x35, 0x76, 0x86, 0x27, 0xc3, 0xfd, 0xd1, 0xf0, 0x45, - 0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0xe8, 0x40, 0x88, 0xbc, 0x18, - 0x8e, 0x0e, 0x3a, 0x86, 0xfd, 0xbb, 0x01, 0x5d, 0x3d, 0x45, 0x74, 0x41, 0x02, 0x8a, 0xe3, 0x1c, - 0x4d, 0x48, 0x14, 0x24, 0x39, 0xe2, 0x1b, 0x84, 0xa0, 0x12, 0xe0, 0xb7, 0x2a, 0x43, 0x7c, 0x1d, - 0x73, 0x32, 0xc2, 0x5c, 0x9f, 0x67, 0xa7, 0xec, 0x88, 0x0d, 0xfa, 0x14, 0x1a, 0x32, 0x74, 0x6a, - 0x56, 0x76, 0xcb, 0xbd, 0xd6, 0x60, 0x53, 0x07, 0x44, 0x5a, 0x74, 0x12, 0x36, 0xfb, 0x10, 0xb6, - 0x0f, 0xb1, 0xf2, 0x44, 0xe0, 0xa5, 0x2a, 0x26, 0xb6, 0xeb, 0xce, 0x31, 0x77, 0x26, 0xb6, 0xeb, - 0xce, 0x31, 0x32, 0xa1, 0x2e, 0xcb, 0x8d, 0xbb, 0x53, 0x75, 0xd4, 0xd6, 0x66, 0x60, 0xde, 0x56, - 0x24, 0xe3, 0xca, 0xd2, 0xf4, 0x21, 0x54, 0xe2, 0x9b, 0xc0, 0xd5, 0xb4, 0x06, 0x48, 0xf7, 0xf3, - 0x38, 0x98, 0x11, 0x87, 0xd3, 0xf5, 0x54, 0x95, 0x97, 0x53, 0x75, 0x94, 0xb6, 0x7a, 0x40, 0x02, - 0x86, 0x03, 0xf6, 0x30, 0xff, 0x4f, 0x60, 0x27, 0x43, 0x93, 0x0c, 0x60, 0x0f, 0xea, 0xd2, 0x35, - 0xae, 0x2d, 0x17, 0x57, 0xc5, 0x65, 0xff, 0x5d, 0x82, 0xee, 0xd9, 0x62, 0xea, 0x32, 0xac, 0x48, - 0x77, 0x38, 0xf5, 0x18, 0xaa, 0xbc, 0xa3, 0x48, 0x2c, 0xd6, 0x85, 0x6e, 0xd1, 0x76, 0x0e, 0xe2, - 0x5f, 0x47, 0xd0, 0xd1, 0x53, 0xa8, 0x5d, 0xb9, 0x7e, 0x84, 0x29, 0x07, 0x22, 0x41, 0x4d, 0x72, - 0xf2, 0x76, 0xe4, 0x48, 0x0e, 0xb4, 0x0d, 0xf5, 0x69, 0x78, 0x1d, 0xf7, 0x13, 0x7e, 0x05, 0x1b, - 0x4e, 0x6d, 0x1a, 0x5e, 0x3b, 0x51, 0x80, 0xde, 0x87, 0xb5, 0xa9, 0x47, 0xdd, 0x73, 0x1f, 0x8f, - 0x2f, 0x09, 0x79, 0x43, 0xf9, 0x2d, 0x6c, 0x38, 0xab, 0xf2, 0xf0, 0x28, 0x3e, 0x43, 0x56, 0x5c, - 0x49, 0x93, 0x10, 0xbb, 0x0c, 0x9b, 0x35, 0x4e, 0x4f, 0xf6, 0x31, 0x86, 0xcc, 0x9b, 0x63, 0x12, - 0x31, 0x7e, 0x75, 0xca, 0x8e, 0xda, 0xa2, 0xf7, 0x60, 0x35, 0xc4, 0x14, 0xb3, 0xb1, 0xf4, 0xb2, - 0xc1, 0x25, 0x5b, 0xfc, 0xec, 0xb5, 0x70, 0x0b, 0x41, 0xe5, 0x57, 0xd7, 0x63, 0x66, 0x93, 0x93, - 0xf8, 0x5a, 0x88, 0x45, 0x14, 0x2b, 0x31, 0x50, 0x62, 0x11, 0xc5, 0x52, 0xac, 0x0b, 0xd5, 0x19, - 0x09, 0x27, 0xd8, 0x6c, 0x71, 0x9a, 0xd8, 0xd8, 0x47, 0xb0, 0xb9, 0x04, 0xf2, 0x43, 0xf3, 0xf5, - 0x8f, 0x01, 0x5b, 0x0e, 0xf1, 0xfd, 0x73, 0x77, 0xf2, 0xa6, 0x40, 0xc6, 0x52, 0xe0, 0x96, 0xee, - 0x06, 0xb7, 0x9c, 0x01, 0x6e, 0xaa, 0x08, 0x2b, 0x5a, 0x11, 0x6a, 0xb0, 0x57, 0xf3, 0x61, 0xaf, - 0xe9, 0xb0, 0x2b, 0x4c, 0xeb, 0x29, 0x4c, 0x13, 0xc0, 0x1a, 0x69, 0xc0, 0xbe, 0x86, 0xed, 0x5b, - 0x51, 0x3e, 0x14, 0xb2, 0x3f, 0x4a, 0xb0, 0x79, 0x1c, 0x50, 0xe6, 0xfa, 0xfe, 0x12, 0x62, 0x49, - 0x3d, 0x1b, 0x85, 0xeb, 0xb9, 0xf4, 0x5f, 0xea, 0xb9, 0xac, 0x41, 0xae, 0xf2, 0x53, 0x49, 0xe5, - 0xa7, 0x50, 0x8d, 0x6b, 0x9d, 0xa5, 0xb6, 0xd4, 0x59, 0xd0, 0x3b, 0x00, 0xa2, 0x28, 0xb9, 0x72, - 0x01, 0x6d, 0x93, 0x9f, 0x9c, 0xca, 0x46, 0xa2, 0xb2, 0xd1, 0xc8, 0xce, 0x46, 0xaa, 0xc2, 0xed, - 0x63, 0xd8, 0x5a, 0x86, 0xea, 0xa1, 0xb0, 0xff, 0x66, 0xc0, 0xf6, 0x59, 0xe0, 0x65, 0x02, 0x9f, - 0x55, 0xaa, 0xb7, 0xa0, 0x28, 0x65, 0x40, 0xd1, 0x85, 0xea, 0x22, 0x0a, 0x2f, 0xb0, 0x84, 0x56, - 0x6c, 0xd2, 0x31, 0x56, 0xb4, 0x18, 0xed, 0x31, 0x98, 0xb7, 0x7d, 0x78, 0x60, 0x44, 0xb1, 0xd7, - 0xc9, 0x4b, 0xd0, 0x14, 0x5d, 0xdf, 0xde, 0x80, 0xf5, 0x43, 0xcc, 0x5e, 0x8b, 0x6b, 0x21, 0xc3, - 0xb3, 0x87, 0x80, 0xd2, 0x87, 0x37, 0xf6, 0xe4, 0x91, 0x6e, 0x4f, 0x8d, 0x45, 0x8a, 0x5f, 0x71, - 0xd9, 0x5f, 0x70, 0xdd, 0x47, 0x1e, 0x65, 0x24, 0xbc, 0xbe, 0x0b, 0xba, 0x0e, 0x94, 0xe7, 0xee, - 0x5b, 0xf9, 0x50, 0xc4, 0x4b, 0xfb, 0x90, 0x7b, 0x90, 0x88, 0x4a, 0x0f, 0xd2, 0xcf, 0xae, 0x51, - 0xec, 0xd9, 0xfd, 0x01, 0xd0, 0x2b, 0x9c, 0x4c, 0x00, 0xf7, 0xbc, 0x58, 0x2a, 0x09, 0x25, 0xbd, - 0xd0, 0x4c, 0xa8, 0x4f, 0x7c, 0xec, 0x06, 0xd1, 0x42, 0xa6, 0x4d, 0x6d, 0xed, 0x1f, 0x61, 0x43, - 0xd3, 0x2e, 0xfd, 0x8c, 0xe3, 0xa1, 0x17, 0x52, 0x7b, 0xbc, 0x44, 0x9f, 0x43, 0x4d, 0x8c, 0x45, - 0x5c, 0x77, 0x7b, 0xf0, 0x48, 0xf7, 0x9b, 0x2b, 0x89, 0x02, 0x39, 0x47, 0x39, 0x92, 0x77, 0xf0, - 0x57, 0x03, 0xda, 0xea, 0xa1, 0x17, 0x43, 0x1b, 0xf2, 0x60, 0x35, 0x3d, 0xd1, 0xa0, 0x27, 0xf9, - 0x33, 0xdd, 0xd2, 0x60, 0x6a, 0x3d, 0x2d, 0xc2, 0x2a, 0x22, 0xb0, 0x57, 0x3e, 0x31, 0x10, 0x85, - 0xce, 0xf2, 0xa0, 0x81, 0x9e, 0x65, 0xeb, 0xc8, 0x99, 0x6c, 0xac, 0x7e, 0x51, 0x76, 0x65, 0x16, - 0x5d, 0xf1, 0x9a, 0xd1, 0xa7, 0x03, 0x74, 0xaf, 0x1a, 0x7d, 0x20, 0xb1, 0xf6, 0x0a, 0xf3, 0x27, - 0x76, 0x7f, 0x86, 0x35, 0xed, 0x85, 0x43, 0x39, 0x68, 0x65, 0xcd, 0x1a, 0xd6, 0x47, 0x85, 0x78, - 0x13, 0x5b, 0x73, 0x68, 0xeb, 0x4d, 0x0a, 0xe5, 0x28, 0xc8, 0xec, 0xfa, 0xd6, 0xc7, 0xc5, 0x98, - 0x13, 0x73, 0x14, 0x3a, 0xcb, 0x3d, 0x24, 0x2f, 0x8f, 0x39, 0xfd, 0x2e, 0x2f, 0x8f, 0x79, 0xad, - 0xc9, 0x5e, 0x41, 0x2e, 0xc0, 0x4d, 0x0b, 0x41, 0x8f, 0x73, 0x13, 0xa2, 0x77, 0x1e, 0xab, 0x77, - 0x3f, 0x63, 0x62, 0x62, 0x01, 0xff, 0x5b, 0x7a, 0x63, 0x51, 0x0e, 0x34, 0xd9, 0x03, 0x87, 0xf5, - 0xac, 0x20, 0xf7, 0x52, 0x50, 0xb2, 0x2b, 0xdd, 0x11, 0x94, 0xde, 0xf2, 0xee, 0x08, 0x6a, 0xa9, - 0xc1, 0xd9, 0x2b, 0xc8, 0x83, 0xb6, 0x13, 0x05, 0xd2, 0x74, 0xdc, 0x16, 0x50, 0x8e, 0xf4, 0xed, - 0xae, 0x66, 0x3d, 0x29, 0xc0, 0x79, 0x73, 0xbf, 0x9f, 0xc3, 0xf7, 0x0d, 0xc5, 0x7a, 0x5e, 0xe3, - 0xff, 0x69, 0x3f, 0xfb, 0x37, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x7c, 0x9c, 0x49, 0xc1, 0x0f, 0x00, - 0x00, + 0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x6e, 0xfe, 0xd9, 0x69, 0xda, 0xba, 0xfe, 0x2f, 0xa8, 0x18, 0xc1, + 0x66, 0x17, 0x36, 0x85, 0xc0, 0x0d, 0x12, 0x42, 0xea, 0x66, 0xa3, 0xb6, 0x50, 0xba, 0x92, 0xb3, + 0x5d, 0x24, 0x04, 0x44, 0x6e, 0x32, 0x69, 0xcd, 0x3a, 0x76, 0xf0, 0x8c, 0xcb, 0xf6, 0x96, 0x3b, + 0xde, 0x8a, 0x77, 0xe0, 0x92, 0x4b, 0x78, 0x10, 0x34, 0x5f, 0xae, 0x27, 0xb5, 0x5b, 0xd3, 0x9b, + 0x78, 0x66, 0xce, 0xf7, 0xef, 0x9c, 0x39, 0x73, 0x02, 0xd6, 0x85, 0xbb, 0xf4, 0xf6, 0x08, 0x8e, + 0x2e, 0xbd, 0x29, 0x26, 0x7b, 0xd4, 0xf3, 0x7d, 0x1c, 0xf5, 0x97, 0x51, 0x48, 0x43, 0xd4, 0x65, + 0xb4, 0xbe, 0xa2, 0xf5, 0x05, 0xcd, 0xda, 0xe2, 0x12, 0xd3, 0x0b, 0x37, 0xa2, 0xe2, 0x57, 0x70, + 0x5b, 0xdb, 0xe9, 0xf3, 0x30, 0x98, 0x7b, 0xe7, 0x92, 0x20, 0x4c, 0x44, 0xd8, 0xc7, 0x2e, 0xc1, + 0xea, 0xab, 0x09, 0x29, 0x9a, 0x17, 0xcc, 0x43, 0x49, 0xf8, 0xbf, 0x46, 0xa0, 0x98, 0xd0, 0x49, + 0x14, 0x07, 0x92, 0xb8, 0xa3, 0x11, 0x09, 0x75, 0x69, 0x4c, 0x34, 0x63, 0x97, 0x38, 0x22, 0x5e, + 0x18, 0xa8, 0xaf, 0xa0, 0xd9, 0x7f, 0x94, 0x60, 0xe3, 0xd8, 0x23, 0xd4, 0x11, 0x82, 0xc4, 0xc1, + 0xbf, 0xc4, 0x98, 0x50, 0xd4, 0x85, 0xaa, 0xef, 0x2d, 0x3c, 0x6a, 0x1a, 0xbb, 0x46, 0xaf, 0xec, + 0x88, 0x0d, 0xda, 0x82, 0x5a, 0x38, 0x9f, 0x13, 0x4c, 0xcd, 0xd2, 0xae, 0xd1, 0x6b, 0x3a, 0x72, + 0x87, 0xbe, 0x82, 0x3a, 0x09, 0x23, 0x3a, 0x39, 0xbb, 0x32, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, + 0xa0, 0x9f, 0x85, 0x53, 0x9f, 0x59, 0x1a, 0x87, 0x11, 0xed, 0xb3, 0x9f, 0xe7, 0x57, 0x4e, 0x8d, + 0xf0, 0x2f, 0xd3, 0x3b, 0xf7, 0x7c, 0x8a, 0x23, 0xb3, 0x22, 0xf4, 0x8a, 0x1d, 0x3a, 0x00, 0xe0, + 0x7a, 0xc3, 0x68, 0x86, 0x23, 0xb3, 0xca, 0x55, 0xf7, 0x0a, 0xa8, 0x7e, 0xc9, 0xf8, 0x9d, 0x26, + 0x51, 0x4b, 0xf4, 0x25, 0xac, 0x0b, 0x48, 0x26, 0xd3, 0x70, 0x86, 0x89, 0x59, 0xdb, 0x2d, 0xf7, + 0xda, 0x83, 0x1d, 0xa1, 0x4a, 0xc1, 0x3f, 0x16, 0xa0, 0x0d, 0xc3, 0x19, 0x76, 0x5a, 0x82, 0x9d, + 0xad, 0x09, 0x7a, 0x04, 0xcd, 0xc0, 0x5d, 0x60, 0xb2, 0x74, 0xa7, 0xd8, 0xac, 0x73, 0x0f, 0xaf, + 0x0f, 0xec, 0x9f, 0xa0, 0xa1, 0x8c, 0xdb, 0x03, 0xa8, 0x89, 0xd0, 0x50, 0x0b, 0xea, 0xa7, 0x27, + 0xdf, 0x9c, 0xbc, 0xfc, 0xee, 0xa4, 0xb3, 0x86, 0x1a, 0x50, 0x39, 0xd9, 0xff, 0x76, 0xd4, 0x31, + 0xd0, 0x43, 0x78, 0x70, 0xbc, 0x3f, 0x7e, 0x35, 0x71, 0x46, 0xc7, 0xa3, 0xfd, 0xf1, 0xe8, 0x45, + 0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0x78, 0x28, 0x44, 0x5e, 0x8c, + 0xc6, 0xc3, 0x8e, 0x61, 0xff, 0x6e, 0x40, 0x57, 0x4f, 0x11, 0x59, 0x86, 0x01, 0xc1, 0x2c, 0x47, + 0xd3, 0x30, 0x0e, 0x92, 0x1c, 0xf1, 0x0d, 0x42, 0x50, 0x09, 0xf0, 0x5b, 0x95, 0x21, 0xbe, 0x66, + 0x9c, 0x34, 0xa4, 0xae, 0xcf, 0xb3, 0x53, 0x76, 0xc4, 0x06, 0x7d, 0x0a, 0x0d, 0x19, 0x3a, 0x31, + 0x2b, 0xbb, 0xe5, 0x5e, 0x6b, 0xb0, 0xa9, 0x03, 0x22, 0x2d, 0x3a, 0x09, 0x9b, 0x7d, 0x00, 0xdb, + 0x07, 0x58, 0x79, 0x22, 0xf0, 0x52, 0x15, 0xc3, 0xec, 0xba, 0x0b, 0xcc, 0x9d, 0x61, 0x76, 0xdd, + 0x05, 0x46, 0x26, 0xd4, 0x65, 0xb9, 0x71, 0x77, 0xaa, 0x8e, 0xda, 0xda, 0x14, 0xcc, 0x9b, 0x8a, + 0x64, 0x5c, 0x59, 0x9a, 0x3e, 0x84, 0x0a, 0xbb, 0x09, 0x5c, 0x4d, 0x6b, 0x80, 0x74, 0x3f, 0x8f, + 0x82, 0x79, 0xe8, 0x70, 0xba, 0x9e, 0xaa, 0xf2, 0x6a, 0xaa, 0x0e, 0xd3, 0x56, 0x87, 0x61, 0x40, + 0x71, 0x40, 0xef, 0xe7, 0xff, 0x31, 0xec, 0x64, 0x68, 0x92, 0x01, 0xec, 0x41, 0x5d, 0xba, 0xc6, + 0xb5, 0xe5, 0xe2, 0xaa, 0xb8, 0xec, 0xbf, 0x4b, 0xd0, 0x3d, 0x5d, 0xce, 0x5c, 0x8a, 0x15, 0xe9, + 0x16, 0xa7, 0x1e, 0x43, 0x95, 0x77, 0x14, 0x89, 0xc5, 0x43, 0xa1, 0x5b, 0xb4, 0x9d, 0x21, 0xfb, + 0x75, 0x04, 0x1d, 0x3d, 0x85, 0xda, 0xa5, 0xeb, 0xc7, 0x98, 0x70, 0x20, 0x12, 0xd4, 0x24, 0x27, + 0x6f, 0x47, 0x8e, 0xe4, 0x40, 0xdb, 0x50, 0x9f, 0x45, 0x57, 0xac, 0x9f, 0xf0, 0x2b, 0xd8, 0x70, + 0x6a, 0xb3, 0xe8, 0xca, 0x89, 0x03, 0xf4, 0x3e, 0x3c, 0x98, 0x79, 0xc4, 0x3d, 0xf3, 0xf1, 0xe4, + 0x22, 0x0c, 0xdf, 0x10, 0x7e, 0x0b, 0x1b, 0xce, 0xba, 0x3c, 0x3c, 0x64, 0x67, 0xc8, 0x62, 0x95, + 0x34, 0x8d, 0xb0, 0x4b, 0xb1, 0x59, 0xe3, 0xf4, 0x64, 0xcf, 0x30, 0xa4, 0xde, 0x02, 0x87, 0x31, + 0xe5, 0x57, 0xa7, 0xec, 0xa8, 0x2d, 0x7a, 0x0f, 0xd6, 0x23, 0x4c, 0x30, 0x9d, 0x48, 0x2f, 0x1b, + 0x5c, 0xb2, 0xc5, 0xcf, 0x5e, 0x0b, 0xb7, 0x10, 0x54, 0x7e, 0x75, 0x3d, 0x6a, 0x36, 0x39, 0x89, + 0xaf, 0x85, 0x58, 0x4c, 0xb0, 0x12, 0x03, 0x25, 0x16, 0x13, 0x2c, 0xc5, 0xba, 0x50, 0x9d, 0x87, + 0xd1, 0x14, 0x9b, 0x2d, 0x4e, 0x13, 0x1b, 0xfb, 0x10, 0x36, 0x57, 0x40, 0xbe, 0x6f, 0xbe, 0xfe, + 0x31, 0x60, 0xcb, 0x09, 0x7d, 0xff, 0xcc, 0x9d, 0xbe, 0x29, 0x90, 0xb1, 0x14, 0xb8, 0xa5, 0xdb, + 0xc1, 0x2d, 0x67, 0x80, 0x9b, 0x2a, 0xc2, 0x8a, 0x56, 0x84, 0x1a, 0xec, 0xd5, 0x7c, 0xd8, 0x6b, + 0x3a, 0xec, 0x0a, 0xd3, 0x7a, 0x0a, 0xd3, 0x04, 0xb0, 0x46, 0x1a, 0xb0, 0xaf, 0x61, 0xfb, 0x46, + 0x94, 0xf7, 0x85, 0xec, 0xcf, 0x12, 0x6c, 0x1e, 0x05, 0x84, 0xba, 0xbe, 0xbf, 0x82, 0x58, 0x52, + 0xcf, 0x46, 0xe1, 0x7a, 0x2e, 0xfd, 0x97, 0x7a, 0x2e, 0x6b, 0x90, 0xab, 0xfc, 0x54, 0x52, 0xf9, + 0x29, 0x54, 0xe3, 0x5a, 0x67, 0xa9, 0xad, 0x74, 0x16, 0xf4, 0x0e, 0x80, 0x28, 0x4a, 0xae, 0x5c, + 0x40, 0xdb, 0xe4, 0x27, 0x27, 0xb2, 0x91, 0xa8, 0x6c, 0x34, 0xb2, 0xb3, 0x91, 0xae, 0xf0, 0x1e, + 0x74, 0x94, 0x3f, 0xd3, 0x68, 0xc6, 0x7d, 0x92, 0x55, 0xde, 0x96, 0xe7, 0xc3, 0x68, 0xc6, 0xbc, + 0xb2, 0x8f, 0x60, 0x6b, 0x15, 0xd4, 0xfb, 0x26, 0xe8, 0x37, 0x03, 0xb6, 0x4f, 0x03, 0x2f, 0x33, + 0x45, 0x59, 0x45, 0x7d, 0x03, 0xb4, 0x52, 0x06, 0x68, 0x5d, 0xa8, 0x2e, 0xe3, 0xe8, 0x1c, 0xcb, + 0x24, 0x88, 0x4d, 0x1a, 0x8d, 0x8a, 0x86, 0x86, 0x3d, 0x01, 0xf3, 0xa6, 0x0f, 0xf7, 0x8c, 0x88, + 0x79, 0x9d, 0xbc, 0x19, 0x4d, 0xf1, 0x3e, 0xd8, 0x1b, 0xf0, 0xf0, 0x00, 0xd3, 0xd7, 0xe2, 0x02, + 0xc9, 0xf0, 0xec, 0x11, 0xa0, 0xf4, 0xe1, 0xb5, 0x3d, 0x79, 0xa4, 0xdb, 0x53, 0x03, 0x94, 0xe2, + 0x57, 0x5c, 0xf6, 0x17, 0x5c, 0xf7, 0xa1, 0x47, 0x68, 0x18, 0x5d, 0xdd, 0x06, 0x5d, 0x07, 0xca, + 0x0b, 0xf7, 0xad, 0x7c, 0x52, 0xd8, 0xd2, 0x3e, 0xe0, 0x1e, 0x24, 0xa2, 0xd2, 0x83, 0xf4, 0x03, + 0x6d, 0x14, 0x7b, 0xa0, 0x7f, 0x00, 0xf4, 0x0a, 0x27, 0xb3, 0xc2, 0x1d, 0x6f, 0x9b, 0x4a, 0x42, + 0x49, 0x2f, 0x49, 0x13, 0xea, 0x53, 0x1f, 0xbb, 0x41, 0xbc, 0x94, 0x69, 0x53, 0x5b, 0xfb, 0x47, + 0xd8, 0xd0, 0xb4, 0x4b, 0x3f, 0x59, 0x3c, 0xe4, 0x5c, 0x6a, 0x67, 0x4b, 0xf4, 0x39, 0xd4, 0xc4, + 0x00, 0xc5, 0x75, 0xb7, 0x07, 0x8f, 0x74, 0xbf, 0xb9, 0x92, 0x38, 0x90, 0x13, 0x97, 0x23, 0x79, + 0x07, 0x7f, 0x35, 0xa0, 0xad, 0x46, 0x02, 0x31, 0xde, 0x21, 0x0f, 0xd6, 0xd3, 0xb3, 0x0f, 0x7a, + 0x92, 0x3f, 0xfd, 0xad, 0x8c, 0xb0, 0xd6, 0xd3, 0x22, 0xac, 0x22, 0x02, 0x7b, 0xed, 0x13, 0x03, + 0x11, 0xe8, 0xac, 0x8e, 0x24, 0xe8, 0x59, 0xb6, 0x8e, 0x9c, 0x19, 0xc8, 0xea, 0x17, 0x65, 0x57, + 0x66, 0xd1, 0x25, 0xaf, 0x19, 0x7d, 0x8e, 0x40, 0x77, 0xaa, 0xd1, 0x47, 0x17, 0x6b, 0xaf, 0x30, + 0x7f, 0x62, 0xf7, 0x67, 0x78, 0xa0, 0xbd, 0x85, 0x28, 0x07, 0xad, 0xac, 0xa9, 0xc4, 0xfa, 0xa8, + 0x10, 0x6f, 0x62, 0x6b, 0x01, 0x6d, 0xbd, 0x49, 0xa1, 0x1c, 0x05, 0x99, 0xef, 0x83, 0xf5, 0x71, + 0x31, 0xe6, 0xc4, 0x1c, 0x81, 0xce, 0x6a, 0x0f, 0xc9, 0xcb, 0x63, 0x4e, 0xbf, 0xcb, 0xcb, 0x63, + 0x5e, 0x6b, 0xb2, 0xd7, 0x90, 0x0b, 0x70, 0xdd, 0x42, 0xd0, 0xe3, 0xdc, 0x84, 0xe8, 0x9d, 0xc7, + 0xea, 0xdd, 0xcd, 0x98, 0x98, 0x58, 0xc2, 0xff, 0x56, 0x5e, 0x63, 0x94, 0x03, 0x4d, 0xf6, 0x68, + 0x62, 0x3d, 0x2b, 0xc8, 0xbd, 0x12, 0x94, 0xec, 0x4a, 0xb7, 0x04, 0xa5, 0xb7, 0xbc, 0x5b, 0x82, + 0x5a, 0x69, 0x70, 0xf6, 0x1a, 0xf2, 0xa0, 0xed, 0xc4, 0x81, 0x34, 0xcd, 0xda, 0x02, 0xca, 0x91, + 0xbe, 0xd9, 0xd5, 0xac, 0x27, 0x05, 0x38, 0xaf, 0xef, 0xf7, 0x73, 0xf8, 0xbe, 0xa1, 0x58, 0xcf, + 0x6a, 0xfc, 0xdf, 0xef, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc3, 0xd5, 0x55, 0xeb, + 0x0f, 0x00, 0x00, } diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index e1e965d0857..2dd085ed7de 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -42,6 +42,7 @@ var events = map[string]release.Hook_Event{ hooks.PostRollback: release.Hook_POST_ROLLBACK, hooks.ReleaseTestSuccess: release.Hook_RELEASE_TEST_SUCCESS, hooks.ReleaseTestFailure: release.Hook_RELEASE_TEST_FAILURE, + hooks.CRDInstall: release.Hook_CRD_INSTALL, } // deletePolices represents a mapping between the key in the annotation for label deleting policy and its real meaning @@ -137,10 +138,6 @@ func (file *manifestFile) sort(result *result) error { return e } - if entry.Version != "" && !file.apis.Has(entry.Version) { - return fmt.Errorf("apiVersion %q in %s is not available", entry.Version, file.path) - } - if !hasAnyAnnotation(entry) { result.generic = append(result.generic, Manifest{ Name: file.path, @@ -199,7 +196,6 @@ func (file *manifestFile) sort(result *result) error { } }) } - return nil } diff --git a/pkg/tiller/release_install.go b/pkg/tiller/release_install.go index 8e7fd3acdb6..0b8f4da5b37 100644 --- a/pkg/tiller/release_install.go +++ b/pkg/tiller/release_install.go @@ -127,20 +127,59 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re rel.Info.Status.Notes = notesTxt } - err = validateManifest(s.env.KubeClient, req.Namespace, manifestDoc.Bytes()) - return rel, err + return rel, nil +} + +func hasCRDHook(hs []*release.Hook) bool { + for _, h := range hs { + for _, e := range h.Events { + if e == events[hooks.CRDInstall] { + return true + } + } + } + return false } // performRelease runs a release. func (s *ReleaseServer) performRelease(r *release.Release, req *services.InstallReleaseRequest) (*services.InstallReleaseResponse, error) { res := &services.InstallReleaseResponse{Release: r} + manifestDoc := []byte(r.Manifest) if req.DryRun { s.Log("dry run for %s", r.Name) + + if !req.DisableCrdHook && hasCRDHook(r.Hooks) { + s.Log("validation skipped because CRD hook is present") + res.Release.Info.Description = "Validation skipped because CRDs are not installed" + return res, nil + } + + // Here's the problem with dry runs and CRDs: We can't install a CRD + // during a dry run, which means it cannot be validated. + if err := validateManifest(s.env.KubeClient, req.Namespace, manifestDoc); err != nil { + return res, err + } + res.Release.Info.Description = "Dry run complete" return res, nil } + // crd-install hooks + if !req.DisableHooks && !req.DisableCrdHook { + if err := s.execHook(r.Hooks, r.Name, r.Namespace, hooks.CRDInstall, req.Timeout); err != nil { + fmt.Printf("Finished installing CRD: %s", err) + return res, err + } + } else { + s.Log("CRD install hooks disabled for %s", req.Name) + } + + // Because the CRDs are installed, they are used for validation during this step. + if err := validateManifest(s.env.KubeClient, req.Namespace, manifestDoc); err != nil { + return res, fmt.Errorf("validation failed: %s", err) + } + // pre-install hooks if !req.DisableHooks { if err := s.execHook(r.Hooks, r.Name, r.Namespace, hooks.PreInstall, req.Timeout); err != nil { diff --git a/pkg/tiller/release_install_test.go b/pkg/tiller/release_install_test.go index 2f21dc46b52..a244e4b720b 100644 --- a/pkg/tiller/release_install_test.go +++ b/pkg/tiller/release_install_test.go @@ -22,11 +22,44 @@ import ( "testing" "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/version" ) +func TestHasCRDHook(t *testing.T) { + tests := []struct { + hooks []*release.Hook + expect bool + }{ + { + hooks: []*release.Hook{ + {Events: []release.Hook_Event{release.Hook_PRE_DELETE}}, + }, + expect: false, + }, + { + hooks: []*release.Hook{ + {Events: []release.Hook_Event{release.Hook_CRD_INSTALL}}, + }, + expect: true, + }, + { + hooks: []*release.Hook{ + {Events: []release.Hook_Event{release.Hook_PRE_UPGRADE, release.Hook_CRD_INSTALL}}, + }, + expect: true, + }, + } + + for i, tt := range tests { + if tt.expect != hasCRDHook(tt.hooks) { + t.Errorf("test %d: expected %t, got %t", i, tt.expect, !tt.expect) + } + } +} + func TestInstallRelease(t *testing.T) { c := helm.NewContext() rs := rsFixture() @@ -335,6 +368,55 @@ func TestInstallRelease_NoHooks(t *testing.T) { } } +func TestInstallRelease_CRDInstallHook(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rs.env.Releases.Create(releaseStub()) + + req := installRequest() + req.Chart.Templates = append(req.Chart.Templates, &chart.Template{ + Name: "templates/crdhook", + Data: []byte(manifestWithCRDHook), + }) + + res, err := rs.InstallRelease(c, req) + if err != nil { + t.Errorf("Failed install: %s", err) + } + + // The new hook should have been pulled from the manifest. + if l := len(res.Release.Hooks); l != 2 { + t.Fatalf("expected 2 hooks, got %d", l) + } + + expect := "Install complete" + if got := res.Release.Info.Description; got != expect { + t.Errorf("Expected Description to be %q, got %q", expect, got) + } +} + +func TestInstallRelease_DryRunCRDInstallHook(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rs.env.Releases.Create(releaseStub()) + + req := installRequest(withDryRun()) + req.Chart.Templates = append(req.Chart.Templates, &chart.Template{ + Name: "templates/crdhook", + Data: []byte(manifestWithCRDHook), + }) + + res, err := rs.InstallRelease(c, req) + if err != nil { + t.Errorf("Failed install: %s", err) + } + + expect := "Validation skipped because CRDs are not installed" + if res.Release.Info.Description != expect { + t.Errorf("Expected Description %q, got %q", expect, res.Release.Info.Description) + } +} + func TestInstallRelease_FailedHooks(t *testing.T) { c := helm.NewContext() rs := rsFixture() diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 7c4bc62cf7f..1a2b3c4da4b 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -363,7 +363,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin executingHooks = sortByHookWeight(executingHooks) for _, h := range executingHooks { - if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.BeforeHookCreation, name, namespace, hook, kubeCli); err != nil { + if err := s.deleteHookByPolicy(h, hooks.BeforeHookCreation, name, namespace, hook, kubeCli); err != nil { return err } @@ -376,14 +376,17 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin b.Reset() b.WriteString(h.Manifest) - if err := kubeCli.WatchUntilReady(namespace, b, timeout, false); err != nil { - s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err) - // If a hook is failed, checkout the annotation of the hook to determine whether the hook should be deleted - // under failed condition. If so, then clear the corresponding resource object in the hook - if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookFailed, name, namespace, hook, kubeCli); err != nil { + // We can't watch CRDs + if hook != hooks.CRDInstall { + if err := kubeCli.WatchUntilReady(namespace, b, timeout, false); err != nil { + s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err) + // If a hook is failed, checkout the annotation of the hook to determine whether the hook should be deleted + // under failed condition. If so, then clear the corresponding resource object in the hook + if err := s.deleteHookByPolicy(h, hooks.HookFailed, name, namespace, hook, kubeCli); err != nil { + return err + } return err } - return err } } @@ -391,7 +394,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin // If all hooks are succeeded, checkout the annotation of each hook to determine whether the hook should be deleted // under succeeded condition. If so, then clear the corresponding resource object in each hook for _, h := range executingHooks { - if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookSucceeded, name, namespace, hook, kubeCli); err != nil { + if err := s.deleteHookByPolicy(h, hooks.HookSucceeded, name, namespace, hook, kubeCli); err != nil { return err } h.LastRun = timeconv.Now() @@ -418,7 +421,7 @@ func validateReleaseName(releaseName string) error { return nil } -func (s *ReleaseServer) deleteHookIfShouldBeDeletedByDeletePolicy(h *release.Hook, policy string, name, namespace, hook string, kubeCli environment.KubeClient) error { +func (s *ReleaseServer) deleteHookByPolicy(h *release.Hook, policy string, name, namespace, hook string, kubeCli environment.KubeClient) error { b := bytes.NewBufferString(h.Manifest) if hookHasDeletePolicy(h, policy) { s.Log("deleting %s hook %s for release %s due to %q policy", hook, h.Name, name, policy) diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 73ba08f67ba..96cb84a7551 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -55,6 +55,25 @@ metadata: data: name: value` +var manifestWithCRDHook = ` +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: crontabs.stable.example.com + annotations: + "helm.sh/hook": crd-install +spec: + group: stable.example.com + version: v1 + scope: Namespaced + names: + plural: crontabs + singular: crontab + kind: CronTab + shortNames: + - ct +` + var manifestWithTestHook = `kind: Pod metadata: name: finding-nemo, From 26943763a14b50f516e8a0642b4aad8c6589636c Mon Sep 17 00:00:00 2001 From: Gabriel Silva Vinha Date: Fri, 11 May 2018 15:10:26 -0300 Subject: [PATCH 053/483] Upgrade moniker version (#4034) --- glide.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/glide.yaml b/glide.yaml index ce5d0e8c2ee..fc3dcc37d03 100644 --- a/glide.yaml +++ b/glide.yaml @@ -18,6 +18,7 @@ import: - package: github.com/Masterminds/semver version: ~1.3.1 - package: github.com/technosophos/moniker + version: ~0.2 - package: github.com/golang/protobuf version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 subpackages: From 1bb34bc255b5379a9af0b832599a472ceca2d7a1 Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Fri, 11 May 2018 14:15:46 -0400 Subject: [PATCH 054/483] chore(docs): mv index.md to README.md * Newcomers may not realize they have to look for the index.md file when coming to the docs dir * README.md makes the index easier to see --- docs/{index.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{index.md => README.md} (100%) diff --git a/docs/index.md b/docs/README.md similarity index 100% rename from docs/index.md rename to docs/README.md From b831efdf5853dceb0249eaf441024d115b5cb633 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Fri, 11 May 2018 12:12:42 -0700 Subject: [PATCH 055/483] fix(kube): run schema validation on BuildUnstructured --- pkg/kube/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index e4c6b6a9f1d..926174ef1b0 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -139,6 +139,7 @@ func (c *Client) BuildUnstructured(namespace string, reader io.Reader) (Result, NamespaceParam(namespace). DefaultNamespace(). Stream(reader, ""). + Schema(c.validator()). Flatten(). Do().Infos() return result, scrubValidationError(err) From 32bd9d82e860427e7685df8732b16a5dfc6dfa86 Mon Sep 17 00:00:00 2001 From: Doug Winter Date: Fri, 11 May 2018 20:25:04 +0100 Subject: [PATCH 056/483] Support values files on remote servers with self-signed certs / client cert authentication (#4003) * support tls for values file access - uses --ca-file / --cert-file / --key-file * also for upgrade command --- cmd/helm/install.go | 10 +++++----- cmd/helm/template.go | 2 +- cmd/helm/upgrade.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 2dafd85ba80..d1c24c2131e 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -220,7 +220,7 @@ func (i *installCmd) run() error { i.namespace = defaultNamespace() } - rawVals, err := vals(i.valueFiles, i.values, i.stringValues) + rawVals, err := vals(i.valueFiles, i.values, i.stringValues, i.certFile, i.keyFile, i.caFile) if err != nil { return err } @@ -335,7 +335,7 @@ func mergeValues(dest map[string]interface{}, src map[string]interface{}) map[st // vals merges values from files specified via -f/--values and // directly via --set or --set-string, marshaling them to YAML -func vals(valueFiles valueFiles, values []string, stringValues []string) ([]byte, error) { +func vals(valueFiles valueFiles, values []string, stringValues []string, CertFile, KeyFile, CAFile string) ([]byte, error) { base := map[string]interface{}{} // User specified a values files via -f/--values @@ -347,7 +347,7 @@ func vals(valueFiles valueFiles, values []string, stringValues []string) ([]byte if strings.TrimSpace(filePath) == "-" { bytes, err = ioutil.ReadAll(os.Stdin) } else { - bytes, err = readFile(filePath) + bytes, err = readFile(filePath, CertFile, KeyFile, CAFile) } if err != nil { @@ -512,7 +512,7 @@ func checkDependencies(ch *chart.Chart, reqs *chartutil.Requirements) error { } //readFile load a file from the local directory or a remote file with a url. -func readFile(filePath string) ([]byte, error) { +func readFile(filePath, CertFile, KeyFile, CAFile string) ([]byte, error) { u, _ := url.Parse(filePath) p := getter.All(settings) @@ -523,7 +523,7 @@ func readFile(filePath string) ([]byte, error) { return ioutil.ReadFile(filePath) } - getter, err := getterConstructor(filePath, "", "", "") + getter, err := getterConstructor(filePath, CertFile, KeyFile, CAFile) if err != nil { return []byte{}, err } diff --git a/cmd/helm/template.go b/cmd/helm/template.go index fc1f44392f2..458df87b5b0 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -130,7 +130,7 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { t.namespace = defaultNamespace() } // get combined values and create config - rawVals, err := vals(t.valueFiles, t.values, t.stringValues) + rawVals, err := vals(t.valueFiles, t.values, t.stringValues, "", "", "") if err != nil { return err } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 66c4a36577c..4dd433a3924 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -195,7 +195,7 @@ func (u *upgradeCmd) run() error { } } - rawVals, err := vals(u.valueFiles, u.values, u.stringValues) + rawVals, err := vals(u.valueFiles, u.values, u.stringValues, u.certFile, u.keyFile, u.caFile) if err != nil { return err } From f2abb2ae1409ef0c897bd5f7a943561b17af0b3a Mon Sep 17 00:00:00 2001 From: Rajat Jindal Date: Sat, 12 May 2018 17:37:09 -0700 Subject: [PATCH 057/483] fix lint warning --- pkg/downloader/manager.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 89a839b54aa..9ee1f6f6d07 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -99,11 +99,7 @@ func (m *Manager) Build() error { } // Now we need to fetch every package here into charts/ - if err := m.downloadAll(lock.Dependencies); err != nil { - return err - } - - return nil + return m.downloadAll(lock.Dependencies) } // Update updates a local charts directory. From 4e08a023ddd71a211a774ffd2538b5701ba05ea9 Mon Sep 17 00:00:00 2001 From: Jonathan Hall Date: Mon, 14 May 2018 18:47:13 +0200 Subject: [PATCH 058/483] Suppress 'unauthenticated users' warning when --tiller-tls-verify present And clarify the warning to indicate exactly how to correct the problem. --- cmd/helm/init.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index d368945ec1e..92f4c379496 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -312,9 +312,12 @@ func (i *initCmd) run() error { "(Use --client-only to suppress this message, or --upgrade to upgrade Tiller to the current version.)") } } else { - fmt.Fprintln(i.out, "\nTiller (the Helm server-side component) has been installed into your Kubernetes Cluster.\n\n"+ - "Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.\n"+ - "For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation") + fmt.Fprintln(i.out, "\nTiller (the Helm server-side component) has been installed into your Kubernetes Cluster.") + if !tlsVerify { + fmt.Fprintln(i.out, "\nPlease note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.\n"+ + "To prevent this, run `helm init` with the --tiller-tls-verify flag.\n"+ + "For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation") + } } if err := i.ping(); err != nil { return err From e52c7dbf921f8633068c3a7031a6cb6793b01d98 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 14 May 2018 11:44:49 -0700 Subject: [PATCH 059/483] replace with a link to the latest releases page This removes a step required every time we release Helm, making it simpler to cut a new release. --- README.md | 7 +------ docs/release_checklist.md | 25 ------------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/README.md b/README.md index fb2e16bce71..fc091056ef0 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,7 @@ Think of it like apt/yum/homebrew for Kubernetes. ## Install -Binary downloads of the Helm client can be found at the following links: - -- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-darwin-amd64.tar.gz) -- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-linux-amd64.tar.gz) -- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-linux-386.tar.gz) -- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-windows-amd64.tar.gz) +Binary downloads of the Helm client can be found on [the latest Releases page](https://github.com/kubernetes/helm/releases/latest). Unpack the `helm` binary and add it to your PATH and you are good to go! diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 26506985ca5..d678e774824 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -94,31 +94,6 @@ index 2109a0a..6f5a1a4 100644 BuildMetadata = "unreleased" ``` -The README stores links to the latest release for helm. We want to change the version to the first release candidate which we are releasing (more on that in step 5). - -```shell -$ git diff README.md -diff --git a/README.md b/README.md -index 022afd79..547839e2 100644 ---- a/README.md -+++ b/README.md -@@ -34,10 +34,10 @@ Think of it like apt/yum/homebrew for Kubernetes. - - Binary downloads of the Helm client can be found at the following links: - --- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-darwin-amd64.tar.gz) --- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-amd64.tar.gz) --- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-386.tar.gz) --- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-windows-amd64.tar.gz) -+- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-darwin-amd64.tar.gz) -+- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-linux-amd64.tar.gz) -+- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-linux-386.tar.gz) -+- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-windows-amd64.tar.gz) - - Unpack the `helm` binary and add it to your PATH and you are good to go! - macOS/[homebrew](https://brew.sh/) users can also use `brew install kubernetes-helm`. -``` - For patch releases, the old version number will be the latest patch release, so just bump the patch number, incrementing Z by one. ```shell From 51f92b47877bcc36401dacc6b624eecff8a8931d Mon Sep 17 00:00:00 2001 From: AdamDang Date: Wed, 16 May 2018 00:31:05 +0800 Subject: [PATCH 060/483] Typo fix: mach->match mach->match --- pkg/chartutil/requirements.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 546160b0c06..6ef6508d9fc 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -45,7 +45,7 @@ var ( type Dependency struct { // Name is the name of the dependency. // - // This must mach the name in the dependency's Chart.yaml. + // This must match the name in the dependency's Chart.yaml. Name string `json:"name"` // Version is the version (range) of this chart. // From 931c80edea0301a068b93a6782a8000a619dcb79 Mon Sep 17 00:00:00 2001 From: James Meickle Date: Tue, 15 May 2018 12:43:28 -0400 Subject: [PATCH 061/483] Don't request Tiller version in installer This makes the script hang for quite a while if it can't connect to Tiller to retrieve this information that isn't being used anyways. --- scripts/get | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get b/scripts/get index 943ca415811..af0960abfc2 100755 --- a/scripts/get +++ b/scripts/get @@ -92,7 +92,7 @@ checkDesiredVersion() { # if it needs to be changed. checkHelmInstalledVersion() { if [[ -f "${HELM_INSTALL_DIR}/${PROJECT_NAME}" ]]; then - local version=$(helm version | grep '^Client' | cut -d'"' -f2) + local version=$(helm version -c | grep '^Client' | cut -d'"' -f2) if [[ "$version" == "$TAG" ]]; then echo "Helm ${version} is already ${DESIRED_VERSION:-latest}" return 0 From 89c29f3ff107bd107a3a115c69e41bcf89422bc0 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Thu, 17 May 2018 00:05:06 +0800 Subject: [PATCH 062/483] Update capabilities.go --- pkg/chartutil/capabilities.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/capabilities.go b/pkg/chartutil/capabilities.go index c87c0368ea4..d26aa170751 100644 --- a/pkg/chartutil/capabilities.go +++ b/pkg/chartutil/capabilities.go @@ -42,7 +42,7 @@ var ( type Capabilities struct { // List of all supported API versions APIVersions VersionSet - // KubeVerison is the Kubernetes version + // KubeVersion is the Kubernetes version KubeVersion *version.Info // TillerVersion is the Tiller version // From 4fbc733ade47ed8eb35229783e8f53465e14ae27 Mon Sep 17 00:00:00 2001 From: Alejandro Vicente Grabovetsky Date: Sat, 19 May 2018 02:42:49 +0300 Subject: [PATCH 063/483] Migrate 'template' to 'include' in 'helm create' to conform to Helm best practices Signed-off-by: Alejandro Vicente Grabovetsky --- pkg/chartutil/create.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 30c6310b2e0..fa6fb278368 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -129,8 +129,8 @@ kind: Ingress metadata: name: {{ $fullName }} labels: - app: {{ template ".name" . }} - chart: {{ template ".chart" . }} + app: {{ include ".name" . }} + chart: {{ include ".chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} {{- with .Values.ingress.annotations }} @@ -164,22 +164,22 @@ spec: const defaultDeployment = `apiVersion: apps/v1beta2 kind: Deployment metadata: - name: {{ template ".fullname" . }} + name: {{ include ".fullname" . }} labels: - app: {{ template ".name" . }} - chart: {{ template ".chart" . }} + app: {{ include ".name" . }} + chart: {{ include ".chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: - app: {{ template ".name" . }} + app: {{ include ".name" . }} release: {{ .Release.Name }} template: metadata: labels: - app: {{ template ".name" . }} + app: {{ include ".name" . }} release: {{ .Release.Name }} spec: containers: @@ -217,10 +217,10 @@ spec: const defaultService = `apiVersion: v1 kind: Service metadata: - name: {{ template ".fullname" . }} + name: {{ include ".fullname" . }} labels: - app: {{ template ".name" . }} - chart: {{ template ".chart" . }} + app: {{ include ".name" . }} + chart: {{ include ".chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: @@ -231,7 +231,7 @@ spec: protocol: TCP name: http selector: - app: {{ template ".name" . }} + app: {{ include ".name" . }} release: {{ .Release.Name }} ` @@ -241,16 +241,16 @@ const defaultNotes = `1. Get the application URL by running these commands: http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} {{- end }} {{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template ".fullname" . }}) + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include ".fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT {{- else if contains "LoadBalancer" .Values.service.type }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc -w {{ template ".fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template ".fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + You can watch the status of by running 'kubectl get svc -w {{ include ".fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include ".fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.service.port }} {{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template ".name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ include ".name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:80 {{- end }} From 4f36bbf2bd56dec4a7254706e9bc6d70b7185bd0 Mon Sep 17 00:00:00 2001 From: Yeni Capote Diaz Date: Sun, 20 May 2018 23:26:45 -0700 Subject: [PATCH 064/483] removed --install option from --namespace. --- cmd/helm/lint.go | 2 +- docs/helm/helm_lint.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/helm/lint.go b/cmd/helm/lint.go index 63f11c062e7..c81468e50a1 100644 --- a/cmd/helm/lint.go +++ b/cmd/helm/lint.go @@ -73,7 +73,7 @@ func newLintCmd(out io.Writer) *cobra.Command { cmd.Flags().VarP(&l.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") cmd.Flags().StringArrayVar(&l.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") cmd.Flags().StringArrayVar(&l.sValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") - cmd.Flags().StringVar(&l.namespace, "namespace", "default", "namespace to install the release into (only used if --install is set)") + cmd.Flags().StringVar(&l.namespace, "namespace", "default", "namespace to put the release into") cmd.Flags().BoolVar(&l.strict, "strict", false, "fail on lint warnings") return cmd diff --git a/docs/helm/helm_lint.md b/docs/helm/helm_lint.md index 596edf2bb68..c10322efd4d 100644 --- a/docs/helm/helm_lint.md +++ b/docs/helm/helm_lint.md @@ -21,7 +21,7 @@ helm lint [flags] PATH ### Options ``` - --namespace string namespace to install the release into (only used if --install is set) (default "default") + --namespace string namespace to put the release into (default "default") --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --strict fail on lint warnings @@ -42,4 +42,4 @@ helm lint [flags] PATH ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 9-Mar-2018 +###### Auto generated by spf13/cobra on 20-May-2018 From 091dd84c71814fdeb8b67aaaf90179629f1f7f84 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 21 May 2018 16:18:16 +0800 Subject: [PATCH 065/483] fix charts doc: extra space in requirement condition --- docs/charts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/charts.md b/docs/charts.md index a55038e3ef3..8f8a9856faf 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -265,7 +265,7 @@ dependencies: - name: subchart1 repository: http://localhost:10191 version: 0.1.0 - condition: subchart1.enabled, global.subchart1.enabled + condition: subchart1.enabled,global.subchart1.enabled tags: - front-end - subchart1 From 43b19dccbee45dcf77a047fabb1aa051ff346d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johnny=20Bergstr=C3=B6m?= Date: Tue, 22 May 2018 16:24:19 +0200 Subject: [PATCH 066/483] Add helm template --is-upgrade Useful for toggling .Release.IsInstall / .Release.IsUpgrade which in turn may cause templates to render differently. --- cmd/helm/template.go | 28 +++++++++++-------- cmd/helm/template_test.go | 14 ++++++++++ .../charts/subchart1/templates/service.yaml | 2 ++ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 458df87b5b0..7e3eb48a743 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -63,18 +63,19 @@ To render just one template in a chart, use '-x': ` type templateCmd struct { - namespace string - valueFiles valueFiles - chartPath string - out io.Writer - values []string - stringValues []string - nameTemplate string - showNotes bool - releaseName string - renderFiles []string - kubeVersion string - outputDir string + namespace string + valueFiles valueFiles + chartPath string + out io.Writer + values []string + stringValues []string + nameTemplate string + showNotes bool + releaseName string + releaseIsUpgrade bool + renderFiles []string + kubeVersion string + outputDir string } func newTemplateCmd(out io.Writer) *cobra.Command { @@ -93,6 +94,7 @@ func newTemplateCmd(out io.Writer) *cobra.Command { f := cmd.Flags() f.BoolVar(&t.showNotes, "notes", false, "show the computed NOTES.txt file as well") f.StringVarP(&t.releaseName, "name", "n", "RELEASE-NAME", "release name") + f.BoolVar(&t.releaseIsUpgrade, "is-upgrade", false, "set .Release.IsUpgrade instead of .Release.IsInstall") f.StringArrayVarP(&t.renderFiles, "execute", "x", []string{}, "only execute the given templates") f.VarP(&t.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") f.StringVar(&t.namespace, "namespace", "", "namespace to install the release into") @@ -159,6 +161,8 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } options := chartutil.ReleaseOptions{ Name: t.releaseName, + IsInstall: !t.releaseIsUpgrade, + IsUpgrade: t.releaseIsUpgrade, Time: timeconv.Now(), Namespace: t.namespace, } diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index cad42db16df..d15dc5666d7 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -107,6 +107,20 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/templates/service.yaml", expectValue: "release-name: \"test\"", }, + { + name: "check_release_is_install", + desc: "verify --is-upgrade toggles .Release.IsInstall", + args: []string{subchart1ChartPath, "--is-upgrade=false"}, + expectKey: "subchart1/templates/service.yaml", + expectValue: "release-is-install: \"true\"", + }, + { + name: "check_release_is_upgrade", + desc: "verify --is-upgrade toggles .Release.IsUpgrade", + args: []string{subchart1ChartPath, "--is-upgrade", "true"}, + expectKey: "subchart1/templates/service.yaml", + expectValue: "release-is-upgrade: \"true\"", + }, { name: "check_notes", desc: "verify --notes shows notes", diff --git a/pkg/chartutil/testdata/subpop/charts/subchart1/templates/service.yaml b/pkg/chartutil/testdata/subpop/charts/subchart1/templates/service.yaml index 3835a3d0b13..e06d19b90ea 100644 --- a/pkg/chartutil/testdata/subpop/charts/subchart1/templates/service.yaml +++ b/pkg/chartutil/testdata/subpop/charts/subchart1/templates/service.yaml @@ -6,6 +6,8 @@ metadata: chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" namespace: "{{ .Release.Namespace }}" release-name: "{{ .Release.Name }}" + release-is-upgrade: "{{ .Release.IsUpgrade }}" + release-is-install: "{{ .Release.IsInstall }}" kube-version/major: "{{ .Capabilities.KubeVersion.Major }}" kube-version/minor: "{{ .Capabilities.KubeVersion.Minor }}" kube-version/gitversion: "v{{ .Capabilities.KubeVersion.Major }}.{{ .Capabilities.KubeVersion.Minor }}.0" From 93e8f0a694e18b1c1310a193c01f874648d898df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johnny=20Bergstr=C3=B6m?= Date: Tue, 22 May 2018 16:45:37 +0200 Subject: [PATCH 067/483] make docs recipe for target 'verify-docs' failed --- docs/helm/helm_template.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index 3a4e9ce4a10..cdc8a84a6cc 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -26,6 +26,7 @@ helm template [flags] CHART ``` -x, --execute stringArray only execute the given templates + --is-upgrade set .Release.IsUpgrade instead of .Release.IsInstall --kube-version string kubernetes version used as Capabilities.KubeVersion.Major/Minor (default "1.9") -n, --name string release name (default "RELEASE-NAME") --name-template string specify template used to name the release @@ -51,4 +52,4 @@ helm template [flags] CHART ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 9-Mar-2018 +###### Auto generated by spf13/cobra on 22-May-2018 From 20fe27c0dec8029760d9ade1f02eb1905d89813f Mon Sep 17 00:00:00 2001 From: Ryan Hartje Date: Wed, 23 May 2018 11:43:56 -0400 Subject: [PATCH 068/483] adding docs for GKE for helm 2 --- docs/kubernetes_distros.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/kubernetes_distros.md b/docs/kubernetes_distros.md index 8b80519ec3c..bb14043dac8 100644 --- a/docs/kubernetes_distros.md +++ b/docs/kubernetes_distros.md @@ -18,8 +18,9 @@ Hyperkube you may need to do some manual configuration. ## GKE -Google's GKE hosted Kubernetes platform is known to work with Helm, and requires -no additional configuration. +Google's GKE hosted Kubernetes platform enables RBAC by default. You will need to create a service account for tiller, and use the --service-account flag when initializing the helm server. + +See [Tiller and role-based access control](https://docs.helm.sh/using_helm/#role-based-access-control) for more information. ## Ubuntu with 'kubeadm' @@ -48,4 +49,3 @@ Helm Client and Helm Server (Tiller) are pre-installed with [Platform9 Managed K Helm (both client and server) has been tested and is working on Mesospheres DC/OS 1.11 Kubernetes platform, and requires no additional configuration. - From 8415e2716c31df14aa859a9b3e692f02c154a878 Mon Sep 17 00:00:00 2001 From: Shubham Jain Date: Thu, 24 May 2018 18:19:51 +0530 Subject: [PATCH 069/483] docs(helm): Added double quotes to example In the current version of helm (2.8.2), there needs to be double quotes around the value to support escaping special characters. --- docs/using_helm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/using_helm.md b/docs/using_helm.md index 6bf7bc40a4d..0d15637d4fc 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -285,7 +285,7 @@ servers: ``` Sometimes you need to use special characters in your `--set` lines. You can use -a backslash to escape the characters; `--set name=value1\,value2` will become: +a backslash to escape the characters; `--set name="value1\,value2"` will become: ```yaml name: "value1,value2" From 215abe9fd42571a99f42cb03737461208b418a1e Mon Sep 17 00:00:00 2001 From: mf-lit Date: Thu, 24 May 2018 16:41:11 +0100 Subject: [PATCH 070/483] Update tiller_ssl.md Add -days parameter to openssl signing commands for clarity. Also add some related troubleshooting steps. --- docs/tiller_ssl.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index d7f0166c4f4..6db19550726 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -148,10 +148,10 @@ $ openssl req -key helm.key.pem -new -sha256 -out helm.csr.pem (In rare cases, we've had to add the `-nodes` flag when generating the request.) -Now we sign each of these CSRs with the CA certificate we created: +Now we sign each of these CSRs with the CA certificate we created (adjust the days parameter to suit your requirements): ```console -$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem +$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem -days 365 Signature ok subject=/C=US/ST=CO/L=Boulder/O=Tiller Server/CN=tiller-server Getting CA Private Key @@ -161,7 +161,7 @@ Enter pass phrase for ca.key.pem: And again for the client certificate: ```console -$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in helm.csr.pem -out helm.cert.pem +$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in helm.csr.pem -out helm.cert.pem -days 365 ``` At this point, the important files for us are these: @@ -284,6 +284,13 @@ the host name that Helm connects to matches the host name on the certificate. In some cases this is awkward, since Helm will connect over localhost, or the FQDN is not available for public resolution. +*If I use `--tls-verify` on the client, I get `Error: x509: certificate has expired or is not yet valid`* + +Your helm certificate has expired, you need to sign a new certificate using your private key and the CA (and consider increasing the number of days) + +If your tiller certificate has expired, you'll need to sign a new certificate, base64 encode it and update the Tiller Secret: +`kubectl edit secret tiller-secret` + ## References https://github.com/denji/golang-tls From af37c6715ad2e39c2bbb542730a39194341de423 Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Thu, 24 May 2018 12:14:09 -0700 Subject: [PATCH 071/483] update security vulnerability email --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34b4f8b1694..86809000590 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ The Kubernetes Helm project accepts contributions via GitHub pull requests. This Most of the time, when you find a bug in Helm, it should be reported using [GitHub issues](https://github.com/kubernetes/helm/issues). However, if you are reporting a _security vulnerability_, please email a report to -[helm-security@deis.com](mailto:helm-security@deis.com). This will give +[cncf-kubernetes-helm-security@lists.cncf.io](mailto:cncf-kubernetes-helm-security@lists.cncf.io). This will give us a chance to try to fix the issue before it is exploited in the wild. ## Contributor License Agreements From 2b04523bafa1cc96eb92b64980f7672a399e3715 Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Sun, 27 May 2018 18:25:55 -0400 Subject: [PATCH 072/483] Fix inaccurate comment in `tiller` When reading through `cmd/tiller/tiller.go`, I noticed a comment around `rootServer` mentions the usage of an `init` function. However, there is no `init` function in this package. Update the comment to be more accurate. --- cmd/tiller/tiller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index 5d2db381692..c97187b2a01 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -85,7 +85,7 @@ var ( // rootServer is the root gRPC server. // - // Each gRPC service registers itself to this server during init(). + // Each gRPC service registers itself to this server during start(). rootServer *grpc.Server // env is the default environment. From 53c8e9b67ed9482edd1c03146a55b73b014134b5 Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Mon, 28 May 2018 10:07:33 -0400 Subject: [PATCH 073/483] Fix concurrency issues with helm install Address a race condition that arises when running two `helm install` commands, both of which specify a namespace that does not already exist. In this specific instance, attempting to create a `namespace` which already exists shouldn't be a failure which causes `helm install` to terminate. --- pkg/kube/namespace.go | 11 ++++++++++- pkg/tiller/environment/environment.go | 2 -- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/kube/namespace.go b/pkg/kube/namespace.go index 9d2793d875e..6547e4abc28 100644 --- a/pkg/kube/namespace.go +++ b/pkg/kube/namespace.go @@ -40,7 +40,16 @@ func getNamespace(client internalclientset.Interface, namespace string) (*core.N func ensureNamespace(client internalclientset.Interface, namespace string) error { _, err := getNamespace(client, namespace) if err != nil && errors.IsNotFound(err) { - return createNamespace(client, namespace) + err = createNamespace(client, namespace) + + // If multiple commands which run `ensureNamespace` are run in + // parallel, then protect against the race condition in which + // the namespace did not exist when `getNamespace` was executed, + // but did exist when `createNamespace` was executed. If that + // happens, we can just proceed as normal. + if errors.IsAlreadyExists(err) { + return nil + } } return err } diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 366fdf522af..18518dfc10d 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -98,8 +98,6 @@ type Engine interface { type KubeClient interface { // Create creates one or more resources. // - // namespace must contain a valid existing namespace. - // // reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n"). Create(namespace string, reader io.Reader, timeout int64, shouldWait bool) error From 4e29c7e2fd4ced670da320c7587cd8a9e7a895e2 Mon Sep 17 00:00:00 2001 From: radbaron Date: Tue, 29 May 2018 15:28:04 +0100 Subject: [PATCH 074/483] Documentation: add syntax highlighting to code examples & fix spelling of kube primitives --- docs/examples/README.md | 3 +-- docs/using_helm.md | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/examples/README.md b/docs/examples/README.md index 723040ca84b..f936e1551e9 100644 --- a/docs/examples/README.md +++ b/docs/examples/README.md @@ -14,6 +14,5 @@ It simply deploys a single pod running Alpine Linux. The `nginx` chart shows how to compose several resources into one chart, and it illustrates more complex template usage. -It deploys a `deployment` (which creates a `replica set`), a `config -map`, and a `service`. The replica set starts an nginx pod. The config +It deploys a `Deployment` (which creates a `ReplicaSet`), a `ConfigMap`, and a `Service`. The replica set starts an nginx pod. The config map stores the files that the nginx server can serve. diff --git a/docs/using_helm.md b/docs/using_helm.md index 0d15637d4fc..5490abbe119 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -43,7 +43,7 @@ carefully curated and maintained charts. This chart repository is named You can see which charts are available by running `helm search`: -``` +```console $ helm search NAME VERSION DESCRIPTION stable/drupal 0.3.2 One of the most versatile open source content m... @@ -56,7 +56,7 @@ stable/mysql 0.1.0 Chart for MySQL With no filter, `helm search` shows you all of the available charts. You can narrow down your results by searching with a filter: -``` +```console $ helm search mysql NAME VERSION DESCRIPTION stable/mysql 0.1.0 Chart for MySQL @@ -69,7 +69,7 @@ Why is `mariadb` in the list? Because its package description relates it to MySQL. We can use `helm inspect chart` to see this: -``` +```console $ helm inspect stable/mariadb Fetched stable/mariadb to mariadb-0.5.1.tgz description: Chart for MariaDB @@ -91,7 +91,7 @@ package you want to install, you can use `helm install` to install it. To install a new package, use the `helm install` command. At its simplest, it takes only one argument: The name of the chart. -``` +```console $ helm install stable/mariadb Fetched stable/mariadb-0.3.0 to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz happy-panda @@ -139,7 +139,7 @@ may take a long time to install into the cluster. To keep track of a release's state, or to re-read configuration information, you can use `helm status`: -``` +```console $ helm status happy-panda Last Deployed: Wed Sep 28 12:32:28 2016 Namespace: default @@ -392,14 +392,14 @@ is not a full list of cli flags. To see a description of all flags, just run When it is time to uninstall or delete a release from the cluster, use the `helm delete` command: -``` +```console $ helm delete happy-panda ``` This will remove the release from the cluster. You can see all of your currently deployed releases with the `helm list` command: -``` +```console $ helm list NAME VERSION UPDATED STATUS CHART inky-cat 1 Wed Sep 28 12:59:46 2016 DEPLOYED alpine-0.1.0 From 272d9bc6efff112b578e48334054534290d3af95 Mon Sep 17 00:00:00 2001 From: Elmar Ritsch Date: Tue, 29 May 2018 21:17:37 +0200 Subject: [PATCH 075/483] Parse booleans and null as string values with --set-string flag --- pkg/strvals/parser.go | 9 +++++++-- pkg/strvals/parser_test.go | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index 90670a4dd56..dae949d8e34 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -325,6 +325,11 @@ func inMap(k rune, m map[rune]bool) bool { func typedVal(v []rune, st bool) interface{} { val := string(v) + + if st { + return val + } + if strings.EqualFold(val, "true") { return true } @@ -337,8 +342,8 @@ func typedVal(v []rune, st bool) interface{} { return nil } - // If this value does not start with zero, and not returnString, try parsing it to an int - if !st && len(val) != 0 && val[0] != '0' { + // If this value does not start with zero, try parsing it to an int + if len(val) != 0 && val[0] != '0' { if iv, err := strconv.ParseInt(val, 10, 64); err == nil { return iv } diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index c897cf0a7cf..54a95e6e065 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -75,6 +75,11 @@ func TestParseSet(t *testing.T) { expect: map[string]interface{}{"long_int_string": "1234567890"}, err: false, }, + { + str: "boolean=true", + expect: map[string]interface{}{"boolean": "true"}, + err: false, + }, } tests := []struct { str string @@ -117,6 +122,10 @@ func TestParseSet(t *testing.T) { str: "long_int=1234567890", expect: map[string]interface{}{"long_int": 1234567890}, }, + { + str: "boolean=true", + expect: map[string]interface{}{"boolean": true}, + }, { str: "name1,name2=", err: true, From 7308e766e2633bbe08f0c441e9a84a46acca38f9 Mon Sep 17 00:00:00 2001 From: Elmar Ritsch Date: Tue, 29 May 2018 21:38:21 +0200 Subject: [PATCH 076/483] Add test to make sure --set-string flag takes `null` as string --- pkg/strvals/parser_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index 54a95e6e065..7ad31aa5600 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -80,6 +80,11 @@ func TestParseSet(t *testing.T) { expect: map[string]interface{}{"boolean": "true"}, err: false, }, + { + str: "is_null=null", + expect: map[string]interface{}{"is_null": "null"}, + err: false, + }, } tests := []struct { str string From a7362d76bc6002140a153daa4ab68b87b509af89 Mon Sep 17 00:00:00 2001 From: Elmar Ritsch Date: Tue, 29 May 2018 22:06:00 +0200 Subject: [PATCH 077/483] Add test to make sure --set flag interprets `null` as `nil` --- pkg/strvals/parser_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index 7ad31aa5600..f6e35c81b60 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -131,6 +131,11 @@ func TestParseSet(t *testing.T) { str: "boolean=true", expect: map[string]interface{}{"boolean": true}, }, + { + str: "is_null=null", + expect: map[string]interface{}{"is_null": nil}, + err: false, + }, { str: "name1,name2=", err: true, From 03d502c4313fdd516bf1ec4d5d9021accd377106 Mon Sep 17 00:00:00 2001 From: Rob Salmond Date: Thu, 31 May 2018 10:36:28 -0700 Subject: [PATCH 078/483] small typo fix --- docs/securing_installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index 4083bf188ed..f192ad9f867 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -34,7 +34,7 @@ There are four main areas to consider when securing a tiller installation: ### RBAC -Recent versions of Kubernetes employ a [role-based access control (or RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control) system (as do modern operating systems) to help mitigate the damage that can done if credentials are misused or bugs exist. Even where an identity is hijacked, the identity has only so many permissions to a controlled space. This effectively adds a layer of security to limit the scope of any attack with that identity. +Recent versions of Kubernetes employ a [role-based access control (or RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control) system (as do modern operating systems) to help mitigate the damage that can be done if credentials are misused or bugs exist. Even where an identity is hijacked, the identity has only so many permissions to a controlled space. This effectively adds a layer of security to limit the scope of any attack with that identity. Helm and Tiller are designed to install, remove, and modify logical applications that can contain many services interacting together. As a result, often its usefulness involves cluster-wide operations, which in a multitenant cluster means that great care must be taken with access to a cluster-wide Tiller installation to prevent improper activity. From e8b788dc4f3533934394e783cda94e65faf75918 Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Fri, 1 Jun 2018 10:13:33 -0400 Subject: [PATCH 079/483] Fix test failure message The error message we reported if the test failed was incorrect. --- pkg/releasetesting/test_suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/releasetesting/test_suite_test.go b/pkg/releasetesting/test_suite_test.go index e6cc8bcf59f..0c2fae8769c 100644 --- a/pkg/releasetesting/test_suite_test.go +++ b/pkg/releasetesting/test_suite_test.go @@ -134,7 +134,7 @@ func TestRun(t *testing.T) { } if result2.Status != release.TestRun_FAILURE { - t.Errorf("Expected test result to be successful, got: %v", result2.Status) + t.Errorf("Expected test result to be failure, got: %v", result2.Status) } } From 4d22b104b72cc1b6b024d047c423ba496ec05e0c Mon Sep 17 00:00:00 2001 From: AdamDang Date: Sat, 2 Jun 2018 18:57:31 +0800 Subject: [PATCH 080/483] Typo fix: retruns->returns retruns->returns --- pkg/helm/portforwarder/pod.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/helm/portforwarder/pod.go b/pkg/helm/portforwarder/pod.go index 7c235520464..5eae5b5e6f1 100644 --- a/pkg/helm/portforwarder/pod.go +++ b/pkg/helm/portforwarder/pod.go @@ -32,7 +32,7 @@ func isPodReady(pod *v1.Pod) bool { return isPodReadyConditionTrue(pod.Status) } -// isPodReady retruns true if a pod is ready; false otherwise. +// isPodReadyConditionTrue returns true if a pod is ready; false otherwise. func isPodReadyConditionTrue(status v1.PodStatus) bool { condition := getPodReadyCondition(status) return condition != nil && condition.Status == v1.ConditionTrue From 4d63e1f84f45fbd66cb70e7148a9021772b534bb Mon Sep 17 00:00:00 2001 From: Lukas Eichler Date: Sat, 2 Jun 2018 13:05:46 +0200 Subject: [PATCH 081/483] Added documentation for the tpl function --- docs/charts_tips_and_tricks.md | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index 484d8b9369e..a83b44457f7 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -106,6 +106,43 @@ For example: The above will render the template when .Values.foo is defined, but will fail to render and exit when .Values.foo is undefined. +## Using the 'tpl' Function + +The `tpl` function allows developers to evaluate strings as templates inside a template. +This is useful to pass a template string as a value to a chart or render external configuration files. +Syntax: `{{ tpl TEMPLATE_STRING VALUES }}` + +Examples: +``` +# values +template: "{{ .Values.name }}" +name: "Tom" + +# template +{{ tpl .Values.template . }} + +# output +Tom +``` + +Rendering a external configuration file: +``` +# external configuration file conf/app.conf +firstName={{ .Values.firstName }} +lastName={{ .Values.lastName }} + +# values +firstName: Peter +lastName: Parker + +# template +{{ tpl (.Files.Get "conf/app.conf") . }} + +# output +firstName=Peter +lastName=Parker +``` + ## Creating Image Pull Secrets Image pull secrets are essentially a combination of _registry_, _username_, and _password_. You may need them in an application you are deploying, but to create them requires running _base64_ a couple of times. We can write a helper template to compose the Docker configuration file for use as the Secret's payload. Here is an example: From 96a85a06ed48e618c53441cdc988680eb00f8e0c Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Sat, 2 Jun 2018 10:37:35 -0400 Subject: [PATCH 082/483] Fix incorrect timestamp when helm package The files contained in the `tar` file from `helm package` did not have the correct timestamp. This lack of timestamp occurred because we were not writing any time to the tar header file. --- pkg/chartutil/save.go | 8 ++-- pkg/chartutil/save_test.go | 80 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 201372a0f10..8a274699357 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -24,6 +24,7 @@ import ( "io/ioutil" "os" "path/filepath" + "time" "github.com/ghodss/yaml" @@ -205,9 +206,10 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { func writeToTar(out *tar.Writer, name string, body []byte) error { // TODO: Do we need to create dummy parent directory names if none exist? h := &tar.Header{ - Name: filepath.ToSlash(name), - Mode: 0755, - Size: int64(len(body)), + Name: filepath.ToSlash(name), + Mode: 0755, + Size: int64(len(body)), + ModTime: time.Now(), } if err := out.WriteHeader(h); err != nil { return err diff --git a/pkg/chartutil/save_test.go b/pkg/chartutil/save_test.go index 5e156429981..3279281b2b9 100644 --- a/pkg/chartutil/save_test.go +++ b/pkg/chartutil/save_test.go @@ -17,10 +17,14 @@ limitations under the License. package chartutil import ( + "archive/tar" + "compress/gzip" + "io" "io/ioutil" "os" "strings" "testing" + "time" "github.com/golang/protobuf/ptypes/any" "k8s.io/helm/pkg/proto/hapi/chart" @@ -73,6 +77,82 @@ func TestSave(t *testing.T) { } } +func TestSavePreservesTimestamps(t *testing.T) { + // Test executes so quickly that if we don't subtract a second, the + // check will fail because `initialCreateTime` will be identical to the + // written timestamp for the files. + initialCreateTime := time.Now().Add(-1 * time.Second) + + tmp, err := ioutil.TempDir("", "helm-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmp) + + c := &chart.Chart{ + Metadata: &chart.Metadata{ + Name: "ahab", + Version: "1.2.3.4", + }, + Values: &chart.Config{ + Raw: "ship: Pequod", + }, + Files: []*any.Any{ + {TypeUrl: "scheherazade/shahryar.txt", Value: []byte("1,001 Nights")}, + }, + } + + where, err := Save(c, tmp) + if err != nil { + t.Fatalf("Failed to save: %s", err) + } + + allHeaders, err := retrieveAllHeadersFromTar(where) + if err != nil { + t.Fatalf("Failed to parse tar: %v", err) + } + + for _, header := range allHeaders { + if header.ModTime.Before(initialCreateTime) { + t.Fatalf("File timestamp not preserved: %v", header.ModTime) + } + } +} + +// We could refactor `load.go` to use this `retrieveAllHeadersFromTar` function +// as well, so we are not duplicating components of the code which iterate +// through the tar. +func retrieveAllHeadersFromTar(path string) ([]*tar.Header, error) { + raw, err := os.Open(path) + if err != nil { + return nil, err + } + defer raw.Close() + + unzipped, err := gzip.NewReader(raw) + if err != nil { + return nil, err + } + defer unzipped.Close() + + tr := tar.NewReader(unzipped) + headers := []*tar.Header{} + for { + hd, err := tr.Next() + if err == io.EOF { + break + } + + if err != nil { + return nil, err + } + + headers = append(headers, hd) + } + + return headers, nil +} + func TestSaveDir(t *testing.T) { tmp, err := ioutil.TempDir("", "helm-") if err != nil { From 3eaa1bfd3b040cb644c7974d32047dc70037cf95 Mon Sep 17 00:00:00 2001 From: tariq1890 Date: Sat, 2 Jun 2018 21:26:50 -0700 Subject: [PATCH 083/483] Setting DisableCompression to true to disable unwanted httpclient tranformations --- pkg/getter/httpgetter.go | 14 ++++---- pkg/getter/httpgetter_test.go | 53 +++++++++++++++++++++++++++-- pkg/getter/testdata/sssd-0.1.0.tgz | Bin 0 -> 2736 bytes 3 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 pkg/getter/testdata/sssd-0.1.0.tgz diff --git a/pkg/getter/httpgetter.go b/pkg/getter/httpgetter.go index 990cb8cc563..1df6b0f622c 100644 --- a/pkg/getter/httpgetter.go +++ b/pkg/getter/httpgetter.go @@ -81,19 +81,17 @@ func newHTTPGetter(URL, CertFile, KeyFile, CAFile string) (Getter, error) { // NewHTTPGetter constructs a valid http/https client as HttpGetter func NewHTTPGetter(URL, CertFile, KeyFile, CAFile string) (*HttpGetter, error) { var client HttpGetter + tr := &http.Transport{ + DisableCompression: true, + } if (CertFile != "" && KeyFile != "") || CAFile != "" { tlsConf, err := tlsutil.NewTLSConfig(URL, CertFile, KeyFile, CAFile) if err != nil { return &client, fmt.Errorf("can't create TLS config: %s", err.Error()) } - client.client = &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsConf, - Proxy: http.ProxyFromEnvironment, - }, - } - } else { - client.client = http.DefaultClient + tr.TLSClientConfig = tlsConf + tr.Proxy = http.ProxyFromEnvironment } + client.client = &http.Client{Transport: tr} return &client, nil } diff --git a/pkg/getter/httpgetter_test.go b/pkg/getter/httpgetter_test.go index ec730f4014b..fa4863de85a 100644 --- a/pkg/getter/httpgetter_test.go +++ b/pkg/getter/httpgetter_test.go @@ -16,21 +16,29 @@ limitations under the License. package getter import ( + "io" "net/http" + "net/http/httptest" + "os" "path/filepath" + "strconv" "testing" ) +type TestFileHandler struct{} + +func (h *TestFileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + HandleClient(w, r) +} + func TestHTTPGetter(t *testing.T) { g, err := newHTTPGetter("http://example.com", "", "", "") if err != nil { t.Fatal(err) } - if hg, ok := g.(*HttpGetter); !ok { + if _, ok := g.(*HttpGetter); !ok { t.Fatal("Expected newHTTPGetter to produce an HttpGetter") - } else if hg.client != http.DefaultClient { - t.Fatal("Expected newHTTPGetter to return a default HTTP client.") } // Test with SSL: @@ -58,3 +66,42 @@ func TestHTTPGetter(t *testing.T) { t.Fatal("Expected newHTTPGetter to return a non-default HTTP client") } } + +func HandleClient(writer http.ResponseWriter, request *http.Request) { + f, _ := os.Open("testdata/sssd-0.1.0.tgz") + defer f.Close() + + b := make([]byte, 512) + f.Read(b) + //Get the file size + FileStat, _ := f.Stat() + FileSize := strconv.FormatInt(FileStat.Size(), 10) + + //Simulating improper header values from bitbucket + writer.Header().Set("Content-Type", "application/x-tar") + writer.Header().Set("Content-Encoding", "gzip") + writer.Header().Set("Content-Length", FileSize) + + f.Seek(0, 0) + io.Copy(writer, f) + return +} + +func TestHTTPGetterTarDownload(t *testing.T) { + h := &TestFileHandler{} + server := httptest.NewServer(h) + defer server.Close() + + g, err := newHTTPGetter(server.URL, "", "", "") + if err != nil { + t.Fatal(err) + } + + data, _ := g.Get(server.URL) + mimeType := http.DetectContentType(data.Bytes()) + + expectedMimeType := "application/x-gzip" + if mimeType != expectedMimeType { + t.Fatalf("Expected response with MIME type %s, but got %s", expectedMimeType, mimeType) + } +} diff --git a/pkg/getter/testdata/sssd-0.1.0.tgz b/pkg/getter/testdata/sssd-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2f34fece6a1fd4de1852a3057f7a373e3f3070ad GIT binary patch literal 2736 zcmV;h3QzSPiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PH&dZyUF-{aJqn=X9@0XP@oZ>6ZiYfFSA6Vr?4CZHJ*499hTn zY0*iVq;un!=KbvtlFna~yriGC=?0iT*mn{|QlyR&Nm*;N_F+MdOQy6G555I-I-Snb zy}j_?>2%irJKd-AzS!Q~?ezK&;F}1u4wZG(Jm_@(E}iws{Y!vq{sE2UN~SRB5~}t5 zwb4yF4U(Z{hHDp^4&Wt<5}02vkShbOKp0G|!x9F_D#P6r252Unp@k!grIJL_5>xOC zjZ9{=J4rX`kncVD4Lk_n|AdMP?Kg7(w|xJ-C;i^~_rLpeZ}a`%2W-I+=Cl$H;vxuN zwO`2FC`>sGEzNu9$CaxTy#93d0bAWW#?bR^J%Q!ql%)LP7dOQ&F} zDgzEnEvQ4A5ModZ&gh}4q)VYo2ruavQvzU6E6bfS(-d;dl%eh5HUJzQrw|A@0-!4) zPL$wmn!>C6Sh*8}7NsM^qkBqB$()aeUe4j%>Fg4K3`f;?C~$%zh0b}m*X{ULRZ=c( z3WqO#JthFQc3~+2v+Ni}5!HjQRYU1^Q3X_RscdX+`<_sJ1W%bP{lv>ftm=y-{$aw$CNbO@O# zgg{V<{|BIqp|wM8)P!efQV%+D&$oXZ=pn?e_Neo+RC*pLC!1yXpSn@&1T9RB9D=3%iGc%Z@G4vX8mK9ji6b_D- z+Lotx!$h30Lq-`ImvNIq8y#yajna3vV~1T}d&>341#vgupn`+!Iy;@j-DLigpUJ{Q*UYu(x zvk>xo{|+h-&mkF*kQ%QA8RlFfG(r&J5gX82bcIkOi3umaD?sug2A>}D?F5bC8Nz39 zrjiVv^ui-A2UVW)b7-^{#8778ISO}ZkU9i9=aE-JOyRGJ3Z8S!fNCAYPRMTtnIX2AzLf|uL}K~9150n+wp8WeGKJn*<&j=^eV zI|+G}gF%7R)*535`mtHAE`OuTe*F@LblF)-M*&pB-EdjUR36N84DV7Wsb3 zBD?8%W$`Up)qf~;-03YEEL$&=h$ZL<#ZA@?D2*HEvaIU(T<7fIvk##KWeAO*8qgRv zzG#x)+ZS!%{$XwZk9m`l>aUp$yk-CI_WD=$|EIm)X8*qrSj+#PahauX7*@d>s!55C zX4KJ?04(zOt+-4GL^o#Z^pMsmTwKg^eJe+R1THV@v=24zI=tHH%@OOJGoY@z?;4>% z!yO&3Vbs+Jk2DiJl2!>czA}>COiyzP`|a!wlR-8<9Trr z(BSeC_QOlWp7%y)TE9kC(%QRnlGgqWMw*s)Wu$5OpEJ6+m{IqpZNkHtEL^5vrw?bt zKF0U9CoiJ~Z6LCr$8dSsSf_NdRNlKXW>NcFm4T_Uq<-CgY_uzD+IGZcs2)O# zH~v^cwDmoOLnR%ayL71we5f_y0>_xGD8|D?iK@gms*=vG4r*O{G+Ktzk2;~QsMGDi z>&}lQYsj`5Mbw)RN|j-((=AJOjm@qXh|NxSDXb8_I_7&jrwx2_2rDruP?WKb`Ym|e zmjB=DUb+9Z+k3j%|L+5~;DkDdMuw{!aSgzy0ws(pE;261peZ|}W3=-dA-2+58E3&3 zC z_2<9QUxx4h*B1vzZ(by2_HB6FUjJFI|8;wNoBN;l0$VT`42}r-=>PuME}YXgZMQWY zR|XTV+P*!WS9YMjePe-!YLUvJju*Y}D5<1ltS<=>r@&yT9K!6{0Qci$7VZk6beu&$ zP$Da+WQUiIplFFQ*2^phYzv(~-dN&7;gn-R+b=6-i_+%%l>IYvD!Db2KQOpOrtt%`b)} zgluiWE9s2ND&{9bNbrp@yB~F7g9I6Bp{Av$qVjOO0wsaM$3=-L>OF0@&*n`DS387> z$~rVqS?`BEv5zlNlnXQYeLJzm&df*Gj7=2p#Gt{yDsH($OGsmF(1r{Jx|J32Xu;yqnus;>0wHpHr(lc@4A1;>nwi6(Rh40An^0K< qU77LvlxupeR_I)(`@Q|p1~#yP4Q$|k;r{{v0RR8?Fq}33HUI!%P-8y; literal 0 HcmV?d00001 From e4a80cdc3b12a7a31437a155bd00c7efab7130a8 Mon Sep 17 00:00:00 2001 From: andrzejwp Date: Tue, 5 Jun 2018 15:19:46 +0200 Subject: [PATCH 084/483] Add link to cdwv/awesome-helm --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index 997e3f01d13..bf55df549fa 100644 --- a/docs/related.md +++ b/docs/related.md @@ -16,6 +16,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [GitLab, Consumer Driven Contracts, Helm and Kubernetes](https://medium.com/@enxebre/gitlab-consumer-driven-contracts-helm-and-kubernetes-b7235a60a1cb#.xwp1y4tgi) - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) - [Creating a Helm Plugin in 3 Steps](http://technosophos.com/2017/03/21/creating-a-helm-plugin.html) +- [Awesome Helm](https://github.com/cdwv/awesome-helm) - List of awesome Helm resources ## Video, Audio, and Podcast From ddd1f48c40e0afb7ec44ee08ca365d113b4d2d49 Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Tue, 5 Jun 2018 09:48:11 -0400 Subject: [PATCH 085/483] Increase error message specificity for name reuse If `helm upgrade` fails because a reused name is still in use, the error message does not specify which name is still in use. Update the error message. --- pkg/tiller/release_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 1a2b3c4da4b..a75b7fc8623 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -190,7 +190,7 @@ func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) { s.Log("name %s exists but is not in use, reusing name", start) return start, nil } else if reuse { - return "", errors.New("cannot re-use a name that is still in use") + return "", fmt.Errorf("a released named %s is in use, cannot re-use a name that is still in use", start) } return "", fmt.Errorf("a release named %s already exists.\nRun: helm ls --all %s; to check the status of the release\nOr run: helm del --purge %s; to delete it", start, start, start) From 8389fe1d58a35757762acb194b4ecf878dcb0849 Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Tue, 3 Apr 2018 17:13:14 -0400 Subject: [PATCH 086/483] added description field to api types UpdateReleaseRequest, InstallReleaseRequest, UninstallReleaseRequest, and RollbackReleaseRequest Signed-off-by: Arash Deshmeh --- _proto/hapi/services/tiller.proto | 9 ++ pkg/proto/hapi/services/tiller.pb.go | 196 ++++++++++++++++----------- 2 files changed, 126 insertions(+), 79 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 8daef0cb3e1..95391cb1aa4 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -209,6 +209,8 @@ message UpdateReleaseRequest { bool reuse_values = 10; // Force resource update through delete/recreate if needed. bool force = 11; + // Description, if set, will set the description for the updated release + string description = 12; } // UpdateReleaseResponse is the response to an update request. @@ -234,6 +236,8 @@ message RollbackReleaseRequest { bool wait = 7; // Force resource update through delete/recreate if needed. bool force = 8; + // Description, if set, will set the description for the rollback + string description = 9; } // RollbackReleaseResponse is the response to an update request. @@ -273,6 +277,9 @@ message InstallReleaseRequest { bool wait = 9; bool disable_crd_hook = 10; + + // Description, if set, will set the description for the installed release + string description = 11; } // InstallReleaseResponse is the response from a release installation. @@ -290,6 +297,8 @@ message UninstallReleaseRequest { bool purge = 3; // timeout specifies the max amount of time any kubernetes client command can run. int64 timeout = 4; + // Description, if set, will set the description for the uninnstalled release + string description = 5; } // UninstallReleaseResponse represents a successful response to an uninstall request. diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 4d23bcdad3e..c0b9ab7d31b 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -376,6 +376,8 @@ type UpdateReleaseRequest struct { ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues" json:"reuse_values,omitempty"` // Force resource update through delete/recreate if needed. Force bool `protobuf:"varint,11,opt,name=force" json:"force,omitempty"` + // Description, if set, will set the description for the updated release + Description string `protobuf:"bytes,12,opt,name=description" json:"description,omitempty"` } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } @@ -460,6 +462,13 @@ func (m *UpdateReleaseRequest) GetForce() bool { return false } +func (m *UpdateReleaseRequest) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + // UpdateReleaseResponse is the response to an update request. type UpdateReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -495,6 +504,8 @@ type RollbackReleaseRequest struct { Wait bool `protobuf:"varint,7,opt,name=wait" json:"wait,omitempty"` // Force resource update through delete/recreate if needed. Force bool `protobuf:"varint,8,opt,name=force" json:"force,omitempty"` + // Description, if set, will set the description for the rollback + Description string `protobuf:"bytes,9,opt,name=description" json:"description,omitempty"` } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } @@ -558,6 +569,13 @@ func (m *RollbackReleaseRequest) GetForce() bool { return false } +func (m *RollbackReleaseRequest) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + // RollbackReleaseResponse is the response to an update request. type RollbackReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -601,6 +619,8 @@ type InstallReleaseRequest struct { // before marking the release as successful. It will wait for as long as timeout Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook" json:"disable_crd_hook,omitempty"` + // Description, if set, will set the description for the installed release + Description string `protobuf:"bytes,11,opt,name=description" json:"description,omitempty"` } func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } @@ -678,6 +698,13 @@ func (m *InstallReleaseRequest) GetDisableCrdHook() bool { return false } +func (m *InstallReleaseRequest) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + // InstallReleaseResponse is the response from a release installation. type InstallReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -705,6 +732,8 @@ type UninstallReleaseRequest struct { Purge bool `protobuf:"varint,3,opt,name=purge" json:"purge,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. Timeout int64 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` + // Description, if set, will set the description for the uninnstalled release + Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` } func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest{} } @@ -740,6 +769,13 @@ func (m *UninstallReleaseRequest) GetTimeout() int64 { return 0 } +func (m *UninstallReleaseRequest) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + // UninstallReleaseResponse represents a successful response to an uninstall request. type UninstallReleaseResponse struct { // Release is the release that was marked deleted. @@ -1376,83 +1412,85 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1235 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4, - 0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x6e, 0xfe, 0xd9, 0x69, 0xda, 0xba, 0xfe, 0x2f, 0xa8, 0x18, 0xc1, - 0x66, 0x17, 0x36, 0x85, 0xc0, 0x0d, 0x12, 0x42, 0xea, 0x66, 0xa3, 0xb6, 0x50, 0xba, 0x92, 0xb3, - 0x5d, 0x24, 0x04, 0x44, 0x6e, 0x32, 0x69, 0xcd, 0x3a, 0x76, 0xf0, 0x8c, 0xcb, 0xf6, 0x96, 0x3b, - 0xde, 0x8a, 0x77, 0xe0, 0x92, 0x4b, 0x78, 0x10, 0x34, 0x5f, 0xae, 0x27, 0xb5, 0x5b, 0xd3, 0x9b, - 0x78, 0x66, 0xce, 0xf7, 0xef, 0x9c, 0x39, 0x73, 0x02, 0xd6, 0x85, 0xbb, 0xf4, 0xf6, 0x08, 0x8e, - 0x2e, 0xbd, 0x29, 0x26, 0x7b, 0xd4, 0xf3, 0x7d, 0x1c, 0xf5, 0x97, 0x51, 0x48, 0x43, 0xd4, 0x65, - 0xb4, 0xbe, 0xa2, 0xf5, 0x05, 0xcd, 0xda, 0xe2, 0x12, 0xd3, 0x0b, 0x37, 0xa2, 0xe2, 0x57, 0x70, - 0x5b, 0xdb, 0xe9, 0xf3, 0x30, 0x98, 0x7b, 0xe7, 0x92, 0x20, 0x4c, 0x44, 0xd8, 0xc7, 0x2e, 0xc1, - 0xea, 0xab, 0x09, 0x29, 0x9a, 0x17, 0xcc, 0x43, 0x49, 0xf8, 0xbf, 0x46, 0xa0, 0x98, 0xd0, 0x49, - 0x14, 0x07, 0x92, 0xb8, 0xa3, 0x11, 0x09, 0x75, 0x69, 0x4c, 0x34, 0x63, 0x97, 0x38, 0x22, 0x5e, - 0x18, 0xa8, 0xaf, 0xa0, 0xd9, 0x7f, 0x94, 0x60, 0xe3, 0xd8, 0x23, 0xd4, 0x11, 0x82, 0xc4, 0xc1, - 0xbf, 0xc4, 0x98, 0x50, 0xd4, 0x85, 0xaa, 0xef, 0x2d, 0x3c, 0x6a, 0x1a, 0xbb, 0x46, 0xaf, 0xec, - 0x88, 0x0d, 0xda, 0x82, 0x5a, 0x38, 0x9f, 0x13, 0x4c, 0xcd, 0xd2, 0xae, 0xd1, 0x6b, 0x3a, 0x72, - 0x87, 0xbe, 0x82, 0x3a, 0x09, 0x23, 0x3a, 0x39, 0xbb, 0x32, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, - 0xa0, 0x9f, 0x85, 0x53, 0x9f, 0x59, 0x1a, 0x87, 0x11, 0xed, 0xb3, 0x9f, 0xe7, 0x57, 0x4e, 0x8d, - 0xf0, 0x2f, 0xd3, 0x3b, 0xf7, 0x7c, 0x8a, 0x23, 0xb3, 0x22, 0xf4, 0x8a, 0x1d, 0x3a, 0x00, 0xe0, - 0x7a, 0xc3, 0x68, 0x86, 0x23, 0xb3, 0xca, 0x55, 0xf7, 0x0a, 0xa8, 0x7e, 0xc9, 0xf8, 0x9d, 0x26, - 0x51, 0x4b, 0xf4, 0x25, 0xac, 0x0b, 0x48, 0x26, 0xd3, 0x70, 0x86, 0x89, 0x59, 0xdb, 0x2d, 0xf7, - 0xda, 0x83, 0x1d, 0xa1, 0x4a, 0xc1, 0x3f, 0x16, 0xa0, 0x0d, 0xc3, 0x19, 0x76, 0x5a, 0x82, 0x9d, - 0xad, 0x09, 0x7a, 0x04, 0xcd, 0xc0, 0x5d, 0x60, 0xb2, 0x74, 0xa7, 0xd8, 0xac, 0x73, 0x0f, 0xaf, - 0x0f, 0xec, 0x9f, 0xa0, 0xa1, 0x8c, 0xdb, 0x03, 0xa8, 0x89, 0xd0, 0x50, 0x0b, 0xea, 0xa7, 0x27, - 0xdf, 0x9c, 0xbc, 0xfc, 0xee, 0xa4, 0xb3, 0x86, 0x1a, 0x50, 0x39, 0xd9, 0xff, 0x76, 0xd4, 0x31, - 0xd0, 0x43, 0x78, 0x70, 0xbc, 0x3f, 0x7e, 0x35, 0x71, 0x46, 0xc7, 0xa3, 0xfd, 0xf1, 0xe8, 0x45, - 0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0x78, 0x28, 0x44, 0x5e, 0x8c, - 0xc6, 0xc3, 0x8e, 0x61, 0xff, 0x6e, 0x40, 0x57, 0x4f, 0x11, 0x59, 0x86, 0x01, 0xc1, 0x2c, 0x47, - 0xd3, 0x30, 0x0e, 0x92, 0x1c, 0xf1, 0x0d, 0x42, 0x50, 0x09, 0xf0, 0x5b, 0x95, 0x21, 0xbe, 0x66, - 0x9c, 0x34, 0xa4, 0xae, 0xcf, 0xb3, 0x53, 0x76, 0xc4, 0x06, 0x7d, 0x0a, 0x0d, 0x19, 0x3a, 0x31, - 0x2b, 0xbb, 0xe5, 0x5e, 0x6b, 0xb0, 0xa9, 0x03, 0x22, 0x2d, 0x3a, 0x09, 0x9b, 0x7d, 0x00, 0xdb, - 0x07, 0x58, 0x79, 0x22, 0xf0, 0x52, 0x15, 0xc3, 0xec, 0xba, 0x0b, 0xcc, 0x9d, 0x61, 0x76, 0xdd, - 0x05, 0x46, 0x26, 0xd4, 0x65, 0xb9, 0x71, 0x77, 0xaa, 0x8e, 0xda, 0xda, 0x14, 0xcc, 0x9b, 0x8a, - 0x64, 0x5c, 0x59, 0x9a, 0x3e, 0x84, 0x0a, 0xbb, 0x09, 0x5c, 0x4d, 0x6b, 0x80, 0x74, 0x3f, 0x8f, - 0x82, 0x79, 0xe8, 0x70, 0xba, 0x9e, 0xaa, 0xf2, 0x6a, 0xaa, 0x0e, 0xd3, 0x56, 0x87, 0x61, 0x40, - 0x71, 0x40, 0xef, 0xe7, 0xff, 0x31, 0xec, 0x64, 0x68, 0x92, 0x01, 0xec, 0x41, 0x5d, 0xba, 0xc6, - 0xb5, 0xe5, 0xe2, 0xaa, 0xb8, 0xec, 0xbf, 0x4b, 0xd0, 0x3d, 0x5d, 0xce, 0x5c, 0x8a, 0x15, 0xe9, - 0x16, 0xa7, 0x1e, 0x43, 0x95, 0x77, 0x14, 0x89, 0xc5, 0x43, 0xa1, 0x5b, 0xb4, 0x9d, 0x21, 0xfb, - 0x75, 0x04, 0x1d, 0x3d, 0x85, 0xda, 0xa5, 0xeb, 0xc7, 0x98, 0x70, 0x20, 0x12, 0xd4, 0x24, 0x27, - 0x6f, 0x47, 0x8e, 0xe4, 0x40, 0xdb, 0x50, 0x9f, 0x45, 0x57, 0xac, 0x9f, 0xf0, 0x2b, 0xd8, 0x70, - 0x6a, 0xb3, 0xe8, 0xca, 0x89, 0x03, 0xf4, 0x3e, 0x3c, 0x98, 0x79, 0xc4, 0x3d, 0xf3, 0xf1, 0xe4, - 0x22, 0x0c, 0xdf, 0x10, 0x7e, 0x0b, 0x1b, 0xce, 0xba, 0x3c, 0x3c, 0x64, 0x67, 0xc8, 0x62, 0x95, - 0x34, 0x8d, 0xb0, 0x4b, 0xb1, 0x59, 0xe3, 0xf4, 0x64, 0xcf, 0x30, 0xa4, 0xde, 0x02, 0x87, 0x31, - 0xe5, 0x57, 0xa7, 0xec, 0xa8, 0x2d, 0x7a, 0x0f, 0xd6, 0x23, 0x4c, 0x30, 0x9d, 0x48, 0x2f, 0x1b, - 0x5c, 0xb2, 0xc5, 0xcf, 0x5e, 0x0b, 0xb7, 0x10, 0x54, 0x7e, 0x75, 0x3d, 0x6a, 0x36, 0x39, 0x89, - 0xaf, 0x85, 0x58, 0x4c, 0xb0, 0x12, 0x03, 0x25, 0x16, 0x13, 0x2c, 0xc5, 0xba, 0x50, 0x9d, 0x87, - 0xd1, 0x14, 0x9b, 0x2d, 0x4e, 0x13, 0x1b, 0xfb, 0x10, 0x36, 0x57, 0x40, 0xbe, 0x6f, 0xbe, 0xfe, - 0x31, 0x60, 0xcb, 0x09, 0x7d, 0xff, 0xcc, 0x9d, 0xbe, 0x29, 0x90, 0xb1, 0x14, 0xb8, 0xa5, 0xdb, - 0xc1, 0x2d, 0x67, 0x80, 0x9b, 0x2a, 0xc2, 0x8a, 0x56, 0x84, 0x1a, 0xec, 0xd5, 0x7c, 0xd8, 0x6b, - 0x3a, 0xec, 0x0a, 0xd3, 0x7a, 0x0a, 0xd3, 0x04, 0xb0, 0x46, 0x1a, 0xb0, 0xaf, 0x61, 0xfb, 0x46, - 0x94, 0xf7, 0x85, 0xec, 0xcf, 0x12, 0x6c, 0x1e, 0x05, 0x84, 0xba, 0xbe, 0xbf, 0x82, 0x58, 0x52, - 0xcf, 0x46, 0xe1, 0x7a, 0x2e, 0xfd, 0x97, 0x7a, 0x2e, 0x6b, 0x90, 0xab, 0xfc, 0x54, 0x52, 0xf9, - 0x29, 0x54, 0xe3, 0x5a, 0x67, 0xa9, 0xad, 0x74, 0x16, 0xf4, 0x0e, 0x80, 0x28, 0x4a, 0xae, 0x5c, - 0x40, 0xdb, 0xe4, 0x27, 0x27, 0xb2, 0x91, 0xa8, 0x6c, 0x34, 0xb2, 0xb3, 0x91, 0xae, 0xf0, 0x1e, - 0x74, 0x94, 0x3f, 0xd3, 0x68, 0xc6, 0x7d, 0x92, 0x55, 0xde, 0x96, 0xe7, 0xc3, 0x68, 0xc6, 0xbc, - 0xb2, 0x8f, 0x60, 0x6b, 0x15, 0xd4, 0xfb, 0x26, 0xe8, 0x37, 0x03, 0xb6, 0x4f, 0x03, 0x2f, 0x33, - 0x45, 0x59, 0x45, 0x7d, 0x03, 0xb4, 0x52, 0x06, 0x68, 0x5d, 0xa8, 0x2e, 0xe3, 0xe8, 0x1c, 0xcb, - 0x24, 0x88, 0x4d, 0x1a, 0x8d, 0x8a, 0x86, 0x86, 0x3d, 0x01, 0xf3, 0xa6, 0x0f, 0xf7, 0x8c, 0x88, - 0x79, 0x9d, 0xbc, 0x19, 0x4d, 0xf1, 0x3e, 0xd8, 0x1b, 0xf0, 0xf0, 0x00, 0xd3, 0xd7, 0xe2, 0x02, - 0xc9, 0xf0, 0xec, 0x11, 0xa0, 0xf4, 0xe1, 0xb5, 0x3d, 0x79, 0xa4, 0xdb, 0x53, 0x03, 0x94, 0xe2, - 0x57, 0x5c, 0xf6, 0x17, 0x5c, 0xf7, 0xa1, 0x47, 0x68, 0x18, 0x5d, 0xdd, 0x06, 0x5d, 0x07, 0xca, - 0x0b, 0xf7, 0xad, 0x7c, 0x52, 0xd8, 0xd2, 0x3e, 0xe0, 0x1e, 0x24, 0xa2, 0xd2, 0x83, 0xf4, 0x03, - 0x6d, 0x14, 0x7b, 0xa0, 0x7f, 0x00, 0xf4, 0x0a, 0x27, 0xb3, 0xc2, 0x1d, 0x6f, 0x9b, 0x4a, 0x42, - 0x49, 0x2f, 0x49, 0x13, 0xea, 0x53, 0x1f, 0xbb, 0x41, 0xbc, 0x94, 0x69, 0x53, 0x5b, 0xfb, 0x47, - 0xd8, 0xd0, 0xb4, 0x4b, 0x3f, 0x59, 0x3c, 0xe4, 0x5c, 0x6a, 0x67, 0x4b, 0xf4, 0x39, 0xd4, 0xc4, - 0x00, 0xc5, 0x75, 0xb7, 0x07, 0x8f, 0x74, 0xbf, 0xb9, 0x92, 0x38, 0x90, 0x13, 0x97, 0x23, 0x79, - 0x07, 0x7f, 0x35, 0xa0, 0xad, 0x46, 0x02, 0x31, 0xde, 0x21, 0x0f, 0xd6, 0xd3, 0xb3, 0x0f, 0x7a, - 0x92, 0x3f, 0xfd, 0xad, 0x8c, 0xb0, 0xd6, 0xd3, 0x22, 0xac, 0x22, 0x02, 0x7b, 0xed, 0x13, 0x03, - 0x11, 0xe8, 0xac, 0x8e, 0x24, 0xe8, 0x59, 0xb6, 0x8e, 0x9c, 0x19, 0xc8, 0xea, 0x17, 0x65, 0x57, - 0x66, 0xd1, 0x25, 0xaf, 0x19, 0x7d, 0x8e, 0x40, 0x77, 0xaa, 0xd1, 0x47, 0x17, 0x6b, 0xaf, 0x30, - 0x7f, 0x62, 0xf7, 0x67, 0x78, 0xa0, 0xbd, 0x85, 0x28, 0x07, 0xad, 0xac, 0xa9, 0xc4, 0xfa, 0xa8, - 0x10, 0x6f, 0x62, 0x6b, 0x01, 0x6d, 0xbd, 0x49, 0xa1, 0x1c, 0x05, 0x99, 0xef, 0x83, 0xf5, 0x71, - 0x31, 0xe6, 0xc4, 0x1c, 0x81, 0xce, 0x6a, 0x0f, 0xc9, 0xcb, 0x63, 0x4e, 0xbf, 0xcb, 0xcb, 0x63, - 0x5e, 0x6b, 0xb2, 0xd7, 0x90, 0x0b, 0x70, 0xdd, 0x42, 0xd0, 0xe3, 0xdc, 0x84, 0xe8, 0x9d, 0xc7, - 0xea, 0xdd, 0xcd, 0x98, 0x98, 0x58, 0xc2, 0xff, 0x56, 0x5e, 0x63, 0x94, 0x03, 0x4d, 0xf6, 0x68, - 0x62, 0x3d, 0x2b, 0xc8, 0xbd, 0x12, 0x94, 0xec, 0x4a, 0xb7, 0x04, 0xa5, 0xb7, 0xbc, 0x5b, 0x82, - 0x5a, 0x69, 0x70, 0xf6, 0x1a, 0xf2, 0xa0, 0xed, 0xc4, 0x81, 0x34, 0xcd, 0xda, 0x02, 0xca, 0x91, - 0xbe, 0xd9, 0xd5, 0xac, 0x27, 0x05, 0x38, 0xaf, 0xef, 0xf7, 0x73, 0xf8, 0xbe, 0xa1, 0x58, 0xcf, - 0x6a, 0xfc, 0xdf, 0xef, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc3, 0xd5, 0x55, 0xeb, - 0x0f, 0x00, 0x00, + // 1267 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x6e, 0xe3, 0x44, + 0x17, 0x6e, 0xe2, 0x7c, 0x9e, 0x74, 0xf3, 0x66, 0x67, 0xb3, 0xad, 0xeb, 0x77, 0x41, 0xc1, 0x08, + 0x36, 0xbb, 0xb0, 0x29, 0x04, 0xfe, 0x20, 0x21, 0xa4, 0x6e, 0x36, 0x6a, 0x0b, 0xa5, 0x2b, 0x39, + 0xdb, 0x45, 0x42, 0x40, 0xe4, 0x26, 0x93, 0xd6, 0xac, 0x63, 0x07, 0xcf, 0xb8, 0x6c, 0x2f, 0x00, + 0x24, 0xee, 0x83, 0x0b, 0xe1, 0x3e, 0xb8, 0x0e, 0xfe, 0x23, 0xcf, 0x87, 0xeb, 0x71, 0xec, 0xd4, + 0xf4, 0x4f, 0xe3, 0x99, 0x73, 0xe6, 0x7c, 0x3c, 0xcf, 0x9c, 0x33, 0xa7, 0x60, 0x5c, 0xda, 0x2b, + 0x67, 0x9f, 0xe0, 0xe0, 0xca, 0x99, 0x61, 0xb2, 0x4f, 0x1d, 0xd7, 0xc5, 0xc1, 0x60, 0x15, 0xf8, + 0xd4, 0x47, 0xdd, 0x48, 0x36, 0x90, 0xb2, 0x01, 0x97, 0x19, 0x3b, 0xec, 0xc4, 0xec, 0xd2, 0x0e, + 0x28, 0xff, 0xcb, 0xb5, 0x8d, 0xdd, 0xe4, 0xbe, 0xef, 0x2d, 0x9c, 0x0b, 0x21, 0xe0, 0x2e, 0x02, + 0xec, 0x62, 0x9b, 0x60, 0xf9, 0xab, 0x1c, 0x92, 0x32, 0xc7, 0x5b, 0xf8, 0x42, 0xf0, 0x7f, 0x45, + 0x40, 0x31, 0xa1, 0xd3, 0x20, 0xf4, 0x84, 0x70, 0x4f, 0x11, 0x12, 0x6a, 0xd3, 0x90, 0x28, 0xce, + 0xae, 0x70, 0x40, 0x1c, 0xdf, 0x93, 0xbf, 0x5c, 0x66, 0xfe, 0x55, 0x86, 0x07, 0x27, 0x0e, 0xa1, + 0x16, 0x3f, 0x48, 0x2c, 0xfc, 0x4b, 0x88, 0x09, 0x45, 0x5d, 0xa8, 0xba, 0xce, 0xd2, 0xa1, 0x7a, + 0xa9, 0x57, 0xea, 0x6b, 0x16, 0x5f, 0xa0, 0x1d, 0xa8, 0xf9, 0x8b, 0x05, 0xc1, 0x54, 0x2f, 0xf7, + 0x4a, 0xfd, 0xa6, 0x25, 0x56, 0xe8, 0x2b, 0xa8, 0x13, 0x3f, 0xa0, 0xd3, 0xf3, 0x6b, 0x5d, 0xeb, + 0x95, 0xfa, 0xed, 0xe1, 0x07, 0x83, 0x2c, 0x9c, 0x06, 0x91, 0xa7, 0x89, 0x1f, 0xd0, 0x41, 0xf4, + 0xe7, 0xf9, 0xb5, 0x55, 0x23, 0xec, 0x37, 0xb2, 0xbb, 0x70, 0x5c, 0x8a, 0x03, 0xbd, 0xc2, 0xed, + 0xf2, 0x15, 0x3a, 0x04, 0x60, 0x76, 0xfd, 0x60, 0x8e, 0x03, 0xbd, 0xca, 0x4c, 0xf7, 0x0b, 0x98, + 0x7e, 0x19, 0xe9, 0x5b, 0x4d, 0x22, 0x3f, 0xd1, 0x97, 0xb0, 0xcd, 0x21, 0x99, 0xce, 0xfc, 0x39, + 0x26, 0x7a, 0xad, 0xa7, 0xf5, 0xdb, 0xc3, 0x3d, 0x6e, 0x4a, 0xc2, 0x3f, 0xe1, 0xa0, 0x8d, 0xfc, + 0x39, 0xb6, 0x5a, 0x5c, 0x3d, 0xfa, 0x26, 0xe8, 0x11, 0x34, 0x3d, 0x7b, 0x89, 0xc9, 0xca, 0x9e, + 0x61, 0xbd, 0xce, 0x22, 0xbc, 0xd9, 0x30, 0x7f, 0x82, 0x86, 0x74, 0x6e, 0x0e, 0xa1, 0xc6, 0x53, + 0x43, 0x2d, 0xa8, 0x9f, 0x9d, 0x7e, 0x73, 0xfa, 0xf2, 0xbb, 0xd3, 0xce, 0x16, 0x6a, 0x40, 0xe5, + 0xf4, 0xe0, 0xdb, 0x71, 0xa7, 0x84, 0xee, 0xc3, 0xbd, 0x93, 0x83, 0xc9, 0xab, 0xa9, 0x35, 0x3e, + 0x19, 0x1f, 0x4c, 0xc6, 0x2f, 0x3a, 0x65, 0xf3, 0x5d, 0x68, 0xc6, 0x31, 0xa3, 0x3a, 0x68, 0x07, + 0x93, 0x11, 0x3f, 0xf2, 0x62, 0x3c, 0x19, 0x75, 0x4a, 0xe6, 0x1f, 0x25, 0xe8, 0xaa, 0x14, 0x91, + 0x95, 0xef, 0x11, 0x1c, 0x71, 0x34, 0xf3, 0x43, 0x2f, 0xe6, 0x88, 0x2d, 0x10, 0x82, 0x8a, 0x87, + 0xdf, 0x4a, 0x86, 0xd8, 0x77, 0xa4, 0x49, 0x7d, 0x6a, 0xbb, 0x8c, 0x1d, 0xcd, 0xe2, 0x0b, 0xf4, + 0x29, 0x34, 0x44, 0xea, 0x44, 0xaf, 0xf4, 0xb4, 0x7e, 0x6b, 0xf8, 0x50, 0x05, 0x44, 0x78, 0xb4, + 0x62, 0x35, 0xf3, 0x10, 0x76, 0x0f, 0xb1, 0x8c, 0x84, 0xe3, 0x25, 0x6f, 0x4c, 0xe4, 0xd7, 0x5e, + 0x62, 0x16, 0x4c, 0xe4, 0xd7, 0x5e, 0x62, 0xa4, 0x43, 0x5d, 0x5c, 0x37, 0x16, 0x4e, 0xd5, 0x92, + 0x4b, 0x93, 0x82, 0xbe, 0x6e, 0x48, 0xe4, 0x95, 0x65, 0xe9, 0x43, 0xa8, 0x44, 0x95, 0xc0, 0xcc, + 0xb4, 0x86, 0x48, 0x8d, 0xf3, 0xd8, 0x5b, 0xf8, 0x16, 0x93, 0xab, 0x54, 0x69, 0x69, 0xaa, 0x8e, + 0x92, 0x5e, 0x47, 0xbe, 0x47, 0xb1, 0x47, 0xef, 0x16, 0xff, 0x09, 0xec, 0x65, 0x58, 0x12, 0x09, + 0xec, 0x43, 0x5d, 0x84, 0xc6, 0xac, 0xe5, 0xe2, 0x2a, 0xb5, 0xcc, 0xdf, 0x34, 0xe8, 0x9e, 0xad, + 0xe6, 0x36, 0xc5, 0x52, 0xb4, 0x21, 0xa8, 0xc7, 0x50, 0x65, 0x1d, 0x45, 0x60, 0x71, 0x9f, 0xdb, + 0xe6, 0x6d, 0x67, 0x14, 0xfd, 0xb5, 0xb8, 0x1c, 0x3d, 0x85, 0xda, 0x95, 0xed, 0x86, 0x98, 0x30, + 0x20, 0x62, 0xd4, 0x84, 0x26, 0x6b, 0x47, 0x96, 0xd0, 0x40, 0xbb, 0x50, 0x9f, 0x07, 0xd7, 0x51, + 0x3f, 0x61, 0x25, 0xd8, 0xb0, 0x6a, 0xf3, 0xe0, 0xda, 0x0a, 0x3d, 0xf4, 0x3e, 0xdc, 0x9b, 0x3b, + 0xc4, 0x3e, 0x77, 0xf1, 0xf4, 0xd2, 0xf7, 0xdf, 0x10, 0x56, 0x85, 0x0d, 0x6b, 0x5b, 0x6c, 0x1e, + 0x45, 0x7b, 0xc8, 0x88, 0x6e, 0xd2, 0x2c, 0xc0, 0x36, 0xc5, 0x7a, 0x8d, 0xc9, 0xe3, 0x75, 0x84, + 0x21, 0x75, 0x96, 0xd8, 0x0f, 0x29, 0x2b, 0x1d, 0xcd, 0x92, 0x4b, 0xf4, 0x1e, 0x6c, 0x07, 0x98, + 0x60, 0x3a, 0x15, 0x51, 0x36, 0xd8, 0xc9, 0x16, 0xdb, 0x7b, 0xcd, 0xc3, 0x42, 0x50, 0xf9, 0xd5, + 0x76, 0xa8, 0xde, 0x64, 0x22, 0xf6, 0xcd, 0x8f, 0x85, 0x04, 0xcb, 0x63, 0x20, 0x8f, 0x85, 0x04, + 0x8b, 0x63, 0x5d, 0xa8, 0x2e, 0xfc, 0x60, 0x86, 0xf5, 0x16, 0x93, 0xf1, 0x05, 0xea, 0x41, 0x6b, + 0x8e, 0xc9, 0x2c, 0x70, 0x56, 0x34, 0x62, 0x74, 0x9b, 0x61, 0x9a, 0xdc, 0x32, 0x8f, 0xe0, 0x61, + 0x8a, 0x86, 0xbb, 0x32, 0xfa, 0x7b, 0x19, 0x76, 0x2c, 0xdf, 0x75, 0xcf, 0xed, 0xd9, 0x9b, 0x02, + 0x9c, 0x26, 0xe0, 0x2f, 0x6f, 0x86, 0x5f, 0xcb, 0x80, 0x3f, 0x71, 0x4d, 0x2b, 0xca, 0x35, 0x55, + 0x88, 0xa9, 0xe6, 0x13, 0x53, 0x53, 0x89, 0x91, 0xa8, 0xd7, 0x13, 0xa8, 0xc7, 0x90, 0x36, 0x36, + 0x40, 0xda, 0x5c, 0x87, 0xf4, 0x6b, 0xd8, 0x5d, 0xc3, 0xe1, 0xae, 0xa0, 0xfe, 0x53, 0x86, 0x87, + 0xc7, 0x1e, 0xa1, 0xb6, 0xeb, 0xa6, 0x30, 0x8d, 0x6b, 0xa2, 0x54, 0xb8, 0x26, 0xca, 0xff, 0xa5, + 0x26, 0x34, 0x85, 0x14, 0xc9, 0x60, 0x25, 0xc1, 0x60, 0xa1, 0x3a, 0x51, 0xba, 0x53, 0x2d, 0xd5, + 0x9d, 0xd0, 0x3b, 0x00, 0xfc, 0x62, 0x33, 0xe3, 0x1c, 0xfc, 0x26, 0xdb, 0x39, 0x15, 0xcd, 0x48, + 0xf2, 0xd5, 0xc8, 0xe6, 0x2b, 0x59, 0x25, 0x7d, 0xe8, 0xc8, 0x78, 0x66, 0xc1, 0x9c, 0xc5, 0x24, + 0x2a, 0xa5, 0x2d, 0xf6, 0x47, 0xc1, 0x3c, 0x8a, 0x2a, 0xcd, 0x61, 0x6b, 0x9d, 0xc3, 0x63, 0xd8, + 0x49, 0xc3, 0x7e, 0x57, 0x0a, 0xff, 0x2c, 0xc1, 0xee, 0x99, 0xe7, 0x64, 0x92, 0x98, 0x55, 0x18, + 0x6b, 0xb0, 0x96, 0x33, 0x60, 0xed, 0x42, 0x75, 0x15, 0x06, 0x17, 0x58, 0xd0, 0xc4, 0x17, 0x49, + 0xbc, 0x2a, 0x2a, 0x5e, 0xa9, 0x8c, 0xab, 0xeb, 0x19, 0x4f, 0x41, 0x5f, 0x8f, 0xf2, 0x8e, 0x39, + 0x47, 0x79, 0xc5, 0x6f, 0x57, 0x93, 0xbf, 0x53, 0xe6, 0x03, 0xb8, 0x7f, 0x88, 0xe9, 0x6b, 0x5e, + 0xa6, 0x02, 0x00, 0x73, 0x0c, 0x28, 0xb9, 0x79, 0xe3, 0x4f, 0x6c, 0xa9, 0xfe, 0xe4, 0x20, 0x27, + 0xf5, 0xa5, 0x96, 0xf9, 0x05, 0xb3, 0x7d, 0xe4, 0x10, 0xea, 0x07, 0xd7, 0x9b, 0xc0, 0xed, 0x80, + 0xb6, 0xb4, 0xdf, 0x8a, 0xa7, 0x2d, 0xfa, 0x34, 0x0f, 0x59, 0x04, 0xf1, 0x51, 0x11, 0x41, 0x72, + 0x50, 0x28, 0x15, 0x1b, 0x14, 0x7e, 0x00, 0xf4, 0x0a, 0xc7, 0x33, 0xcb, 0x2d, 0x6f, 0xac, 0xa4, + 0xa9, 0xac, 0xd2, 0xa4, 0x43, 0x7d, 0xe6, 0x62, 0xdb, 0x0b, 0x57, 0x82, 0x58, 0xb9, 0x34, 0x7f, + 0x84, 0x07, 0x8a, 0x75, 0x11, 0x67, 0x94, 0x0f, 0xb9, 0x10, 0xd6, 0xa3, 0x4f, 0xf4, 0x39, 0xd4, + 0xf8, 0x20, 0xc7, 0x6c, 0xb7, 0x87, 0x8f, 0xd4, 0xb8, 0x99, 0x91, 0xd0, 0x13, 0x93, 0x9f, 0x25, + 0x74, 0x87, 0x7f, 0x37, 0xa0, 0x2d, 0x47, 0x13, 0x3e, 0x66, 0x22, 0x07, 0xb6, 0x93, 0x33, 0x18, + 0x7a, 0x92, 0x3f, 0x85, 0xa6, 0x46, 0x69, 0xe3, 0x69, 0x11, 0x55, 0x9e, 0x81, 0xb9, 0xf5, 0x49, + 0x09, 0x11, 0xe8, 0xa4, 0x47, 0x23, 0xf4, 0x2c, 0xdb, 0x46, 0xce, 0x2c, 0x66, 0x0c, 0x8a, 0xaa, + 0x4b, 0xb7, 0xe8, 0x8a, 0xdd, 0x19, 0x75, 0x9e, 0x41, 0xb7, 0x9a, 0x51, 0x47, 0x28, 0x63, 0xbf, + 0xb0, 0x7e, 0xec, 0xf7, 0x67, 0xb8, 0xa7, 0xbc, 0xb8, 0x28, 0x07, 0xad, 0xac, 0xe9, 0xc8, 0xf8, + 0xa8, 0x90, 0x6e, 0xec, 0x6b, 0x09, 0x6d, 0xb5, 0x8d, 0xa1, 0x1c, 0x03, 0x99, 0x6f, 0x8c, 0xf1, + 0x71, 0x31, 0xe5, 0xd8, 0x1d, 0x81, 0x4e, 0xba, 0x87, 0xe4, 0xf1, 0x98, 0xd3, 0x11, 0xf3, 0x78, + 0xcc, 0x6b, 0x4d, 0xe6, 0x16, 0xb2, 0x01, 0x6e, 0x5a, 0x08, 0x7a, 0x9c, 0x4b, 0x88, 0xda, 0x79, + 0x8c, 0xfe, 0xed, 0x8a, 0xb1, 0x8b, 0x15, 0xfc, 0x2f, 0xf5, 0xa2, 0xa3, 0x1c, 0x68, 0xb2, 0x07, + 0x20, 0xe3, 0x59, 0x41, 0xed, 0x54, 0x52, 0xa2, 0x2b, 0x6d, 0x48, 0x4a, 0x6d, 0x79, 0x1b, 0x92, + 0x4a, 0x35, 0x38, 0x73, 0x0b, 0x39, 0xd0, 0xb6, 0x42, 0x4f, 0xb8, 0x8e, 0xda, 0x02, 0xca, 0x39, + 0xbd, 0xde, 0xd5, 0x8c, 0x27, 0x05, 0x34, 0x6f, 0xea, 0xfb, 0x39, 0x7c, 0xdf, 0x90, 0xaa, 0xe7, + 0x35, 0xf6, 0x5f, 0xf8, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x9d, 0x73, 0x4f, 0x4d, 0x73, + 0x10, 0x00, 0x00, } From a32868e48b82c97dba246b5ed4003bf8966a7725 Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Tue, 3 Apr 2018 17:29:21 -0400 Subject: [PATCH 087/483] added ability to handle custom release descriptions to tiller Signed-off-by: Arash Deshmeh --- pkg/tiller/release_install.go | 6 +++- pkg/tiller/release_install_test.go | 20 ++++++++++++ pkg/tiller/release_rollback.go | 7 +++- pkg/tiller/release_rollback_test.go | 32 ++++++++++++++++++ pkg/tiller/release_uninstall.go | 6 +++- pkg/tiller/release_uninstall_test.go | 21 ++++++++++++ pkg/tiller/release_update.go | 12 +++++-- pkg/tiller/release_update_test.go | 49 ++++++++++++++++++++++++++++ 8 files changed, 148 insertions(+), 5 deletions(-) diff --git a/pkg/tiller/release_install.go b/pkg/tiller/release_install.go index 0b8f4da5b37..01ef88c98e8 100644 --- a/pkg/tiller/release_install.go +++ b/pkg/tiller/release_install.go @@ -250,7 +250,11 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install } r.Info.Status.Code = release.Status_DEPLOYED - r.Info.Description = "Install complete" + if req.Description == "" { + r.Info.Description = "Install complete" + } else { + r.Info.Description = req.Description + } // This is a tricky case. The release has been created, but the result // cannot be recorded. The truest thing to tell the user is that the // release was created. However, the user will not be able to do anything diff --git a/pkg/tiller/release_install_test.go b/pkg/tiller/release_install_test.go index a244e4b720b..bbea3b9dd10 100644 --- a/pkg/tiller/release_install_test.go +++ b/pkg/tiller/release_install_test.go @@ -495,3 +495,23 @@ func TestInstallRelease_WrongKubeVersion(t *testing.T) { t.Errorf("Expected %q to contain %q", err.Error(), expect) } } + +func TestInstallRelease_Description(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rs.env.Releases.Create(releaseStub()) + + customDescription := "foo" + req := &services.InstallReleaseRequest{ + Chart: chartStub(), + Description: customDescription, + } + res, err := rs.InstallRelease(c, req) + if err != nil { + t.Errorf("Failed install: %s", err) + } + + if desc := res.Release.Info.Description; desc != customDescription { + t.Errorf("Expected description %q. Got %q", customDescription, desc) + } +} diff --git a/pkg/tiller/release_rollback.go b/pkg/tiller/release_rollback.go index fa3d943f4f0..ab6462db98b 100644 --- a/pkg/tiller/release_rollback.go +++ b/pkg/tiller/release_rollback.go @@ -86,6 +86,11 @@ func (s *ReleaseServer) prepareRollback(req *services.RollbackReleaseRequest) (* return nil, nil, err } + description := req.Description + if req.Description == "" { + description = fmt.Sprintf("Rollback to %d", previousVersion) + } + // Store a new release object with previous release's configuration targetRelease := &release.Release{ Name: req.Name, @@ -101,7 +106,7 @@ func (s *ReleaseServer) prepareRollback(req *services.RollbackReleaseRequest) (* }, // Because we lose the reference to previous version elsewhere, we set the // message here, and only override it later if we experience failure. - Description: fmt.Sprintf("Rollback to %d", previousVersion), + Description: description, }, Version: currentRelease.Version + 1, Manifest: previousRelease.Manifest, diff --git a/pkg/tiller/release_rollback_test.go b/pkg/tiller/release_rollback_test.go index b73501a3685..710f0ebbec2 100644 --- a/pkg/tiller/release_rollback_test.go +++ b/pkg/tiller/release_rollback_test.go @@ -252,3 +252,35 @@ func TestRollbackReleaseFailure(t *testing.T) { t.Errorf("Expected SUPERSEDED status on previous Release version. Got %v", oldStatus) } } + +func TestRollbackReleaseWithCustomDescription(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + rs.env.Releases.Create(rel) + upgradedRel := upgradeReleaseVersion(rel) + rs.env.Releases.Update(rel) + rs.env.Releases.Create(upgradedRel) + + customDescription := "foo" + req := &services.RollbackReleaseRequest{ + Name: rel.Name, + Description: customDescription, + } + res, err := rs.RollbackRelease(c, req) + if err != nil { + t.Fatalf("Failed rollback: %s", err) + } + + if res.Release.Name == "" { + t.Errorf("Expected release name.") + } + + if res.Release.Name != rel.Name { + t.Errorf("Updated release name does not match previous release name. Expected %s, got %s", rel.Name, res.Release.Name) + } + + if res.Release.Info.Description != customDescription { + t.Errorf("Expected Description to be %q, got %q", customDescription, res.Release.Info.Description) + } +} diff --git a/pkg/tiller/release_uninstall.go b/pkg/tiller/release_uninstall.go index 423b6e7ef7f..294645ae75f 100644 --- a/pkg/tiller/release_uninstall.go +++ b/pkg/tiller/release_uninstall.go @@ -97,7 +97,11 @@ func (s *ReleaseServer) UninstallRelease(c ctx.Context, req *services.UninstallR } rel.Info.Status.Code = release.Status_DELETED - rel.Info.Description = "Deletion complete" + if req.Description == "" { + rel.Info.Description = "Deletion complete" + } else { + rel.Info.Description = req.Description + } if req.Purge { s.Log("purge requested for %s", req.Name) diff --git a/pkg/tiller/release_uninstall_test.go b/pkg/tiller/release_uninstall_test.go index 20bfd24860d..a68ac55f704 100644 --- a/pkg/tiller/release_uninstall_test.go +++ b/pkg/tiller/release_uninstall_test.go @@ -176,3 +176,24 @@ func TestUninstallReleaseNoHooks(t *testing.T) { t.Errorf("Expected LastRun to be zero, got %d.", res.Release.Hooks[0].LastRun.Seconds) } } + +func TestUninstallReleaseCustomDescription(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rs.env.Releases.Create(releaseStub()) + + customDescription := "foo" + req := &services.UninstallReleaseRequest{ + Name: "angry-panda", + Description: "foo", + } + + res, err := rs.UninstallRelease(c, req) + if err != nil { + t.Errorf("Failed uninstall: %s", err) + } + + if res.Release.Info.Description != customDescription { + t.Errorf("Expected description to be %q, got %q", customDescription, res.Release.Info.Description) + } +} diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index 6f5d3733122..e94de705d52 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -243,7 +243,11 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( } newRelease.Info.Status.Code = release.Status_DEPLOYED - newRelease.Info.Description = "Upgrade complete" + if req.Description == "" { + newRelease.Info.Description = "Upgrade complete" + } else { + newRelease.Info.Description = req.Description + } s.recordRelease(newRelease, true) return res, nil @@ -287,7 +291,11 @@ func (s *ReleaseServer) performUpdate(originalRelease, updatedRelease *release.R s.recordRelease(originalRelease, true) updatedRelease.Info.Status.Code = release.Status_DEPLOYED - updatedRelease.Info.Description = "Upgrade complete" + if req.Description == "" { + updatedRelease.Info.Description = "Upgrade complete" + } else { + updatedRelease.Info.Description = req.Description + } return res, nil } diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index a1b9a4bff1b..56dcca8740c 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -432,6 +432,55 @@ func TestUpdateReleaseNoChanges(t *testing.T) { } } +func TestUpdateReleaseCustomDescription(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + rs.env.Releases.Create(rel) + + customDescription := "foo" + + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: rel.GetChart(), + Description: customDescription, + } + + res, err := rs.UpdateRelease(c, req) + if err != nil { + t.Fatalf("Failed updated: %s", err) + } + if res.Release.Info.Description != customDescription { + t.Errorf("Expected release description to be %q, got %q", customDescription, res.Release.Info.Description) + } + compareStoredAndReturnedRelease(t, *rs, *res) +} + +func TestUpdateReleaseCustomDescription_Force(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + rs.env.Releases.Create(rel) + + customDescription := "foo" + + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: rel.GetChart(), + Force: true, + Description: customDescription, + } + + res, err := rs.UpdateRelease(c, req) + if err != nil { + t.Fatalf("Failed updated: %s", err) + } + if res.Release.Info.Description != customDescription { + t.Errorf("Expected release description to be %q, got %q", customDescription, res.Release.Info.Description) + } + compareStoredAndReturnedRelease(t, *rs, *res) +} + func compareStoredAndReturnedRelease(t *testing.T, rs ReleaseServer, res services.UpdateReleaseResponse) *release.Release { storedRelease, err := rs.env.Releases.Get(res.Release.Name, res.Release.Version) if err != nil { From d8c4cbb0e0e31276241d87d6386aad8d90011117 Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Tue, 3 Apr 2018 17:35:07 -0400 Subject: [PATCH 088/483] feat(helm): Added the ability to handle custom description to client side for install, upgrade, rollback, and delete commands. Updated the documentation according to the changes. Signed-off-by: Arash Deshmeh --- cmd/helm/delete.go | 3 +++ cmd/helm/delete_test.go | 8 ++++++++ cmd/helm/install.go | 5 ++++- cmd/helm/install_test.go | 7 +++++++ cmd/helm/rollback.go | 5 ++++- cmd/helm/rollback_test.go | 6 ++++++ cmd/helm/upgrade.go | 6 +++++- cmd/helm/upgrade_test.go | 16 ++++++++++++++++ docs/helm/helm_delete.md | 3 ++- docs/helm/helm_install.md | 3 ++- docs/helm/helm_rollback.md | 3 ++- docs/helm/helm_upgrade.md | 1 + pkg/helm/fake.go | 21 ++++++++++++++------- pkg/helm/fake_test.go | 17 +++++++++++++++++ pkg/helm/option.go | 28 ++++++++++++++++++++++++++++ 15 files changed, 119 insertions(+), 13 deletions(-) diff --git a/cmd/helm/delete.go b/cmd/helm/delete.go index e0ac8c4f6cd..46c7abcb192 100755 --- a/cmd/helm/delete.go +++ b/cmd/helm/delete.go @@ -40,6 +40,7 @@ type deleteCmd struct { disableHooks bool purge bool timeout int64 + description string out io.Writer client helm.Interface @@ -81,6 +82,7 @@ func newDeleteCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&del.disableHooks, "no-hooks", false, "prevent hooks from running during deletion") f.BoolVar(&del.purge, "purge", false, "remove the release from the store and make its name free for later use") f.Int64Var(&del.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") + f.StringVar(&del.description, "description", "", "specify a description for the release") return cmd } @@ -91,6 +93,7 @@ func (d *deleteCmd) run() error { helm.DeleteDisableHooks(d.disableHooks), helm.DeletePurge(d.purge), helm.DeleteTimeout(d.timeout), + helm.DeleteDescription(d.description), } res, err := d.client.DeleteRelease(d.name, opts...) if res != nil && res.Info != "" { diff --git a/cmd/helm/delete_test.go b/cmd/helm/delete_test.go index 829d179069b..6b5c444b192 100644 --- a/cmd/helm/delete_test.go +++ b/cmd/helm/delete_test.go @@ -61,6 +61,14 @@ func TestDelete(t *testing.T) { resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"}), rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"})}, }, + { + name: "delete with description", + args: []string{"aeneas"}, + flags: []string{"--description", "foo"}, + expected: "", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"}), + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"})}, + }, { name: "delete without release", args: []string{}, diff --git a/cmd/helm/install.go b/cmd/helm/install.go index d1c24c2131e..6a2107b9285 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -129,6 +129,7 @@ type installCmd struct { password string devel bool depUp bool + description string certFile string keyFile string @@ -209,6 +210,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.BoolVar(&inst.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") f.BoolVar(&inst.depUp, "dep-up", false, "run helm dependency update before installing the chart") + f.StringVar(&inst.description, "description", "", "specify a description for the release") return cmd } @@ -277,7 +279,8 @@ func (i *installCmd) run() error { helm.InstallDisableHooks(i.disableHooks), helm.InstallDisableCRDHook(i.disableCRDHook), helm.InstallTimeout(i.timeout), - helm.InstallWait(i.wait)) + helm.InstallWait(i.wait), + helm.InstallDescription(i.description)) if err != nil { return prettyError(err) } diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index aa828c6ce51..236174bec8a 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -115,6 +115,13 @@ func TestInstall(t *testing.T) { expected: "FOOBAR", resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "FOOBAR"}), }, + { + name: "install with custom description", + args: []string{"testdata/testcharts/alpine"}, + flags: []string{"--name", "virgil", "--description", "foobar"}, + expected: "virgil", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "virgil", Description: "foobar"}), + }, // Install, perform chart verification along the way. { name: "install with verification, missing provenance", diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 889b6ae2860..370807cb4e0 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -45,6 +45,7 @@ type rollbackCmd struct { client helm.Interface timeout int64 wait bool + description string } func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { @@ -83,6 +84,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&rollback.disableHooks, "no-hooks", false, "prevent hooks from running during rollback") f.Int64Var(&rollback.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&rollback.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") + f.StringVar(&rollback.description, "description", "", "specify a description for the release") return cmd } @@ -96,7 +98,8 @@ func (r *rollbackCmd) run() error { helm.RollbackDisableHooks(r.disableHooks), helm.RollbackVersion(r.revision), helm.RollbackTimeout(r.timeout), - helm.RollbackWait(r.wait)) + helm.RollbackWait(r.wait), + helm.RollbackDescription(r.description)) if err != nil { return prettyError(err) } diff --git a/cmd/helm/rollback_test.go b/cmd/helm/rollback_test.go index f1479b2eb2c..62bfd6477a5 100644 --- a/cmd/helm/rollback_test.go +++ b/cmd/helm/rollback_test.go @@ -45,6 +45,12 @@ func TestRollbackCmd(t *testing.T) { flags: []string{"--wait"}, expected: "Rollback was a success! Happy Helming!", }, + { + name: "rollback a release with description", + args: []string{"funny-honey", "1"}, + flags: []string{"--description", "foo"}, + expected: "Rollback was a success! Happy Helming!", + }, { name: "rollback a release without revision", args: []string{"funny-honey"}, diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 4dd433a3924..aaf87b7d0d3 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -78,6 +78,7 @@ type upgradeCmd struct { username string password string devel bool + description string certFile string keyFile string @@ -139,6 +140,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&upgrade.keyFile, "key-file", "", "identify HTTPS client using this SSL key file") f.StringVar(&upgrade.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.BoolVar(&upgrade.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") + f.StringVar(&upgrade.description, "description", "", "specify the description to use for the upgrade, rather than the default") f.MarkDeprecated("disable-hooks", "use --no-hooks instead") @@ -190,6 +192,7 @@ func (u *upgradeCmd) run() error { namespace: u.namespace, timeout: u.timeout, wait: u.wait, + description: u.description, } return ic.run() } @@ -224,7 +227,8 @@ func (u *upgradeCmd) run() error { helm.UpgradeTimeout(u.timeout), helm.ResetValues(u.resetValues), helm.ReuseValues(u.reuseValues), - helm.UpgradeWait(u.wait)) + helm.UpgradeWait(u.wait), + helm.UpgradeDescription(u.description)) if err != nil { return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) } diff --git a/cmd/helm/upgrade_test.go b/cmd/helm/upgrade_test.go index 187d3593e1a..032df2f32ad 100644 --- a/cmd/helm/upgrade_test.go +++ b/cmd/helm/upgrade_test.go @@ -139,6 +139,14 @@ func TestUpgradeCmd(t *testing.T) { expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch})}, }, + { + name: "install a release with 'upgrade --install' and custom description", + args: []string{"crazy-bunny", chartPath}, + flags: []string{"-i", "--description", "foo"}, + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch, Description: "foo"}), + expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch, Description: "foo"})}, + }, { name: "upgrade a release with wait", args: []string{"crazy-bunny", chartPath}, @@ -147,6 +155,14 @@ func TestUpgradeCmd(t *testing.T) { expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2})}, }, + { + name: "upgrade a release with description", + args: []string{"crazy-bunny", chartPath}, + flags: []string{"--description", "foo"}, + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2}), + expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2, Description: "foo"})}, + }, { name: "upgrade a release with missing dependencies", args: []string{"bonkers-bunny", missingDepsPath}, diff --git a/docs/helm/helm_delete.md b/docs/helm/helm_delete.md index 5d41cd7eaf5..9eee6e8ec97 100644 --- a/docs/helm/helm_delete.md +++ b/docs/helm/helm_delete.md @@ -20,6 +20,7 @@ helm delete [flags] RELEASE_NAME [...] ### Options ``` + --description string specify a description for the release --dry-run simulate a delete --no-hooks prevent hooks from running during deletion --purge remove the release from the store and make its name free for later use @@ -45,4 +46,4 @@ helm delete [flags] RELEASE_NAME [...] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 13-Apr-2018 diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 9f1ad86b0cf..62d02cc38b2 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -77,6 +77,7 @@ helm install [CHART] --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --dep-up run helm dependency update before installing the chart + --description string specify a description for the release --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. --dry-run simulate an install --key-file string identify HTTPS client using this SSL key file @@ -118,4 +119,4 @@ helm install [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 27-Apr-2018 +###### Auto generated by spf13/cobra on 5-Jun-2018 diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index 4b6dcbbb2f0..ae64a0a26ec 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -20,6 +20,7 @@ helm rollback [flags] [RELEASE] [REVISION] ### Options ``` + --description string specify a description for the release --dry-run simulate a rollback --force force resource update through delete/recreate if needed --no-hooks prevent hooks from running during rollback @@ -47,4 +48,4 @@ helm rollback [flags] [RELEASE] [REVISION] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 13-Apr-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index c2882265e05..b952624a52f 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -39,6 +39,7 @@ helm upgrade [RELEASE] [CHART] ``` --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file + --description string specify the description to use for the upgrade, rather than the default --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. --dry-run simulate an upgrade --force force resource update through delete/recreate if needed diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 0a9e77c4406..aa2bbb4e938 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -69,6 +69,7 @@ func (c *FakeClient) InstallReleaseFromChart(chart *chart.Chart, ns string, opts } releaseName := c.Opts.instReq.Name + releaseDescription := c.Opts.instReq.Description // Check to see if the release already exists. rel, err := c.ReleaseStatus(releaseName, nil) @@ -76,7 +77,7 @@ func (c *FakeClient) InstallReleaseFromChart(chart *chart.Chart, ns string, opts return nil, errors.New("cannot re-use a name that is still in use") } - release := ReleaseMock(&MockReleaseOptions{Name: releaseName, Namespace: ns}) + release := ReleaseMock(&MockReleaseOptions{Name: releaseName, Namespace: ns, Description: releaseDescription}) c.Rels = append(c.Rels, release) return &rls.InstallReleaseResponse{ @@ -206,11 +207,12 @@ metadata: // MockReleaseOptions allows for user-configurable options on mock release objects. type MockReleaseOptions struct { - Name string - Version int32 - Chart *chart.Chart - StatusCode release.Status_Code - Namespace string + Name string + Version int32 + Chart *chart.Chart + StatusCode release.Status_Code + Namespace string + Description string } // ReleaseMock creates a mock release object based on options set by MockReleaseOptions. This function should typically not be used outside of testing. @@ -232,6 +234,11 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { namespace = "default" } + description := opts.Description + if description == "" { + description = "Release mock" + } + ch := opts.Chart if opts.Chart == nil { ch = &chart.Chart{ @@ -256,7 +263,7 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { FirstDeployed: &date, LastDeployed: &date, Status: &release.Status{Code: scode}, - Description: "Release mock", + Description: description, }, Chart: ch, Config: &chart.Config{Raw: `name: "value"`}, diff --git a/pkg/helm/fake_test.go b/pkg/helm/fake_test.go index 9c0a537594e..f6de572b5a5 100644 --- a/pkg/helm/fake_test.go +++ b/pkg/helm/fake_test.go @@ -150,6 +150,23 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { }, wantErr: false, }, + { + name: "Add release with description.", + fields: fields{ + Rels: []*release.Release{}, + }, + args: args{ + ns: "default", + opts: []InstallOption{ReleaseName("new-release"), InstallDescription("foo-bar")}, + }, + want: &rls.InstallReleaseResponse{ + Release: ReleaseMock(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), + }, + relsAfter: []*release.Release{ + ReleaseMock(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), + }, + wantErr: false, + }, { name: "Try to add a release where the name already exists.", fields: fields{ diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 602e1e3a389..4babec07361 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -262,6 +262,34 @@ func UpdateValueOverrides(raw []byte) UpdateOption { } } +// InstallDescription specifies the description for the release +func InstallDescription(description string) InstallOption { + return func(opts *options) { + opts.instReq.Description = description + } +} + +// UpgradeDescription specifies the description for the update +func UpgradeDescription(description string) UpdateOption { + return func(opts *options) { + opts.updateReq.Description = description + } +} + +// RollbackDescription specifies the description for the release +func RollbackDescription(description string) RollbackOption { + return func(opts *options) { + opts.rollbackReq.Description = description + } +} + +// DeleteDescription specifies the description for the release +func DeleteDescription(description string) DeleteOption { + return func(opts *options) { + opts.uninstallReq.Description = description + } +} + // DeleteDisableHooks will disable hooks for a deletion operation. func DeleteDisableHooks(disable bool) DeleteOption { return func(opts *options) { From b4cfb5f2f3efe957b1cb1b671ee33cfe18aeaf93 Mon Sep 17 00:00:00 2001 From: ruicao Date: Wed, 6 Jun 2018 10:48:33 +0800 Subject: [PATCH 089/483] Typo fix: indentifies -> identifies --- cmd/helm/installer/options.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 13cf43dccec..3769d12e197 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -50,7 +50,7 @@ type Options struct { // Force allows to force upgrading tiller if deployed version is greater than current version ForceUpgrade bool - // ImageSpec indentifies the image Tiller will use when deployed. + // ImageSpec identifies the image Tiller will use when deployed. // // Valid if and only if UseCanary is false. ImageSpec string From 8817f7baa714161b0c3fa7299f0e0b0160cba96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herbert=20M=C3=BChlburger?= Date: Thu, 7 Jun 2018 10:30:17 +0200 Subject: [PATCH 090/483] test: add test for 'ParseIntoString' and update test for 'ParseInto' --- pkg/strvals/parser_test.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index c897cf0a7cf..257bc5f29d6 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -336,12 +336,13 @@ func TestParseInto(t *testing.T) { "inner2": "value2", }, } - input := "outer.inner1=value1,outer.inner3=value3" + input := "outer.inner1=value1,outer.inner3=value3,outer.inner4=4" expect := map[string]interface{}{ "outer": map[string]interface{}{ "inner1": "value1", "inner2": "value2", "inner3": "value3", + "inner4": 4, }, } @@ -362,6 +363,39 @@ func TestParseInto(t *testing.T) { t.Errorf("%s: Expected:\n%s\nGot:\n%s", input, y1, y2) } } +func TestParseIntoString(t *testing.T) { + got := map[string]interface{}{ + "outer": map[string]interface{}{ + "inner1": "overwrite", + "inner2": "value2", + }, + } + input := "outer.inner1=1,outer.inner3=3" + expect := map[string]interface{}{ + "outer": map[string]interface{}{ + "inner1": "1", + "inner2": "value2", + "inner3": "3", + }, + } + + if err := ParseIntoString(input, got); err != nil { + t.Fatal(err) + } + + y1, err := yaml.Marshal(expect) + if err != nil { + t.Fatal(err) + } + y2, err := yaml.Marshal(got) + if err != nil { + t.Fatalf("Error serializing parsed value: %s", err) + } + + if string(y1) != string(y2) { + t.Errorf("%s: Expected:\n%s\nGot:\n%s", input, y1, y2) + } +} func TestToYAML(t *testing.T) { // The TestParse does the hard part. We just verify that YAML formatting is From c19dea18b0f93a710a8cd6c33a30456bce0c61aa Mon Sep 17 00:00:00 2001 From: Alice Frosi Date: Thu, 7 Jun 2018 07:24:45 -0500 Subject: [PATCH 091/483] Add s390 architecture in TARGETS Signed-off-by: Alice Frosi --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 54cc1ff1860..77d7c8ff752 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder -TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le windows/amd64 +TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 DIST_DIRS = find * -type d -exec APP = helm From 0ddbcc1fe9a920c1d4146b008b08579752a0567a Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Thu, 7 Jun 2018 15:12:31 +0100 Subject: [PATCH 092/483] Remove trailing whitespace --- docs/charts.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/charts.md b/docs/charts.md index a55038e3ef3..bdcbe9b61f8 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -303,7 +303,6 @@ The `--set` parameter can be used as usual to alter tag and condition values. ```` helm install --set tags.front-end=true --set subchart2.enabled=false - ```` ##### Tags and Condition Resolution From 63760b29377fde5e3d2ac9f3a3df97d133161858 Mon Sep 17 00:00:00 2001 From: liyongxin Date: Fri, 8 Jun 2018 10:09:07 +0800 Subject: [PATCH 093/483] typo fix for lengh to length --- pkg/storage/storage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 4b39e0bb237..d308cef1b5e 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -163,7 +163,7 @@ func (s *Storage) History(name string) ([]*rspb.Release, error) { return s.Driver.Query(map[string]string{"NAME": name, "OWNER": "TILLER"}) } -// removeLeastRecent removes items from history until the lengh number of releases +// removeLeastRecent removes items from history until the length number of releases // does not exceed max. // // We allow max to be set explicitly so that calling functions can "make space" From 5d2140be384eaba7ed8bb0ff1bc2fb9be6284b4d Mon Sep 17 00:00:00 2001 From: liyongxin Date: Tue, 12 Jun 2018 11:05:02 +0800 Subject: [PATCH 094/483] typo fix for template test --- cmd/helm/template_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index d15dc5666d7..263b6bb35e2 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -68,8 +68,8 @@ func TestTemplateCmd(t *testing.T) { }, { name: "check_execute_non_existent", - desc: "verify --execute fails on a template that doesnt exist", - args: []string{subchart1ChartPath, "-x", "templates/thisdoesntexist.yaml"}, + desc: "verify --execute fails on a template that doesn't exist", + args: []string{subchart1ChartPath, "-x", "templates/thisdoesn'texist.yaml"}, expectError: "could not find template", }, { From 4d579bbbdff7d9b7c6b380d256f29a5732147d22 Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 17 May 2018 09:24:25 +0800 Subject: [PATCH 095/483] Fix(helm): fix the bug of the charts not deployed after downloaded in helm install --dep-up helm install --dep-up does not deploy the charts downloaded by itself. I reload the charts path after downloading the missing charts. Closes #3423 --- cmd/helm/install.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index d1c24c2131e..ae50684e89e 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -258,6 +258,12 @@ func (i *installCmd) run() error { if err := man.Update(); err != nil { return prettyError(err) } + + // Update all dependencies which are present in /charts. + chartRequested, err = chartutil.Load(i.chartPath) + if err != nil { + return prettyError(err) + } } else { return prettyError(err) } From f89a5a729913bb3ebfca1218432c0acbdb84c47e Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Thu, 24 May 2018 11:53:46 -0700 Subject: [PATCH 096/483] add SECURITY_CONTACTS --- SECURITY_CONTACTS | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 SECURITY_CONTACTS diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS new file mode 100644 index 00000000000..7298ea2d290 --- /dev/null +++ b/SECURITY_CONTACTS @@ -0,0 +1,20 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://github.com/kubernetes/helm/blob/master/CONTRIBUTING.md#reporting-a-security-issue + +adamreese +bacongobbler +mattfarina +michelleN +prydonius +SlickNik +technosophos +thomastaylor312 From 8ce64076d34ae95aec7c28b58c46916be6009ebe Mon Sep 17 00:00:00 2001 From: Curtis Mattoon Date: Thu, 14 Jun 2018 12:05:24 -0400 Subject: [PATCH 097/483] Do not fail linting because of missing 'required' template values --- pkg/engine/engine.go | 13 +++++++++++++ pkg/lint/rules/template.go | 1 + 2 files changed, 14 insertions(+) diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index 7a940fc84bc..c2e74af5c97 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -19,6 +19,7 @@ package engine import ( "bytes" "fmt" + "log" "path" "sort" "strings" @@ -39,6 +40,8 @@ type Engine struct { // a value that was not passed in. Strict bool CurrentTemplates map[string]renderable + // In LintMode, some 'required' template values may be missing, so don't fail + LintMode bool } // New creates a new Go template Engine instance. @@ -155,9 +158,19 @@ func (e *Engine) alterFuncMap(t *template.Template) template.FuncMap { // Add the 'required' function here funcMap["required"] = func(warn string, val interface{}) (interface{}, error) { if val == nil { + if e.LintMode { + // Don't fail on missing required values when linting + log.Printf("[INFO] Missing required value: %s", warn) + return val, nil + } return val, fmt.Errorf(warn) } else if _, ok := val.(string); ok { if val == "" { + if e.LintMode { + // Don't fail on missing required values when linting + log.Printf("[INFO] Missing required value: %s", warn) + return val, nil + } return val, fmt.Errorf(warn) } } diff --git a/pkg/lint/rules/template.go b/pkg/lint/rules/template.go index a8b6a675708..3bddcf5fc31 100644 --- a/pkg/lint/rules/template.go +++ b/pkg/lint/rules/template.go @@ -76,6 +76,7 @@ func Templates(linter *support.Linter, values []byte, namespace string, strict b return } e := engine.New() + e.LintMode = true if strict { e.Strict = true } From 5041d741878820c000546b5ed87d5938aa6c4996 Mon Sep 17 00:00:00 2001 From: James Munnelly Date: Sat, 16 Jun 2018 18:07:08 +0100 Subject: [PATCH 098/483] Add 'name' label to created namespaces --- pkg/kube/namespace.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/kube/namespace.go b/pkg/kube/namespace.go index 6547e4abc28..c6878bd0f7b 100644 --- a/pkg/kube/namespace.go +++ b/pkg/kube/namespace.go @@ -27,6 +27,9 @@ func createNamespace(client internalclientset.Interface, namespace string) error ns := &core.Namespace{ ObjectMeta: metav1.ObjectMeta{ Name: namespace, + Labels: map[string]string{ + "name": namespace, + }, }, } _, err := client.Core().Namespaces().Create(ns) From aae233e7629e87ed391321df8e7bc0bf66c89371 Mon Sep 17 00:00:00 2001 From: Gage Hugo Date: Tue, 19 Jun 2018 10:58:02 -0500 Subject: [PATCH 099/483] chore(sprig): bump sprig to 2.15.0 This change updates sprig to 2.15, which has support for generating SSL certificates in charts from user defined CA certificates. --- glide.lock | 21 ++++++++++----------- glide.yaml | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/glide.lock b/glide.lock index a91c31b7b1c..eef256fd151 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 4023a1644d60060fbf2fdbbe5b73cbb4b957eb686ce925640d102db2d1858676 -updated: 2018-04-14T11:27:34.604716498-04:00 +hash: 41304a2eabc68608507c034304ce87cbf76924c90caaafbe42a9be16e6265868 +updated: 2018-06-19T14:50:56.238468981-05:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -89,7 +89,7 @@ imports: subpackages: - spdy - name: github.com/evanphx/json-patch - version: 944e07253867aacae43c04b2e6a239005443f33a + version: 94e38aa1586e8a6c8a75770bddf5ff84c48a106b - name: github.com/exponent-io/jsonpath version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5 - name: github.com/fatih/camelcase @@ -250,7 +250,7 @@ imports: - name: github.com/spf13/pflag version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7 - name: github.com/technosophos/moniker - version: ab470f5e105a44d0c87ea21bacd6a335c4816d83 + version: a5dbd03a2245d554160e3ae6bfdcf969fe58b431 - name: golang.org/x/crypto version: 81e90905daefcd6fd217b62423c0908922eadb30 subpackages: @@ -359,9 +359,9 @@ imports: - json - jwt - name: gopkg.in/yaml.v2 - version: 53feefa2559fb8dfa8d81baad31be332c97d6c77 + version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: c699ec51538f0cfd4afa8bfcfe1e0779cafbe666 + version: 8b7507fac302640dd5f1efbf9643199952cc58db subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -398,7 +398,7 @@ imports: subpackages: - pkg/features - name: k8s.io/apimachinery - version: 54101a56dda9a0962bc48751c058eb4c546dcbb9 + version: f6313580a4d36c7c74a3d845dda6e116642c4f90 subpackages: - pkg/api/equality - pkg/api/errors @@ -455,7 +455,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: ea53f8588c655568158b4ff53f5ec6fa4ebfc332 + version: f7914ed3085badf66a1b6f3a5218ada28f7bd084 subpackages: - pkg/apis/audit - pkg/authentication/authenticator @@ -640,12 +640,12 @@ imports: - util/retry - util/workqueue - name: k8s.io/kube-openapi - version: 50ae88d24ede7b8bad68e23c805b5d3da5c8abaf + version: 39cb288412c48cb533ba4be5d6c28620b9a0c1b4 subpackages: - pkg/util/proto - pkg/util/proto/validation - name: k8s.io/kubernetes - version: baab3992147260d47cb59b9c485a24fdeff2e457 + version: 32ac1c9073b132b8ba18aa830f46b77dcceb0723 subpackages: - pkg/api/events - pkg/api/legacyscheme @@ -767,7 +767,6 @@ imports: - pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake - - pkg/client/conditions - pkg/cloudprovider - pkg/controller - pkg/controller/daemon diff --git a/glide.yaml b/glide.yaml index fc3dcc37d03..a101a11eef3 100644 --- a/glide.yaml +++ b/glide.yaml @@ -13,7 +13,7 @@ import: - package: github.com/imdario/mergo version: 6633656539c1639d9d78127b7d47c622b5d7b6dc - package: github.com/Masterminds/sprig - version: ^2.14.1 + version: ^2.15.0 - package: github.com/ghodss/yaml - package: github.com/Masterminds/semver version: ~1.3.1 From b3c583b855f0c10bc3adb2a4f019e0e752643d83 Mon Sep 17 00:00:00 2001 From: Jon Kalfayan Date: Wed, 27 Jun 2018 21:31:40 -0700 Subject: [PATCH 100/483] add nil check in if statement configmap example, also note why --- docs/chart_template_guide/control_structures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 7575ebc356a..1844bd3936c 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -53,10 +53,10 @@ data: myvalue: "Hello World" drink: {{ .Values.favorite.drink | default "tea" | quote }} food: {{ .Values.favorite.food | upper | quote }} - {{ if eq .Values.favorite.drink "coffee" }}mug: true{{ end }} + {{ if (.Values.favorite.drink) and eq .Values.favorite.drink "coffee" }}mug: true{{ end }} ``` -Since we commented out `drink: coffee` in our last example, the output should not include a `mug: true` flag. But if we add that line back into our `values.yaml` file, the output should look like this: +Note that `.Values.favorite.drink` must be defined or else it will throw an error when comparing it to "coffee". Since we commented out `drink: coffee` in our last example, the output should not include a `mug: true` flag. But if we add that line back into our `values.yaml` file, the output should look like this: ```yaml # Source: mychart/templates/configmap.yaml From d75d35da82d707614fae9626ec1a5e5cd8dc25f5 Mon Sep 17 00:00:00 2001 From: Junya Ogasawara Date: Fri, 29 Jun 2018 14:06:54 +0900 Subject: [PATCH 101/483] Change permission of index.yaml Because index.yaml generated by a command `helm repo index` isn't executable file, but just configuration file. --- cmd/helm/repo_index.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/helm/repo_index.go b/cmd/helm/repo_index.go index 540057eb843..939f35ac019 100644 --- a/cmd/helm/repo_index.go +++ b/cmd/helm/repo_index.go @@ -91,7 +91,7 @@ func index(dir, url, mergeTo string) error { var i2 *repo.IndexFile if _, err := os.Stat(mergeTo); os.IsNotExist(err) { i2 = repo.NewIndexFile() - i2.WriteFile(mergeTo, 0755) + i2.WriteFile(mergeTo, 0644) } else { i2, err = repo.LoadIndexFile(mergeTo) if err != nil { @@ -101,5 +101,5 @@ func index(dir, url, mergeTo string) error { i.Merge(i2) } i.SortEntries() - return i.WriteFile(out, 0755) + return i.WriteFile(out, 0644) } From 81994381c1e940d8938766293c36fa03db0026d8 Mon Sep 17 00:00:00 2001 From: roc Date: Thu, 5 Jul 2018 11:50:03 +0800 Subject: [PATCH 102/483] Support Stdin when using downloaders of plugin Inject os.Stdin into the command of helm plugin's downloaders --- pkg/getter/plugingetter.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/getter/plugingetter.go b/pkg/getter/plugingetter.go index c747eef7fdd..a73ccc85398 100644 --- a/pkg/getter/plugingetter.go +++ b/pkg/getter/plugingetter.go @@ -69,6 +69,7 @@ func (p *pluginGetter) Get(href string) (*bytes.Buffer, error) { buf := bytes.NewBuffer(nil) prog.Stdout = buf prog.Stderr = os.Stderr + prog.Stdin = os.Stdin if err := prog.Run(); err != nil { if eerr, ok := err.(*exec.ExitError); ok { os.Stderr.Write(eerr.Stderr) From a3a1034e084e6b695ce9c4f9f2d7dfd03e5703ca Mon Sep 17 00:00:00 2001 From: flynnduism Date: Thu, 5 Jul 2018 15:15:59 -0700 Subject: [PATCH 103/483] docs(chore): add svg logo --- docs/logos/helm-blue-vector.svg | 27 ++++++ docs/logos/helm-white-vector.svg | 27 ++++++ docs/logos/helm.svg | 153 +++++++++++++++++++++++++++++++ 3 files changed, 207 insertions(+) create mode 100755 docs/logos/helm-blue-vector.svg create mode 100755 docs/logos/helm-white-vector.svg create mode 100644 docs/logos/helm.svg diff --git a/docs/logos/helm-blue-vector.svg b/docs/logos/helm-blue-vector.svg new file mode 100755 index 00000000000..b8707ba909e --- /dev/null +++ b/docs/logos/helm-blue-vector.svg @@ -0,0 +1,27 @@ + + + + logo + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/docs/logos/helm-white-vector.svg b/docs/logos/helm-white-vector.svg new file mode 100755 index 00000000000..4b5163d8f37 --- /dev/null +++ b/docs/logos/helm-white-vector.svg @@ -0,0 +1,27 @@ + + + + logo white + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/logos/helm.svg b/docs/logos/helm.svg new file mode 100644 index 00000000000..2d8858e9381 --- /dev/null +++ b/docs/logos/helm.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 69f10ca73be76e2fc2567b97f8a8bb142e38a49d Mon Sep 17 00:00:00 2001 From: AdamDang Date: Fri, 6 Jul 2018 15:46:20 +0800 Subject: [PATCH 104/483] Some small typos: Some small typos: Line 92: stategies->strategies Line 263: namepace->namespace Line 266: ReuseName->Reuse_name --- _proto/hapi/services/tiller.proto | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 8daef0cb3e1..f1f3ab27a14 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -89,7 +89,7 @@ service ReleaseService { // // Releases can be retrieved in chunks by setting limit and offset. // -// Releases can be sorted according to a few pre-determined sort stategies. +// Releases can be sorted according to a few pre-determined sort strategies. message ListReleasesRequest { // Limit is the maximum number of releases to be returned. int64 limit = 1; @@ -260,10 +260,10 @@ message InstallReleaseRequest { // DisableHooks causes the server to skip running any hooks for the install. bool disable_hooks = 5; - // Namepace is the kubernetes namespace of the release. + // Namespace is the kubernetes namespace of the release. string namespace = 6; - // ReuseName requests that Tiller re-uses a name, instead of erroring out. + // Reuse_name requests that Tiller re-uses a name, instead of erroring out. bool reuse_name = 7; // timeout specifies the max amount of time any kubernetes client command can run. From c551fb7ef6e51e149a77d650440f8a61c7d493d5 Mon Sep 17 00:00:00 2001 From: roc Date: Sun, 8 Jul 2018 17:08:48 +0800 Subject: [PATCH 105/483] docs(helm): add helm-cos to related helm plugins --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index bf55df549fa..bac9e899bfb 100644 --- a/docs/related.md +++ b/docs/related.md @@ -39,6 +39,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely - [helm-edit](https://github.com/mstrzele/helm-edit) - Plugin for editing release's values - [helm-gcs](https://github.com/nouney/helm-gcs) - Plugin to manage repositories on Google Cloud Storage +- [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-github](https://github.com/sagansystems/helm-github) - Plugin to install Helm Charts from Github repositories - [helm-monitor](https://github.com/ContainerSolutions/helm-monitor) - Plugin to monitor a release and rollback based on Prometheus/ElasticSearch query - [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp From 5a43a80e95e9155a2880cf12119822e33734c127 Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Tue, 10 Jul 2018 18:18:41 -0400 Subject: [PATCH 106/483] chore(docs): lowercase `Kind` for clarity `Kind` being upper case makes it seem like we're referrring to the Kind field of a Kubernetes resource but we're really talking about the kind of helm hook in this case. resolves #4302 --- docs/charts_hooks.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index f51749f57be..b6c276bbad7 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -183,8 +183,7 @@ deterministic executing order. Weights are defined using the following annotatio ``` Hook weights can be positive or negative numbers but must be represented as -strings. When Tiller starts the execution cycle of hooks of a particular Kind it -will sort those hooks in ascending order. +strings. When Tiller starts the execution cycle of hooks of a particular kind (ex. the `pre-install` hooks or `post-install` hooks, etc.) it will sort those hooks in ascending order. It is also possible to define policies that determine when to delete corresponding hook resources. Hook deletion policies are defined using the following annotation: From 6767f3cf08b30fda5f031cda7e2d0cb9d66a7bd8 Mon Sep 17 00:00:00 2001 From: fibonacci1729 Date: Tue, 10 Jul 2018 17:51:03 -0600 Subject: [PATCH 107/483] fix(helm): return when listing with no releases or nil --- cmd/helm/list.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 4614c7f6738..47417749f80 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -166,8 +166,11 @@ func (l *listCmd) run() error { if err != nil { return prettyError(err) } + if res == nil { + return nil + } - rels := filterList(res.Releases) + rels := filterList(res.GetReleases()) result := getListResult(rels, res.Next) From c6a572a38e1f9e7d9bbd1e902137198d8eba4dbf Mon Sep 17 00:00:00 2001 From: flynnduism Date: Wed, 11 Jul 2018 13:03:00 -0700 Subject: [PATCH 108/483] docs(chore): scale svg up to 620 initial width/height --- docs/logos/helm-blue-vector.svg | 70 ++++++++++++++++++++------------ docs/logos/helm-white-vector.svg | 70 ++++++++++++++++++++------------ 2 files changed, 86 insertions(+), 54 deletions(-) mode change 100755 => 100644 docs/logos/helm-blue-vector.svg mode change 100755 => 100644 docs/logos/helm-white-vector.svg diff --git a/docs/logos/helm-blue-vector.svg b/docs/logos/helm-blue-vector.svg old mode 100755 new mode 100644 index b8707ba909e..45f2c2f8620 --- a/docs/logos/helm-blue-vector.svg +++ b/docs/logos/helm-blue-vector.svg @@ -1,27 +1,43 @@ - - - - logo - Created with Sketch. - - - - - - - \ No newline at end of file + + + + +logo +Created with Sketch. + + + + + + diff --git a/docs/logos/helm-white-vector.svg b/docs/logos/helm-white-vector.svg old mode 100755 new mode 100644 index 4b5163d8f37..0f09be31efd --- a/docs/logos/helm-white-vector.svg +++ b/docs/logos/helm-white-vector.svg @@ -1,27 +1,43 @@ - - - - logo white - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + +logo white +Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + From 917c1a6b1169b28d0f4841d640f2cb13a5177b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Magnusson?= Date: Wed, 11 Jul 2018 23:03:16 +0200 Subject: [PATCH 109/483] CONTRIBUTING.md: Corrected slack channel/s in support channels --- CONTRIBUTING.md | 102 ++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8fecb047998..81ed009d475 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,9 @@ apply to [third_party](third_party/) and [vendor](vendor/). Whether you are a user or contributor, official support channels include: - GitHub [issues](https://github.com/kubernetes/helm/issues/new) -- Slack: #Helm room in the [Kubernetes Slack](http://slack.kubernetes.io/) +- Slack [Kubernetes Slack](http://slack.kubernetes.io/): + - User: #helm-users + - Contributor: #helm-dev Before opening a new issue or submitting a new pull request, it's helpful to search the project - it's likely that another user has already reported the issue you're facing, or it's a known issue that we're already aware of. @@ -40,15 +42,15 @@ Before opening a new issue or submitting a new pull request, it's helpful to sea We use milestones to track progress of releases. There are also 2 special milestones used for helping us keep work organized: `Upcoming - Minor` and `Upcoming - Major` -`Upcoming - Minor` is used for keeping track of issues that aren't assigned to a specific +`Upcoming - Minor` is used for keeping track of issues that aren't assigned to a specific release but could easily be addressed in a minor release. `Upcoming - Major` keeps track -of issues that will need to be addressed in a major release. For example, if the current -version is `2.2.0` an issue/PR could fall in to one of 4 different active milestones: -`2.2.1`, `2.3.0`, `Upcoming - Minor`, or `Upcoming - Major`. If an issue pertains to a -specific upcoming bug or minor release, it would go into `2.2.1` or `2.3.0`. If the issue/PR -does not have a specific milestone yet, but it is likely that it will land in a `2.X` release, -it should go into `Upcoming - Minor`. If the issue/PR is a large functionality add or change -and/or it breaks compatibility, then it should be added to the `Upcoming - Major` milestone. +of issues that will need to be addressed in a major release. For example, if the current +version is `2.2.0` an issue/PR could fall in to one of 4 different active milestones: +`2.2.1`, `2.3.0`, `Upcoming - Minor`, or `Upcoming - Major`. If an issue pertains to a +specific upcoming bug or minor release, it would go into `2.2.1` or `2.3.0`. If the issue/PR +does not have a specific milestone yet, but it is likely that it will land in a `2.X` release, +it should go into `Upcoming - Minor`. If the issue/PR is a large functionality add or change +and/or it breaks compatibility, then it should be added to the `Upcoming - Major` milestone. An issue that we are not sure we will be doing will not be added to any milestone. A milestone (and hence release) is considered done when all outstanding issues/PRs have been closed or moved to another milestone. @@ -75,42 +77,42 @@ Issues are used as the primary method for tracking anything to do with the Helm ### Issue Types There are 4 types of issues (each with their own corresponding [label](#labels)): -- Question: These are support or functionality inquiries that we want to have a record of for -future reference. Generally these are questions that are too complex or large to store in the -Slack channel or have particular interest to the community as a whole. Depending on the discussion, +- Question: These are support or functionality inquiries that we want to have a record of for +future reference. Generally these are questions that are too complex or large to store in the +Slack channel or have particular interest to the community as a whole. Depending on the discussion, these can turn into "Feature" or "Bug" issues. -- Proposal: Used for items (like this one) that propose a new ideas or functionality that require -a larger community discussion. This allows for feedback from others in the community before a -feature is actually developed. This is not needed for small additions. Final word on whether or -not a feature needs a proposal is up to the core maintainers. All issues that are proposals should -both have a label and an issue title of "Proposal: [the rest of the title]." A proposal can become +- Proposal: Used for items (like this one) that propose a new ideas or functionality that require +a larger community discussion. This allows for feedback from others in the community before a +feature is actually developed. This is not needed for small additions. Final word on whether or +not a feature needs a proposal is up to the core maintainers. All issues that are proposals should +both have a label and an issue title of "Proposal: [the rest of the title]." A proposal can become a "Feature" and does not require a milestone. -- Features: These track specific feature requests and ideas until they are complete. They can evolve +- Features: These track specific feature requests and ideas until they are complete. They can evolve from a "Proposal" or can be submitted individually depending on the size. - Bugs: These track bugs with the code or problems with the documentation (i.e. missing or incomplete) ### Issue Lifecycle -The issue lifecycle is mainly driven by the core maintainers, but is good information for those +The issue lifecycle is mainly driven by the core maintainers, but is good information for those contributing to Helm. All issue types follow the same general lifecycle. Differences are noted below. 1. Issue creation 2. Triage - - The maintainer in charge of triaging will apply the proper labels for the issue. This - includes labels for priority, type, and metadata (such as "starter"). The only issue - priority we will be tracking is whether or not the issue is "critical." If additional + - The maintainer in charge of triaging will apply the proper labels for the issue. This + includes labels for priority, type, and metadata (such as "starter"). The only issue + priority we will be tracking is whether or not the issue is "critical." If additional levels are needed in the future, we will add them. - - (If needed) Clean up the title to succinctly and clearly state the issue. Also ensure + - (If needed) Clean up the title to succinctly and clearly state the issue. Also ensure that proposals are prefaced with "Proposal". - - Add the issue to the correct milestone. If any questions come up, don't worry about + - Add the issue to the correct milestone. If any questions come up, don't worry about adding the issue to a milestone until the questions are answered. - We attempt to do this process at least once per work day. 3. Discussion - - "Feature" and "Bug" issues should be connected to the PR that resolves it. - - Whoever is working on a "Feature" or "Bug" issue (whether a maintainer or someone from - the community), should either assign the issue to them self or make a comment in the issue + - "Feature" and "Bug" issues should be connected to the PR that resolves it. + - Whoever is working on a "Feature" or "Bug" issue (whether a maintainer or someone from + the community), should either assign the issue to them self or make a comment in the issue saying that they are taking it. - - "Proposal" and "Question" issues should stay open until resolved or if they have not been - active for more than 30 days. This will help keep the issue queue to a manageable size and + - "Proposal" and "Question" issues should stay open until resolved or if they have not been + active for more than 30 days. This will help keep the issue queue to a manageable size and reduce noise. Should the issue need to stay open, the `keep open` label can be added. 4. Issue closure @@ -133,36 +135,36 @@ Like any good open source project, we use Pull Requests to track code changes 1. PR creation - We more than welcome PRs that are currently in progress. They are a great way to keep track of - important work that is in-flight, but useful for others to see. If a PR is a work in progress, + important work that is in-flight, but useful for others to see. If a PR is a work in progress, it **must** be prefaced with "WIP: [title]". Once the PR is ready for review, remove "WIP" from the title. - It is preferred, but not required, to have a PR tied to a specific issue. 2. Triage - - The maintainer in charge of triaging will apply the proper labels for the issue. This should - include at least a size label, `bug` or `feature`, and `awaiting review` once all labels are applied. + - The maintainer in charge of triaging will apply the proper labels for the issue. This should + include at least a size label, `bug` or `feature`, and `awaiting review` once all labels are applied. See the [Labels section](#labels) for full details on the definitions of labels - Add the PR to the correct milestone. This should be the same as the issue the PR closes. 3. Assigning reviews - - Once a review has the `awaiting review` label, maintainers will review them as schedule permits. + - Once a review has the `awaiting review` label, maintainers will review them as schedule permits. The maintainer who takes the issue should self-request a review. - - Reviews from others in the community, especially those who have encountered a bug or have - requested a feature, are highly encouraged, but not required. Maintainer reviews **are** required + - Reviews from others in the community, especially those who have encountered a bug or have + requested a feature, are highly encouraged, but not required. Maintainer reviews **are** required before any merge - - Any PR with the `size/large` label requires 2 review approvals from maintainers before it can be + - Any PR with the `size/large` label requires 2 review approvals from maintainers before it can be merged. Those with `size/medium` are per the judgement of the maintainers 4. Reviewing/Discussion - - Once a maintainer begins reviewing a PR, they will remove the `awaiting review` label and add - the `in progress` label so the person submitting knows that it is being worked on. This is + - Once a maintainer begins reviewing a PR, they will remove the `awaiting review` label and add + the `in progress` label so the person submitting knows that it is being worked on. This is especially helpful when the review may take awhile. - All reviews will be completed using Github review tool. - - A "Comment" review should be used when there are questions about the code that should be + - A "Comment" review should be used when there are questions about the code that should be answered, but that don't involve code changes. This type of review does not count as approval. - A "Changes Requested" review indicates that changes to the code need to be made before they will be merged. - Reviewers should update labels as needed (such as `needs rebase`) 5. Address comments by answering questions or changing code 6. Merge or close - - PRs should stay open until merged or if they have not been active for more than 30 days. - This will help keep the PR queue to a manageable size and reduce noise. Should the PR need + - PRs should stay open until merged or if they have not been active for more than 30 days. + This will help keep the PR queue to a manageable size and reduce noise. Should the PR need to stay open (like in the case of a WIP), the `keep open` label can be added. - If the owner of the PR is listed in `OWNERS`, that user **must** merge their own PRs or explicitly request another OWNER do that for them. @@ -171,14 +173,14 @@ Like any good open source project, we use Pull Requests to track code changes #### Documentation PRs -Documentation PRs will follow the same lifecycle as other PRs. They will also be labeled with the -`docs` label. For documentation, special attention will be paid to spelling, grammar, and clarity +Documentation PRs will follow the same lifecycle as other PRs. They will also be labeled with the +`docs` label. For documentation, special attention will be paid to spelling, grammar, and clarity (whereas those things don't matter *as* much for comments in code). ## The Triager -Each week, one of the core maintainers will serve as the designated "triager" starting after the -public standup meetings on Thursday. This person will be in charge triaging new PRs and issues +Each week, one of the core maintainers will serve as the designated "triager" starting after the +public standup meetings on Thursday. This person will be in charge triaging new PRs and issues throughout the work week. ## Labels @@ -222,11 +224,11 @@ The following tables define all label types used for Helm. It is split up by cat #### Size labels -Size labels are used to indicate how "dangerous" a PR is. The guidelines below are used to assign the -labels, but ultimately this can be changed by the maintainers. For example, even if a PR only makes -30 lines of changes in 1 file, but it changes key functionality, it will likely be labeled as `size/large` -because it requires sign off from multiple people. Conversely, a PR that adds a small feature, but requires -another 150 lines of tests to cover all cases, could be labeled as `size/small` even though the number +Size labels are used to indicate how "dangerous" a PR is. The guidelines below are used to assign the +labels, but ultimately this can be changed by the maintainers. For example, even if a PR only makes +30 lines of changes in 1 file, but it changes key functionality, it will likely be labeled as `size/large` +because it requires sign off from multiple people. Conversely, a PR that adds a small feature, but requires +another 150 lines of tests to cover all cases, could be labeled as `size/small` even though the number lines is greater than defined below. | Label | Description | From aaf1c6a35218c40d9facc7b8fe1060226cae5fc6 Mon Sep 17 00:00:00 2001 From: fibonacci1729 Date: Thu, 12 Jul 2018 13:26:07 -0600 Subject: [PATCH 110/483] docs(*): update tiller_ssl docs to reflect IP SAN usage. When using helm/tiller in tls-verify mode, 127.0.0.1 should be listed as an IP SAN in the tiller certificate to pass hostname verficiation of the TLS handshake. Closes #4149 --- docs/tiller_ssl.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 6db19550726..963e36e400d 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -284,6 +284,21 @@ the host name that Helm connects to matches the host name on the certificate. In some cases this is awkward, since Helm will connect over localhost, or the FQDN is not available for public resolution. +*If I use `--tls-verify` on the client, I get `Error: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs`* + +By default, the Helm client connects to Tiller via tunnel (i.e. kube proxy) at 127.0.0.1. During the TLS handshake, +a target, usually provided as a hostname (e.g. example.com), is checked against the subject and subject alternative +names of the certificate (i.e. hostname verficiation). However, because of the tunnel, the target is an IP address. +Therefore, to validate the certificate, the IP address 127.0.0.1 must be listed as an IP subject alternative name +(IP SAN) in the Tiller certificate. + +For example, to list 127.0.0.1 as an IP SAN when generating the Tiller certificate: + +```console +$ echo subjectAltName=IP:127.0.0.1 > extfile.cnf +$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem -days 365 -extfile extfile.cnf +``` + *If I use `--tls-verify` on the client, I get `Error: x509: certificate has expired or is not yet valid`* Your helm certificate has expired, you need to sign a new certificate using your private key and the CA (and consider increasing the number of days) From cd6dd313979e68cb4f700ad87387076e77b94572 Mon Sep 17 00:00:00 2001 From: Dusty Rip Date: Sun, 15 Jul 2018 17:26:27 +0200 Subject: [PATCH 111/483] Allow zsh completion to be autoloaded by compinit --- cmd/helm/completion.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index b1cd04140ca..e83a32a1370 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -82,6 +82,8 @@ func runCompletionBash(out io.Writer, cmd *cobra.Command) error { func runCompletionZsh(out io.Writer, cmd *cobra.Command) error { zshInitialization := ` +#compdef helm + __helm_bash_source() { alias shopt=':' alias _expand=_bash_expand From 7faf62a209e91bfae17522e4a63c750a3482f6f3 Mon Sep 17 00:00:00 2001 From: fibonacci1729 Date: Mon, 16 Jul 2018 13:40:42 -0600 Subject: [PATCH 112/483] fix(helm): add --tls-hostname flag to tls-flags --- cmd/helm/helm.go | 11 +++++++++-- pkg/tlsutil/cfg.go | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 4c7ca92909c..99075b8abd9 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -40,6 +40,7 @@ import ( ) var ( + tlsServerName string // overrides the server name used to verify the hostname on the returned certificates from the server. tlsCaCertFile string // path to TLS CA certificate file tlsCertFile string // path to TLS certificate file tlsKeyFile string // path to TLS key file @@ -280,8 +281,13 @@ func newClient() helm.Interface { if tlsKeyFile == "" { tlsKeyFile = settings.Home.TLSKey() } - debug("Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) - tlsopts := tlsutil.Options{KeyFile: tlsKeyFile, CertFile: tlsCertFile, InsecureSkipVerify: true} + debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) + tlsopts := tlsutil.Options{ + ServerName: tlsServerName, + KeyFile: tlsKeyFile, + CertFile: tlsCertFile, + InsecureSkipVerify: true, + } if tlsVerify { tlsopts.CaCertFile = tlsCaCertFile tlsopts.InsecureSkipVerify = false @@ -301,6 +307,7 @@ func newClient() helm.Interface { func addFlagsTLS(cmd *cobra.Command) *cobra.Command { // add flags + cmd.Flags().StringVar(&tlsServerName, "tls-hostname", settings.TillerHost, "the server name used to verify the hostname on the returned certificates from the server") cmd.Flags().StringVar(&tlsCaCertFile, "tls-ca-cert", tlsCaCertDefault, "path to TLS CA certificate file") cmd.Flags().StringVar(&tlsCertFile, "tls-cert", tlsCertDefault, "path to TLS certificate file") cmd.Flags().StringVar(&tlsKeyFile, "tls-key", tlsKeyDefault, "path to TLS key file") diff --git a/pkg/tlsutil/cfg.go b/pkg/tlsutil/cfg.go index 9ce3109e1bd..3cc18d3d225 100644 --- a/pkg/tlsutil/cfg.go +++ b/pkg/tlsutil/cfg.go @@ -33,6 +33,9 @@ type Options struct { CertFile string // Client-only options InsecureSkipVerify bool + // Overrides the server name used to verify the hostname on the returned + // certificates from the server. + ServerName string // Server-only options ClientAuth tls.ClientAuthType } @@ -55,8 +58,12 @@ func ClientConfig(opts Options) (cfg *tls.Config, err error) { return nil, err } } - - cfg = &tls.Config{InsecureSkipVerify: opts.InsecureSkipVerify, Certificates: []tls.Certificate{*cert}, RootCAs: pool} + cfg = &tls.Config{ + InsecureSkipVerify: opts.InsecureSkipVerify, + Certificates: []tls.Certificate{*cert}, + ServerName: opts.ServerName, + RootCAs: pool, + } return cfg, nil } From aedd306e83fa8319ddaaa9df0a9e5111c3538e37 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 16 Jul 2018 13:46:50 -0600 Subject: [PATCH 113/483] Revert "fix(helm): add `--tls-hostname` flag to tls flags." --- cmd/helm/helm.go | 11 ++--------- docs/tiller_ssl.md | 15 --------------- pkg/tlsutil/cfg.go | 11 ++--------- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 99075b8abd9..4c7ca92909c 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -40,7 +40,6 @@ import ( ) var ( - tlsServerName string // overrides the server name used to verify the hostname on the returned certificates from the server. tlsCaCertFile string // path to TLS CA certificate file tlsCertFile string // path to TLS certificate file tlsKeyFile string // path to TLS key file @@ -281,13 +280,8 @@ func newClient() helm.Interface { if tlsKeyFile == "" { tlsKeyFile = settings.Home.TLSKey() } - debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) - tlsopts := tlsutil.Options{ - ServerName: tlsServerName, - KeyFile: tlsKeyFile, - CertFile: tlsCertFile, - InsecureSkipVerify: true, - } + debug("Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) + tlsopts := tlsutil.Options{KeyFile: tlsKeyFile, CertFile: tlsCertFile, InsecureSkipVerify: true} if tlsVerify { tlsopts.CaCertFile = tlsCaCertFile tlsopts.InsecureSkipVerify = false @@ -307,7 +301,6 @@ func newClient() helm.Interface { func addFlagsTLS(cmd *cobra.Command) *cobra.Command { // add flags - cmd.Flags().StringVar(&tlsServerName, "tls-hostname", settings.TillerHost, "the server name used to verify the hostname on the returned certificates from the server") cmd.Flags().StringVar(&tlsCaCertFile, "tls-ca-cert", tlsCaCertDefault, "path to TLS CA certificate file") cmd.Flags().StringVar(&tlsCertFile, "tls-cert", tlsCertDefault, "path to TLS certificate file") cmd.Flags().StringVar(&tlsKeyFile, "tls-key", tlsKeyDefault, "path to TLS key file") diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 963e36e400d..6db19550726 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -284,21 +284,6 @@ the host name that Helm connects to matches the host name on the certificate. In some cases this is awkward, since Helm will connect over localhost, or the FQDN is not available for public resolution. -*If I use `--tls-verify` on the client, I get `Error: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs`* - -By default, the Helm client connects to Tiller via tunnel (i.e. kube proxy) at 127.0.0.1. During the TLS handshake, -a target, usually provided as a hostname (e.g. example.com), is checked against the subject and subject alternative -names of the certificate (i.e. hostname verficiation). However, because of the tunnel, the target is an IP address. -Therefore, to validate the certificate, the IP address 127.0.0.1 must be listed as an IP subject alternative name -(IP SAN) in the Tiller certificate. - -For example, to list 127.0.0.1 as an IP SAN when generating the Tiller certificate: - -```console -$ echo subjectAltName=IP:127.0.0.1 > extfile.cnf -$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem -days 365 -extfile extfile.cnf -``` - *If I use `--tls-verify` on the client, I get `Error: x509: certificate has expired or is not yet valid`* Your helm certificate has expired, you need to sign a new certificate using your private key and the CA (and consider increasing the number of days) diff --git a/pkg/tlsutil/cfg.go b/pkg/tlsutil/cfg.go index 3cc18d3d225..9ce3109e1bd 100644 --- a/pkg/tlsutil/cfg.go +++ b/pkg/tlsutil/cfg.go @@ -33,9 +33,6 @@ type Options struct { CertFile string // Client-only options InsecureSkipVerify bool - // Overrides the server name used to verify the hostname on the returned - // certificates from the server. - ServerName string // Server-only options ClientAuth tls.ClientAuthType } @@ -58,12 +55,8 @@ func ClientConfig(opts Options) (cfg *tls.Config, err error) { return nil, err } } - cfg = &tls.Config{ - InsecureSkipVerify: opts.InsecureSkipVerify, - Certificates: []tls.Certificate{*cert}, - ServerName: opts.ServerName, - RootCAs: pool, - } + + cfg = &tls.Config{InsecureSkipVerify: opts.InsecureSkipVerify, Certificates: []tls.Certificate{*cert}, RootCAs: pool} return cfg, nil } From fc7b1caf9ba81d1b6f9dcf7e0ec66be79d5d99c5 Mon Sep 17 00:00:00 2001 From: "A. Stiles" Date: Mon, 16 Jul 2018 15:47:15 -0500 Subject: [PATCH 114/483] Include exact details to configure storage=secret --- docs/securing_installation.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index f192ad9f867..a489cc837fc 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -65,7 +65,7 @@ For historical reasons, Tiller stores its release information in ConfigMaps. We Secrets are the Kubernetes accepted mechanism for saving configuration data that is considered sensitive. While secrets don't themselves offer many protections, Kubernetes cluster management software often treats them differently than other objects. Thus, we suggest using secrets to store releases. -Enabling this feature currently requires setting the `--storage=secret` flag in the tiller-deploy deployment. This entails directly modifying the deployment or using `helm init --override=...`, as no helm init flag is currently available to do this for you. For more information, see [Using --override](install.md#using---override). +Enabling this feature currently requires setting the `--storage=secret` flag in the tiller-deploy deployment. This entails directly modifying the deployment or using `helm init --override 'spec.template.spec.containers[0].command'='{/tiller,--storage=secret}'`, as no helm init flag is currently available to do this for you. ### Thinking about Charts @@ -93,6 +93,7 @@ If these steps are followed, an example `helm init` command might look something ```bash $ helm init \ +--override 'spec.template.spec.containers[0].command'='{/tiller,--storage=secret}' \ --tiller-tls \ --tiller-tls-verify \ --tiller-tls-cert=cert.pem \ @@ -101,7 +102,7 @@ $ helm init \ --service-account=accountname ``` -This command will start Tiller with both strong authentication over gRPC, and a service account to which RBAC policies have been applied. +This command will start Tiller with strong authentication over gRPC, release information stored in a Kubernetes Secret, and a service account to which RBAC policies have been applied. From 327080161dce6921ec5ca085d404b7cadbdc3ae7 Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Mon, 16 Jul 2018 17:10:16 -0700 Subject: [PATCH 115/483] [fake] make InstallReleaseFromChart obey DryRun --- pkg/helm/fake.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 2f0ad90b86f..39909cfcdde 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -97,7 +97,9 @@ func (c *FakeClient) InstallReleaseFromChart(chart *chart.Chart, ns string, opts } release := ReleaseMock(&MockReleaseOptions{Name: releaseName, Namespace: ns, Description: releaseDescription}) - c.Rels = append(c.Rels, release) + if !c.Opts.dryRun { + c.Rels = append(c.Rels, release) + } return &rls.InstallReleaseResponse{ Release: release, From a6ab04be4d6f214e664a388101cdd8ace56015ab Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Mon, 16 Jul 2018 17:15:56 -0700 Subject: [PATCH 116/483] [fake] return the correct error message for missing releases --- pkg/helm/fake.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 39909cfcdde..05235c92a31 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -18,7 +18,6 @@ package helm // import "k8s.io/helm/pkg/helm" import ( "errors" - "fmt" "math/rand" "sync" @@ -27,6 +26,7 @@ import ( "k8s.io/helm/pkg/proto/hapi/release" rls "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/proto/hapi/version" + storage "k8s.io/helm/pkg/storage/driver" ) // FakeClient implements Interface @@ -117,7 +117,7 @@ func (c *FakeClient) DeleteRelease(rlsName string, opts ...DeleteOption) (*rls.U } } - return nil, fmt.Errorf("No such release: %s", rlsName) + return nil, storage.ErrReleaseNotFound(rlsName) } // GetVersion returns a fake version @@ -161,7 +161,7 @@ func (c *FakeClient) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.G }, nil } } - return nil, fmt.Errorf("No such release: %s", rlsName) + return nil, storage.ErrReleaseNotFound(rlsName) } // ReleaseContent returns the configuration for the matching release name in the fake release client. @@ -173,7 +173,7 @@ func (c *FakeClient) ReleaseContent(rlsName string, opts ...ContentOption) (resp }, nil } } - return resp, fmt.Errorf("No such release: %s", rlsName) + return resp, storage.ErrReleaseNotFound(rlsName) } // ReleaseHistory returns a release's revision history. From 01da56f956329bbfcef14ac164f9ab49081ad108 Mon Sep 17 00:00:00 2001 From: Erik Sundell Date: Wed, 18 Jul 2018 16:01:11 -0400 Subject: [PATCH 117/483] helm template cmd - conformity of output (#3811) By changing a string from `##---` to `---` the output written to files matches the output generated to stdout. --- cmd/helm/template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 7e3eb48a743..9ba21787112 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -309,7 +309,7 @@ func writeToFile(outputDir string, name string, data string) error { defer f.Close() - _, err = f.WriteString(fmt.Sprintf("##---\n# Source: %s\n%s", name, data)) + _, err = f.WriteString(fmt.Sprintf("---\n# Source: %s\n%s", name, data)) if err != nil { return err From 93ead1d0c9d7bdfb70c3530e9e8ab8bb26553442 Mon Sep 17 00:00:00 2001 From: Ihor Dvoretskyi Date: Thu, 19 Jul 2018 01:54:06 +0300 Subject: [PATCH 118/483] Slack channels now have URL's --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fc091056ef0..0b3d902474b 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ The [Helm roadmap uses Github milestones](https://github.com/kubernetes/helm/mil You can reach the Helm community and developers via the following channels: - [Kubernetes Slack](http://slack.k8s.io): - - #helm-users - - #helm-dev - - #charts + - [#helm-users](https://kubernetes.slack.com/messages/helm-users) + - [#helm-dev](https://kubernetes.slack.com/messages/helm-dev) + - [#charts](https://kubernetes.slack.com/messages/charts) - Mailing Lists: - [Helm Mailing List](https://lists.cncf.io/g/cncf-kubernetes-helm) - [Kubernetes SIG Apps Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-apps) From 57e7b07c3e9fedd46cd81db4e9315f7edca3dd6e Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Fri, 20 Jul 2018 12:12:08 -0400 Subject: [PATCH 119/483] ref(docs): add more links to tiller rbac info --- docs/install.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/install.md b/docs/install.md index 17905a805f3..cc7f75a3aca 100755 --- a/docs/install.md +++ b/docs/install.md @@ -122,6 +122,7 @@ You can explicitly tell `helm init` to... - Install a particular image (version) with `--tiller-image` - Install to a particular cluster with `--kube-context` - Install into a particular namespace with `--tiller-namespace` +- Install Tiller with a Service Account with `--service-account` (for [RBAC enabled clusters](securing_installation.md#rbac)) Once Tiller is installed, running `helm version` should show you both the client and server version. (If it shows only the client version, From 30f245c0d3178cb185c0a72e0c79369626e221ce Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Fri, 20 Jul 2018 13:23:43 -0400 Subject: [PATCH 120/483] docs(rbac.md): delete redundant step --- docs/rbac.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/rbac.md b/docs/rbac.md index 36d06e62a74..4af36203cc9 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -14,11 +14,6 @@ Once you have satisfied the pre-requisite and have a service account with the co ### Example: Service account with cluster-admin role -```console -$ kubectl create serviceaccount tiller --namespace kube-system -serviceaccount "tiller" created -``` - In `rbac-config.yaml`: ```yaml From 02f8130dbe1d46e5c8c47c8db9f2420c69e4aeb0 Mon Sep 17 00:00:00 2001 From: Dan Clarke Date: Fri, 20 Jul 2018 18:42:17 +0100 Subject: [PATCH 121/483] Add missing space MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Yeah, I know - very trivial, but ¯\_(ツ)_/¯ :) --- docs/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 52a7c800f9e..8622137b23d 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -65,7 +65,7 @@ This will install Tiller into the Kubernetes cluster you saw with **TIP:** When you want to upgrade Tiller, just run `helm init --upgrade`. -By default, when Tiller is installed,it does not have authentication enabled. +By default, when Tiller is installed, it does not have authentication enabled. To learn more about configuring strong TLS authentication for Tiller, consult [the Tiller TLS guide](tiller_ssl.md). From 4efa18a5ec135229e36d3aeaca0f3cfa5a0fdb38 Mon Sep 17 00:00:00 2001 From: Rohan Chakravarthy Date: Mon, 23 Jul 2018 12:40:54 -0700 Subject: [PATCH 122/483] feat(helm): Add the --kubeconfig flag (#4235) Adds the ability to specify a kubeconfig file that overrides $KUBECONFIG --- cmd/helm/helm.go | 14 +++++++------- cmd/helm/init.go | 4 ++-- cmd/helm/install.go | 2 +- cmd/helm/reset.go | 2 +- cmd/helm/version.go | 8 +++++--- docs/helm/helm.md | 3 ++- docs/helm/helm_completion.md | 3 ++- docs/helm/helm_create.md | 3 ++- docs/helm/helm_delete.md | 3 ++- docs/helm/helm_dependency.md | 3 ++- docs/helm/helm_dependency_build.md | 3 ++- docs/helm/helm_dependency_list.md | 3 ++- docs/helm/helm_dependency_update.md | 3 ++- docs/helm/helm_fetch.md | 3 +++ docs/helm/helm_get.md | 3 ++- docs/helm/helm_get_hooks.md | 3 ++- docs/helm/helm_get_manifest.md | 3 ++- docs/helm/helm_get_values.md | 3 ++- docs/helm/helm_history.md | 3 ++- docs/helm/helm_home.md | 3 ++- docs/helm/helm_init.md | 3 ++- docs/helm/helm_inspect.md | 3 ++- docs/helm/helm_inspect_chart.md | 3 ++- docs/helm/helm_inspect_readme.md | 3 ++- docs/helm/helm_inspect_values.md | 3 ++- docs/helm/helm_install.md | 3 ++- docs/helm/helm_lint.md | 3 ++- docs/helm/helm_list.md | 3 ++- docs/helm/helm_package.md | 3 ++- docs/helm/helm_plugin.md | 3 ++- docs/helm/helm_plugin_install.md | 3 ++- docs/helm/helm_plugin_list.md | 3 ++- docs/helm/helm_plugin_remove.md | 3 ++- docs/helm/helm_plugin_update.md | 3 ++- docs/helm/helm_repo.md | 3 ++- docs/helm/helm_repo_add.md | 3 ++- docs/helm/helm_repo_index.md | 3 ++- docs/helm/helm_repo_list.md | 3 ++- docs/helm/helm_repo_remove.md | 3 ++- docs/helm/helm_repo_update.md | 3 ++- docs/helm/helm_reset.md | 3 ++- docs/helm/helm_rollback.md | 3 ++- docs/helm/helm_search.md | 3 ++- docs/helm/helm_serve.md | 3 ++- docs/helm/helm_status.md | 3 ++- docs/helm/helm_template.md | 3 ++- docs/helm/helm_test.md | 3 ++- docs/helm/helm_upgrade.md | 3 ++- docs/helm/helm_verify.md | 3 ++- docs/helm/helm_version.md | 3 ++- pkg/helm/environment/environment.go | 3 +++ pkg/helm/environment/environment_test.go | 10 +++++++--- pkg/kube/config.go | 11 +++++++++-- 53 files changed, 126 insertions(+), 63 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 4c7ca92909c..be3ced37611 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -169,7 +169,7 @@ func markDeprecated(cmd *cobra.Command, notice string) *cobra.Command { func setupConnection() error { if settings.TillerHost == "" { - config, client, err := getKubeClient(settings.KubeContext) + config, client, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return err } @@ -223,8 +223,8 @@ func prettyError(err error) error { } // configForContext creates a Kubernetes REST client configuration for a given kubeconfig context. -func configForContext(context string) (*rest.Config, error) { - config, err := kube.GetConfig(context).ClientConfig() +func configForContext(context string, kubeconfig string) (*rest.Config, error) { + config, err := kube.GetConfig(context, kubeconfig).ClientConfig() if err != nil { return nil, fmt.Errorf("could not get Kubernetes config for context %q: %s", context, err) } @@ -232,8 +232,8 @@ func configForContext(context string) (*rest.Config, error) { } // getKubeClient creates a Kubernetes config and client for a given kubeconfig context. -func getKubeClient(context string) (*rest.Config, kubernetes.Interface, error) { - config, err := configForContext(context) +func getKubeClient(context string, kubeconfig string) (*rest.Config, kubernetes.Interface, error) { + config, err := configForContext(context, kubeconfig) if err != nil { return nil, nil, err } @@ -247,8 +247,8 @@ func getKubeClient(context string) (*rest.Config, kubernetes.Interface, error) { // getInternalKubeClient creates a Kubernetes config and an "internal" client for a given kubeconfig context. // // Prefer the similar getKubeClient if you don't need to use such an internal client. -func getInternalKubeClient(context string) (internalclientset.Interface, error) { - config, err := configForContext(context) +func getInternalKubeClient(context string, kubeconfig string) (internalclientset.Interface, error) { + config, err := configForContext(context, kubeconfig) if err != nil { return nil, err } diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 92f4c379496..93073b9c144 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -289,7 +289,7 @@ func (i *initCmd) run() error { if !i.clientOnly { if i.kubeClient == nil { - _, c, err := getKubeClient(settings.KubeContext) + _, c, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return fmt.Errorf("could not get kubernetes client: %s", err) } @@ -332,7 +332,7 @@ func (i *initCmd) run() error { func (i *initCmd) ping() error { if i.wait { - _, kubeClient, err := getKubeClient(settings.KubeContext) + _, kubeClient, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return err } diff --git a/cmd/helm/install.go b/cmd/helm/install.go index ee4e76a2b5a..a6a8758ede3 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -491,7 +491,7 @@ func generateName(nameTemplate string) (string, error) { } func defaultNamespace() string { - if ns, _, err := kube.GetConfig(settings.KubeContext).Namespace(); err == nil { + if ns, _, err := kube.GetConfig(settings.KubeContext, settings.KubeConfig).Namespace(); err == nil { return ns } return "default" diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index 9d3e17e03cd..1fe0ce39f23 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -86,7 +86,7 @@ func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { // runReset uninstalls tiller from Kubernetes Cluster and deletes local config func (d *resetCmd) run() error { if d.kubeClient == nil { - c, err := getInternalKubeClient(settings.KubeContext) + c, err := getInternalKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return fmt.Errorf("could not get kubernetes client: %s", err) } diff --git a/cmd/helm/version.go b/cmd/helm/version.go index d541067a010..407c2bf43b5 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -76,7 +76,10 @@ func newVersionCmd(c helm.Interface, out io.Writer) *cobra.Command { if version.showServer { // We do this manually instead of in PreRun because we only // need a tunnel if server version is requested. - setupConnection() + err := setupConnection() + if err != nil { + return err + } } version.client = ensureHelmClient(version.client) return version.run() @@ -115,7 +118,6 @@ func (v *versionCmd) run() error { } fmt.Fprintf(v.out, "Kubernetes: %#v\n", k8sVersion) } - resp, err := v.client.GetVersion() if err != nil { if grpc.Code(err) == codes.Unimplemented { @@ -135,7 +137,7 @@ func (v *versionCmd) run() error { func getK8sVersion() (*apiVersion.Info, error) { var v *apiVersion.Info - _, client, err := getKubeClient(settings.KubeContext) + _, client, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return v, err } diff --git a/docs/helm/helm.md b/docs/helm/helm.md index 8592cad7c60..ae27de40112 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -36,6 +36,7 @@ Environment: --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -68,4 +69,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 14-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_completion.md b/docs/helm/helm_completion.md index 994205d881e..64a6056f829 100644 --- a/docs/helm/helm_completion.md +++ b/docs/helm/helm_completion.md @@ -28,6 +28,7 @@ helm completion SHELL --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -35,4 +36,4 @@ helm completion SHELL ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_create.md b/docs/helm/helm_create.md index 6e0f3de78b3..7ae947ed724 100644 --- a/docs/helm/helm_create.md +++ b/docs/helm/helm_create.md @@ -47,6 +47,7 @@ helm create NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -54,4 +55,4 @@ helm create NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_delete.md b/docs/helm/helm_delete.md index 9eee6e8ec97..e181f439e7e 100644 --- a/docs/helm/helm_delete.md +++ b/docs/helm/helm_delete.md @@ -39,6 +39,7 @@ helm delete [flags] RELEASE_NAME [...] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -46,4 +47,4 @@ helm delete [flags] RELEASE_NAME [...] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 13-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_dependency.md b/docs/helm/helm_dependency.md index 34d49e20a09..b0085c6c738 100644 --- a/docs/helm/helm_dependency.md +++ b/docs/helm/helm_dependency.md @@ -61,6 +61,7 @@ for this case. --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -71,4 +72,4 @@ for this case. * [helm dependency list](helm_dependency_list.md) - list the dependencies for the given chart * [helm dependency update](helm_dependency_update.md) - update charts/ based on the contents of requirements.yaml -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_dependency_build.md b/docs/helm/helm_dependency_build.md index 0413a9a8531..eea2fa02c5b 100644 --- a/docs/helm/helm_dependency_build.md +++ b/docs/helm/helm_dependency_build.md @@ -34,6 +34,7 @@ helm dependency build [flags] CHART --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -41,4 +42,4 @@ helm dependency build [flags] CHART ### SEE ALSO * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_dependency_list.md b/docs/helm/helm_dependency_list.md index b4343081c3a..d6bc0175a4c 100644 --- a/docs/helm/helm_dependency_list.md +++ b/docs/helm/helm_dependency_list.md @@ -26,6 +26,7 @@ helm dependency list [flags] CHART --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -33,4 +34,4 @@ helm dependency list [flags] CHART ### SEE ALSO * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_dependency_update.md b/docs/helm/helm_dependency_update.md index 3c90ff77975..90b81ecea25 100644 --- a/docs/helm/helm_dependency_update.md +++ b/docs/helm/helm_dependency_update.md @@ -39,6 +39,7 @@ helm dependency update [flags] CHART --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -46,4 +47,4 @@ helm dependency update [flags] CHART ### SEE ALSO * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_fetch.md b/docs/helm/helm_fetch.md index 1ddef65fa07..c347d162059 100644 --- a/docs/helm/helm_fetch.md +++ b/docs/helm/helm_fetch.md @@ -50,9 +50,12 @@ helm fetch [flags] [chart URL | repo/chartname] [...] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. + +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index 9cd70e52020..f233cd2a75c 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -40,6 +40,7 @@ helm get [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -50,4 +51,4 @@ helm get [flags] RELEASE_NAME * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release * [helm get values](helm_get_values.md) - download the values file for a named release -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_get_hooks.md b/docs/helm/helm_get_hooks.md index 85fa5d04ba6..4f9fa1887b9 100644 --- a/docs/helm/helm_get_hooks.md +++ b/docs/helm/helm_get_hooks.md @@ -33,6 +33,7 @@ helm get hooks [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -40,4 +41,4 @@ helm get hooks [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_get_manifest.md b/docs/helm/helm_get_manifest.md index a00c1be568a..3ae55ef3e70 100644 --- a/docs/helm/helm_get_manifest.md +++ b/docs/helm/helm_get_manifest.md @@ -35,6 +35,7 @@ helm get manifest [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -42,4 +43,4 @@ helm get manifest [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_get_values.md b/docs/helm/helm_get_values.md index d8944b4757b..12d9731227f 100644 --- a/docs/helm/helm_get_values.md +++ b/docs/helm/helm_get_values.md @@ -32,6 +32,7 @@ helm get values [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -39,4 +40,4 @@ helm get values [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_history.md b/docs/helm/helm_history.md index ac51a899450..437e70f0320 100755 --- a/docs/helm/helm_history.md +++ b/docs/helm/helm_history.md @@ -45,6 +45,7 @@ helm history [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -52,4 +53,4 @@ helm history [flags] RELEASE_NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 14-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_home.md b/docs/helm/helm_home.md index bdccd756f4d..9af12c91a3c 100644 --- a/docs/helm/helm_home.md +++ b/docs/helm/helm_home.md @@ -21,6 +21,7 @@ helm home --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -28,4 +29,4 @@ helm home ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_init.md b/docs/helm/helm_init.md index 5374488af69..ec775520a1f 100644 --- a/docs/helm/helm_init.md +++ b/docs/helm/helm_init.md @@ -64,6 +64,7 @@ helm init --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -71,4 +72,4 @@ helm init ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_inspect.md b/docs/helm/helm_inspect.md index e46b3dbf45e..4bc904f63d1 100644 --- a/docs/helm/helm_inspect.md +++ b/docs/helm/helm_inspect.md @@ -37,6 +37,7 @@ helm inspect [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -47,4 +48,4 @@ helm inspect [CHART] * [helm inspect readme](helm_inspect_readme.md) - shows inspect readme * [helm inspect values](helm_inspect_values.md) - shows inspect values -###### Auto generated by spf13/cobra on 14-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_inspect_chart.md b/docs/helm/helm_inspect_chart.md index cd1328b594d..257f26051bb 100644 --- a/docs/helm/helm_inspect_chart.md +++ b/docs/helm/helm_inspect_chart.md @@ -35,6 +35,7 @@ helm inspect chart [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -42,4 +43,4 @@ helm inspect chart [CHART] ### SEE ALSO * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_inspect_readme.md b/docs/helm/helm_inspect_readme.md index 9dd9ebd43b8..8ff7d892e4c 100644 --- a/docs/helm/helm_inspect_readme.md +++ b/docs/helm/helm_inspect_readme.md @@ -33,6 +33,7 @@ helm inspect readme [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -40,4 +41,4 @@ helm inspect readme [CHART] ### SEE ALSO * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 14-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_inspect_values.md b/docs/helm/helm_inspect_values.md index 6a907cc7dd7..50ff6ac244b 100644 --- a/docs/helm/helm_inspect_values.md +++ b/docs/helm/helm_inspect_values.md @@ -35,6 +35,7 @@ helm inspect values [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -42,4 +43,4 @@ helm inspect values [CHART] ### SEE ALSO * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 62d02cc38b2..dbb08796407 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -112,6 +112,7 @@ helm install [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -119,4 +120,4 @@ helm install [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 5-Jun-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_lint.md b/docs/helm/helm_lint.md index c10322efd4d..319939bcfda 100644 --- a/docs/helm/helm_lint.md +++ b/docs/helm/helm_lint.md @@ -35,6 +35,7 @@ helm lint [flags] PATH --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -42,4 +43,4 @@ helm lint [flags] PATH ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 20-May-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_list.md b/docs/helm/helm_list.md index 99872a41390..c7e99e40349 100755 --- a/docs/helm/helm_list.md +++ b/docs/helm/helm_list.md @@ -67,6 +67,7 @@ helm list [flags] [FILTER] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -74,4 +75,4 @@ helm list [flags] [FILTER] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_package.md b/docs/helm/helm_package.md index 21090fa4580..30d06fcf05e 100644 --- a/docs/helm/helm_package.md +++ b/docs/helm/helm_package.md @@ -40,6 +40,7 @@ helm package [flags] [CHART_PATH] [...] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -47,4 +48,4 @@ helm package [flags] [CHART_PATH] [...] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 16-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_plugin.md b/docs/helm/helm_plugin.md index cc42aa4dcae..bb0498d8782 100644 --- a/docs/helm/helm_plugin.md +++ b/docs/helm/helm_plugin.md @@ -16,6 +16,7 @@ Manage client-side Helm plugins. --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -27,4 +28,4 @@ Manage client-side Helm plugins. * [helm plugin remove](helm_plugin_remove.md) - remove one or more Helm plugins * [helm plugin update](helm_plugin_update.md) - update one or more Helm plugins -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_plugin_install.md b/docs/helm/helm_plugin_install.md index 196ca97dda5..ab45850bf2a 100644 --- a/docs/helm/helm_plugin_install.md +++ b/docs/helm/helm_plugin_install.md @@ -29,6 +29,7 @@ helm plugin install [options] ... --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -36,4 +37,4 @@ helm plugin install [options] ... ### SEE ALSO * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_plugin_list.md b/docs/helm/helm_plugin_list.md index ddfd04ee610..dc13cdf7af9 100644 --- a/docs/helm/helm_plugin_list.md +++ b/docs/helm/helm_plugin_list.md @@ -18,6 +18,7 @@ helm plugin list --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -25,4 +26,4 @@ helm plugin list ### SEE ALSO * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_plugin_remove.md b/docs/helm/helm_plugin_remove.md index 8543a367a99..2ef833217d2 100644 --- a/docs/helm/helm_plugin_remove.md +++ b/docs/helm/helm_plugin_remove.md @@ -18,6 +18,7 @@ helm plugin remove ... --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -25,4 +26,4 @@ helm plugin remove ... ### SEE ALSO * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_plugin_update.md b/docs/helm/helm_plugin_update.md index 9e5e205f090..93bc3e76450 100644 --- a/docs/helm/helm_plugin_update.md +++ b/docs/helm/helm_plugin_update.md @@ -18,6 +18,7 @@ helm plugin update ... --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -25,4 +26,4 @@ helm plugin update ... ### SEE ALSO * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo.md b/docs/helm/helm_repo.md index 4109ceca438..32e9d02b256 100644 --- a/docs/helm/helm_repo.md +++ b/docs/helm/helm_repo.md @@ -20,6 +20,7 @@ Example usage: --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -32,4 +33,4 @@ Example usage: * [helm repo remove](helm_repo_remove.md) - remove a chart repository * [helm repo update](helm_repo_update.md) - update information of available charts locally from chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo_add.md b/docs/helm/helm_repo_add.md index 456ffa27ebd..1deb0cb5cc3 100644 --- a/docs/helm/helm_repo_add.md +++ b/docs/helm/helm_repo_add.md @@ -29,6 +29,7 @@ helm repo add [flags] [NAME] [URL] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -36,4 +37,4 @@ helm repo add [flags] [NAME] [URL] ### SEE ALSO * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo_index.md b/docs/helm/helm_repo_index.md index 14b412b2918..baa1291de49 100644 --- a/docs/helm/helm_repo_index.md +++ b/docs/helm/helm_repo_index.md @@ -34,6 +34,7 @@ helm repo index [flags] [DIR] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -41,4 +42,4 @@ helm repo index [flags] [DIR] ### SEE ALSO * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo_list.md b/docs/helm/helm_repo_list.md index 858ef957f7e..00221ed248c 100644 --- a/docs/helm/helm_repo_list.md +++ b/docs/helm/helm_repo_list.md @@ -18,6 +18,7 @@ helm repo list [flags] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -25,4 +26,4 @@ helm repo list [flags] ### SEE ALSO * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo_remove.md b/docs/helm/helm_repo_remove.md index 801bc3c3fea..272ecea47f1 100644 --- a/docs/helm/helm_repo_remove.md +++ b/docs/helm/helm_repo_remove.md @@ -18,6 +18,7 @@ helm repo remove [flags] [NAME] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -25,4 +26,4 @@ helm repo remove [flags] [NAME] ### SEE ALSO * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_repo_update.md b/docs/helm/helm_repo_update.md index 897ed24b7f3..f0215da487b 100644 --- a/docs/helm/helm_repo_update.md +++ b/docs/helm/helm_repo_update.md @@ -24,6 +24,7 @@ helm repo update --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -31,4 +32,4 @@ helm repo update ### SEE ALSO * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_reset.md b/docs/helm/helm_reset.md index ed68b1b8476..507a94bfdfa 100644 --- a/docs/helm/helm_reset.md +++ b/docs/helm/helm_reset.md @@ -34,6 +34,7 @@ helm reset --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -41,4 +42,4 @@ helm reset ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index ae64a0a26ec..b40fb883ada 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -41,6 +41,7 @@ helm rollback [flags] [RELEASE] [REVISION] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -48,4 +49,4 @@ helm rollback [flags] [RELEASE] [REVISION] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 13-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_search.md b/docs/helm/helm_search.md index 1ed04e88054..ffee22ce4bd 100644 --- a/docs/helm/helm_search.md +++ b/docs/helm/helm_search.md @@ -32,6 +32,7 @@ helm search [keyword] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -39,4 +40,4 @@ helm search [keyword] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 23-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_serve.md b/docs/helm/helm_serve.md index 90ebb6da9aa..e300ee63304 100644 --- a/docs/helm/helm_serve.md +++ b/docs/helm/helm_serve.md @@ -39,6 +39,7 @@ helm serve --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -46,4 +47,4 @@ helm serve ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 02ec0ad6650..5317875e637 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -39,6 +39,7 @@ helm status [flags] RELEASE_NAME --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -46,4 +47,4 @@ helm status [flags] RELEASE_NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index cdc8a84a6cc..81c7fa00ef0 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -45,6 +45,7 @@ helm template [flags] CHART --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -52,4 +53,4 @@ helm template [flags] CHART ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 22-May-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_test.md b/docs/helm/helm_test.md index 062244e73e4..688b67a3404 100644 --- a/docs/helm/helm_test.md +++ b/docs/helm/helm_test.md @@ -35,6 +35,7 @@ helm test [RELEASE] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -42,4 +43,4 @@ helm test [RELEASE] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index b952624a52f..d83231fcb82 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -75,6 +75,7 @@ helm upgrade [RELEASE] [CHART] --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -82,4 +83,4 @@ helm upgrade [RELEASE] [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 4-Apr-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_verify.md b/docs/helm/helm_verify.md index bc53439377e..866b3fbd808 100644 --- a/docs/helm/helm_verify.md +++ b/docs/helm/helm_verify.md @@ -33,6 +33,7 @@ helm verify [flags] PATH --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -40,4 +41,4 @@ helm verify [flags] PATH ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/docs/helm/helm_version.md b/docs/helm/helm_version.md index 1f48cceba5f..61636c4042f 100644 --- a/docs/helm/helm_version.md +++ b/docs/helm/helm_version.md @@ -48,6 +48,7 @@ helm version --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") ``` @@ -55,4 +56,4 @@ helm version ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 8-Mar-2018 +###### Auto generated by spf13/cobra on 17-Jun-2018 diff --git a/pkg/helm/environment/environment.go b/pkg/helm/environment/environment.go index 2980e6dc9c9..9b0acce4c73 100644 --- a/pkg/helm/environment/environment.go +++ b/pkg/helm/environment/environment.go @@ -49,6 +49,8 @@ type EnvSettings struct { Debug bool // KubeContext is the name of the kubeconfig context. KubeContext string + // KubeConfig is the path to an explicit kubeconfig file. This overwrites the value in $KUBECONFIG + KubeConfig string } // AddFlags binds flags to the given flagset. @@ -56,6 +58,7 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { fs.StringVar((*string)(&s.Home), "home", DefaultHelmHome, "location of your Helm config. Overrides $HELM_HOME") fs.StringVar(&s.TillerHost, "host", "", "address of Tiller. Overrides $HELM_HOST") fs.StringVar(&s.KubeContext, "kube-context", "", "name of the kubeconfig context to use") + fs.StringVar(&s.KubeConfig, "kubeconfig", "", "absolute path to the kubeconfig file to use") fs.BoolVar(&s.Debug, "debug", false, "enable verbose output") fs.StringVar(&s.TillerNamespace, "tiller-namespace", "kube-system", "namespace of Tiller") fs.Int64Var(&s.TillerConnectionTimeout, "tiller-connection-timeout", int64(300), "the duration (in seconds) Helm will wait to establish a connection to tiller") diff --git a/pkg/helm/environment/environment_test.go b/pkg/helm/environment/environment_test.go index 8f0caa388a5..c7d65cd5a93 100644 --- a/pkg/helm/environment/environment_test.go +++ b/pkg/helm/environment/environment_test.go @@ -35,8 +35,8 @@ func TestEnvSettings(t *testing.T) { envars map[string]string // expected values - home, host, ns, kcontext, plugins string - debug bool + home, host, ns, kcontext, kconfig, plugins string + debug bool }{ { name: "defaults", @@ -47,11 +47,12 @@ func TestEnvSettings(t *testing.T) { }, { name: "with flags set", - args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns"}, + args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns", "--kubeconfig", "/bar"}, home: "/foo", plugins: helmpath.Home("/foo").Plugins(), host: "here", ns: "myns", + kconfig: "/bar", debug: true, }, { @@ -111,6 +112,9 @@ func TestEnvSettings(t *testing.T) { if settings.KubeContext != tt.kcontext { t.Errorf("expected kube-context %q, got %q", tt.kcontext, settings.KubeContext) } + if settings.KubeConfig != tt.kconfig { + t.Errorf("expected kubeconfig %q, got %q", tt.kconfig, settings.KubeConfig) + } cleanup() }) diff --git a/pkg/kube/config.go b/pkg/kube/config.go index b6560486ef8..ac0a9015d65 100644 --- a/pkg/kube/config.go +++ b/pkg/kube/config.go @@ -16,10 +16,12 @@ limitations under the License. package kube // import "k8s.io/helm/pkg/kube" -import "k8s.io/client-go/tools/clientcmd" +import ( + "k8s.io/client-go/tools/clientcmd" +) // GetConfig returns a Kubernetes client config for a given context. -func GetConfig(context string) clientcmd.ClientConfig { +func GetConfig(context string, kubeconfig string) clientcmd.ClientConfig { rules := clientcmd.NewDefaultClientConfigLoadingRules() rules.DefaultClientConfig = &clientcmd.DefaultClientConfig @@ -28,5 +30,10 @@ func GetConfig(context string) clientcmd.ClientConfig { if context != "" { overrides.CurrentContext = context } + + if kubeconfig != "" { + rules.ExplicitPath = kubeconfig + } + return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides) } From 3e5b4066d2a067ef49f6ca39b3f84d2ebcad25ba Mon Sep 17 00:00:00 2001 From: KUOKA Yusuke Date: Tue, 24 Jul 2018 04:49:42 +0900 Subject: [PATCH 123/483] feat(helm): Detailed exit code for helm plugins (#4367) Resolves #4170 --- cmd/helm/helm.go | 7 ++++++- cmd/helm/load_plugins.go | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index be3ced37611..3f859392d36 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -158,7 +158,12 @@ func init() { func main() { cmd := newRootCmd(os.Args[1:]) if err := cmd.Execute(); err != nil { - os.Exit(1) + switch e := err.(type) { + case pluginError: + os.Exit(e.code) + default: + os.Exit(1) + } } } diff --git a/cmd/helm/load_plugins.go b/cmd/helm/load_plugins.go index f4c97bde703..67de8bae537 100644 --- a/cmd/helm/load_plugins.go +++ b/cmd/helm/load_plugins.go @@ -22,12 +22,18 @@ import ( "os/exec" "path/filepath" "strings" + "syscall" "github.com/spf13/cobra" "k8s.io/helm/pkg/plugin" ) +type pluginError struct { + error + code int +} + // loadPlugins loads plugins into the command list. // // This follows a different pattern than the other commands because it has @@ -87,7 +93,11 @@ func loadPlugins(baseCmd *cobra.Command, out io.Writer) { if err := prog.Run(); err != nil { if eerr, ok := err.(*exec.ExitError); ok { os.Stderr.Write(eerr.Stderr) - return fmt.Errorf("plugin %q exited with error", md.Name) + status := eerr.Sys().(syscall.WaitStatus) + return pluginError{ + error: fmt.Errorf("plugin %q exited with error", md.Name), + code: status.ExitStatus(), + } } return err } From 84856089c687e4b715631bb2380efbb561c30626 Mon Sep 17 00:00:00 2001 From: Ihor Dvoretskyi Date: Mon, 23 Jul 2018 22:51:24 +0300 Subject: [PATCH 124/483] Snap installation information added (#4366) * Snap installation information added Signed-off-by: Ihor Dvoretskyi * Moved Snap instructions to the different section Signed-off-by: Ihor Dvoretskyi --- docs/install.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/install.md b/docs/install.md index 17905a805f3..5aa4233c175 100755 --- a/docs/install.md +++ b/docs/install.md @@ -24,6 +24,15 @@ can be manually downloaded and installed. From there, you should be able to run the client: `helm help`. +### From Snap (Linux) + +The Snap package for Helm is maintained by +[Snapcrafters](https://github.com/snapcrafters/helm). + +``` +$ sudo snap install helm +``` + ### From Homebrew (macOS) Members of the Kubernetes community have contributed a Helm formula build to From 4f1fec3edbcf06f3e358a53375570ef8c8195410 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Mon, 23 Jul 2018 15:26:40 -0600 Subject: [PATCH 125/483] docs(OWNERS): add rimusz as emeritus maintainer (#4357) This PR was approved by vote of the core maintainers. It adds Rimus, one of the project's founders, as an emeritus Helm maintainer. --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 32b26efa26b..39f8c844837 100644 --- a/OWNERS +++ b/OWNERS @@ -28,3 +28,4 @@ emeritus: - migmartri - seh - vaikas-google + - rimusz From a65710679837ff12879d90c76aa99764e6f2178f Mon Sep 17 00:00:00 2001 From: nashasha1 Date: Tue, 24 Jul 2018 23:49:50 +0800 Subject: [PATCH 126/483] Dashes are not allowed in the name --- docs/chart_best_practices/conventions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/chart_best_practices/conventions.md b/docs/chart_best_practices/conventions.md index 324ef88f9a8..4d080ceb1ef 100644 --- a/docs/chart_best_practices/conventions.md +++ b/docs/chart_best_practices/conventions.md @@ -4,14 +4,14 @@ This part of the Best Practices Guide explains general conventions. ## Chart Names -Chart names should be lower case letters and numbers. Words _may_ be separated with dashes (-): +Chart names should be lower case letters and numbers. Dashes (-) are not allowed: Examples: ``` drupal -nginx-lego -aws-cluster-autoscaler +cluster01 +aws-cluster-autoscaler #incorrect do not use dashes in the name ``` Neither uppercase letters nor underscores should be used in chart names. Dots should not be used in chart names. From dc939086267357aa1a87418fa38ed91e68b535bc Mon Sep 17 00:00:00 2001 From: KUOKA Yusuke Date: Thu, 26 Jul 2018 06:12:40 +0900 Subject: [PATCH 127/483] feat: Set values from local files (#3758) Adds the `--set-file key=filepath` flag to `install`, `upgrade`, `template` and `lint` sub-commands so that the content of the file at the `filepath` is set to the value for the `key`. Resolves #1754 --- cmd/helm/install.go | 28 +++++++++--- cmd/helm/lint.go | 19 ++++++++ cmd/helm/template.go | 4 +- cmd/helm/upgrade.go | 11 +++-- docs/chart_best_practices/values.md | 1 + docs/helm/helm_install.md | 12 +++-- docs/helm/helm_lint.md | 3 +- docs/helm/helm_template.md | 3 +- docs/helm/helm_upgrade.md | 9 ++-- docs/using_helm.md | 31 ++++++++++++- pkg/strvals/parser.go | 69 ++++++++++++++++++++++++----- pkg/strvals/parser_test.go | 33 ++++++++++++++ 12 files changed, 193 insertions(+), 30 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index a6a8758ede3..2213fd1fbc0 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -50,8 +50,10 @@ The install argument must be a chart reference, a path to a packaged chart, a path to an unpacked chart directory or a URL. To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line, to force -a string value use '--set-string'. +or use the '--set' flag and pass configuration from the command line. To force string +values in '--set', use '--set-string' instead. In case a value is large and therefore +you want not to use neither '--values' nor '--set', use '--set-file' to read the +single large value from file. $ helm install -f myvalues.yaml ./redis @@ -63,6 +65,9 @@ or $ helm install --set-string long_int=1234567890 ./redis +or + $ helm install --set-file multiline_text=path/to/textfile + You can specify the '--values'/'-f' flag multiple times. The priority will be given to the last (right-most) file specified. For example, if both myvalues.yaml and override.yaml contained a key called 'Test', the value set in override.yaml would take precedence: @@ -120,6 +125,7 @@ type installCmd struct { client helm.Interface values []string stringValues []string + fileValues []string nameTemplate string version string timeout int64 @@ -196,6 +202,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&inst.replace, "replace", false, "re-use the given name, even if that name is already used. This is unsafe in production") f.StringArrayVar(&inst.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&inst.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(&inst.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.StringVar(&inst.nameTemplate, "name-template", "", "specify template used to name the release") f.BoolVar(&inst.verify, "verify", false, "verify the package before installing it") f.StringVar(&inst.keyring, "keyring", defaultKeyring(), "location of public keys used for verification") @@ -222,7 +229,7 @@ func (i *installCmd) run() error { i.namespace = defaultNamespace() } - rawVals, err := vals(i.valueFiles, i.values, i.stringValues, i.certFile, i.keyFile, i.caFile) + rawVals, err := vals(i.valueFiles, i.values, i.stringValues, i.fileValues, i.certFile, i.keyFile, i.caFile) if err != nil { return err } @@ -343,8 +350,8 @@ func mergeValues(dest map[string]interface{}, src map[string]interface{}) map[st } // vals merges values from files specified via -f/--values and -// directly via --set or --set-string, marshaling them to YAML -func vals(valueFiles valueFiles, values []string, stringValues []string, CertFile, KeyFile, CAFile string) ([]byte, error) { +// directly via --set or --set-string or --set-file, marshaling them to YAML +func vals(valueFiles valueFiles, values []string, stringValues []string, fileValues []string, CertFile, KeyFile, CAFile string) ([]byte, error) { base := map[string]interface{}{} // User specified a values files via -f/--values @@ -384,6 +391,17 @@ func vals(valueFiles valueFiles, values []string, stringValues []string, CertFil } } + // User specified a value via --set-file + for _, value := range fileValues { + reader := func(rs []rune) (interface{}, error) { + bytes, err := readFile(string(rs), CertFile, KeyFile, CAFile) + return string(bytes), err + } + if err := strvals.ParseIntoFile(value, base, reader); err != nil { + return []byte{}, fmt.Errorf("failed parsing --set-file data: %s", err) + } + } + return yaml.Marshal(base) } diff --git a/cmd/helm/lint.go b/cmd/helm/lint.go index c81468e50a1..3221368ce76 100644 --- a/cmd/helm/lint.go +++ b/cmd/helm/lint.go @@ -47,6 +47,7 @@ type lintCmd struct { valueFiles valueFiles values []string sValues []string + fValues []string namespace string strict bool paths []string @@ -73,6 +74,7 @@ func newLintCmd(out io.Writer) *cobra.Command { cmd.Flags().VarP(&l.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") cmd.Flags().StringArrayVar(&l.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") cmd.Flags().StringArrayVar(&l.sValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") + cmd.Flags().StringArrayVar(&l.fValues, "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)") cmd.Flags().StringVar(&l.namespace, "namespace", "default", "namespace to put the release into") cmd.Flags().BoolVar(&l.strict, "strict", false, "fail on lint warnings") @@ -172,6 +174,12 @@ func lintChart(path string, vals []byte, namespace string, strict bool) (support return lint.All(chartPath, vals, namespace, strict), nil } +// vals merges values from files specified via -f/--values and +// directly via --set or --set-string or --set-file, marshaling them to YAML +// +// This func is implemented intentionally and separately from the `vals` func for the `install` and `upgrade` comammdsn. +// Compared to the alternative func, this func lacks the parameters for tls opts - ca key, cert, and ca cert. +// That's because this command, `lint`, is explicitly forbidden from making server connections. func (l *lintCmd) vals() ([]byte, error) { base := map[string]interface{}{} @@ -204,5 +212,16 @@ func (l *lintCmd) vals() ([]byte, error) { } } + // User specified a value via --set-file + for _, value := range l.fValues { + reader := func(rs []rune) (interface{}, error) { + bytes, err := ioutil.ReadFile(string(rs)) + return string(bytes), err + } + if err := strvals.ParseIntoFile(value, base, reader); err != nil { + return []byte{}, fmt.Errorf("failed parsing --set-file data: %s", err) + } + } + return yaml.Marshal(base) } diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 9ba21787112..bcfb6a7e45e 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -69,6 +69,7 @@ type templateCmd struct { out io.Writer values []string stringValues []string + fileValues []string nameTemplate string showNotes bool releaseName string @@ -100,6 +101,7 @@ func newTemplateCmd(out io.Writer) *cobra.Command { f.StringVar(&t.namespace, "namespace", "", "namespace to install the release into") f.StringArrayVar(&t.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&t.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(&t.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.StringVar(&t.nameTemplate, "name-template", "", "specify template used to name the release") f.StringVar(&t.kubeVersion, "kube-version", defaultKubeVersion, "kubernetes version used as Capabilities.KubeVersion.Major/Minor") f.StringVar(&t.outputDir, "output-dir", "", "writes the executed templates to files in output-dir instead of stdout") @@ -132,7 +134,7 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { t.namespace = defaultNamespace() } // get combined values and create config - rawVals, err := vals(t.valueFiles, t.values, t.stringValues, "", "", "") + rawVals, err := vals(t.valueFiles, t.values, t.stringValues, t.fileValues, "", "", "") if err != nil { return err } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index aaf87b7d0d3..27c504e20c8 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -37,8 +37,10 @@ a packaged chart, or a fully qualified URL. For chart references, the latest version will be specified unless the '--version' flag is set. To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line, to force string -values, use '--set-string'. +or use the '--set' flag and pass configuration from the command line. To force string +values in '--set', use '--set-string' instead. In case a value is large and therefore +you want not to use neither '--values' nor '--set', use '--set-file' to read the +single large value from file. You can specify the '--values'/'-f' flag multiple times. The priority will be given to the last (right-most) file specified. For example, if both myvalues.yaml and override.yaml @@ -65,6 +67,7 @@ type upgradeCmd struct { valueFiles valueFiles values []string stringValues []string + fileValues []string verify bool keyring string install bool @@ -122,6 +125,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&upgrade.force, "force", false, "force resource update through delete/recreate if needed") f.StringArrayVar(&upgrade.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&upgrade.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(&upgrade.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(&upgrade.disableHooks, "disable-hooks", false, "disable pre/post upgrade hooks. DEPRECATED. Use no-hooks") f.BoolVar(&upgrade.disableHooks, "no-hooks", false, "disable pre/post upgrade hooks") f.BoolVar(&upgrade.verify, "verify", false, "verify the provenance of the chart before upgrading") @@ -189,6 +193,7 @@ func (u *upgradeCmd) run() error { keyring: u.keyring, values: u.values, stringValues: u.stringValues, + fileValues: u.fileValues, namespace: u.namespace, timeout: u.timeout, wait: u.wait, @@ -198,7 +203,7 @@ func (u *upgradeCmd) run() error { } } - rawVals, err := vals(u.valueFiles, u.values, u.stringValues, u.certFile, u.keyFile, u.caFile) + rawVals, err := vals(u.valueFiles, u.values, u.stringValues, u.fileValues, u.certFile, u.keyFile, u.caFile) if err != nil { return err } diff --git a/docs/chart_best_practices/values.md b/docs/chart_best_practices/values.md index 2962e7d4514..28e3a3eac3d 100644 --- a/docs/chart_best_practices/values.md +++ b/docs/chart_best_practices/values.md @@ -93,6 +93,7 @@ There are three potential sources of values: - A chart's `values.yaml` file - A values file supplied by `helm install -f` or `helm upgrade -f` - The values passed to a `--set` or `--set-string` flag on `helm install` or `helm upgrade` +- The content of a file passed to `--set-file` flag on `helm install` or `helm upgrade` When designing the structure of your values, keep in mind that users of your chart may want to override them via either the `-f` flag or with the `--set` diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index dbb08796407..c266222b8ac 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -12,8 +12,10 @@ The install argument must be a chart reference, a path to a packaged chart, a path to an unpacked chart directory or a URL. To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line, to force -a string value use '--set-string'. +or use the '--set' flag and pass configuration from the command line. To force string +values in '--set', use '--set-string' instead. In case a value is large and therefore +you want not to use neither '--values' nor '--set', use '--set-file' to read the +single large value from file. $ helm install -f myvalues.yaml ./redis @@ -25,6 +27,9 @@ or $ helm install --set-string long_int=1234567890 ./redis +or + $ helm install --set-file multiline_text=path/to/textfile + You can specify the '--values'/'-f' flag multiple times. The priority will be given to the last (right-most) file specified. For example, if both myvalues.yaml and override.yaml contained a key called 'Test', the value set in override.yaml would take precedence: @@ -91,6 +96,7 @@ helm install [CHART] --replace re-use the given name, even if that name is already used. This is unsafe in production --repo string chart repository url where to locate the requested chart --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) --tls enable TLS for request @@ -120,4 +126,4 @@ helm install [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 17-Jul-2018 diff --git a/docs/helm/helm_lint.md b/docs/helm/helm_lint.md index 319939bcfda..9c328a08626 100644 --- a/docs/helm/helm_lint.md +++ b/docs/helm/helm_lint.md @@ -23,6 +23,7 @@ helm lint [flags] PATH ``` --namespace string namespace to put the release into (default "default") --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --strict fail on lint warnings -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) @@ -43,4 +44,4 @@ helm lint [flags] PATH ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 25-Jul-2018 diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index 81c7fa00ef0..f456f74beda 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -34,6 +34,7 @@ helm template [flags] CHART --notes show the computed NOTES.txt file as well --output-dir string writes the executed templates to files in output-dir instead of stdout --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) ``` @@ -53,4 +54,4 @@ helm template [flags] CHART ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 17-Jul-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index d83231fcb82..ecd51e65ca3 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -14,8 +14,10 @@ a packaged chart, or a fully qualified URL. For chart references, the latest version will be specified unless the '--version' flag is set. To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line, to force string -values, use '--set-string'. +or use the '--set' flag and pass configuration from the command line. To force string +values in '--set', use '--set-string' instead. In case a value is large and therefore +you want not to use neither '--values' nor '--set', use '--set-file' to read the +single large value from file. You can specify the '--values'/'-f' flag multiple times. The priority will be given to the last (right-most) file specified. For example, if both myvalues.yaml and override.yaml @@ -54,6 +56,7 @@ helm upgrade [RELEASE] [CHART] --reset-values when upgrading, reset the values to the ones built into the chart --reuse-values when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored. --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) --tls enable TLS for request @@ -83,4 +86,4 @@ helm upgrade [RELEASE] [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 17-May-2018 diff --git a/docs/using_helm.md b/docs/using_helm.md index 5490abbe119..b7fec60ed8b 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -227,7 +227,7 @@ There are two ways to pass configuration data during install: - `--values` (or `-f`): Specify a YAML file with overrides. This can be specified multiple times and the rightmost file will take precedence -- `--set`: Specify overrides on the command line. +- `--set` (and its variants `--set-string` and `--set-file`): Specify overrides on the command line. If both are used, `--set` values are merged into `--values` with higher precedence. Overrides specified with `--set` are persisted in a configmap. Values that have been @@ -304,6 +304,35 @@ Deeply nested data structures can be difficult to express using `--set`. Chart designers are encouraged to consider the `--set` usage when designing the format of a `values.yaml` file. +Helm will cast certain values specified with `--set` to integers. +For example, `--set foo=true` results Helm to cast `true` into an int64 value. +In case you want a string, use a `--set`'s variant named `--set-string`. `--set-string foo=true` results in a string value of `"true"`. + +`--set-file key=filepath` is another variant of `--set`. +It reads the file and use its content as a value. +An example use case of it is to inject a multi-line text into values without dealing with indentation in YAML. +Say you want to create a [brigade](https://github.com/Azure/brigade) project with certain value containing 5 lines JavaScript code, you might write a `values.yaml` like: + +```yaml +defaultScript: | + const { events, Job } = require("brigadier") + function run(e, project) { + console.log("hello default script") + } + events.on("run", run) +``` + +Being embedded in a YAML, this makes it harder for you to use IDE features and testing framework and so on that supports writing code. +Instead, you can use `--set-file defaultScript=brigade.js` with `brigade.js` containing: + +```javascript +const { events, Job } = require("brigadier") +function run(e, project) { + console.log("hello default script") +} +events.on("run", run) +``` + ### More Installation Methods The `helm install` command can install from several sources: diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index dae949d8e34..eb29c250f9b 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -50,6 +50,20 @@ func Parse(s string) (map[string]interface{}, error) { return vals, err } +// ParseFile parses a set line, but its final value is loaded from the file at the path specified by the original value. +// +// A set line is of the form name1=path1,name2=path2 +// +// When the files at path1 and path2 contained "val1" and "val2" respectively, the set line is consumed as +// name1=val1,name2=val2 +func ParseFile(s string, runesToVal runesToVal) (map[string]interface{}, error) { + vals := map[string]interface{}{} + scanner := bytes.NewBufferString(s) + t := newFileParser(scanner, vals, runesToVal) + err := t.parse() + return vals, err +} + // ParseString parses a set line and forces a string value. // // A set line is of the form name1=value1,name2=value2 @@ -71,6 +85,15 @@ func ParseInto(s string, dest map[string]interface{}) error { return t.parse() } +// ParseIntoFile parses a filevals line and merges the result into dest. +// +// This method always returns a string as the value. +func ParseIntoFile(s string, dest map[string]interface{}, runesToVal runesToVal) error { + scanner := bytes.NewBufferString(s) + t := newFileParser(scanner, dest, runesToVal) + return t.parse() +} + // ParseIntoString parses a strvals line nad merges the result into dest. // // This method always returns a string as the value. @@ -87,13 +110,22 @@ func ParseIntoString(s string, dest map[string]interface{}) error { // where data is the final parsed data from the parses with correct types // where st is a boolean to figure out if we're forcing it to parse values as string type parser struct { - sc *bytes.Buffer - data map[string]interface{} - st bool + sc *bytes.Buffer + data map[string]interface{} + runesToVal runesToVal } +type runesToVal func([]rune) (interface{}, error) + func newParser(sc *bytes.Buffer, data map[string]interface{}, stringBool bool) *parser { - return &parser{sc: sc, data: data, st: stringBool} + rs2v := func(rs []rune) (interface{}, error) { + return typedVal(rs, stringBool), nil + } + return &parser{sc: sc, data: data, runesToVal: rs2v} +} + +func newFileParser(sc *bytes.Buffer, data map[string]interface{}, runesToVal runesToVal) *parser { + return &parser{sc: sc, data: data, runesToVal: runesToVal} } func (t *parser) parse() error { @@ -157,8 +189,12 @@ func (t *parser) key(data map[string]interface{}) error { set(data, string(k), "") return e case ErrNotList: - v, e := t.val() - set(data, string(k), typedVal(v, t.st)) + rs, e := t.val() + if e != nil && e != io.EOF { + return e + } + v, e := t.runesToVal(rs) + set(data, string(k), v) return e default: return e @@ -230,8 +266,12 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) { case io.EOF: return setIndex(list, i, ""), err case ErrNotList: - v, e := t.val() - return setIndex(list, i, typedVal(v, t.st)), e + rs, e := t.val() + if e != nil && e != io.EOF { + return list, e + } + v, e := t.runesToVal(rs) + return setIndex(list, i, v), e default: return list, e } @@ -279,7 +319,7 @@ func (t *parser) valList() ([]interface{}, error) { list := []interface{}{} stop := runeSet([]rune{',', '}'}) for { - switch v, last, err := runesUntil(t.sc, stop); { + switch rs, last, err := runesUntil(t.sc, stop); { case err != nil: if err == io.EOF { err = errors.New("list must terminate with '}'") @@ -290,10 +330,15 @@ func (t *parser) valList() ([]interface{}, error) { if r, _, e := t.sc.ReadRune(); e == nil && r != ',' { t.sc.UnreadRune() } - list = append(list, typedVal(v, t.st)) - return list, nil + v, e := t.runesToVal(rs) + list = append(list, v) + return list, e case last == ',': - list = append(list, typedVal(v, t.st)) + v, e := t.runesToVal(rs) + if e != nil { + return list, e + } + list = append(list, v) } } } diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index 22f0e753a60..f23a57e0a9e 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -416,6 +416,39 @@ func TestParseIntoString(t *testing.T) { } } +func TestParseIntoFile(t *testing.T) { + got := map[string]interface{}{} + input := "name1=path1" + expect := map[string]interface{}{ + "name1": "value1", + } + rs2v := func(rs []rune) (interface{}, error) { + v := string(rs) + if v != "path1" { + t.Errorf("%s: runesToVal: Expected value path1, got %s", input, v) + return "", nil + } + return "value1", nil + } + + if err := ParseIntoFile(input, got, rs2v); err != nil { + t.Fatal(err) + } + + y1, err := yaml.Marshal(expect) + if err != nil { + t.Fatal(err) + } + y2, err := yaml.Marshal(got) + if err != nil { + t.Fatalf("Error serializing parsed value: %s", err) + } + + if string(y1) != string(y2) { + t.Errorf("%s: Expected:\n%s\nGot:\n%s", input, y1, y2) + } +} + func TestToYAML(t *testing.T) { // The TestParse does the hard part. We just verify that YAML formatting is // happening. From ade712dad2864277b79ef93347056cf7f367e35d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Magnusson?= Date: Thu, 26 Jul 2018 12:08:34 +0200 Subject: [PATCH 128/483] README: updated links to helm/helm --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fc091056ef0..0c281a54a8c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Kubernetes Helm -[![CircleCI](https://circleci.com/gh/kubernetes/helm.svg?style=svg)](https://circleci.com/gh/kubernetes/helm) -[![Go Report Card](https://goreportcard.com/badge/github.com/kubernetes/helm)](https://goreportcard.com/report/github.com/kubernetes/helm) +[![CircleCI](https://circleci.com/gh/helm/helm.svg?style=svg)](https://circleci.com/gh/helm/helm) +[![Go Report Card](https://goreportcard.com/badge/github.com/helm/helm)](https://goreportcard.com/report/github.com/helm/helm) [![GoDoc](https://godoc.org/github.com/kubernetes/helm?status.svg)](https://godoc.org/github.com/kubernetes/helm) Helm is a tool for managing Kubernetes charts. Charts are packages of @@ -9,7 +9,7 @@ pre-configured Kubernetes resources. Use Helm to: -- Find and use [popular software packaged as Kubernetes charts](https://github.com/kubernetes/charts) +- Find and use [popular software packaged as Kubernetes charts](https://github.com/helm/charts) - Share your own applications as Kubernetes charts - Create reproducible builds of your Kubernetes applications - Intelligently manage your Kubernetes manifest files @@ -32,7 +32,7 @@ Think of it like apt/yum/homebrew for Kubernetes. ## Install -Binary downloads of the Helm client can be found on [the latest Releases page](https://github.com/kubernetes/helm/releases/latest). +Binary downloads of the Helm client can be found on [the latest Releases page](https://github.com/helm/helm/releases/latest). Unpack the `helm` binary and add it to your PATH and you are good to go! @@ -52,7 +52,7 @@ Get started with the [Quick Start guide](https://docs.helm.sh/using_helm/#quicks ## Roadmap -The [Helm roadmap uses Github milestones](https://github.com/kubernetes/helm/milestones) to track the progress of the project. +The [Helm roadmap uses Github milestones](https://github.com/helm/helm/milestones) to track the progress of the project. ## Community, discussion, contribution, and support From 9effff424f38591ec6eb9e22138afe259aba2c73 Mon Sep 17 00:00:00 2001 From: Anders Rasmussen Date: Sun, 29 Jul 2018 23:34:09 +0200 Subject: [PATCH 129/483] Adding space for correct formatting on docs.helm.sh The rendering of the bullet list is not rendered correctly on https://docs.helm.sh/developing_charts/#hooks --- docs/charts_hooks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index b6c276bbad7..8d5006d1f39 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -193,6 +193,7 @@ It is also possible to define policies that determine when to delete correspondi ``` You can choose one or more defined annotation values: + * `"hook-succeeded"` specifies Tiller should delete the hook after the hook is successfully executed. * `"hook-failed"` specifies Tiller should delete the hook if the hook failed during execution. * `"before-hook-creation"` specifies Tiller should delete the previous hook before the new hook is launched. From d8b46d840be34f2232cd72ee980b646ccdf8aa6c Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 30 Jul 2018 08:27:12 -0700 Subject: [PATCH 130/483] fix path output for Windows --- cmd/helm/dependency.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/dependency.go b/cmd/helm/dependency.go index 231659691a7..a0388e18dfa 100644 --- a/cmd/helm/dependency.go +++ b/cmd/helm/dependency.go @@ -141,7 +141,7 @@ func (l *dependencyListCmd) run() error { r, err := chartutil.LoadRequirements(c) if err != nil { if err == chartutil.ErrRequirementsNotFound { - fmt.Fprintf(l.out, "WARNING: no requirements at %s/charts\n", l.chartpath) + fmt.Fprintf(l.out, "WARNING: no requirements at %s\n", filepath.Join(l.chartpath, "charts")) return nil } return err From 2d77db11fa47005150e682fb13c3cf49eab98fbb Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 8 Jun 2018 07:59:37 -0700 Subject: [PATCH 131/483] change copyright to "Copyright The Helm Authors" --- .circleci/bootstrap.sh | 2 +- .circleci/deploy.sh | 2 +- .circleci/test.sh | 2 +- LICENSE | 2 +- _proto/hapi/chart/chart.proto | 2 +- _proto/hapi/chart/config.proto | 2 +- _proto/hapi/chart/metadata.proto | 2 +- _proto/hapi/chart/template.proto | 2 +- _proto/hapi/release/hook.proto | 2 +- _proto/hapi/release/info.proto | 2 +- _proto/hapi/release/release.proto | 2 +- _proto/hapi/release/status.proto | 2 +- _proto/hapi/release/test_run.proto | 2 +- _proto/hapi/release/test_suite.proto | 2 +- _proto/hapi/rudder/rudder.proto | 2 +- _proto/hapi/services/tiller.proto | 2 +- _proto/hapi/version/version.proto | 2 +- cmd/helm/completion.go | 2 +- cmd/helm/create.go | 2 +- cmd/helm/create_test.go | 2 +- cmd/helm/delete.go | 2 +- cmd/helm/delete_test.go | 2 +- cmd/helm/dependency.go | 2 +- cmd/helm/dependency_build.go | 2 +- cmd/helm/dependency_build_test.go | 2 +- cmd/helm/dependency_test.go | 2 +- cmd/helm/dependency_update.go | 2 +- cmd/helm/dependency_update_test.go | 2 +- cmd/helm/docs.go | 2 +- cmd/helm/fetch.go | 2 +- cmd/helm/fetch_test.go | 2 +- cmd/helm/get.go | 2 +- cmd/helm/get_hooks.go | 2 +- cmd/helm/get_hooks_test.go | 2 +- cmd/helm/get_manifest.go | 2 +- cmd/helm/get_manifest_test.go | 2 +- cmd/helm/get_test.go | 2 +- cmd/helm/get_values.go | 2 +- cmd/helm/get_values_test.go | 2 +- cmd/helm/helm.go | 2 +- cmd/helm/helm_test.go | 2 +- cmd/helm/history.go | 2 +- cmd/helm/history_test.go | 2 +- cmd/helm/home.go | 2 +- cmd/helm/init.go | 2 +- cmd/helm/init_test.go | 2 +- cmd/helm/init_unix.go | 2 +- cmd/helm/init_windows.go | 2 +- cmd/helm/inspect.go | 2 +- cmd/helm/inspect_test.go | 2 +- cmd/helm/install.go | 2 +- cmd/helm/install_test.go | 2 +- cmd/helm/installer/install.go | 2 +- cmd/helm/installer/install_test.go | 2 +- cmd/helm/installer/options.go | 2 +- cmd/helm/installer/uninstall.go | 2 +- cmd/helm/installer/uninstall_test.go | 2 +- cmd/helm/lint.go | 2 +- cmd/helm/lint_test.go | 2 +- cmd/helm/list.go | 2 +- cmd/helm/list_test.go | 2 +- cmd/helm/load_plugins.go | 2 +- cmd/helm/package.go | 2 +- cmd/helm/package_test.go | 2 +- cmd/helm/plugin.go | 2 +- cmd/helm/plugin_install.go | 2 +- cmd/helm/plugin_list.go | 2 +- cmd/helm/plugin_remove.go | 2 +- cmd/helm/plugin_test.go | 2 +- cmd/helm/plugin_update.go | 2 +- cmd/helm/printer.go | 2 +- cmd/helm/release_testing.go | 2 +- cmd/helm/release_testing_test.go | 2 +- cmd/helm/repo.go | 2 +- cmd/helm/repo_add.go | 2 +- cmd/helm/repo_add_test.go | 2 +- cmd/helm/repo_index.go | 2 +- cmd/helm/repo_index_test.go | 2 +- cmd/helm/repo_list.go | 2 +- cmd/helm/repo_remove.go | 2 +- cmd/helm/repo_remove_test.go | 2 +- cmd/helm/repo_update.go | 2 +- cmd/helm/repo_update_test.go | 2 +- cmd/helm/reset.go | 2 +- cmd/helm/reset_test.go | 2 +- cmd/helm/rollback.go | 2 +- cmd/helm/rollback_test.go | 2 +- cmd/helm/search.go | 2 +- cmd/helm/search/search.go | 2 +- cmd/helm/search/search_test.go | 2 +- cmd/helm/search_test.go | 2 +- cmd/helm/serve.go | 2 +- cmd/helm/status.go | 2 +- cmd/helm/status_test.go | 2 +- cmd/helm/template.go | 2 +- cmd/helm/template_test.go | 2 +- cmd/helm/upgrade.go | 2 +- cmd/helm/upgrade_test.go | 2 +- cmd/helm/verify.go | 2 +- cmd/helm/verify_test.go | 2 +- cmd/helm/version.go | 2 +- cmd/helm/version_test.go | 2 +- cmd/rudder/rudder.go | 2 +- cmd/tiller/probes.go | 2 +- cmd/tiller/probes_test.go | 2 +- cmd/tiller/tiller.go | 2 +- cmd/tiller/tiller_test.go | 2 +- cmd/tiller/trace.go | 2 +- pkg/chartutil/capabilities.go | 2 +- pkg/chartutil/capabilities_test.go | 2 +- pkg/chartutil/chartfile.go | 2 +- pkg/chartutil/chartfile_test.go | 2 +- pkg/chartutil/create.go | 2 +- pkg/chartutil/create_test.go | 2 +- pkg/chartutil/doc.go | 2 +- pkg/chartutil/expand.go | 2 +- pkg/chartutil/files.go | 2 +- pkg/chartutil/files_test.go | 2 +- pkg/chartutil/load.go | 2 +- pkg/chartutil/load_test.go | 2 +- pkg/chartutil/requirements.go | 2 +- pkg/chartutil/requirements_test.go | 2 +- pkg/chartutil/save.go | 2 +- pkg/chartutil/save_test.go | 2 +- pkg/chartutil/transform.go | 2 +- pkg/chartutil/values.go | 2 +- pkg/chartutil/values_test.go | 2 +- pkg/downloader/chart_downloader.go | 2 +- pkg/downloader/chart_downloader_test.go | 2 +- pkg/downloader/doc.go | 2 +- pkg/downloader/manager.go | 2 +- pkg/downloader/manager_test.go | 2 +- pkg/engine/doc.go | 2 +- pkg/engine/engine.go | 2 +- pkg/engine/engine_test.go | 2 +- pkg/getter/doc.go | 2 +- pkg/getter/getter.go | 2 +- pkg/getter/getter_test.go | 2 +- pkg/getter/httpgetter.go | 2 +- pkg/getter/httpgetter_test.go | 2 +- pkg/getter/plugingetter.go | 2 +- pkg/getter/plugingetter_test.go | 2 +- pkg/helm/client.go | 2 +- pkg/helm/client_test.go | 2 +- pkg/helm/environment/environment.go | 2 +- pkg/helm/environment/environment_test.go | 2 +- pkg/helm/fake.go | 2 +- pkg/helm/fake_test.go | 2 +- pkg/helm/helm_test.go | 2 +- pkg/helm/helmpath/helmhome.go | 2 +- pkg/helm/helmpath/helmhome_unix_test.go | 2 +- pkg/helm/helmpath/helmhome_windows_test.go | 2 +- pkg/helm/interface.go | 2 +- pkg/helm/option.go | 2 +- pkg/helm/portforwarder/pod.go | 2 +- pkg/helm/portforwarder/portforwarder.go | 2 +- pkg/helm/portforwarder/portforwarder_test.go | 2 +- pkg/hooks/hooks.go | 2 +- pkg/ignore/doc.go | 2 +- pkg/ignore/rules.go | 2 +- pkg/ignore/rules_test.go | 2 +- pkg/kube/client.go | 2 +- pkg/kube/client_test.go | 2 +- pkg/kube/config.go | 2 +- pkg/kube/log.go | 2 +- pkg/kube/namespace.go | 2 +- pkg/kube/namespace_test.go | 2 +- pkg/kube/result.go | 2 +- pkg/kube/result_test.go | 2 +- pkg/kube/tunnel.go | 2 +- pkg/kube/tunnel_test.go | 2 +- pkg/kube/wait.go | 2 +- pkg/lint/lint.go | 2 +- pkg/lint/lint_test.go | 2 +- pkg/lint/rules/chartfile.go | 2 +- pkg/lint/rules/chartfile_test.go | 2 +- pkg/lint/rules/template.go | 2 +- pkg/lint/rules/template_test.go | 2 +- pkg/lint/rules/values.go | 2 +- pkg/lint/support/doc.go | 2 +- pkg/lint/support/message.go | 2 +- pkg/lint/support/message_test.go | 2 +- pkg/plugin/cache/cache.go | 2 +- pkg/plugin/hooks.go | 2 +- pkg/plugin/installer/base.go | 2 +- pkg/plugin/installer/doc.go | 2 +- pkg/plugin/installer/http_installer.go | 2 +- pkg/plugin/installer/http_installer_test.go | 2 +- pkg/plugin/installer/installer.go | 2 +- pkg/plugin/installer/local_installer.go | 2 +- pkg/plugin/installer/local_installer_test.go | 2 +- pkg/plugin/installer/vcs_installer.go | 2 +- pkg/plugin/installer/vcs_installer_test.go | 2 +- pkg/plugin/plugin.go | 2 +- pkg/plugin/plugin_test.go | 2 +- pkg/provenance/doc.go | 2 +- pkg/provenance/sign.go | 2 +- pkg/provenance/sign_test.go | 2 +- pkg/releasetesting/environment.go | 2 +- pkg/releasetesting/environment_test.go | 2 +- pkg/releasetesting/test_suite.go | 2 +- pkg/releasetesting/test_suite_test.go | 2 +- pkg/releaseutil/filter.go | 2 +- pkg/releaseutil/filter_test.go | 2 +- pkg/releaseutil/manifest.go | 2 +- pkg/releaseutil/manifest_test.go | 2 +- pkg/releaseutil/sorter.go | 2 +- pkg/releaseutil/sorter_test.go | 2 +- pkg/repo/chartrepo.go | 2 +- pkg/repo/chartrepo_test.go | 2 +- pkg/repo/doc.go | 2 +- pkg/repo/index.go | 2 +- pkg/repo/index_test.go | 2 +- pkg/repo/local.go | 2 +- pkg/repo/local_test.go | 2 +- pkg/repo/repo.go | 2 +- pkg/repo/repo_test.go | 2 +- pkg/repo/repotest/doc.go | 2 +- pkg/repo/repotest/server.go | 2 +- pkg/repo/repotest/server_test.go | 2 +- pkg/resolver/resolver.go | 2 +- pkg/resolver/resolver_test.go | 2 +- pkg/rudder/client.go | 2 +- pkg/storage/driver/cfgmaps.go | 2 +- pkg/storage/driver/cfgmaps_test.go | 2 +- pkg/storage/driver/driver.go | 2 +- pkg/storage/driver/labels.go | 2 +- pkg/storage/driver/labels_test.go | 2 +- pkg/storage/driver/memory.go | 2 +- pkg/storage/driver/memory_test.go | 2 +- pkg/storage/driver/mock_test.go | 2 +- pkg/storage/driver/records.go | 2 +- pkg/storage/driver/records_test.go | 2 +- pkg/storage/driver/secrets.go | 2 +- pkg/storage/driver/secrets_test.go | 2 +- pkg/storage/driver/util.go | 2 +- pkg/storage/storage.go | 2 +- pkg/storage/storage_test.go | 2 +- pkg/strvals/doc.go | 2 +- pkg/strvals/parser.go | 2 +- pkg/strvals/parser_test.go | 2 +- pkg/sympath/walk.go | 2 +- pkg/sympath/walk_test.go | 2 +- pkg/tiller/environment/environment.go | 2 +- pkg/tiller/environment/environment_test.go | 2 +- pkg/tiller/hook_sorter.go | 2 +- pkg/tiller/hook_sorter_test.go | 2 +- pkg/tiller/hooks.go | 2 +- pkg/tiller/hooks_test.go | 2 +- pkg/tiller/kind_sorter.go | 2 +- pkg/tiller/kind_sorter_test.go | 2 +- pkg/tiller/release_content.go | 2 +- pkg/tiller/release_content_test.go | 2 +- pkg/tiller/release_history.go | 2 +- pkg/tiller/release_history_test.go | 2 +- pkg/tiller/release_install.go | 2 +- pkg/tiller/release_install_test.go | 2 +- pkg/tiller/release_list.go | 2 +- pkg/tiller/release_list_test.go | 2 +- pkg/tiller/release_modules.go | 2 +- pkg/tiller/release_rollback.go | 2 +- pkg/tiller/release_rollback_test.go | 2 +- pkg/tiller/release_server.go | 2 +- pkg/tiller/release_server_test.go | 2 +- pkg/tiller/release_status.go | 2 +- pkg/tiller/release_status_test.go | 2 +- pkg/tiller/release_testing.go | 2 +- pkg/tiller/release_testing_test.go | 2 +- pkg/tiller/release_uninstall.go | 2 +- pkg/tiller/release_uninstall_test.go | 2 +- pkg/tiller/release_update.go | 2 +- pkg/tiller/release_update_test.go | 2 +- pkg/tiller/release_version.go | 2 +- pkg/tiller/resource_policy.go | 2 +- pkg/tiller/server.go | 2 +- pkg/timeconv/doc.go | 2 +- pkg/timeconv/timeconv.go | 2 +- pkg/timeconv/timeconv_test.go | 2 +- pkg/tlsutil/cfg.go | 2 +- pkg/tlsutil/tls.go | 2 +- pkg/tlsutil/tlsutil_test.go | 2 +- pkg/urlutil/urlutil.go | 2 +- pkg/urlutil/urlutil_test.go | 2 +- pkg/version/compatible.go | 2 +- pkg/version/compatible_test.go | 2 +- pkg/version/doc.go | 2 +- pkg/version/version.go | 2 +- pkg/version/version_test.go | 2 +- rootfs/Dockerfile | 2 +- rootfs/Dockerfile.experimental | 2 +- rootfs/Dockerfile.rudder | 2 +- scripts/coverage.sh | 2 +- scripts/get | 2 +- scripts/sync-repo.sh | 2 +- scripts/update-docs.sh | 2 +- scripts/util.sh | 2 +- scripts/validate-go.sh | 2 +- scripts/validate-license.sh | 17 +++++++++++++---- scripts/verify-docs.sh | 2 +- 299 files changed, 311 insertions(+), 302 deletions(-) diff --git a/.circleci/bootstrap.sh b/.circleci/bootstrap.sh index 978464efe83..30dc0b3164a 100755 --- a/.circleci/bootstrap.sh +++ b/.circleci/bootstrap.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.circleci/deploy.sh b/.circleci/deploy.sh index 6ad91109d75..08adad56814 100755 --- a/.circleci/deploy.sh +++ b/.circleci/deploy.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.circleci/test.sh b/.circleci/test.sh index e0faf9c1822..a6acd8f6a04 100755 --- a/.circleci/test.sh +++ b/.circleci/test.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/LICENSE b/LICENSE index 21c57fae21f..393b7a33b5c 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2016 The Kubernetes Authors All Rights Reserved + Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/_proto/hapi/chart/chart.proto b/_proto/hapi/chart/chart.proto index 9b838fd1a95..68aea8f0536 100644 --- a/_proto/hapi/chart/chart.proto +++ b/_proto/hapi/chart/chart.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/chart/config.proto b/_proto/hapi/chart/config.proto index a1404476bd9..a851d212fd4 100644 --- a/_proto/hapi/chart/config.proto +++ b/_proto/hapi/chart/config.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/chart/metadata.proto b/_proto/hapi/chart/metadata.proto index 49d6a217a6b..0ac695ce281 100644 --- a/_proto/hapi/chart/metadata.proto +++ b/_proto/hapi/chart/metadata.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/chart/template.proto b/_proto/hapi/chart/template.proto index d13543ea973..879d2071abc 100644 --- a/_proto/hapi/chart/template.proto +++ b/_proto/hapi/chart/template.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/hook.proto b/_proto/hapi/release/hook.proto index 0d96dd9ae93..cf7e25bf6f8 100644 --- a/_proto/hapi/release/hook.proto +++ b/_proto/hapi/release/hook.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/info.proto b/_proto/hapi/release/info.proto index e23175d3d80..ee03056c74b 100644 --- a/_proto/hapi/release/info.proto +++ b/_proto/hapi/release/info.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/release.proto b/_proto/hapi/release/release.proto index 4a6afa0fe2e..ce9208e298a 100644 --- a/_proto/hapi/release/release.proto +++ b/_proto/hapi/release/release.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/status.proto b/_proto/hapi/release/status.proto index ef28a233c15..aa90760b34d 100644 --- a/_proto/hapi/release/status.proto +++ b/_proto/hapi/release/status.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/test_run.proto b/_proto/hapi/release/test_run.proto index 60734ae0384..7c281669fb4 100644 --- a/_proto/hapi/release/test_run.proto +++ b/_proto/hapi/release/test_run.proto @@ -1,5 +1,5 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/release/test_suite.proto b/_proto/hapi/release/test_suite.proto index 2f6feb08c49..9ac6583b244 100644 --- a/_proto/hapi/release/test_suite.proto +++ b/_proto/hapi/release/test_suite.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/rudder/rudder.proto b/_proto/hapi/rudder/rudder.proto index 3a37c9e99d2..188491512cf 100644 --- a/_proto/hapi/rudder/rudder.proto +++ b/_proto/hapi/rudder/rudder.proto @@ -1,4 +1,4 @@ -// Copyright 2017 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 25bf7af44b3..a94a90a4a1a 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_proto/hapi/version/version.proto b/_proto/hapi/version/version.proto index 0ae0985b786..5c50e852ffa 100644 --- a/_proto/hapi/version/version.proto +++ b/_proto/hapi/version/version.proto @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index b1cd04140ca..f1057d055c6 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/create.go b/cmd/helm/create.go index 556ff171d71..eaea81e5bb8 100644 --- a/cmd/helm/create.go +++ b/cmd/helm/create.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/create_test.go b/cmd/helm/create_test.go index 84ccebecebc..214432b83b5 100644 --- a/cmd/helm/create_test.go +++ b/cmd/helm/create_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/delete.go b/cmd/helm/delete.go index 46c7abcb192..ad7c6049a91 100755 --- a/cmd/helm/delete.go +++ b/cmd/helm/delete.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/delete_test.go b/cmd/helm/delete_test.go index 6b5c444b192..b71860e67c2 100644 --- a/cmd/helm/delete_test.go +++ b/cmd/helm/delete_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/dependency.go b/cmd/helm/dependency.go index 231659691a7..ade4ddb39dc 100644 --- a/cmd/helm/dependency.go +++ b/cmd/helm/dependency.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/dependency_build.go b/cmd/helm/dependency_build.go index ec5fd14b75d..3af3c124393 100644 --- a/cmd/helm/dependency_build.go +++ b/cmd/helm/dependency_build.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/dependency_build_test.go b/cmd/helm/dependency_build_test.go index 2d7c88654c1..207313bf5b2 100644 --- a/cmd/helm/dependency_build_test.go +++ b/cmd/helm/dependency_build_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/dependency_test.go b/cmd/helm/dependency_test.go index cc451914711..e98f436ec45 100644 --- a/cmd/helm/dependency_test.go +++ b/cmd/helm/dependency_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/dependency_update.go b/cmd/helm/dependency_update.go index d6a9986398b..a8e54137bf2 100644 --- a/cmd/helm/dependency_update.go +++ b/cmd/helm/dependency_update.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/dependency_update_test.go b/cmd/helm/dependency_update_test.go index e29cb35de7f..f7ef84e6f78 100644 --- a/cmd/helm/dependency_update_test.go +++ b/cmd/helm/dependency_update_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/docs.go b/cmd/helm/docs.go index e5b9f752107..56e3beaf5b1 100644 --- a/cmd/helm/docs.go +++ b/cmd/helm/docs.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/fetch.go b/cmd/helm/fetch.go index 069f57effe6..d6f622bb6d2 100644 --- a/cmd/helm/fetch.go +++ b/cmd/helm/fetch.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/fetch_test.go b/cmd/helm/fetch_test.go index 13247ee9972..3fba37dd62f 100644 --- a/cmd/helm/fetch_test.go +++ b/cmd/helm/fetch_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get.go b/cmd/helm/get.go index a2eb1d137fd..5744beb62cc 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_hooks.go b/cmd/helm/get_hooks.go index 1b6f2f8fef5..9192db99823 100644 --- a/cmd/helm/get_hooks.go +++ b/cmd/helm/get_hooks.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_hooks_test.go b/cmd/helm/get_hooks_test.go index e578c2533ed..fe9133feb21 100644 --- a/cmd/helm/get_hooks_test.go +++ b/cmd/helm/get_hooks_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_manifest.go b/cmd/helm/get_manifest.go index c01febfb45a..f4ae11e58bf 100644 --- a/cmd/helm/get_manifest.go +++ b/cmd/helm/get_manifest.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_manifest_test.go b/cmd/helm/get_manifest_test.go index 286b5628aa6..c95a1f2657c 100644 --- a/cmd/helm/get_manifest_test.go +++ b/cmd/helm/get_manifest_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_test.go b/cmd/helm/get_test.go index a6e72987ad4..cb230a8a508 100644 --- a/cmd/helm/get_test.go +++ b/cmd/helm/get_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index b6ce648e519..12a48f1daf1 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index 30b2ba4b86d..35c84f2ec64 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 3f859392d36..8607129e49a 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/helm_test.go b/cmd/helm/helm_test.go index 79b8c16f2a9..c872af8c368 100644 --- a/cmd/helm/helm_test.go +++ b/cmd/helm/helm_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/history.go b/cmd/helm/history.go index e6366d31d83..6e0b48d338a 100644 --- a/cmd/helm/history.go +++ b/cmd/helm/history.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/history_test.go b/cmd/helm/history_test.go index fef43374206..5d51462288b 100644 --- a/cmd/helm/history_test.go +++ b/cmd/helm/history_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/home.go b/cmd/helm/home.go index e96edd7a127..ca21088a7f7 100644 --- a/cmd/helm/home.go +++ b/cmd/helm/home.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 93073b9c144..d6c43206006 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/init_test.go b/cmd/helm/init_test.go index 6a5767fcaaf..74d6a0424f5 100644 --- a/cmd/helm/init_test.go +++ b/cmd/helm/init_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/init_unix.go b/cmd/helm/init_unix.go index 1117dd487bd..bf61f19251f 100644 --- a/cmd/helm/init_unix.go +++ b/cmd/helm/init_unix.go @@ -1,7 +1,7 @@ // +build !windows /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/init_windows.go b/cmd/helm/init_windows.go index be17bccda3e..447044bbac9 100644 --- a/cmd/helm/init_windows.go +++ b/cmd/helm/init_windows.go @@ -1,7 +1,7 @@ // +build windows /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/inspect.go b/cmd/helm/inspect.go index 9998569591f..c1861f7c5cd 100644 --- a/cmd/helm/inspect.go +++ b/cmd/helm/inspect.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/inspect_test.go b/cmd/helm/inspect_test.go index 44d71fbbd4f..b9dbf2ab625 100644 --- a/cmd/helm/inspect_test.go +++ b/cmd/helm/inspect_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 2213fd1fbc0..1488b87c59d 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index 236174bec8a..48d9fc8c1cc 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index becf412a179..0108d1892cb 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index dbb7143e33d..b67bb0ad8db 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 3769d12e197..95aa3988d84 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/installer/uninstall.go b/cmd/helm/installer/uninstall.go index 818827ddbd3..14735ea8505 100644 --- a/cmd/helm/installer/uninstall.go +++ b/cmd/helm/installer/uninstall.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/installer/uninstall_test.go b/cmd/helm/installer/uninstall_test.go index 91b257d47d8..195b209bc31 100644 --- a/cmd/helm/installer/uninstall_test.go +++ b/cmd/helm/installer/uninstall_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/lint.go b/cmd/helm/lint.go index 3221368ce76..d0159d34b09 100644 --- a/cmd/helm/lint.go +++ b/cmd/helm/lint.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/lint_test.go b/cmd/helm/lint_test.go index 973af9b6314..67775893b7f 100644 --- a/cmd/helm/lint_test.go +++ b/cmd/helm/lint_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 47417749f80..ed70702d546 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/list_test.go b/cmd/helm/list_test.go index e0faee93505..934f10712c8 100644 --- a/cmd/helm/list_test.go +++ b/cmd/helm/list_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/load_plugins.go b/cmd/helm/load_plugins.go index 67de8bae537..158a69c88ed 100644 --- a/cmd/helm/load_plugins.go +++ b/cmd/helm/load_plugins.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/package.go b/cmd/helm/package.go index ed44382c792..81603e67b1e 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/package_test.go b/cmd/helm/package_test.go index 4404586e0f8..7ed9829a5c5 100644 --- a/cmd/helm/package_test.go +++ b/cmd/helm/package_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin.go b/cmd/helm/plugin.go index cf0b02f0947..fbdd1245b48 100644 --- a/cmd/helm/plugin.go +++ b/cmd/helm/plugin.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin_install.go b/cmd/helm/plugin_install.go index f3617880825..7d77be3fc2f 100644 --- a/cmd/helm/plugin_install.go +++ b/cmd/helm/plugin_install.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin_list.go b/cmd/helm/plugin_list.go index e7618f38a71..9693baaa2bd 100644 --- a/cmd/helm/plugin_list.go +++ b/cmd/helm/plugin_list.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin_remove.go b/cmd/helm/plugin_remove.go index ec11547344e..f30e5b5162a 100644 --- a/cmd/helm/plugin_remove.go +++ b/cmd/helm/plugin_remove.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin_test.go b/cmd/helm/plugin_test.go index 2a4a0e9aadb..2d06c3797d6 100644 --- a/cmd/helm/plugin_test.go +++ b/cmd/helm/plugin_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/plugin_update.go b/cmd/helm/plugin_update.go index d3778764d79..f9d5a3facf0 100644 --- a/cmd/helm/plugin_update.go +++ b/cmd/helm/plugin_update.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/printer.go b/cmd/helm/printer.go index ebb24bf7d80..e98b71c64b8 100644 --- a/cmd/helm/printer.go +++ b/cmd/helm/printer.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index bdfa87a60f2..0c9debb3f1a 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/release_testing_test.go b/cmd/helm/release_testing_test.go index b946746d016..f4f64c16ddf 100644 --- a/cmd/helm/release_testing_test.go +++ b/cmd/helm/release_testing_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo.go b/cmd/helm/repo.go index 8acc762e278..9f1dc892805 100644 --- a/cmd/helm/repo.go +++ b/cmd/helm/repo.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_add.go b/cmd/helm/repo_add.go index 77a64cc89a4..906a9aef496 100644 --- a/cmd/helm/repo_add.go +++ b/cmd/helm/repo_add.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_add_test.go b/cmd/helm/repo_add_test.go index 157b1cc5bc0..5a458cef72f 100644 --- a/cmd/helm/repo_add_test.go +++ b/cmd/helm/repo_add_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_index.go b/cmd/helm/repo_index.go index 540057eb843..3ed36e43fbe 100644 --- a/cmd/helm/repo_index.go +++ b/cmd/helm/repo_index.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_index_test.go b/cmd/helm/repo_index_test.go index 4d6313f6c35..0d5571ef7de 100644 --- a/cmd/helm/repo_index_test.go +++ b/cmd/helm/repo_index_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_list.go b/cmd/helm/repo_list.go index 0f795b2b0fb..36887c69b22 100644 --- a/cmd/helm/repo_list.go +++ b/cmd/helm/repo_list.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_remove.go b/cmd/helm/repo_remove.go index 728852fa1e2..f13b8dadbc0 100644 --- a/cmd/helm/repo_remove.go +++ b/cmd/helm/repo_remove.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_remove_test.go b/cmd/helm/repo_remove_test.go index bc071b989bc..f52c3afc490 100644 --- a/cmd/helm/repo_remove_test.go +++ b/cmd/helm/repo_remove_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 51e5c08685a..291b21b72b2 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/repo_update_test.go b/cmd/helm/repo_update_test.go index 68f964f3280..71dc879660e 100644 --- a/cmd/helm/repo_update_test.go +++ b/cmd/helm/repo_update_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index 1fe0ce39f23..5b0914e8231 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/reset_test.go b/cmd/helm/reset_test.go index 189b692735b..8a74e8af511 100644 --- a/cmd/helm/reset_test.go +++ b/cmd/helm/reset_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 370807cb4e0..5c85afc3bcb 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/rollback_test.go b/cmd/helm/rollback_test.go index 62bfd6477a5..a98a4096af0 100644 --- a/cmd/helm/rollback_test.go +++ b/cmd/helm/rollback_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/search.go b/cmd/helm/search.go index ab284a89804..84f328d415f 100644 --- a/cmd/helm/search.go +++ b/cmd/helm/search.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/search/search.go b/cmd/helm/search/search.go index 6c4cb4aa48b..04acb869087 100644 --- a/cmd/helm/search/search.go +++ b/cmd/helm/search/search.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/search/search_test.go b/cmd/helm/search/search_test.go index 574f55448a4..8432685fa0b 100644 --- a/cmd/helm/search/search_test.go +++ b/cmd/helm/search/search_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/search_test.go b/cmd/helm/search_test.go index 734f752f5ff..233f94572ea 100644 --- a/cmd/helm/search_test.go +++ b/cmd/helm/search_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/serve.go b/cmd/helm/serve.go index 21ae36da146..81f2785c34b 100644 --- a/cmd/helm/serve.go +++ b/cmd/helm/serve.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/status.go b/cmd/helm/status.go index b73b6f56e38..be057a28e42 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/status_test.go b/cmd/helm/status_test.go index 616b027f392..4a00b8698a8 100644 --- a/cmd/helm/status_test.go +++ b/cmd/helm/status_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/template.go b/cmd/helm/template.go index bcfb6a7e45e..2080320297e 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 263b6bb35e2..64924c2f206 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 27c504e20c8..ba0649e396b 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/upgrade_test.go b/cmd/helm/upgrade_test.go index 032df2f32ad..60b529f6391 100644 --- a/cmd/helm/upgrade_test.go +++ b/cmd/helm/upgrade_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/verify.go b/cmd/helm/verify.go index e82eb4e333f..bbc8347c15c 100644 --- a/cmd/helm/verify.go +++ b/cmd/helm/verify.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/verify_test.go b/cmd/helm/verify_test.go index 6e8b906fc9e..4d683df7578 100644 --- a/cmd/helm/verify_test.go +++ b/cmd/helm/verify_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/helm/version.go b/cmd/helm/version.go index 407c2bf43b5..605e96b523b 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/helm/version_test.go b/cmd/helm/version_test.go index e25724f4cad..5519131c209 100644 --- a/cmd/helm/version_test.go +++ b/cmd/helm/version_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/cmd/rudder/rudder.go b/cmd/rudder/rudder.go index 30ece399813..8897e78be2c 100644 --- a/cmd/rudder/rudder.go +++ b/cmd/rudder/rudder.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/tiller/probes.go b/cmd/tiller/probes.go index 144ad8a1b3f..7d209aa4298 100644 --- a/cmd/tiller/probes.go +++ b/cmd/tiller/probes.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/tiller/probes_test.go b/cmd/tiller/probes_test.go index 0b13460e0a6..d13979a8af2 100644 --- a/cmd/tiller/probes_test.go +++ b/cmd/tiller/probes_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index c97187b2a01..0208fe74126 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/tiller/tiller_test.go b/cmd/tiller/tiller_test.go index 0698e9d94c1..9ce153fc7eb 100644 --- a/cmd/tiller/tiller_test.go +++ b/cmd/tiller/tiller_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/tiller/trace.go b/cmd/tiller/trace.go index 71d7e8f7268..126bbf83a4f 100644 --- a/cmd/tiller/trace.go +++ b/cmd/tiller/trace.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/capabilities.go b/pkg/chartutil/capabilities.go index d26aa170751..d7e660b8a28 100644 --- a/pkg/chartutil/capabilities.go +++ b/pkg/chartutil/capabilities.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/capabilities_test.go b/pkg/chartutil/capabilities_test.go index ac20f0038c3..1f7020a39d7 100644 --- a/pkg/chartutil/capabilities_test.go +++ b/pkg/chartutil/capabilities_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/chartfile.go b/pkg/chartutil/chartfile.go index c2879cdae57..f997d15fe2b 100644 --- a/pkg/chartutil/chartfile.go +++ b/pkg/chartutil/chartfile.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/chartfile_test.go b/pkg/chartutil/chartfile_test.go index 5b36dc95566..e55fbbd48c0 100755 --- a/pkg/chartutil/chartfile_test.go +++ b/pkg/chartutil/chartfile_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index fa6fb278368..97056c1756a 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/create_test.go b/pkg/chartutil/create_test.go index e9af83ad284..96c467e7e9f 100644 --- a/pkg/chartutil/create_test.go +++ b/pkg/chartutil/create_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/doc.go b/pkg/chartutil/doc.go index 1190d968da3..cb3f5d1f1a0 100644 --- a/pkg/chartutil/doc.go +++ b/pkg/chartutil/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/expand.go b/pkg/chartutil/expand.go index 126e14e8005..1d49b159f69 100644 --- a/pkg/chartutil/expand.go +++ b/pkg/chartutil/expand.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/files.go b/pkg/chartutil/files.go index a09bb8f438e..c5496a8b03f 100644 --- a/pkg/chartutil/files.go +++ b/pkg/chartutil/files.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/files_test.go b/pkg/chartutil/files_test.go index 731c82e6f50..1488b7986e8 100644 --- a/pkg/chartutil/files_test.go +++ b/pkg/chartutil/files_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go index c5246b8d76a..b3daefac736 100644 --- a/pkg/chartutil/load.go +++ b/pkg/chartutil/load.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/load_test.go b/pkg/chartutil/load_test.go index 45450048999..5cb15fbdcc6 100644 --- a/pkg/chartutil/load_test.go +++ b/pkg/chartutil/load_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 6ef6508d9fc..56612312227 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/requirements_test.go b/pkg/chartutil/requirements_test.go index 24388f86c61..0afde17e16a 100644 --- a/pkg/chartutil/requirements_test.go +++ b/pkg/chartutil/requirements_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 201372a0f10..f72b34e1b5e 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/save_test.go b/pkg/chartutil/save_test.go index 5e156429981..318630f6e04 100644 --- a/pkg/chartutil/save_test.go +++ b/pkg/chartutil/save_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/transform.go b/pkg/chartutil/transform.go index 7cbb754fb32..fbee8e690a6 100644 --- a/pkg/chartutil/transform.go +++ b/pkg/chartutil/transform.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go index 66a2658d511..1ea7edd8c0b 100644 --- a/pkg/chartutil/values.go +++ b/pkg/chartutil/values.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/chartutil/values_test.go b/pkg/chartutil/values_test.go index d9b03c21a1e..f54b25827d6 100644 --- a/pkg/chartutil/values_test.go +++ b/pkg/chartutil/values_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 59b9d4d756d..92c8f9165d7 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/downloader/chart_downloader_test.go b/pkg/downloader/chart_downloader_test.go index 80efa77e8c9..5967eee7030 100644 --- a/pkg/downloader/chart_downloader_test.go +++ b/pkg/downloader/chart_downloader_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/downloader/doc.go b/pkg/downloader/doc.go index fb54936b867..c70b2f69525 100644 --- a/pkg/downloader/doc.go +++ b/pkg/downloader/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 9ee1f6f6d07..67f9dc7bf1e 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index 1ff2a9c173c..8c2377e47c4 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/engine/doc.go b/pkg/engine/doc.go index 53c4084b005..63c036605ce 100644 --- a/pkg/engine/doc.go +++ b/pkg/engine/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index 7a940fc84bc..e29e044f973 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/engine/engine_test.go b/pkg/engine/engine_test.go index 8ffb3d87c9d..91a3fd79559 100644 --- a/pkg/engine/engine_test.go +++ b/pkg/engine/engine_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/getter/doc.go b/pkg/getter/doc.go index fe51e49670a..c53ef1ae02b 100644 --- a/pkg/getter/doc.go +++ b/pkg/getter/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/getter/getter.go b/pkg/getter/getter.go index ca018884a01..c595fec699d 100644 --- a/pkg/getter/getter.go +++ b/pkg/getter/getter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/getter/getter_test.go b/pkg/getter/getter_test.go index 6d38a0d28dd..d03c82686ab 100644 --- a/pkg/getter/getter_test.go +++ b/pkg/getter/getter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/getter/httpgetter.go b/pkg/getter/httpgetter.go index 1df6b0f622c..4987e951abd 100644 --- a/pkg/getter/httpgetter.go +++ b/pkg/getter/httpgetter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/getter/httpgetter_test.go b/pkg/getter/httpgetter_test.go index fa4863de85a..fbe33039065 100644 --- a/pkg/getter/httpgetter_test.go +++ b/pkg/getter/httpgetter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/getter/plugingetter.go b/pkg/getter/plugingetter.go index a73ccc85398..8f2099de045 100644 --- a/pkg/getter/plugingetter.go +++ b/pkg/getter/plugingetter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/getter/plugingetter_test.go b/pkg/getter/plugingetter_test.go index f1fe9bf29d3..9bfe6144df1 100644 --- a/pkg/getter/plugingetter_test.go +++ b/pkg/getter/plugingetter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 465ca0af8c3..f9774392f13 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index 95e04449983..30d8e200252 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/environment/environment.go b/pkg/helm/environment/environment.go index 9b0acce4c73..4241bbb8a42 100644 --- a/pkg/helm/environment/environment.go +++ b/pkg/helm/environment/environment.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/environment/environment_test.go b/pkg/helm/environment/environment_test.go index c7d65cd5a93..35958e7917d 100644 --- a/pkg/helm/environment/environment_test.go +++ b/pkg/helm/environment/environment_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 05235c92a31..a3b0ebc84de 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/fake_test.go b/pkg/helm/fake_test.go index f6de572b5a5..f16fbaf4c2d 100644 --- a/pkg/helm/fake_test.go +++ b/pkg/helm/fake_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/helm_test.go b/pkg/helm/helm_test.go index 2b0436581d7..fe7150cc02f 100644 --- a/pkg/helm/helm_test.go +++ b/pkg/helm/helm_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/helmpath/helmhome.go b/pkg/helm/helmpath/helmhome.go index b5ec4909eb9..9608ea6dd2e 100644 --- a/pkg/helm/helmpath/helmhome.go +++ b/pkg/helm/helmpath/helmhome.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/helm/helmpath/helmhome_unix_test.go b/pkg/helm/helmpath/helmhome_unix_test.go index 494d0f6b493..ca90355546a 100644 --- a/pkg/helm/helmpath/helmhome_unix_test.go +++ b/pkg/helm/helmpath/helmhome_unix_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // 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 diff --git a/pkg/helm/helmpath/helmhome_windows_test.go b/pkg/helm/helmpath/helmhome_windows_test.go index e416bfd5880..db1341421d3 100644 --- a/pkg/helm/helmpath/helmhome_windows_test.go +++ b/pkg/helm/helmpath/helmhome_windows_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 The Kubernetes Authors All rights reserved. +// Copyright The Helm Authors. // 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 diff --git a/pkg/helm/interface.go b/pkg/helm/interface.go index 10c04c71089..d09b6cf8f89 100644 --- a/pkg/helm/interface.go +++ b/pkg/helm/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 4babec07361..5579ae76d9a 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/portforwarder/pod.go b/pkg/helm/portforwarder/pod.go index 5eae5b5e6f1..239eb273054 100644 --- a/pkg/helm/portforwarder/pod.go +++ b/pkg/helm/portforwarder/pod.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/portforwarder/portforwarder.go b/pkg/helm/portforwarder/portforwarder.go index 878610d5f25..cc3261d1ca7 100644 --- a/pkg/helm/portforwarder/portforwarder.go +++ b/pkg/helm/portforwarder/portforwarder.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/helm/portforwarder/portforwarder_test.go b/pkg/helm/portforwarder/portforwarder_test.go index e4c14899158..ad5a23bc8ea 100644 --- a/pkg/helm/portforwarder/portforwarder_test.go +++ b/pkg/helm/portforwarder/portforwarder_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/hooks/hooks.go b/pkg/hooks/hooks.go index 64118333de9..5083672cda8 100644 --- a/pkg/hooks/hooks.go +++ b/pkg/hooks/hooks.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/ignore/doc.go b/pkg/ignore/doc.go index 7281c33a9f6..85cc9106089 100644 --- a/pkg/ignore/doc.go +++ b/pkg/ignore/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/ignore/rules.go b/pkg/ignore/rules.go index 185d289bb0c..9a8e0832721 100644 --- a/pkg/ignore/rules.go +++ b/pkg/ignore/rules.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/ignore/rules_test.go b/pkg/ignore/rules_test.go index 17b8bf403ab..a2f7090978a 100644 --- a/pkg/ignore/rules_test.go +++ b/pkg/ignore/rules_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 926174ef1b0..39187da42e1 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 47049810af6..6e33ca27f96 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/config.go b/pkg/kube/config.go index ac0a9015d65..7504d902889 100644 --- a/pkg/kube/config.go +++ b/pkg/kube/config.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/log.go b/pkg/kube/log.go index fbe51823a4e..fc3683b1dfc 100644 --- a/pkg/kube/log.go +++ b/pkg/kube/log.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/namespace.go b/pkg/kube/namespace.go index c6878bd0f7b..57e62bab7e9 100644 --- a/pkg/kube/namespace.go +++ b/pkg/kube/namespace.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/namespace_test.go b/pkg/kube/namespace_test.go index eb96557d0de..79e8e880cb4 100644 --- a/pkg/kube/namespace_test.go +++ b/pkg/kube/namespace_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/result.go b/pkg/kube/result.go index 87c7e6ac1c9..f90d77ad5af 100644 --- a/pkg/kube/result.go +++ b/pkg/kube/result.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/result_test.go b/pkg/kube/result_test.go index 962e9042612..0780ad9fcd7 100644 --- a/pkg/kube/result_test.go +++ b/pkg/kube/result_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/tunnel.go b/pkg/kube/tunnel.go index 08280f25d24..f4eaa7e2600 100644 --- a/pkg/kube/tunnel.go +++ b/pkg/kube/tunnel.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/tunnel_test.go b/pkg/kube/tunnel_test.go index 264200ddfd9..37fb296a30b 100644 --- a/pkg/kube/tunnel_test.go +++ b/pkg/kube/tunnel_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 88f3c7d34d5..ed9bc10a651 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/lint.go b/pkg/lint/lint.go index 256eab90612..aa8df58143f 100644 --- a/pkg/lint/lint.go +++ b/pkg/lint/lint.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/lint_test.go b/pkg/lint/lint_test.go index d84faa10b8e..84dfbf508af 100644 --- a/pkg/lint/lint_test.go +++ b/pkg/lint/lint_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/rules/chartfile.go b/pkg/lint/rules/chartfile.go index 0dab0d250c7..12f028af147 100644 --- a/pkg/lint/rules/chartfile.go +++ b/pkg/lint/rules/chartfile.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/rules/chartfile_test.go b/pkg/lint/rules/chartfile_test.go index 99dc4de0f51..235e5fc4c90 100644 --- a/pkg/lint/rules/chartfile_test.go +++ b/pkg/lint/rules/chartfile_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/rules/template.go b/pkg/lint/rules/template.go index a8b6a675708..8b51b14f8cc 100644 --- a/pkg/lint/rules/template.go +++ b/pkg/lint/rules/template.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/rules/template_test.go b/pkg/lint/rules/template_test.go index cb1be94a2d0..41a7384e73f 100644 --- a/pkg/lint/rules/template_test.go +++ b/pkg/lint/rules/template_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/rules/values.go b/pkg/lint/rules/values.go index 9b97598f0f8..4781cc176e4 100644 --- a/pkg/lint/rules/values.go +++ b/pkg/lint/rules/values.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/support/doc.go b/pkg/lint/support/doc.go index 4cf7272e4cf..ede608906de 100644 --- a/pkg/lint/support/doc.go +++ b/pkg/lint/support/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/support/message.go b/pkg/lint/support/message.go index 6a878031a9c..4dd485c98e1 100644 --- a/pkg/lint/support/message.go +++ b/pkg/lint/support/message.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/lint/support/message_test.go b/pkg/lint/support/message_test.go index 4a9c33c34e4..55675eeeecb 100644 --- a/pkg/lint/support/message_test.go +++ b/pkg/lint/support/message_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/plugin/cache/cache.go b/pkg/plugin/cache/cache.go index a1d3224c8b4..d846126f106 100644 --- a/pkg/plugin/cache/cache.go +++ b/pkg/plugin/cache/cache.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/hooks.go b/pkg/plugin/hooks.go index b5ca032ac3d..70ce5d122de 100644 --- a/pkg/plugin/hooks.go +++ b/pkg/plugin/hooks.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/base.go b/pkg/plugin/installer/base.go index 0664dae763e..15ce3cbcfe2 100644 --- a/pkg/plugin/installer/base.go +++ b/pkg/plugin/installer/base.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/doc.go b/pkg/plugin/installer/doc.go index a2a66f3e1dc..0089e33f803 100644 --- a/pkg/plugin/installer/doc.go +++ b/pkg/plugin/installer/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/http_installer.go b/pkg/plugin/installer/http_installer.go index b5c205de6fd..fd58b88ca47 100644 --- a/pkg/plugin/installer/http_installer.go +++ b/pkg/plugin/installer/http_installer.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/http_installer_test.go b/pkg/plugin/installer/http_installer_test.go index bab5f7a92b3..73af75e8cf5 100644 --- a/pkg/plugin/installer/http_installer_test.go +++ b/pkg/plugin/installer/http_installer_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/installer.go b/pkg/plugin/installer/installer.go index 02aee9f461d..76c751d503c 100644 --- a/pkg/plugin/installer/installer.go +++ b/pkg/plugin/installer/installer.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/local_installer.go b/pkg/plugin/installer/local_installer.go index 3cf6bb42296..f39086a6e8a 100644 --- a/pkg/plugin/installer/local_installer.go +++ b/pkg/plugin/installer/local_installer.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/local_installer_test.go b/pkg/plugin/installer/local_installer_test.go index 6a7c957d687..fb5fa26751b 100644 --- a/pkg/plugin/installer/local_installer_test.go +++ b/pkg/plugin/installer/local_installer_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/vcs_installer.go b/pkg/plugin/installer/vcs_installer.go index 0a373a9718c..4b502dae4bc 100644 --- a/pkg/plugin/installer/vcs_installer.go +++ b/pkg/plugin/installer/vcs_installer.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/installer/vcs_installer_test.go b/pkg/plugin/installer/vcs_installer_test.go index d6eb32c1b14..548a7a49ad5 100644 --- a/pkg/plugin/installer/vcs_installer_test.go +++ b/pkg/plugin/installer/vcs_installer_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/plugin.go b/pkg/plugin/plugin.go index b3458c2d8c4..07fcc700a27 100644 --- a/pkg/plugin/plugin.go +++ b/pkg/plugin/plugin.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/plugin/plugin_test.go b/pkg/plugin/plugin_test.go index 5ddbf15f3e9..338d949f889 100644 --- a/pkg/plugin/plugin_test.go +++ b/pkg/plugin/plugin_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/provenance/doc.go b/pkg/provenance/doc.go index dacfa9e6920..bee48494468 100644 --- a/pkg/provenance/doc.go +++ b/pkg/provenance/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/provenance/sign.go b/pkg/provenance/sign.go index ecd6612a3f5..5e23c2dda68 100644 --- a/pkg/provenance/sign.go +++ b/pkg/provenance/sign.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/provenance/sign_test.go b/pkg/provenance/sign_test.go index 388941deb87..d74e2388763 100644 --- a/pkg/provenance/sign_test.go +++ b/pkg/provenance/sign_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/releasetesting/environment.go b/pkg/releasetesting/environment.go index 3b3d07933ee..17a22c21d6a 100644 --- a/pkg/releasetesting/environment.go +++ b/pkg/releasetesting/environment.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releasetesting/environment_test.go b/pkg/releasetesting/environment_test.go index 0199b74eb46..4403ab6a98c 100644 --- a/pkg/releasetesting/environment_test.go +++ b/pkg/releasetesting/environment_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releasetesting/test_suite.go b/pkg/releasetesting/test_suite.go index 2e42400ce22..79f00301ebb 100644 --- a/pkg/releasetesting/test_suite.go +++ b/pkg/releasetesting/test_suite.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releasetesting/test_suite_test.go b/pkg/releasetesting/test_suite_test.go index 0c2fae8769c..828b14e9983 100644 --- a/pkg/releasetesting/test_suite_test.go +++ b/pkg/releasetesting/test_suite_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/filter.go b/pkg/releaseutil/filter.go index fdd2cc38107..458da705faf 100644 --- a/pkg/releaseutil/filter.go +++ b/pkg/releaseutil/filter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/filter_test.go b/pkg/releaseutil/filter_test.go index 5909523638c..802b1db7a7c 100644 --- a/pkg/releaseutil/filter_test.go +++ b/pkg/releaseutil/filter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/manifest.go b/pkg/releaseutil/manifest.go index a0449cc551c..78c2979c439 100644 --- a/pkg/releaseutil/manifest.go +++ b/pkg/releaseutil/manifest.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/manifest_test.go b/pkg/releaseutil/manifest_test.go index 7906279adf7..8e0793d5fb9 100644 --- a/pkg/releaseutil/manifest_test.go +++ b/pkg/releaseutil/manifest_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/sorter.go b/pkg/releaseutil/sorter.go index 1b744d72cb1..1a13298b0bc 100644 --- a/pkg/releaseutil/sorter.go +++ b/pkg/releaseutil/sorter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/releaseutil/sorter_test.go b/pkg/releaseutil/sorter_test.go index 7d4e31e2e28..a3323bd9614 100644 --- a/pkg/releaseutil/sorter_test.go +++ b/pkg/releaseutil/sorter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 438f66d7cd7..6e14d8c0372 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 948ee12d340..44834178e46 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/doc.go b/pkg/repo/doc.go index fb8b3f4b2d3..19ccf267ce8 100644 --- a/pkg/repo/doc.go +++ b/pkg/repo/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 174ceea018b..01bf4a8ca2a 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index ba426b17482..2ce817ce3a9 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/local.go b/pkg/repo/local.go index f13a4d0ac30..caca1b9c226 100644 --- a/pkg/repo/local.go +++ b/pkg/repo/local.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/local_test.go b/pkg/repo/local_test.go index 1e5359dee6e..cf6cf2d11cf 100644 --- a/pkg/repo/local_test.go +++ b/pkg/repo/local_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/repo.go b/pkg/repo/repo.go index b5bba164e07..fa550357a1a 100644 --- a/pkg/repo/repo.go +++ b/pkg/repo/repo.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/repo_test.go b/pkg/repo/repo_test.go index 4b5bcdbf5e9..264e9bc3c0b 100644 --- a/pkg/repo/repo_test.go +++ b/pkg/repo/repo_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/repo/repotest/doc.go b/pkg/repo/repotest/doc.go index 34d4bc6b041..3bf98aa7e9d 100644 --- a/pkg/repo/repotest/doc.go +++ b/pkg/repo/repotest/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 8ea9103a019..36ab10d7066 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/repo/repotest/server_test.go b/pkg/repo/repotest/server_test.go index 61c056172b9..e4819fbf7d5 100644 --- a/pkg/repo/repotest/server_test.go +++ b/pkg/repo/repotest/server_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/resolver/resolver.go b/pkg/resolver/resolver.go index ec8ea2ccec0..8177df2d3ac 100644 --- a/pkg/resolver/resolver.go +++ b/pkg/resolver/resolver.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/resolver/resolver_test.go b/pkg/resolver/resolver_test.go index 78a0bc46c50..689ffbc32c9 100644 --- a/pkg/resolver/resolver_test.go +++ b/pkg/resolver/resolver_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/rudder/client.go b/pkg/rudder/client.go index 219bb010ac6..093a0c360fe 100644 --- a/pkg/rudder/client.go +++ b/pkg/rudder/client.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/cfgmaps.go b/pkg/storage/driver/cfgmaps.go index 51fa8f8f623..3f5ee204afd 100644 --- a/pkg/storage/driver/cfgmaps.go +++ b/pkg/storage/driver/cfgmaps.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/cfgmaps_test.go b/pkg/storage/driver/cfgmaps_test.go index 7501ad9cbdf..c028e9fdf20 100644 --- a/pkg/storage/driver/cfgmaps_test.go +++ b/pkg/storage/driver/cfgmaps_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/storage/driver/driver.go b/pkg/storage/driver/driver.go index e01d35d64fd..d8c4122b558 100644 --- a/pkg/storage/driver/driver.go +++ b/pkg/storage/driver/driver.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/labels.go b/pkg/storage/driver/labels.go index 8668d665bc9..eb7118fe5fa 100644 --- a/pkg/storage/driver/labels.go +++ b/pkg/storage/driver/labels.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/labels_test.go b/pkg/storage/driver/labels_test.go index af0bd24e549..e8d7fc90caa 100644 --- a/pkg/storage/driver/labels_test.go +++ b/pkg/storage/driver/labels_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/memory.go b/pkg/storage/driver/memory.go index ceb0d67ddd3..ea3faf26b44 100644 --- a/pkg/storage/driver/memory.go +++ b/pkg/storage/driver/memory.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/memory_test.go b/pkg/storage/driver/memory_test.go index 1062071e75d..4f45cf72bda 100644 --- a/pkg/storage/driver/memory_test.go +++ b/pkg/storage/driver/memory_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 979d11cb6f2..1ebe7f65051 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/records.go b/pkg/storage/driver/records.go index ce72308a884..bc793d8b3fb 100644 --- a/pkg/storage/driver/records.go +++ b/pkg/storage/driver/records.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/records_test.go b/pkg/storage/driver/records_test.go index 79380afb8a4..8063ab9dc50 100644 --- a/pkg/storage/driver/records_test.go +++ b/pkg/storage/driver/records_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/secrets.go b/pkg/storage/driver/secrets.go index e8f3984f65a..1b8064e5375 100644 --- a/pkg/storage/driver/secrets.go +++ b/pkg/storage/driver/secrets.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/driver/secrets_test.go b/pkg/storage/driver/secrets_test.go index e6f62e70201..6c9c63ad441 100644 --- a/pkg/storage/driver/secrets_test.go +++ b/pkg/storage/driver/secrets_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/storage/driver/util.go b/pkg/storage/driver/util.go index 65fb17e7c5b..7807382b69e 100644 --- a/pkg/storage/driver/util.go +++ b/pkg/storage/driver/util.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index d308cef1b5e..40fc558a1c8 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/storage/storage_test.go b/pkg/storage/storage_test.go index fb2824de7b3..19d786ad953 100644 --- a/pkg/storage/storage_test.go +++ b/pkg/storage/storage_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/strvals/doc.go b/pkg/strvals/doc.go index d2b859e67d5..f1729058710 100644 --- a/pkg/strvals/doc.go +++ b/pkg/strvals/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index eb29c250f9b..1fd9ab81e05 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index f23a57e0a9e..e5d87814937 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/sympath/walk.go b/pkg/sympath/walk.go index 77fa04153f6..b2500284a54 100644 --- a/pkg/sympath/walk.go +++ b/pkg/sympath/walk.go @@ -4,7 +4,7 @@ the BSD license. https://github.com/golang/go/blob/master/LICENSE -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/sympath/walk_test.go b/pkg/sympath/walk_test.go index d86d8dabd4f..ab8e0eb4c94 100644 --- a/pkg/sympath/walk_test.go +++ b/pkg/sympath/walk_test.go @@ -4,7 +4,7 @@ the BSD license. https://github.com/golang/go/blob/master/LICENSE -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. 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 diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 18518dfc10d..b38230bab17 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index d8c82b90110..0c10cda3718 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/hook_sorter.go b/pkg/tiller/hook_sorter.go index 42d546620d3..11fa6153377 100644 --- a/pkg/tiller/hook_sorter.go +++ b/pkg/tiller/hook_sorter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/hook_sorter_test.go b/pkg/tiller/hook_sorter_test.go index ac5b9bf8daf..efe960ca46a 100644 --- a/pkg/tiller/hook_sorter_test.go +++ b/pkg/tiller/hook_sorter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index 2dd085ed7de..d53ed504f0a 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/hooks_test.go b/pkg/tiller/hooks_test.go index 658f859f4e6..8bd92850026 100644 --- a/pkg/tiller/hooks_test.go +++ b/pkg/tiller/hooks_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/kind_sorter.go b/pkg/tiller/kind_sorter.go index 43726d53e43..65e3f478d02 100644 --- a/pkg/tiller/kind_sorter.go +++ b/pkg/tiller/kind_sorter.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/kind_sorter_test.go b/pkg/tiller/kind_sorter_test.go index 8d01fac17d7..fb3e8ad577f 100644 --- a/pkg/tiller/kind_sorter_test.go +++ b/pkg/tiller/kind_sorter_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_content.go b/pkg/tiller/release_content.go index fd783d6b68f..2315f1aaa83 100644 --- a/pkg/tiller/release_content.go +++ b/pkg/tiller/release_content.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_content_test.go b/pkg/tiller/release_content_test.go index 7c003f70911..4a29c5d3e45 100644 --- a/pkg/tiller/release_content_test.go +++ b/pkg/tiller/release_content_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_history.go b/pkg/tiller/release_history.go index 0dd52597851..fe7ad139516 100644 --- a/pkg/tiller/release_history.go +++ b/pkg/tiller/release_history.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_history_test.go b/pkg/tiller/release_history_test.go index 5df98410f5e..58b7fad9a19 100644 --- a/pkg/tiller/release_history_test.go +++ b/pkg/tiller/release_history_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_install.go b/pkg/tiller/release_install.go index 01ef88c98e8..973da358123 100644 --- a/pkg/tiller/release_install.go +++ b/pkg/tiller/release_install.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_install_test.go b/pkg/tiller/release_install_test.go index bbea3b9dd10..f5e84d870b9 100644 --- a/pkg/tiller/release_install_test.go +++ b/pkg/tiller/release_install_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_list.go b/pkg/tiller/release_list.go index 72c21d97cc1..3344888dcaa 100644 --- a/pkg/tiller/release_list.go +++ b/pkg/tiller/release_list.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_list_test.go b/pkg/tiller/release_list_test.go index 64877422a94..7b0fe6830d2 100644 --- a/pkg/tiller/release_list_test.go +++ b/pkg/tiller/release_list_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 876e1ba37a8..a587581edbd 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_rollback.go b/pkg/tiller/release_rollback.go index ab6462db98b..75e282fb82b 100644 --- a/pkg/tiller/release_rollback.go +++ b/pkg/tiller/release_rollback.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_rollback_test.go b/pkg/tiller/release_rollback_test.go index 710f0ebbec2..d7909ed8b05 100644 --- a/pkg/tiller/release_rollback_test.go +++ b/pkg/tiller/release_rollback_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index a75b7fc8623..bde4c8465f3 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 96cb84a7551..b3b1bc49d0a 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_status.go b/pkg/tiller/release_status.go index e0d75877d9c..3f8047118e9 100644 --- a/pkg/tiller/release_status.go +++ b/pkg/tiller/release_status.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_status_test.go b/pkg/tiller/release_status_test.go index 4ba0f6cd50f..69a7101430c 100644 --- a/pkg/tiller/release_status_test.go +++ b/pkg/tiller/release_status_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_testing.go b/pkg/tiller/release_testing.go index a44b67e6fbc..06d41e323d1 100644 --- a/pkg/tiller/release_testing.go +++ b/pkg/tiller/release_testing.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_testing_test.go b/pkg/tiller/release_testing_test.go index f8d92ebcc48..e0fc7df4114 100644 --- a/pkg/tiller/release_testing_test.go +++ b/pkg/tiller/release_testing_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_uninstall.go b/pkg/tiller/release_uninstall.go index 294645ae75f..2ae3e4c36f5 100644 --- a/pkg/tiller/release_uninstall.go +++ b/pkg/tiller/release_uninstall.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_uninstall_test.go b/pkg/tiller/release_uninstall_test.go index a68ac55f704..d33e9c2a61a 100644 --- a/pkg/tiller/release_uninstall_test.go +++ b/pkg/tiller/release_uninstall_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index e94de705d52..1187226e5e4 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 56dcca8740c..519b839fc82 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/release_version.go b/pkg/tiller/release_version.go index 66b7137bba7..0656a1ab9e4 100644 --- a/pkg/tiller/release_version.go +++ b/pkg/tiller/release_version.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/resource_policy.go b/pkg/tiller/resource_policy.go index 66da1283ff2..cca2391d85c 100644 --- a/pkg/tiller/resource_policy.go +++ b/pkg/tiller/resource_policy.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tiller/server.go b/pkg/tiller/server.go index 818cfd47abc..0fbcd453339 100644 --- a/pkg/tiller/server.go +++ b/pkg/tiller/server.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/timeconv/doc.go b/pkg/timeconv/doc.go index 23516739130..0565a45cd6a 100644 --- a/pkg/timeconv/doc.go +++ b/pkg/timeconv/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/timeconv/timeconv.go b/pkg/timeconv/timeconv.go index 24ff10f4e03..4d11abfe6f9 100644 --- a/pkg/timeconv/timeconv.go +++ b/pkg/timeconv/timeconv.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/timeconv/timeconv_test.go b/pkg/timeconv/timeconv_test.go index f673df3c97f..bd22a238d83 100644 --- a/pkg/timeconv/timeconv_test.go +++ b/pkg/timeconv/timeconv_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tlsutil/cfg.go b/pkg/tlsutil/cfg.go index 9ce3109e1bd..408867db1d3 100644 --- a/pkg/tlsutil/cfg.go +++ b/pkg/tlsutil/cfg.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tlsutil/tls.go b/pkg/tlsutil/tls.go index c166a1662fc..6b0052acc8f 100644 --- a/pkg/tlsutil/tls.go +++ b/pkg/tlsutil/tls.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/tlsutil/tlsutil_test.go b/pkg/tlsutil/tlsutil_test.go index 4f04d50ab46..a4b3c9c220b 100644 --- a/pkg/tlsutil/tlsutil_test.go +++ b/pkg/tlsutil/tlsutil_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/urlutil/urlutil.go b/pkg/urlutil/urlutil.go index fb67708ae17..272907de0c7 100644 --- a/pkg/urlutil/urlutil.go +++ b/pkg/urlutil/urlutil.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/urlutil/urlutil_test.go b/pkg/urlutil/urlutil_test.go index f0c82c0a929..616c4f14f49 100644 --- a/pkg/urlutil/urlutil_test.go +++ b/pkg/urlutil/urlutil_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/version/compatible.go b/pkg/version/compatible.go index 735610778be..d0516a9d09b 100644 --- a/pkg/version/compatible.go +++ b/pkg/version/compatible.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/version/compatible_test.go b/pkg/version/compatible_test.go index adc1c489e73..7a3b23a7dcf 100644 --- a/pkg/version/compatible_test.go +++ b/pkg/version/compatible_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/version/doc.go b/pkg/version/doc.go index 23c9e500d57..3b61dd50ec1 100644 --- a/pkg/version/doc.go +++ b/pkg/version/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/version/version.go b/pkg/version/version.go index 6f5a1a45274..b2ea2c50f91 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/version/version_test.go b/pkg/version/version_test.go index e0e4cac0fb4..eba57353360 100644 --- a/pkg/version/version_test.go +++ b/pkg/version/version_test.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors All rights reserved. +Copyright The Helm Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index ef426616af0..bfc071350be 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2016 The Kubernetes Authors. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index 66a21847726..329a310864b 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -1,4 +1,4 @@ -# Copyright 2017 The Kubernetes Authors. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/rootfs/Dockerfile.rudder b/rootfs/Dockerfile.rudder index 6bb3a2d9236..61afb8af8b3 100644 --- a/rootfs/Dockerfile.rudder +++ b/rootfs/Dockerfile.rudder @@ -1,4 +1,4 @@ -# Copyright 2017 The Kubernetes Authors. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/coverage.sh b/scripts/coverage.sh index 1863d583587..62d495769a6 100755 --- a/scripts/coverage.sh +++ b/scripts/coverage.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/get b/scripts/get index af0960abfc2..08c4551777f 100755 --- a/scripts/get +++ b/scripts/get @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/sync-repo.sh b/scripts/sync-repo.sh index 3795b1a7c3f..4531020724c 100755 --- a/scripts/sync-repo.sh +++ b/scripts/sync-repo.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/update-docs.sh b/scripts/update-docs.sh index e014b537efd..d3018be50a8 100755 --- a/scripts/update-docs.sh +++ b/scripts/update-docs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2017 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/util.sh b/scripts/util.sh index 09caaf972c5..c1e6c3751d1 100644 --- a/scripts/util.sh +++ b/scripts/util.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/validate-go.sh b/scripts/validate-go.sh index 2ecf5dfb3fe..328ce40f908 100755 --- a/scripts/validate-go.sh +++ b/scripts/validate-go.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/scripts/validate-license.sh b/scripts/validate-license.sh index fe7ec481bee..12c76f75c10 100755 --- a/scripts/validate-license.sh +++ b/scripts/validate-license.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2016 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -27,10 +27,19 @@ find_files() { \( -name '*.go' -o -name '*.sh' -o -name 'Dockerfile' \) } -failed=($(find_files | xargs grep -L 'Licensed under the Apache License, Version 2.0 (the "License");')) -if (( ${#failed[@]} > 0 )); then +failed_license_header=($(find_files | xargs grep -L 'Licensed under the Apache License, Version 2.0 (the "License");')) +if (( ${#failed_license_header[@]} > 0 )); then echo "Some source files are missing license headers." - for f in "${failed[@]}"; do + for f in "${failed_license_header[@]}"; do + echo " $f" + done + exit 1 +fi + +failed_copyright_header=($(find_files | xargs grep -L 'Copyright The Helm Authors.')) +if (( ${#failed_copyright_header[@]} > 0 )); then + echo "Some source files are missing the copyright header." + for f in "${failed_copyright_header[@]}"; do echo " $f" done exit 1 diff --git a/scripts/verify-docs.sh b/scripts/verify-docs.sh index b0b799eacb0..b176b036e1b 100755 --- a/scripts/verify-docs.sh +++ b/scripts/verify-docs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2017 The Kubernetes Authors All rights reserved. +# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 1a1ea6383004e13c400070ec50e5003da69963e5 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 4 Jul 2018 15:12:48 -0700 Subject: [PATCH 132/483] fix `helm template -x` pathing issues on Windows tiller's rendering engine converts os filepath separators into unix-style filepath separators, so we need to split template names with a forward slash. --- cmd/helm/template.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/helm/template.go b/cmd/helm/template.go index bcfb6a7e45e..6c2b02cbd98 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -246,7 +246,9 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } for _, manifest := range listManifests { - manifestPathSplit := strings.Split(manifest.Name, string(filepath.Separator)) + // manifest.Name is rendered using linux-style filepath separators on Windows as + // well as macOS/linux. + manifestPathSplit := strings.Split(manifest.Name, "/") // remove the chart name from the path manifestPathSplit = manifestPathSplit[1:] toJoin := append([]string{t.chartPath}, manifestPathSplit...) From e294439e01dbff1a200112dc2d864a3663165039 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 26 Apr 2018 12:58:11 -0700 Subject: [PATCH 133/483] add amendments to release checklist --- README.md | 7 ++++--- docs/release_checklist.md | 16 +++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 0c281a54a8c..f3e3391c77a 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,15 @@ Think of it like apt/yum/homebrew for Kubernetes. ## Install -Binary downloads of the Helm client can be found on [the latest Releases page](https://github.com/helm/helm/releases/latest). +Binary downloads of the Helm client can be found on [the Releases page](https://github.com/helm/helm/releases/latest). Unpack the `helm` binary and add it to your PATH and you are good to go! If you want to use a package manager: -- macOS/[homebrew](https://brew.sh/) users can use `brew install kubernetes-helm`. -- Windows/[chocolatey](https://chocolatey.org/) users can use `choco install kubernetes-helm`. +- [Homebrew](https://brew.sh/) users can use `brew install kubernetes-helm`. +- [Chocolatey](https://chocolatey.org/) users can use `choco install kubernetes-helm`. +- [GoFish](https://gofi.sh/) users can use `gofish install helm`. To rapidly get Helm up and running, start with the [Quick Start Guide](https://docs.helm.sh/using_helm/#quickstart-guide). diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 5187b720a6c..2a00366696d 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -51,7 +51,7 @@ In this doc, we are going to reference a few environment variables as well, whic ```shell export RELEASE_NAME=vX.Y.0 -export RELEASE_BRANCH_NAME="release-$RELEASE_NAME" +export RELEASE_BRANCH_NAME="release-X.Y" export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc1" ``` @@ -121,8 +121,6 @@ index 2109a0a..6f5a1a4 100644 BuildMetadata = "unreleased" ``` -For patch releases, the old version number will be the latest patch release, so just bump the patch number, incrementing Z by one. - ```shell git add . git commit -m "bump version to $RELEASE_CANDIDATE_NAME" @@ -168,7 +166,7 @@ wget https://kubernetes-helm.storage.googleapis.com/helm-$RELEASE_CANDIDATE_NAME windows/amd64, using PowerShell: ```shell -PS C:\> Invoke-WebRequest -Uri "https://kubernetes-helm.storage.googleapis.com/helm-$RELEASE_CANDIDATE_NAME-windows-amd64.tar.gz" -OutFile "helm-$ReleaseCandidateName-windows-amd64.tar.gz" +PS C:\> Invoke-WebRequest -Uri "https://kubernetes-helm.storage.googleapis.com/helm-$RELEASE_CANDIDATE_NAME-windows-amd64.zip" -OutFile "helm-$ReleaseCandidateName-windows-amd64.zip" ``` Then, unpack and move the binary to somewhere on your $PATH, or move it somewhere and add it to your $PATH (e.g. /usr/local/bin/helm for linux/macOS, C:\Program Files\helm\helm.exe for Windows). @@ -220,7 +218,7 @@ An example release note for a minor release would look like this: Helm vX.Y.Z is a feature release. This release, we focused on . Users are encouraged to upgrade for the best experience. -The community keeps growing, and we'd love to see you there. +The community keeps growing, and we'd love to see you there! - Join the discussion in [Kubernetes Slack](https://slack.k8s.io/): - `#helm-users` for questions and just to hang out @@ -232,9 +230,9 @@ The community keeps growing, and we'd love to see you there. Download Helm X.Y. The common platform binaries are here: -- [OSX](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) -- [Linux](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) -- [Windows](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.tar.gz) +- [OSX](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256)) +- [Linux](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz.sha256)) +- [Windows](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.tar.gz.sha256)) Once you have the client installed, upgrade Tiller with `helm init --upgrade`. @@ -260,7 +258,7 @@ git log --no-merges --pretty=format:'- %s %H (%aN)' $RELEASE_NAME $PREVIOUS_RELE Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. -## 9. Evangelize +## 8. Evangelize Congratulations! You're done. Go grab yourself a $DRINK_OF_CHOICE. You've earned it. From 6307aad16dea397ce8697261f95ea361e7fee736 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 24 May 2018 11:54:45 -0700 Subject: [PATCH 134/483] add every release artifact to the release notes --- docs/release_checklist.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 2a00366696d..12b31aa5b53 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -230,9 +230,13 @@ The community keeps growing, and we'd love to see you there! Download Helm X.Y. The common platform binaries are here: -- [OSX](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256)) -- [Linux](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz.sha256)) -- [Windows](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.tar.gz.sha256)) +- [MacOS amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256)) +- [Linux amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz.sha256)) +- [Linux arm](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz.sha256)) +- [Linux arm64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz.sha256)) +- [Linux i386](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz.sha256)) +- [Linux ppc64le](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz.sha256)) +- [Windows amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip.sha256)) Once you have the client installed, upgrade Tiller with `helm init --upgrade`. From 089af0e1aaca15394de947bbd686fd4a03197c83 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 30 Jul 2018 10:13:14 -0700 Subject: [PATCH 135/483] soften the recommendation of hypens in chart names We definitely still suggest that dashes are acceptable for chart packages, but users should be aware of the limitations of dashes in variable names in Go templates. --- docs/chart_best_practices/conventions.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/chart_best_practices/conventions.md b/docs/chart_best_practices/conventions.md index 4d080ceb1ef..524928e2563 100644 --- a/docs/chart_best_practices/conventions.md +++ b/docs/chart_best_practices/conventions.md @@ -4,19 +4,21 @@ This part of the Best Practices Guide explains general conventions. ## Chart Names -Chart names should be lower case letters and numbers. Dashes (-) are not allowed: +Chart names should use lower case letters and numbers, and start with a letter. -Examples: +Hyphens (-) are allowed, but are known to be a little trickier to work with in Helm templates (see [issue #2192](https://github.com/helm/helm/issues/2192) for more information). + +Here are a few examples of good chart names from the [Helm Community Charts](https://github.com/helm/charts): ``` drupal -cluster01 -aws-cluster-autoscaler #incorrect do not use dashes in the name +cert-manager +oauth2-proxy ``` Neither uppercase letters nor underscores should be used in chart names. Dots should not be used in chart names. -The directory that contains a chart MUST have the same name as the chart. Thus, the chart `nginx-lego` MUST be created in a directory called `nginx-lego/`. This is not merely a stylistic detail, but a requirement of the Helm Chart format. +The directory that contains a chart MUST have the same name as the chart. Thus, the chart `cert-manager` MUST be created in a directory called `cert-manager/`. This is not merely a stylistic detail, but a requirement of the Helm Chart format. ## Version Numbers From 0736022d98228e35ffc9cf87871a123629425757 Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Mon, 30 Jul 2018 14:18:00 -0700 Subject: [PATCH 136/483] [tiller] make update --force --dry-run obey dry-run --- pkg/tiller/release_update.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index e94de705d52..28fcf391b4e 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -161,6 +161,10 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( Timeout: req.Timeout, Wait: req.Wait, }) + + // update new release with next revision number so as to append to the old release's history + newRelease.Version = oldRelease.Version + 1 + res := &services.UpdateReleaseResponse{Release: newRelease} if err != nil { s.Log("failed update prepare step: %s", err) @@ -172,6 +176,12 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( return res, err } + if req.DryRun { + s.Log("dry run for %s", newRelease.Name) + res.Release.Info.Description = "Dry run complete" + return res, nil + } + // From here on out, the release is considered to be in Status_DELETING or Status_DELETED // state. There is no turning back. oldRelease.Info.Status.Code = release.Status_DELETING @@ -218,8 +228,6 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( } } - // update new release with next revision number so as to append to the old release's history - newRelease.Version = oldRelease.Version + 1 s.recordRelease(newRelease, false) if err := s.ReleaseModule.Update(oldRelease, newRelease, req, s.env); err != nil { msg := fmt.Sprintf("Upgrade %q failed: %s", newRelease.Name, err) From 5a56449a2f243bf33ae82761c7fdbb701cb459eb Mon Sep 17 00:00:00 2001 From: Rimas Date: Tue, 31 Jul 2018 12:34:02 +0100 Subject: [PATCH 137/483] replace github org with The Kubernetes package manager To begin working with Helm, run the 'helm init' command: $ helm init This will install Tiller to your running Kubernetes cluster. It will also set up any necessary local configuration. Common actions from this point include: - helm search: search for charts - helm fetch: download a chart to your local directory to view - helm install: upload the chart to Kubernetes - helm list: list releases of charts Environment: $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm $HELM_HOST set an alternative Tiller host. The format is host:port $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") Usage: helm [command] Available Commands: completion Generate autocompletions script for the specified shell (bash or zsh) create create a new chart with the given name delete given a release name, delete the release from Kubernetes dependency manage a chart's dependencies fetch download a chart from a repository and (optionally) unpack it in local directory get download a named release history fetch release history home displays the location of HELM_HOME init initialize Helm on both client and server inspect inspect a chart install install a chart archive lint examines a chart for possible issues list list releases package package a chart directory into a chart archive plugin add, list, or remove Helm plugins repo add, list, remove, update, and index chart repositories reset uninstalls Tiller from a cluster rollback roll back a release to a previous revision search search for a keyword in charts serve start a local http web server status displays the status of the named release template locally render templates test test a release upgrade upgrade a release verify verify that a chart at the given path has been signed and is valid version print the client/server version information Flags: --debug enable verbose output -h, --help help for helm --home string location of your Helm config. Overrides $HELM_HOME (default "/Users/rimas/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) --tiller-namespace string namespace of Tiller (default "kube-system") Use "helm [command] --help" for more information about a command. one --- scripts/get | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/get b/scripts/get index af0960abfc2..b49d9db4ca9 100755 --- a/scripts/get +++ b/scripts/get @@ -63,7 +63,7 @@ verifySupported() { local supported="darwin-386\ndarwin-amd64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nlinux-ppc64le\nwindows-386\nwindows-amd64" if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then echo "No prebuilt binary for ${OS}-${ARCH}." - echo "To build from source, go to https://github.com/kubernetes/helm" + echo "To build from source, go to https://github.com/helm/helm" exit 1 fi @@ -76,7 +76,7 @@ verifySupported() { # checkDesiredVersion checks if the desired version is available. checkDesiredVersion() { # Use the GitHub releases webpage for the project to find the desired version for this project. - local release_url="https://github.com/kubernetes/helm/releases/${DESIRED_VERSION:-latest}" + local release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION:-latest}" if type "curl" > /dev/null; then TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') elif type "wget" > /dev/null; then @@ -155,7 +155,7 @@ fail_trap() { else echo "Failed to install $PROJECT_NAME" fi - echo -e "\tFor support, go to https://github.com/kubernetes/helm." + echo -e "\tFor support, go to https://github.com/helm/helm." fi cleanup exit $result @@ -182,7 +182,7 @@ help () { echo -e "\te.g. --version v2.4.0 or -v latest" } -# cleanup temporary files to avoid https://github.com/kubernetes/helm/issues/2977 +# cleanup temporary files to avoid https://github.com/helm/helm/issues/2977 cleanup() { if [[ -d "${HELM_TMP_ROOT:-}" ]]; then rm -rf "$HELM_TMP_ROOT" From fb64bb66de0c5ccedce1ad52c64aa77fe0cb734a Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 31 Jul 2018 10:27:51 -0700 Subject: [PATCH 138/483] use dot notation for release candidates --- docs/release_checklist.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 12b31aa5b53..fcd3429ad98 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -4,7 +4,7 @@ ## Release Meetings As part of the release process, two of the weekly developer calls will be co-opted -as "release meetings." +as "release meetings." ### Start of the Release Cycle The first developer call after a release will be used as the release meeting to @@ -52,7 +52,7 @@ In this doc, we are going to reference a few environment variables as well, whic ```shell export RELEASE_NAME=vX.Y.0 export RELEASE_BRANCH_NAME="release-X.Y" -export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc1" +export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.1" ``` If you are creating a patch release, you may want to use the following instead: @@ -61,7 +61,7 @@ If you are creating a patch release, you may want to use the following instead: export PREVIOUS_PATCH_RELEASE=vX.Y.Z export RELEASE_NAME=vX.Y.Z+1 export RELEASE_BRANCH_NAME="release-X.Y" -export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc1" +export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.1" ``` ## 1. Create the Release Branch @@ -188,7 +188,7 @@ You will also want to update the release version number and the CHANGELOG as we After that, tag it and notify users of the new release candidate: ```shell -export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc2" +export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.2" git tag --sign --annotate "${RELEASE_CANDIDATE_NAME}" --message "Helm release ${RELEASE_CANDIDATE_NAME}" git push upstream $RELEASE_CANDIDATE_NAME ``` From 1b955e63f7862c95c3e5033d67f2b2b6e2a11759 Mon Sep 17 00:00:00 2001 From: Michael Huttner Date: Wed, 1 Aug 2018 15:38:34 +0200 Subject: [PATCH 139/483] Fixed error in docs for file access $path.base gives the error "can't evaluate field base in type string", it should be "base $path" --- docs/chart_template_guide/accessing_files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/accessing_files.md b/docs/chart_template_guide/accessing_files.md index 11747d4f0d5..c959002b72f 100644 --- a/docs/chart_template_guide/accessing_files.md +++ b/docs/chart_template_guide/accessing_files.md @@ -130,7 +130,7 @@ Or ```yaml {{ range $path, $bytes := .Files.Glob "foo/*" }} -{{ $path.base }}: '{{ $root.Files.Get $path | b64enc }}' +{{ base $path }}: '{{ $root.Files.Get $path | b64enc }}' {{ end }} ``` From cfbc1744c71ab926e179da595a3e35647c15e4d2 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 1 Aug 2018 07:49:35 -0700 Subject: [PATCH 140/483] revert back to /tiller when running `helm init --upgrade`, the entrypoint since v2.9.1 changed which caused tiller to never start. Kubernetes may be holding onto the same entrypoint during upgrades. --- rootfs/Dockerfile | 6 +++--- rootfs/Dockerfile.experimental | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index bfc071350be..82dfa0d4c75 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -18,10 +18,10 @@ RUN apk update && apk add ca-certificates socat && rm -rf /var/cache/apk/* ENV HOME /tmp -COPY helm /bin/helm -COPY tiller /bin/tiller +COPY helm /helm +COPY tiller /tiller EXPOSE 44134 USER nobody -ENTRYPOINT ["/bin/tiller"] +ENTRYPOINT ["/tiller"] diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index 329a310864b..ca0c87f3057 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -18,9 +18,9 @@ RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* ENV HOME /tmp -COPY tiller /bin/tiller +COPY tiller /tiller EXPOSE 44134 USER nobody -ENTRYPOINT ["/bin/tiller", "--experimental-release"] +ENTRYPOINT ["/tiller", "--experimental-release"] From a7ab81f8e741a228242d47b22beeaaa507575ea6 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 31 Jul 2018 17:28:10 -0700 Subject: [PATCH 141/483] setup connection after displaying client version --- cmd/helm/version.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/cmd/helm/version.go b/cmd/helm/version.go index 605e96b523b..922e744b29d 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -73,15 +73,6 @@ func newVersionCmd(c helm.Interface, out io.Writer) *cobra.Command { if !version.showClient && !version.showServer { version.showClient, version.showServer = true, true } - if version.showServer { - // We do this manually instead of in PreRun because we only - // need a tunnel if server version is requested. - err := setupConnection() - if err != nil { - return err - } - } - version.client = ensureHelmClient(version.client) return version.run() }, } @@ -111,6 +102,13 @@ func (v *versionCmd) run() error { return tpl(v.template, data, v.out) } + // We do this manually instead of in PreRun because we only + // need a tunnel if server version is requested. + if err := setupConnection(); err != nil { + return err + } + v.client = ensureHelmClient(v.client) + if settings.Debug { k8sVersion, err := getK8sVersion() if err != nil { From 3dddd5080e0fd95ad6b7dde1b9c69031c11483ec Mon Sep 17 00:00:00 2001 From: Rimas Date: Fri, 3 Aug 2018 10:32:53 +0100 Subject: [PATCH 142/483] add support for `auth-provider` from kubeconfig files, addreses #4422 --- cmd/tiller/tiller.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index c97187b2a01..ba5f5b8f0b2 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -37,6 +37,8 @@ import ( healthpb "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/keepalive" + // Import to initialize client auth plugins. + _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/storage" From db69200152575a079d832b62a8465b72b9298c44 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Mon, 6 Aug 2018 18:17:24 -0500 Subject: [PATCH 143/483] Propagate query string arguments in repository URL to absolute chart URL --- pkg/repo/chartrepo.go | 5 ++++- pkg/repo/chartrepo_test.go | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 6e14d8c0372..4e4bc6fe275 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -270,5 +270,8 @@ func ResolveReferenceURL(baseURL, refURL string) (string, error) { return "", fmt.Errorf("failed to parse %s as URL: %v", refURL, err) } - return parsedBaseURL.ResolveReference(parsedRefURL).String(), nil + resolvedURL := parsedBaseURL.ResolveReference(parsedRefURL) + resolvedURL.RawQuery = parsedBaseURL.RawQuery + + return resolvedURL.String(), nil } diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 44834178e46..4b290a0d114 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -287,6 +287,14 @@ func TestResolveReferenceURL(t *testing.T) { t.Errorf("%s", chartURL) } + chartURL, err = ResolveReferenceURL("http://localhost:8123/charts/?st=2018-08-06T22%3A59%3A04Z&se=2018-08-07T22%3A59%3A04Z&sp=rl&sv=2018-03-28&sr=c&sig=cyqM4%2F5G7HNk%2F3faaHSDMaWxFxefCglvZlYSnmQBwiY%3D", "nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "http://localhost:8123/charts/nginx-0.2.0.tgz?st=2018-08-06T22%3A59%3A04Z&se=2018-08-07T22%3A59%3A04Z&sp=rl&sv=2018-03-28&sr=c&sig=cyqM4%2F5G7HNk%2F3faaHSDMaWxFxefCglvZlYSnmQBwiY%3D" { + t.Errorf("%s does not contain the query string of the base URL", chartURL) + } + chartURL, err = ResolveReferenceURL("http://localhost:8123", "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz") if err != nil { t.Errorf("%s", err) From 152fdaf5ba52745af6b4481bed04a4977a11f1f4 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Mon, 6 Aug 2018 18:25:02 -0500 Subject: [PATCH 144/483] Only propagate query string if refURL is relative to baseURL --- pkg/repo/chartrepo.go | 7 ++++++- pkg/repo/chartrepo_test.go | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index 4e4bc6fe275..cd9d6c54728 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -270,8 +270,13 @@ func ResolveReferenceURL(baseURL, refURL string) (string, error) { return "", fmt.Errorf("failed to parse %s as URL: %v", refURL, err) } + // if the base URL contains query string parameters, + // propagate them to the child URL but only if the + // refURL is relative to baseURL resolvedURL := parsedBaseURL.ResolveReference(parsedRefURL) - resolvedURL.RawQuery = parsedBaseURL.RawQuery + if (resolvedURL.Hostname() == parsedBaseURL.Hostname()) && (resolvedURL.Port() == parsedBaseURL.Port()) { + resolvedURL.RawQuery = parsedBaseURL.RawQuery + } return resolvedURL.String(), nil } diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 4b290a0d114..19071872d9f 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -302,4 +302,12 @@ func TestResolveReferenceURL(t *testing.T) { if chartURL != "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz" { t.Errorf("%s", chartURL) } + + chartURL, err = ResolveReferenceURL("http://localhost:8123/?querystring", "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "https://kubernetes-charts.storage.googleapis.com/nginx-0.2.0.tgz" { + t.Errorf("%s contains query string from base URL when it shouldn't", chartURL) + } } From 67de9f2be4c53acee41a02067dd97f5594ef9925 Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Wed, 18 Jul 2018 17:31:39 -0700 Subject: [PATCH 145/483] [tiller] move the Manifest type to its own pkg It's really easy to cause an import cycle on this type; this resolves the problem by moving it out of the tiller pkg into its own. An alias is left behind in order to prevent downstream breakage. --- pkg/manifest/doc.go | 23 +++++++++++++++++++++++ pkg/manifest/types.go | 28 ++++++++++++++++++++++++++++ pkg/tiller/hooks.go | 8 ++------ 3 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 pkg/manifest/doc.go create mode 100644 pkg/manifest/types.go diff --git a/pkg/manifest/doc.go b/pkg/manifest/doc.go new file mode 100644 index 00000000000..c2f127cdaff --- /dev/null +++ b/pkg/manifest/doc.go @@ -0,0 +1,23 @@ +/* +Copyright The Helm Authors. + +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 manifest contains tools for working with kubernetes manifests. + +Much like other parts of helm, it does not generally require that the manifests +be correct yaml, so these functions can be run on broken manifests to aid in +user debugging +*/ +package manifest // import "k8s.io/helm/pkg/manifest" diff --git a/pkg/manifest/types.go b/pkg/manifest/types.go new file mode 100644 index 00000000000..4c748c9e588 --- /dev/null +++ b/pkg/manifest/types.go @@ -0,0 +1,28 @@ +/* +Copyright The Helm Authors. + +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 manifest + +import ( + "k8s.io/helm/pkg/releaseutil" +) + +// Manifest represents a manifest file, which has a name and some content. +type Manifest struct { + Name string + Content string + Head *releaseutil.SimpleHead +} diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index d53ed504f0a..6c3543f61f0 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -27,6 +27,7 @@ import ( "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/hooks" + "k8s.io/helm/pkg/manifest" "k8s.io/helm/pkg/proto/hapi/release" util "k8s.io/helm/pkg/releaseutil" ) @@ -52,12 +53,7 @@ var deletePolices = map[string]release.Hook_DeletePolicy{ hooks.BeforeHookCreation: release.Hook_BEFORE_HOOK_CREATION, } -// Manifest represents a manifest file, which has a name and some content. -type Manifest struct { - Name string - Content string - Head *util.SimpleHead -} +type Manifest = manifest.Manifest type result struct { hooks []*release.Hook From 4139a00e17ac292357bd63a5f109d686c06ecb2c Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Tue, 17 Jul 2018 17:41:02 -0700 Subject: [PATCH 146/483] [templates] extract some rendering code into a package --- cmd/helm/install.go | 27 +----- cmd/helm/package.go | 3 +- cmd/helm/template.go | 77 ++++------------- cmd/helm/upgrade.go | 3 +- pkg/manifest/splitter.go | 43 ++++++++++ pkg/renderutil/deps.go | 50 +++++++++++ pkg/renderutil/doc.go | 24 ++++++ pkg/renderutil/render.go | 88 +++++++++++++++++++ pkg/renderutil/render_test.go | 153 ++++++++++++++++++++++++++++++++++ 9 files changed, 378 insertions(+), 90 deletions(-) create mode 100644 pkg/manifest/splitter.go create mode 100644 pkg/renderutil/deps.go create mode 100644 pkg/renderutil/doc.go create mode 100644 pkg/renderutil/render.go create mode 100644 pkg/renderutil/render_test.go diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 1488b87c59d..1c2dca7efd6 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -37,8 +37,8 @@ import ( "k8s.io/helm/pkg/getter" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/kube" - "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" + "k8s.io/helm/pkg/renderutil" "k8s.io/helm/pkg/repo" "k8s.io/helm/pkg/strvals" ) @@ -254,7 +254,7 @@ func (i *installCmd) run() error { // If checkDependencies returns an error, we have unfulfilled dependencies. // As of Helm 2.4.0, this is treated as a stopping condition: // https://github.com/kubernetes/helm/issues/2209 - if err := checkDependencies(chartRequested, req); err != nil { + if err := renderutil.CheckDependencies(chartRequested, req); err != nil { if i.depUp { man := &downloader.Manager{ Out: i.out, @@ -515,29 +515,6 @@ func defaultNamespace() string { return "default" } -func checkDependencies(ch *chart.Chart, reqs *chartutil.Requirements) error { - missing := []string{} - - deps := ch.GetDependencies() - for _, r := range reqs.Dependencies { - found := false - for _, d := range deps { - if d.Metadata.Name == r.Name { - found = true - break - } - } - if !found { - missing = append(missing, r.Name) - } - } - - if len(missing) > 0 { - return fmt.Errorf("found in requirements.yaml, but missing in charts/ directory: %s", strings.Join(missing, ", ")) - } - return nil -} - //readFile load a file from the local directory or a remote file with a url. func readFile(filePath, CertFile, KeyFile, CAFile string) ([]byte, error) { u, _ := url.Parse(filePath) diff --git a/cmd/helm/package.go b/cmd/helm/package.go index 81603e67b1e..51686dba7a7 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -35,6 +35,7 @@ import ( "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/provenance" + "k8s.io/helm/pkg/renderutil" "k8s.io/helm/pkg/repo" ) @@ -151,7 +152,7 @@ func (p *packageCmd) run() error { } if reqs, err := chartutil.LoadRequirements(ch); err == nil { - if err := checkDependencies(ch, reqs); err != nil { + if err := renderutil.CheckDependencies(ch, reqs); err != nil { return err } } else { diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 54eb9ff4960..63609c18c26 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -27,17 +27,15 @@ import ( "strings" "time" - "github.com/Masterminds/semver" "github.com/spf13/cobra" "k8s.io/helm/pkg/chartutil" - "k8s.io/helm/pkg/engine" + "k8s.io/helm/pkg/manifest" "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" - util "k8s.io/helm/pkg/releaseutil" + "k8s.io/helm/pkg/renderutil" "k8s.io/helm/pkg/tiller" "k8s.io/helm/pkg/timeconv" - tversion "k8s.io/helm/pkg/version" ) const defaultDirectoryPermission = 0755 @@ -154,69 +152,21 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { return prettyError(err) } - if req, err := chartutil.LoadRequirements(c); err == nil { - if err := checkDependencies(c, req); err != nil { - return prettyError(err) - } - } else if err != chartutil.ErrRequirementsNotFound { - return fmt.Errorf("cannot load requirements: %v", err) - } - options := chartutil.ReleaseOptions{ - Name: t.releaseName, - IsInstall: !t.releaseIsUpgrade, - IsUpgrade: t.releaseIsUpgrade, - Time: timeconv.Now(), - Namespace: t.namespace, - } - - err = chartutil.ProcessRequirementsEnabled(c, config) - if err != nil { - return err - } - err = chartutil.ProcessRequirementsImportValues(c) - if err != nil { - return err - } - - // Set up engine. - renderer := engine.New() - - caps := &chartutil.Capabilities{ - APIVersions: chartutil.DefaultVersionSet, - KubeVersion: chartutil.DefaultKubeVersion, - TillerVersion: tversion.GetVersionProto(), - } - - // kubernetes version - kv, err := semver.NewVersion(t.kubeVersion) - if err != nil { - return fmt.Errorf("could not parse a kubernetes version: %v", err) - } - caps.KubeVersion.Major = fmt.Sprint(kv.Major()) - caps.KubeVersion.Minor = fmt.Sprint(kv.Minor()) - caps.KubeVersion.GitVersion = fmt.Sprintf("v%d.%d.0", kv.Major(), kv.Minor()) - - vals, err := chartutil.ToRenderValuesCaps(c, config, options, caps) - if err != nil { - return err + renderOpts := renderutil.Options{ + ReleaseOptions: chartutil.ReleaseOptions{ + Name: t.releaseName, + IsInstall: !t.releaseIsUpgrade, + IsUpgrade: t.releaseIsUpgrade, + Time: timeconv.Now(), + Namespace: t.namespace, + }, + KubeVersion: t.kubeVersion, } - out, err := renderer.Render(c, vals) - listManifests := []tiller.Manifest{} + renderedTemplates, err := renderutil.Render(c, config, renderOpts) if err != nil { return err } - // extract kind and name - re := regexp.MustCompile("kind:(.*)\n") - for k, v := range out { - match := re.FindStringSubmatch(v) - h := "Unknown" - if len(match) == 2 { - h = strings.TrimSpace(match[1]) - } - m := tiller.Manifest{Name: k, Content: v, Head: &util.SimpleHead{Kind: h}} - listManifests = append(listManifests, m) - } if settings.Debug { rel := &release.Release{ @@ -230,7 +180,8 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { printRelease(os.Stdout, rel) } - var manifestsToRender []tiller.Manifest + listManifests := manifest.SplitManifests(renderedTemplates) + var manifestsToRender []manifest.Manifest // if we have a list of files to render, then check that each of the // provided files exists in the chart. diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index ba0649e396b..52c6d4faefc 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -25,6 +25,7 @@ import ( "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/renderutil" "k8s.io/helm/pkg/storage/driver" ) @@ -211,7 +212,7 @@ func (u *upgradeCmd) run() error { // Check chart requirements to make sure all dependencies are present in /charts if ch, err := chartutil.Load(chartPath); err == nil { if req, err := chartutil.LoadRequirements(ch); err == nil { - if err := checkDependencies(ch, req); err != nil { + if err := renderutil.CheckDependencies(ch, req); err != nil { return err } } else if err != chartutil.ErrRequirementsNotFound { diff --git a/pkg/manifest/splitter.go b/pkg/manifest/splitter.go new file mode 100644 index 00000000000..25b77326dd6 --- /dev/null +++ b/pkg/manifest/splitter.go @@ -0,0 +1,43 @@ +/* +Copyright The Helm Authors. + +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 manifest + +import ( + "regexp" + "strings" + + "k8s.io/helm/pkg/releaseutil" +) + +// SplitManifests takes a map of rendered templates and splits them into the +// detected manifests. +func SplitManifests(templates map[string]string) []Manifest { + var listManifests []Manifest + // extract kind and name + re := regexp.MustCompile("kind:(.*)\n") + for k, v := range templates { + match := re.FindStringSubmatch(v) + h := "Unknown" + if len(match) == 2 { + h = strings.TrimSpace(match[1]) + } + m := Manifest{Name: k, Content: v, Head: &releaseutil.SimpleHead{Kind: h}} + listManifests = append(listManifests, m) + } + + return listManifests +} diff --git a/pkg/renderutil/deps.go b/pkg/renderutil/deps.go new file mode 100644 index 00000000000..72e4d12a15c --- /dev/null +++ b/pkg/renderutil/deps.go @@ -0,0 +1,50 @@ +/* +Copyright The Helm Authors. + +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 renderutil + +import ( + "fmt" + "strings" + + "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/proto/hapi/chart" +) + +// CheckDependencies will do a simple dependency check on the chart for local +// rendering +func CheckDependencies(ch *chart.Chart, reqs *chartutil.Requirements) error { + missing := []string{} + + deps := ch.GetDependencies() + for _, r := range reqs.Dependencies { + found := false + for _, d := range deps { + if d.Metadata.Name == r.Name { + found = true + break + } + } + if !found { + missing = append(missing, r.Name) + } + } + + if len(missing) > 0 { + return fmt.Errorf("found in requirements.yaml, but missing in charts/ directory: %s", strings.Join(missing, ", ")) + } + return nil +} diff --git a/pkg/renderutil/doc.go b/pkg/renderutil/doc.go new file mode 100644 index 00000000000..38c3ae60d23 --- /dev/null +++ b/pkg/renderutil/doc.go @@ -0,0 +1,24 @@ +/* +Copyright The Helm Authors. + +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 renderutil contains tools related to the local rendering of charts. + +Local rendering means rendering without the tiller; this is generally used for +local debugging and testing (see the `helm template` command for examples of +use). This package will not render charts exactly the same way as the tiller +will, but will be generally close enough for local debug purposes. +*/ +package renderutil // import "k8s.io/helm/pkg/renderutil" diff --git a/pkg/renderutil/render.go b/pkg/renderutil/render.go new file mode 100644 index 00000000000..1996e1dc297 --- /dev/null +++ b/pkg/renderutil/render.go @@ -0,0 +1,88 @@ +/* +Copyright The Helm Authors. + +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 renderutil + +import ( + "fmt" + + "github.com/Masterminds/semver" + + "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/engine" + "k8s.io/helm/pkg/proto/hapi/chart" + tversion "k8s.io/helm/pkg/version" +) + +// Options are options for this simple local render +type Options struct { + ReleaseOptions chartutil.ReleaseOptions + KubeVersion string +} + +// Render chart templates locally and display the output. +// This does not require the Tiller. Any values that would normally be +// looked up or retrieved in-cluster will be faked locally. Additionally, none +// of the server-side testing of chart validity (e.g. whether an API is supported) +// is done. +// +// Note: a `nil` config passed here means "ignore the chart's default values"; +// if you want the normal behavior of merging the defaults with the new config, +// you should pass `&chart.Config{Raw: "{}"}, +func Render(c *chart.Chart, config *chart.Config, opts Options) (map[string]string, error) { + if req, err := chartutil.LoadRequirements(c); err == nil { + if err := CheckDependencies(c, req); err != nil { + return nil, err + } + } else if err != chartutil.ErrRequirementsNotFound { + return nil, fmt.Errorf("cannot load requirements: %v", err) + } + + err := chartutil.ProcessRequirementsEnabled(c, config) + if err != nil { + return nil, err + } + err = chartutil.ProcessRequirementsImportValues(c) + if err != nil { + return nil, err + } + + // Set up engine. + renderer := engine.New() + + caps := &chartutil.Capabilities{ + APIVersions: chartutil.DefaultVersionSet, + KubeVersion: chartutil.DefaultKubeVersion, + TillerVersion: tversion.GetVersionProto(), + } + + if opts.KubeVersion != "" { + kv, verErr := semver.NewVersion(opts.KubeVersion) + if verErr != nil { + return nil, fmt.Errorf("could not parse a kubernetes version: %v", verErr) + } + caps.KubeVersion.Major = fmt.Sprint(kv.Major()) + caps.KubeVersion.Minor = fmt.Sprint(kv.Minor()) + caps.KubeVersion.GitVersion = fmt.Sprintf("v%d.%d.0", kv.Major(), kv.Minor()) + } + + vals, err := chartutil.ToRenderValuesCaps(c, config, opts.ReleaseOptions, caps) + if err != nil { + return nil, err + } + + return renderer.Render(c, vals) +} diff --git a/pkg/renderutil/render_test.go b/pkg/renderutil/render_test.go new file mode 100644 index 00000000000..e10ff883c94 --- /dev/null +++ b/pkg/renderutil/render_test.go @@ -0,0 +1,153 @@ +/* +Copyright The Helm Authors. + +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 renderutil + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/proto/hapi/chart" +) + +const cmTemplate = `kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Chart: +{{.Chart | toYaml | indent 4}} + Release: +{{.Release | toYaml | indent 4}} + Values: +{{.Values | toYaml | indent 4}} +` + +func TestRender(t *testing.T) { + + testChart := &chart.Chart{ + Metadata: &chart.Metadata{Name: "hello"}, + Templates: []*chart.Template{ + {Name: "templates/cm.yaml", Data: []byte(cmTemplate)}, + }, + Values: &chart.Config{Raw: "meow: defaultmeow"}, + } + + newConfig := &chart.Config{Raw: "meow: newmeow"} + defaultConfig := &chart.Config{Raw: "{}"} + + tests := map[string]struct { + chart *chart.Chart + config *chart.Config + opts Options + want map[string]string + }{ + "BasicWithValues": { + chart: testChart, + config: newConfig, + opts: Options{}, + want: map[string]string{ + "hello/templates/cm.yaml": `kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Chart: + name: hello + + Release: + IsInstall: false + IsUpgrade: false + Name: "" + Namespace: "" + Revision: 0 + Service: Tiller + Time: null + + Values: + meow: newmeow + +`, + }, + }, + "BasicNoValues": { + chart: testChart, + config: defaultConfig, + opts: Options{}, + want: map[string]string{ + "hello/templates/cm.yaml": `kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Chart: + name: hello + + Release: + IsInstall: false + IsUpgrade: false + Name: "" + Namespace: "" + Revision: 0 + Service: Tiller + Time: null + + Values: + meow: defaultmeow + +`, + }, + }, + "SetSomeReleaseValues": { + chart: testChart, + config: defaultConfig, + opts: Options{ReleaseOptions: chartutil.ReleaseOptions{Name: "meow"}}, + want: map[string]string{ + "hello/templates/cm.yaml": `kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Chart: + name: hello + + Release: + IsInstall: false + IsUpgrade: false + Name: meow + Namespace: "" + Revision: 0 + Service: Tiller + Time: null + + Values: + meow: defaultmeow + +`, + }, + }, + } + + for testName, tt := range tests { + t.Run(testName, func(t *testing.T) { + got, err := Render(tt.chart, tt.config, tt.opts) + require.NoError(t, err) + require.Equal(t, tt.want, got) + }) + } +} From 0a9c16f42bd2a08f660995b397b0b1b0fdb941fa Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Tue, 17 Jul 2018 18:39:24 -0700 Subject: [PATCH 147/483] [fake] implement rendering and simulated upgrades --- pkg/helm/fake.go | 111 ++++++++++++++++++++++++++-- pkg/helm/fake_test.go | 168 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 261 insertions(+), 18 deletions(-) diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index a3b0ebc84de..ffb5b40c9c4 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -17,23 +17,29 @@ limitations under the License. package helm // import "k8s.io/helm/pkg/helm" import ( + "bytes" "errors" "math/rand" + "strings" "sync" "github.com/golang/protobuf/ptypes/timestamp" + "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/manifest" "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" rls "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/proto/hapi/version" + "k8s.io/helm/pkg/renderutil" storage "k8s.io/helm/pkg/storage/driver" ) // FakeClient implements Interface type FakeClient struct { - Rels []*release.Release - Responses map[string]release.TestRun_Status - Opts options + Rels []*release.Release + Responses map[string]release.TestRun_Status + Opts options + RenderManifests bool } // Option returns the fake release client @@ -96,7 +102,22 @@ func (c *FakeClient) InstallReleaseFromChart(chart *chart.Chart, ns string, opts return nil, errors.New("cannot re-use a name that is still in use") } - release := ReleaseMock(&MockReleaseOptions{Name: releaseName, Namespace: ns, Description: releaseDescription}) + mockOpts := &MockReleaseOptions{ + Name: releaseName, + Chart: chart, + Config: c.Opts.instReq.Values, + Namespace: ns, + Description: releaseDescription, + } + + release := ReleaseMock(mockOpts) + + if c.RenderManifests { + if err := RenderReleaseMock(release, false); err != nil { + return nil, err + } + } + if !c.Opts.dryRun { c.Rels = append(c.Rels, release) } @@ -135,14 +156,44 @@ func (c *FakeClient) UpdateRelease(rlsName string, chStr string, opts ...UpdateO } // UpdateReleaseFromChart returns an UpdateReleaseResponse containing the updated release, if it exists -func (c *FakeClient) UpdateReleaseFromChart(rlsName string, chart *chart.Chart, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) { +func (c *FakeClient) UpdateReleaseFromChart(rlsName string, newChart *chart.Chart, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) { + for _, opt := range opts { + opt(&c.Opts) + } // Check to see if the release already exists. rel, err := c.ReleaseContent(rlsName, nil) if err != nil { return nil, err } - return &rls.UpdateReleaseResponse{Release: rel.Release}, nil + mockOpts := &MockReleaseOptions{ + Name: rel.Release.Name, + Version: rel.Release.Version + 1, + Chart: newChart, + Config: c.Opts.updateReq.Values, + Namespace: rel.Release.Namespace, + Description: c.Opts.updateReq.Description, + } + + newRelease := ReleaseMock(mockOpts) + + if c.Opts.updateReq.ResetValues { + newRelease.Config = &chart.Config{Raw: "{}"} + } else if c.Opts.updateReq.ReuseValues { + // TODO: This should merge old and new values but does not. + } + + if c.RenderManifests { + if err := RenderReleaseMock(newRelease, true); err != nil { + return nil, err + } + } + + if !c.Opts.dryRun { + *rel.Release = *newRelease + } + + return &rls.UpdateReleaseResponse{Release: newRelease}, nil } // RollbackRelease returns nil, nil @@ -231,12 +282,15 @@ type MockReleaseOptions struct { Name string Version int32 Chart *chart.Chart + Config *chart.Config StatusCode release.Status_Code Namespace string Description string } -// ReleaseMock creates a mock release object based on options set by MockReleaseOptions. This function should typically not be used outside of testing. +// ReleaseMock creates a mock release object based on options set by +// MockReleaseOptions. This function should typically not be used outside of +// testing. func ReleaseMock(opts *MockReleaseOptions) *release.Release { date := timestamp.Timestamp{Seconds: 242085845, Nanos: 0} @@ -273,6 +327,11 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { } } + config := opts.Config + if config == nil { + config = &chart.Config{Raw: `name: "value"`} + } + scode := release.Status_DEPLOYED if opts.StatusCode > 0 { scode = opts.StatusCode @@ -287,7 +346,7 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { Description: description, }, Chart: ch, - Config: &chart.Config{Raw: `name: "value"`}, + Config: config, Version: version, Namespace: namespace, Hooks: []*release.Hook{ @@ -303,3 +362,39 @@ func ReleaseMock(opts *MockReleaseOptions) *release.Release { Manifest: MockManifest, } } + +// RenderReleaseMock will take a release (usually produced by helm.ReleaseMock) +// and will render the Manifest inside using the local mechanism (no tiller). +// (Compare to renderResources in pkg/tiller) +func RenderReleaseMock(r *release.Release, asUpgrade bool) error { + if r == nil || r.Chart == nil || r.Chart.Metadata == nil { + return errors.New("a release with a chart with metadata must be provided to render the manifests") + } + + renderOpts := renderutil.Options{ + ReleaseOptions: chartutil.ReleaseOptions{ + Name: r.Name, + Namespace: r.Namespace, + Time: r.Info.LastDeployed, + Revision: int(r.Version), + IsUpgrade: asUpgrade, + IsInstall: !asUpgrade, + }, + } + rendered, err := renderutil.Render(r.Chart, r.Config, renderOpts) + if err != nil { + return err + } + + b := bytes.NewBuffer(nil) + for _, m := range manifest.SplitManifests(rendered) { + // Remove empty manifests + if len(strings.TrimSpace(m.Content)) == 0 { + continue + } + b.WriteString("\n---\n# Source: " + m.Name + "\n") + b.WriteString(m.Content) + } + r.Manifest = b.String() + return nil +} diff --git a/pkg/helm/fake_test.go b/pkg/helm/fake_test.go index f16fbaf4c2d..ecb0a28555f 100644 --- a/pkg/helm/fake_test.go +++ b/pkg/helm/fake_test.go @@ -17,6 +17,7 @@ limitations under the License. package helm import ( + "fmt" "reflect" "testing" @@ -25,6 +26,57 @@ import ( rls "k8s.io/helm/pkg/proto/hapi/services" ) +const cmInputTemplate = `kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Release: +{{.Release | toYaml | indent 4}} +` +const cmOutputTemplate = ` +--- +# Source: installChart/templates/cm.yaml +kind: ConfigMap +apiVersion: v1 +metadata: + name: example +data: + Release: + IsInstall: %t + IsUpgrade: %t + Name: new-release + Namespace: default + Revision: %d + Service: Tiller + Time: + seconds: 242085845 + +` + +var installChart *chart.Chart + +func init() { + installChart = &chart.Chart{ + Metadata: &chart.Metadata{Name: "installChart"}, + Templates: []*chart.Template{ + {Name: "templates/cm.yaml", Data: []byte(cmInputTemplate)}, + }, + } +} + +func releaseWithChart(opts *MockReleaseOptions) *release.Release { + if opts.Chart == nil { + opts.Chart = installChart + } + return ReleaseMock(opts) +} + +func withManifest(r *release.Release, isUpgrade bool) *release.Release { + r.Manifest = fmt.Sprintf(cmOutputTemplate, !isUpgrade, isUpgrade, r.Version) + return r +} + func TestFakeClient_ReleaseStatus(t *testing.T) { releasePresent := ReleaseMock(&MockReleaseOptions{Name: "release-present"}) releaseNotPresent := ReleaseMock(&MockReleaseOptions{Name: "release-not-present"}) @@ -117,9 +169,9 @@ func TestFakeClient_ReleaseStatus(t *testing.T) { } func TestFakeClient_InstallReleaseFromChart(t *testing.T) { - installChart := &chart.Chart{} type fields struct { - Rels []*release.Release + Rels []*release.Release + RenderManifests bool } type args struct { ns string @@ -143,10 +195,10 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { opts: []InstallOption{ReleaseName("new-release")}, }, want: &rls.InstallReleaseResponse{ - Release: ReleaseMock(&MockReleaseOptions{Name: "new-release"}), + Release: releaseWithChart(&MockReleaseOptions{Name: "new-release"}), }, relsAfter: []*release.Release{ - ReleaseMock(&MockReleaseOptions{Name: "new-release"}), + releaseWithChart(&MockReleaseOptions{Name: "new-release"}), }, wantErr: false, }, @@ -160,10 +212,10 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { opts: []InstallOption{ReleaseName("new-release"), InstallDescription("foo-bar")}, }, want: &rls.InstallReleaseResponse{ - Release: ReleaseMock(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), + Release: releaseWithChart(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), }, relsAfter: []*release.Release{ - ReleaseMock(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), + releaseWithChart(&MockReleaseOptions{Name: "new-release", Description: "foo-bar"}), }, wantErr: false, }, @@ -171,7 +223,7 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { name: "Try to add a release where the name already exists.", fields: fields{ Rels: []*release.Release{ - ReleaseMock(&MockReleaseOptions{Name: "new-release"}), + releaseWithChart(&MockReleaseOptions{Name: "new-release"}), }, }, args: args{ @@ -179,16 +231,35 @@ func TestFakeClient_InstallReleaseFromChart(t *testing.T) { opts: []InstallOption{ReleaseName("new-release")}, }, relsAfter: []*release.Release{ - ReleaseMock(&MockReleaseOptions{Name: "new-release"}), + releaseWithChart(&MockReleaseOptions{Name: "new-release"}), }, want: nil, wantErr: true, }, + { + name: "Render the given chart.", + fields: fields{ + Rels: []*release.Release{}, + RenderManifests: true, + }, + args: args{ + ns: "default", + opts: []InstallOption{ReleaseName("new-release")}, + }, + want: &rls.InstallReleaseResponse{ + Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), + }, + relsAfter: []*release.Release{ + withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release"}), false), + }, + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &FakeClient{ - Rels: tt.fields.Rels, + Rels: tt.fields.Rels, + RenderManifests: tt.fields.RenderManifests, } got, err := c.InstallReleaseFromChart(installChart, tt.args.ns, tt.args.opts...) if (err != nil) != tt.wantErr { @@ -293,7 +364,84 @@ func TestFakeClient_DeleteRelease(t *testing.T) { } if !reflect.DeepEqual(c.Rels, tt.relsAfter) { - t.Errorf("FakeClient.InstallReleaseFromChart() rels = %v, expected %v", got, tt.relsAfter) + t.Errorf("FakeClient.InstallReleaseFromChart() rels = %v, expected %v", c.Rels, tt.relsAfter) + } + }) + } +} + +func TestFakeClient_UpdateReleaseFromChart(t *testing.T) { + type fields struct { + Rels []*release.Release + RenderManifests bool + } + type args struct { + release string + opts []UpdateOption + } + tests := []struct { + name string + fields fields + args args + want *rls.UpdateReleaseResponse + relsAfter []*release.Release + wantErr bool + }{ + { + name: "Update release.", + fields: fields{ + Rels: []*release.Release{ + releaseWithChart(&MockReleaseOptions{Name: "new-release"}), + }, + }, + args: args{ + release: "new-release", + opts: []UpdateOption{}, + }, + want: &rls.UpdateReleaseResponse{ + Release: releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), + }, + relsAfter: []*release.Release{ + releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), + }, + }, + { + name: "Update and render given chart.", + fields: fields{ + Rels: []*release.Release{ + releaseWithChart(&MockReleaseOptions{Name: "new-release"}), + }, + RenderManifests: true, + }, + args: args{ + release: "new-release", + opts: []UpdateOption{}, + }, + want: &rls.UpdateReleaseResponse{ + Release: withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), + }, + relsAfter: []*release.Release{ + withManifest(releaseWithChart(&MockReleaseOptions{Name: "new-release", Version: 2}), true), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &FakeClient{ + Rels: tt.fields.Rels, + RenderManifests: tt.fields.RenderManifests, + } + got, err := c.UpdateReleaseFromChart(tt.args.release, installChart, tt.args.opts...) + if (err != nil) != tt.wantErr { + t.Errorf("FakeClient.UpdateReleaseFromChart() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("FakeClient.UpdateReleaseFromChart() =\n%v\nwant\n%v", got, tt.want) + } + if !reflect.DeepEqual(c.Rels, tt.relsAfter) { + t.Errorf("FakeClient.UpdateReleaseFromChart() rels =\n%v\nwant\n%v", c.Rels, tt.relsAfter) } }) } From 15ef839ff49467c4fd14abab4d564bc2b4747c72 Mon Sep 17 00:00:00 2001 From: Mike Lundy Date: Mon, 6 Aug 2018 17:19:38 -0700 Subject: [PATCH 148/483] [manifests] hoist the regex out of SplitManifests --- pkg/manifest/splitter.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/manifest/splitter.go b/pkg/manifest/splitter.go index 25b77326dd6..7081e7aa7b3 100644 --- a/pkg/manifest/splitter.go +++ b/pkg/manifest/splitter.go @@ -23,14 +23,17 @@ import ( "k8s.io/helm/pkg/releaseutil" ) +var ( + kindRegex = regexp.MustCompile("kind:(.*)\n") +) + // SplitManifests takes a map of rendered templates and splits them into the // detected manifests. func SplitManifests(templates map[string]string) []Manifest { var listManifests []Manifest // extract kind and name - re := regexp.MustCompile("kind:(.*)\n") for k, v := range templates { - match := re.FindStringSubmatch(v) + match := kindRegex.FindStringSubmatch(v) h := "Unknown" if len(match) == 2 { h = strings.TrimSpace(match[1]) From c98f3a1a05cd232624a1b36dfd4c0be8034109a9 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 7 Aug 2018 12:48:54 -0700 Subject: [PATCH 149/483] distribute tiller binary with each release --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 77d7c8ff752..6264cd8148a 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 DIST_DIRS = find * -type d -exec -APP = helm # go option GO ?= go @@ -27,11 +26,12 @@ all: build build: GOBIN=$(BINDIR) $(GO) install $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/... -# usage: make clean build-cross dist APP=helm|tiller VERSION=v2.0.0-alpha.3 +# usage: make clean build-cross dist VERSION=v2.0.0-alpha.3 .PHONY: build-cross build-cross: LDFLAGS += -extldflags "-static" build-cross: - CGO_ENABLED=0 gox -parallel=3 -output="_dist/{{.OS}}-{{.Arch}}/{{.Dir}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/$(APP) + CGO_ENABLED=0 gox -parallel=3 -output="_dist/{{.OS}}-{{.Arch}}/{{.Dir}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/helm + CGO_ENABLED=0 gox -parallel=3 -output="_dist/{{.OS}}-{{.Arch}}/{{.Dir}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)' k8s.io/helm/cmd/tiller .PHONY: dist dist: From 3e0de0dae9be9dd42386ab7e5a73abd9cc831204 Mon Sep 17 00:00:00 2001 From: Michelle Noorali Date: Thu, 19 Jul 2018 15:54:47 -0400 Subject: [PATCH 150/483] fix(release_server): fix how we merge values resolves #4337 Merging maps inside of strings gets a bit tricky. When two strings consisting of "{}" were being added together, this resulted in "{}\n{}" instead of "{}" which is what we wanted. This led to YAML parsing errors and showed up when the `--reuse-values` flag was used when no overrides via `--set` were provided during install and/or upgrade. --- pkg/tiller/release_server.go | 4 +++- pkg/tiller/release_update_test.go | 40 +++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index a75b7fc8623..5964deeeef8 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -138,7 +138,9 @@ func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current } // merge new values with current - req.Values.Raw = current.Config.Raw + "\n" + req.Values.Raw + if current.Config != nil && current.Config.Raw != "" && current.Config.Raw != "{}\n" { + req.Values.Raw = current.Config.Raw + "\n" + req.Values.Raw + } req.Chart.Values = &chart.Config{Raw: nv} // yaml unmarshal and marshal to remove duplicate keys diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 56dcca8740c..02bcb3842f4 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -129,6 +129,46 @@ func TestUpdateRelease_ResetValues(t *testing.T) { } } +func TestUpdateRelease_ReuseValuesWithNoValues(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + + installReq := &services.InstallReleaseRequest{ + Namespace: "spaced", + Chart: &chart.Chart{ + Metadata: &chart.Metadata{Name: "hello"}, + Templates: []*chart.Template{ + {Name: "templates/hello", Data: []byte("hello: world")}, + {Name: "templates/hooks", Data: []byte(manifestWithHook)}, + }, + Values: &chart.Config{Raw: "defaultFoo: defaultBar"}, + }, + } + + installResp, err := rs.InstallRelease(c, installReq) + if err != nil { + t.Fatal(err) + } + + rel := installResp.Release + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: &chart.Chart{ + Metadata: &chart.Metadata{Name: "hello"}, + Templates: []*chart.Template{ + {Name: "templates/hello", Data: []byte("hello: world")}, + }, + }, + Values: &chart.Config{Raw: ""}, + ReuseValues: true, + } + + _, err = rs.UpdateRelease(c, req) + if err != nil { + t.Fatalf("Failed updated: %s", err) + } +} + // This is a regression test for bug found in issue #3655 func TestUpdateRelease_ComplexReuseValues(t *testing.T) { c := helm.NewContext() From bd0686731c4d0bcf2bf1282f915bb20da3770c21 Mon Sep 17 00:00:00 2001 From: fibonacci1729 Date: Mon, 16 Jul 2018 15:16:21 -0600 Subject: [PATCH 151/483] fix(helm): fix(helm): add `--tls-hostname` flag to tls flags docs(*): update tiller_ssl.md to reflect IP SAN usage. When using helm/tiller in tls-verify mode, 127.0.0.1 should be listed as an IP SAN in the tiller certificate to pass hostname verficiation of the TLS handshake. Closes #4149 --- cmd/helm/helm.go | 11 +++++++-- docs/helm/helm_delete.md | 23 ++++++++++--------- docs/helm/helm_get.md | 15 +++++++------ docs/helm/helm_get_hooks.md | 15 +++++++------ docs/helm/helm_get_manifest.md | 15 +++++++------ docs/helm/helm_get_values.md | 17 +++++++------- docs/helm/helm_history.md | 19 ++++++++-------- docs/helm/helm_install.md | 3 ++- docs/helm/helm_list.md | 41 +++++++++++++++++----------------- docs/helm/helm_reset.md | 17 +++++++------- docs/helm/helm_rollback.md | 27 +++++++++++----------- docs/helm/helm_status.md | 17 +++++++------- docs/helm/helm_test.md | 17 +++++++------- docs/helm/helm_upgrade.md | 3 ++- docs/helm/helm_version.md | 21 ++++++++--------- docs/tiller_ssl.md | 17 ++++++++++++++ pkg/tlsutil/cfg.go | 11 +++++++-- 17 files changed, 167 insertions(+), 122 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 8607129e49a..cdb6313e218 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -40,6 +40,7 @@ import ( ) var ( + tlsServerName string // overrides the server name used to verify the hostname on the returned certificates from the server. tlsCaCertFile string // path to TLS CA certificate file tlsCertFile string // path to TLS certificate file tlsKeyFile string // path to TLS key file @@ -285,8 +286,13 @@ func newClient() helm.Interface { if tlsKeyFile == "" { tlsKeyFile = settings.Home.TLSKey() } - debug("Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) - tlsopts := tlsutil.Options{KeyFile: tlsKeyFile, CertFile: tlsCertFile, InsecureSkipVerify: true} + debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) + tlsopts := tlsutil.Options{ + ServerName: tlsServerName, + KeyFile: tlsKeyFile, + CertFile: tlsCertFile, + InsecureSkipVerify: true, + } if tlsVerify { tlsopts.CaCertFile = tlsCaCertFile tlsopts.InsecureSkipVerify = false @@ -306,6 +312,7 @@ func newClient() helm.Interface { func addFlagsTLS(cmd *cobra.Command) *cobra.Command { // add flags + cmd.Flags().StringVar(&tlsServerName, "tls-hostname", settings.TillerHost, "the server name used to verify the hostname on the returned certificates from the server") cmd.Flags().StringVar(&tlsCaCertFile, "tls-ca-cert", tlsCaCertDefault, "path to TLS CA certificate file") cmd.Flags().StringVar(&tlsCertFile, "tls-cert", tlsCertDefault, "path to TLS certificate file") cmd.Flags().StringVar(&tlsKeyFile, "tls-key", tlsKeyDefault, "path to TLS key file") diff --git a/docs/helm/helm_delete.md b/docs/helm/helm_delete.md index e181f439e7e..442e5e96c10 100644 --- a/docs/helm/helm_delete.md +++ b/docs/helm/helm_delete.md @@ -20,16 +20,17 @@ helm delete [flags] RELEASE_NAME [...] ### Options ``` - --description string specify a description for the release - --dry-run simulate a delete - --no-hooks prevent hooks from running during deletion - --purge remove the release from the store and make its name free for later use - --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --description string specify a description for the release + --dry-run simulate a delete + --no-hooks prevent hooks from running during deletion + --purge remove the release from the store and make its name free for later use + --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -47,4 +48,4 @@ helm delete [flags] RELEASE_NAME [...] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index f233cd2a75c..3a1b3d44215 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -25,12 +25,13 @@ helm get [flags] RELEASE_NAME ### Options ``` - --revision int32 get the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --revision int32 get the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -51,4 +52,4 @@ helm get [flags] RELEASE_NAME * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release * [helm get values](helm_get_values.md) - download the values file for a named release -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_get_hooks.md b/docs/helm/helm_get_hooks.md index 4f9fa1887b9..9f3d5b0b26a 100644 --- a/docs/helm/helm_get_hooks.md +++ b/docs/helm/helm_get_hooks.md @@ -18,12 +18,13 @@ helm get hooks [flags] RELEASE_NAME ### Options ``` - --revision int32 get the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --revision int32 get the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -41,4 +42,4 @@ helm get hooks [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_get_manifest.md b/docs/helm/helm_get_manifest.md index 3ae55ef3e70..6cae9001f19 100644 --- a/docs/helm/helm_get_manifest.md +++ b/docs/helm/helm_get_manifest.md @@ -20,12 +20,13 @@ helm get manifest [flags] RELEASE_NAME ### Options ``` - --revision int32 get the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --revision int32 get the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -43,4 +44,4 @@ helm get manifest [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_get_values.md b/docs/helm/helm_get_values.md index 12d9731227f..01fee2cd214 100644 --- a/docs/helm/helm_get_values.md +++ b/docs/helm/helm_get_values.md @@ -16,13 +16,14 @@ helm get values [flags] RELEASE_NAME ### Options ``` - -a, --all dump all (computed) values - --revision int32 get the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + -a, --all dump all (computed) values + --revision int32 get the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -40,4 +41,4 @@ helm get values [flags] RELEASE_NAME ### SEE ALSO * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_history.md b/docs/helm/helm_history.md index 437e70f0320..e5028f9cbe9 100755 --- a/docs/helm/helm_history.md +++ b/docs/helm/helm_history.md @@ -28,14 +28,15 @@ helm history [flags] RELEASE_NAME ### Options ``` - --col-width uint specifies the max column width of output (default 60) - --max int32 maximum number of revision to include in history (default 256) - -o, --output string prints the output in the specified format (json|table|yaml) (default "table") - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --col-width uint specifies the max column width of output (default 60) + --max int32 maximum number of revision to include in history (default 256) + -o, --output string prints the output in the specified format (json|table|yaml) (default "table") + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -53,4 +54,4 @@ helm history [flags] RELEASE_NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index c266222b8ac..6e0948e8f9b 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -102,6 +102,7 @@ helm install [CHART] --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") --tls-verify enable TLS for request and verify remote --username string chart repository username where to locate the requested chart @@ -126,4 +127,4 @@ helm install [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jul-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_list.md b/docs/helm/helm_list.md index c7e99e40349..17b2573b8db 100755 --- a/docs/helm/helm_list.md +++ b/docs/helm/helm_list.md @@ -39,25 +39,26 @@ helm list [flags] [FILTER] ### Options ``` - -a, --all show all releases, not just the ones marked DEPLOYED - --col-width uint specifies the max column width of output (default 60) - -d, --date sort by release date - --deleted show deleted releases - --deleting show releases that are currently being deleted - --deployed show deployed releases. If no other is specified, this will be automatically enabled - --failed show failed releases - -m, --max int maximum number of releases to fetch (default 256) - --namespace string show releases within a specific namespace - -o, --offset string next release name in the list, used to offset from start value - --output string output the specified format (json or yaml) - --pending show pending releases - -r, --reverse reverse the sort order - -q, --short output short (quiet) listing format - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + -a, --all show all releases, not just the ones marked DEPLOYED + --col-width uint specifies the max column width of output (default 60) + -d, --date sort by release date + --deleted show deleted releases + --deleting show releases that are currently being deleted + --deployed show deployed releases. If no other is specified, this will be automatically enabled + --failed show failed releases + -m, --max int maximum number of releases to fetch (default 256) + --namespace string show releases within a specific namespace + -o, --offset string next release name in the list, used to offset from start value + --output string output the specified format (json or yaml) + --pending show pending releases + -r, --reverse reverse the sort order + -q, --short output short (quiet) listing format + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -75,4 +76,4 @@ helm list [flags] [FILTER] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_reset.md b/docs/helm/helm_reset.md index 507a94bfdfa..74d5ecc0e95 100644 --- a/docs/helm/helm_reset.md +++ b/docs/helm/helm_reset.md @@ -18,13 +18,14 @@ helm reset ### Options ``` - -f, --force forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.) - --remove-helm-home if set deletes $HELM_HOME - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + -f, --force forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.) + --remove-helm-home if set deletes $HELM_HOME + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -42,4 +43,4 @@ helm reset ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index b40fb883ada..40d3ad83b3b 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -20,18 +20,19 @@ helm rollback [flags] [RELEASE] [REVISION] ### Options ``` - --description string specify a description for the release - --dry-run simulate a rollback - --force force resource update through delete/recreate if needed - --no-hooks prevent hooks from running during rollback - --recreate-pods performs pods restart for the resource if applicable - --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote - --wait if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout + --description string specify a description for the release + --dry-run simulate a rollback + --force force resource update through delete/recreate if needed + --no-hooks prevent hooks from running during rollback + --recreate-pods performs pods restart for the resource if applicable + --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote + --wait if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout ``` ### Options inherited from parent commands @@ -49,4 +50,4 @@ helm rollback [flags] [RELEASE] [REVISION] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 5317875e637..22b47c85156 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -23,13 +23,14 @@ helm status [flags] RELEASE_NAME ### Options ``` - -o, --output string output the status in the specified format (json or yaml) - --revision int32 if set, display the status of the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + -o, --output string output the status in the specified format (json or yaml) + --revision int32 if set, display the status of the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -47,4 +48,4 @@ helm status [flags] RELEASE_NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_test.md b/docs/helm/helm_test.md index 688b67a3404..5a84c3b1895 100644 --- a/docs/helm/helm_test.md +++ b/docs/helm/helm_test.md @@ -19,13 +19,14 @@ helm test [RELEASE] ### Options ``` - --cleanup delete test pods upon completion - --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + --cleanup delete test pods upon completion + --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -43,4 +44,4 @@ helm test [RELEASE] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index ecd51e65ca3..67907023304 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -62,6 +62,7 @@ helm upgrade [RELEASE] [CHART] --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") --tls-verify enable TLS for request and verify remote --username string chart repository username where to locate the requested chart @@ -86,4 +87,4 @@ helm upgrade [RELEASE] [CHART] ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-May-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/helm/helm_version.md b/docs/helm/helm_version.md index 61636c4042f..3db529120dc 100644 --- a/docs/helm/helm_version.md +++ b/docs/helm/helm_version.md @@ -30,15 +30,16 @@ helm version ### Options ``` - -c, --client client version only - -s, --server server version only - --short print the version number - --template string template for version string format - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote + -c, --client client version only + -s, --server server version only + --short print the version number + --template string template for version string format + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote ``` ### Options inherited from parent commands @@ -56,4 +57,4 @@ helm version ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 7-Aug-2018 diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 6db19550726..41e704653b5 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -284,6 +284,23 @@ the host name that Helm connects to matches the host name on the certificate. In some cases this is awkward, since Helm will connect over localhost, or the FQDN is not available for public resolution. +*If I use `--tls-verify` on the client, I get `Error: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs`* + +By default, the Helm client connects to Tiller via tunnel (i.e. kube proxy) at 127.0.0.1. During the TLS handshake, +a target, usually provided as a hostname (e.g. example.com), is checked against the subject and subject alternative +names of the certificate (i.e. hostname verficiation). However, because of the tunnel, the target is an IP address. +Therefore, to validate the certificate, the IP address 127.0.0.1 must be listed as an IP subject alternative name +(IP SAN) in the Tiller certificate. + +For example, to list 127.0.0.1 as an IP SAN when generating the Tiller certificate: + +```console +$ echo subjectAltName=IP:127.0.0.1 > extfile.cnf +$ openssl x509 -req -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -in tiller.csr.pem -out tiller.cert.pem -days 365 -extfile extfile.cnf +``` + +Alternatively, you can override the expected hostname of the tiller certificate using the `--tls-hostname` flag. + *If I use `--tls-verify` on the client, I get `Error: x509: certificate has expired or is not yet valid`* Your helm certificate has expired, you need to sign a new certificate using your private key and the CA (and consider increasing the number of days) diff --git a/pkg/tlsutil/cfg.go b/pkg/tlsutil/cfg.go index 408867db1d3..2c1dfd340f5 100644 --- a/pkg/tlsutil/cfg.go +++ b/pkg/tlsutil/cfg.go @@ -33,6 +33,9 @@ type Options struct { CertFile string // Client-only options InsecureSkipVerify bool + // Overrides the server name used to verify the hostname on the returned + // certificates from the server. + ServerName string // Server-only options ClientAuth tls.ClientAuthType } @@ -55,8 +58,12 @@ func ClientConfig(opts Options) (cfg *tls.Config, err error) { return nil, err } } - - cfg = &tls.Config{InsecureSkipVerify: opts.InsecureSkipVerify, Certificates: []tls.Certificate{*cert}, RootCAs: pool} + cfg = &tls.Config{ + InsecureSkipVerify: opts.InsecureSkipVerify, + Certificates: []tls.Certificate{*cert}, + ServerName: opts.ServerName, + RootCAs: pool, + } return cfg, nil } From e328d00a2ffea7e5e57c2b262087398f85c531fb Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Wed, 8 Aug 2018 12:21:38 -0400 Subject: [PATCH 152/483] Updating to the k8s label convention Closes #4335 Signed-off-by: Matt Farina --- .../alpine/templates/alpine-pod.yaml | 6 ++-- .../novals/templates/alpine-pod.yaml | 6 ++-- .../signtest/alpine/templates/alpine-pod.yaml | 2 +- docs/chart_best_practices/labels.md | 16 +++++---- docs/chart_best_practices/pods.md | 4 +-- docs/chart_template_guide/variables.md | 8 ++--- docs/charts.md | 12 +++---- docs/charts_hooks.md | 12 +++---- .../examples/alpine/templates/alpine-pod.yaml | 12 +++---- docs/examples/nginx/templates/configmap.yaml | 8 ++--- docs/examples/nginx/templates/deployment.yaml | 16 ++++----- .../nginx/templates/post-install-job.yaml | 16 ++++----- .../nginx/templates/pre-install-secret.yaml | 8 ++--- .../nginx/templates/service-test.yaml | 8 ++--- docs/examples/nginx/templates/service.yaml | 12 +++---- pkg/chartutil/create.go | 36 +++++++++---------- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../charts/alpine/templates/alpine-pod.yaml | 2 +- .../signtest/alpine/templates/alpine-pod.yaml | 2 +- .../testdata/albatross/templates/svc.yaml | 6 ++-- 25 files changed, 104 insertions(+), 100 deletions(-) diff --git a/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml index 424920782f5..b8ae22b6c38 100644 --- a/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml @@ -6,12 +6,12 @@ metadata: # The "heritage" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{.Release.Service | quote }} + app.kubernetes.io/managed-by: {{.Release.Service | quote }} # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{.Release.Name | quote }} + app.kubernetes.io/instance: {{.Release.Name | quote }} # This makes it easy to audit chart usage. - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" values: {{.Values.test.Name}} annotations: "helm.sh/created": {{.Release.Time.Seconds | quote }} diff --git a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml index c15ab8efc0f..f569d556ce8 100644 --- a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml @@ -6,12 +6,12 @@ metadata: # The "heritage" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{.Release.Service | quote }} + app.kubernetes.io/managed-by: {{.Release.Service | quote }} # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{.Release.Name | quote }} + app.kubernetes.io/instance: {{.Release.Name | quote }} # This makes it easy to audit chart usage. - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: "helm.sh/created": {{.Release.Time.Seconds | quote }} spec: diff --git a/cmd/helm/testdata/testcharts/signtest/alpine/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/signtest/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/cmd/helm/testdata/testcharts/signtest/alpine/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/signtest/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/docs/chart_best_practices/labels.md b/docs/chart_best_practices/labels.md index 7c3ac51db9f..a43ad9087cf 100644 --- a/docs/chart_best_practices/labels.md +++ b/docs/chart_best_practices/labels.md @@ -10,7 +10,7 @@ An item of metadata should be a label under the following conditions: - It is used by Kubernetes to identify this resource - It is useful to expose to operators for the purpose of querying the system. -For example, we suggest using `chart: NAME-VERSION` as a label so that operators +For example, we suggest using `helm.sh/chart: NAME-VERSION` as a label so that operators can conveniently find all of the instances of a particular chart to use. If an item of metadata is not used for querying, it should be set as an annotation @@ -25,8 +25,12 @@ are recommended, and _should_ be placed onto a chart for global consistency. Tho Name|Status|Description -----|------|---------- -heritage | REC | This should always be set to `{{ .Release.Service }}`. It is for finding all things managed by Tiller. -release | REC | This should be the `{{ .Release.Name }}`. -chart | REC | This should be the chart name and version: `{{ .Chart.Name }}-{{ .Chart.Version \| replace "+" "_" }}`. -app | REC | This should be the app name, reflecting the entire app. Usually `{{ template "name" . }}` is used for this. This is used by many Kubernetes manifests, and is not Helm-specific. -component | OPT | This is a common label for marking the different roles that pieces may play in an application. For example, `component: frontend`. +`app.kubernetes.io/name` | REC | This should be the app name, reflecting the entire app. Usually `{{ template "name" . }}` is used for this. This is used by many Kubernetes manifests, and is not Helm-specific. +`helm.sh/chart` | REC | This should be the chart name and version: `{{ .Chart.Name }}-{{ .Chart.Version \| replace "+" "_" }}`. +`app.kubernetes.io/managed-by` | REC | This should always be set to `{{ .Release.Service }}`. It is for finding all things managed by Tiller. +`app.kubernetes.io/instance` | REC | This should be the `{{ .Release.Name }}`. It aid in differentiating between different instances of the same application. +`app.kubernetes.io/version` | OPT | The version of the app and can be set to `{{ .Chart.AppVersion }}`. +`app.kubernetes.io/component` | OPT | This is a common label for marking the different roles that pieces may play in an application. For example, `app.kubernetes.io/component: frontend`. +`app.kubernetes.io/part-of` | OPT | When multiple charts or pieces of software are used together to make one application. For example, application software and a database to produce a website. This can be set to the top level application being supported. + +You can find more information on the Kubernetes labels, prefixed with `app.kubernetes.io`, in the [Kubernetes documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). \ No newline at end of file diff --git a/docs/chart_best_practices/pods.md b/docs/chart_best_practices/pods.md index 3f26b02536d..bc9b42dd9e1 100644 --- a/docs/chart_best_practices/pods.md +++ b/docs/chart_best_practices/pods.md @@ -52,11 +52,11 @@ All PodTemplate sections should specify a selector. For example: ```yaml selector: matchLabels: - app: MyName + app.kubernetes.io/name: MyName template: metadata: labels: - app: MyName + app.kubernetes.io/name: MyName ``` This is a good practice because it makes the relationship between the set and diff --git a/docs/chart_template_guide/variables.md b/docs/chart_template_guide/variables.md index b55e6e42295..d924fe2cf32 100644 --- a/docs/chart_template_guide/variables.md +++ b/docs/chart_template_guide/variables.md @@ -113,11 +113,11 @@ metadata: labels: # Many helm templates would use `.` below, but that will not work, # however `$` will work here - app: {{ template "fullname" $ }} + app.kubernetes.io/name: {{ template "fullname" $ }} # I cannot reference .Chart.Name, but I can do $.Chart.Name - chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}" - release: "{{ $.Release.Name }}" - heritage: "{{ $.Release.Service }}" + helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}" + app.kubernetes.io/instance: "{{ $.Release.Name }}" + app.kubernetes.io/managed-by: "{{ $.Release.Service }}" type: kubernetes.io/tls data: tls.crt: {{ .certificate }} diff --git a/docs/charts.md b/docs/charts.md index 65673118240..0414136ce2e 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -526,15 +526,15 @@ metadata: name: deis-database namespace: deis labels: - heritage: deis + app.kubernetes.io/managed-by: deis spec: replicas: 1 selector: - app: deis-database + app.kubernetes.io/name: deis-database template: metadata: labels: - app: deis-database + app.kubernetes.io/name: deis-database spec: serviceAccount: deis-database containers: @@ -663,15 +663,15 @@ metadata: name: deis-database namespace: deis labels: - heritage: deis + app.kubernetes.io/managed-by: deis spec: replicas: 1 selector: - app: deis-database + app.kubernetes.io/name: deis-database template: metadata: labels: - app: deis-database + app.kubernetes.io/name: deis-database spec: serviceAccount: deis-database containers: diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index 8d5006d1f39..59c9c91a254 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -127,9 +127,9 @@ kind: Job metadata: name: "{{.Release.Name}}" labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + app.kubernetes.io/managed-by: {{.Release.Service | quote }} + app.kubernetes.io/instance: {{.Release.Name | quote }} + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: # This is what defines this resource as a hook. Without this line, the # job is considered part of the release. @@ -141,9 +141,9 @@ spec: metadata: name: "{{.Release.Name}}" labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + app.kubernetes.io/managed-by: {{.Release.Service | quote }} + app.kubernetes.io/instance: {{.Release.Name | quote }} + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" spec: restartPolicy: Never containers: diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml index da9caef781b..beafd76680f 100644 --- a/docs/examples/alpine/templates/alpine-pod.yaml +++ b/docs/examples/alpine/templates/alpine-pod.yaml @@ -3,16 +3,16 @@ kind: Pod metadata: name: {{ template "alpine.fullname" . }} labels: - # The "heritage" label is used to track which tool deployed a given chart. + # The "app.kubernetes.io/managed-by" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{ .Release.Service }} - # The "release" convention makes it easy to tie a release to all of the + app.kubernetes.io/managed-by: {{ .Release.Service }} + # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{ .Release.Name }} + app.kubernetes.io/instance: {{ .Release.Name }} # This makes it easy to audit chart usage. - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "alpine.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "alpine.name" . }} spec: # This shows how to use a simple value. This will look for a passed-in value called restartPolicy. restartPolicy: {{ .Values.restartPolicy }} diff --git a/docs/examples/nginx/templates/configmap.yaml b/docs/examples/nginx/templates/configmap.yaml index b90d6c0c72c..0141cbc698d 100644 --- a/docs/examples/nginx/templates/configmap.yaml +++ b/docs/examples/nginx/templates/configmap.yaml @@ -4,10 +4,10 @@ kind: ConfigMap metadata: name: {{ template "nginx.fullname" . }} labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "nginx.name" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "nginx.name" . }} data: # When the config map is mounted as a volume, these will be created as files. index.html: {{ .Values.index | quote }} diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml index 5fa2633eab7..08850935a7b 100644 --- a/docs/examples/nginx/templates/deployment.yaml +++ b/docs/examples/nginx/templates/deployment.yaml @@ -6,16 +6,16 @@ metadata: # multiple times into the same namespace. name: {{ template "nginx.fullname" . }} labels: - # The "heritage" label is used to track which tool deployed a given chart. + # The "app.kubernetes.io/managed-by" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{ .Release.Service }} - # The "release" convention makes it easy to tie a release to all of the + app.kubernetes.io/managed-by: {{ .Release.Service }} + # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{ .Release.Name }} + app.kubernetes.io/instance: {{ .Release.Name }} # This makes it easy to audit chart usage. - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "nginx.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "nginx.name" . }} spec: replicas: {{ .Values.replicaCount }} template: @@ -26,8 +26,8 @@ spec: {{ toYaml .Values.podAnnotations | indent 8 }} {{- end }} labels: - app: {{ template "nginx.name" . }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ template "nginx.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ template "nginx.name" . }} diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml index 9ec90cd0aa2..6e32086ab3b 100644 --- a/docs/examples/nginx/templates/post-install-job.yaml +++ b/docs/examples/nginx/templates/post-install-job.yaml @@ -3,16 +3,16 @@ kind: Job metadata: name: {{ template "nginx.fullname" . }} labels: - # The "heritage" label is used to track which tool deployed a given chart. + # The "app.kubernetes.io/managed-by" label is used to track which tool deployed a given chart. # It is useful for admins who want to see what releases a particular tool # is responsible for. - heritage: {{ .Release.Service }} - # The "release" convention makes it easy to tie a release to all of the + app.kubernetes.io/managed-by: {{ .Release.Service }} + # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{ .Release.Name }} + app.kubernetes.io/instance: {{ .Release.Name }} # This makes it easy to audit chart usage. - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "nginx.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "nginx.name" . }} annotations: # This is what defines this resource as a hook. Without this line, the # job is considered part of the release. @@ -22,8 +22,8 @@ spec: metadata: name: {{ template "nginx.fullname" . }} labels: - release: {{ .Release.Name }} - app: {{ template "nginx.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/name: {{ template "nginx.name" . }} spec: # This shows how to use a simple value. This will look for a passed-in value # called restartPolicy. If it is not found, it will use the default value. diff --git a/docs/examples/nginx/templates/pre-install-secret.yaml b/docs/examples/nginx/templates/pre-install-secret.yaml index 6392f9684a4..07a9504b5ff 100644 --- a/docs/examples/nginx/templates/pre-install-secret.yaml +++ b/docs/examples/nginx/templates/pre-install-secret.yaml @@ -5,10 +5,10 @@ kind: Secret metadata: name: {{ template "nginx.fullname" . }} labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "nginx.name" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "nginx.name" . }} # This declares the resource to be a hook. By convention, we also name the # file "pre-install-XXX.yaml", but Helm itself doesn't care about file names. annotations: diff --git a/docs/examples/nginx/templates/service-test.yaml b/docs/examples/nginx/templates/service-test.yaml index 3913ead9ccc..ffb37e9f4f2 100644 --- a/docs/examples/nginx/templates/service-test.yaml +++ b/docs/examples/nginx/templates/service-test.yaml @@ -3,10 +3,10 @@ kind: Pod metadata: name: "{{ template "nginx.fullname" . }}-service-test" labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app: {{ template "nginx.name" . }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/name: {{ template "nginx.name" . }} annotations: "helm.sh/hook": test-success spec: diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml index 1481e34f01a..03f7aa2c6fd 100644 --- a/docs/examples/nginx/templates/service.yaml +++ b/docs/examples/nginx/templates/service.yaml @@ -6,10 +6,10 @@ metadata: {{ toYaml .Values.service.annotations | indent 4 }} {{- end }} labels: - app: {{ template "nginx.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ template "nginx.name" . }} + helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + app.kubernetes.io/instance: {{ .Release.Name }} name: {{ template "nginx.fullname" . }} spec: # Provides options for the service so chart users have the full choice @@ -35,5 +35,5 @@ spec: nodePort: {{ .Values.service.nodePort }} {{- end }} selector: - app: {{ template "nginx.name" . }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ template "nginx.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 97056c1756a..ef70efed968 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -129,10 +129,10 @@ kind: Ingress metadata: name: {{ $fullName }} labels: - app: {{ include ".name" . }} - chart: {{ include ".chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} + app.kubernetes.io/name: {{ include ".name" . }} + helm.sh/chart: {{ include ".chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} {{- with .Values.ingress.annotations }} annotations: {{ toYaml . | indent 4 }} @@ -166,21 +166,21 @@ kind: Deployment metadata: name: {{ include ".fullname" . }} labels: - app: {{ include ".name" . }} - chart: {{ include ".chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} + app.kubernetes.io/name: {{ include ".name" . }} + helm.sh/chart: {{ include ".chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: - app: {{ include ".name" . }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ include ".name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} template: metadata: labels: - app: {{ include ".name" . }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ include ".name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} @@ -219,10 +219,10 @@ kind: Service metadata: name: {{ include ".fullname" . }} labels: - app: {{ include ".name" . }} - chart: {{ include ".chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} + app.kubernetes.io/name: {{ include ".name" . }} + helm.sh/chart: {{ include ".chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} spec: type: {{ .Values.service.type }} ports: @@ -231,8 +231,8 @@ spec: protocol: TCP name: http selector: - app: {{ include ".name" . }} - release: {{ .Release.Name }} + app.kubernetes.io/name: {{ include ".name" . }} + app.kubernetes.io/instancelease: {{ .Release.Name }} ` const defaultNotes = `1. Get the application URL by running these commands: diff --git a/pkg/chartutil/testdata/dependent-chart-alias/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/dependent-chart-alias/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/dependent-chart-alias/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/dependent-chart-alias/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/dependent-chart-helmignore/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/dependent-chart-helmignore/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/dependent-chart-helmignore/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/dependent-chart-helmignore/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/dependent-chart-no-requirements-yaml/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/dependent-chart-no-requirements-yaml/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/dependent-chart-no-requirements-yaml/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/dependent-chart-no-requirements-yaml/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/dependent-chart-with-all-in-requirements-yaml/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/dependent-chart-with-all-in-requirements-yaml/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/dependent-chart-with-all-in-requirements-yaml/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/dependent-chart-with-all-in-requirements-yaml/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/dependent-chart-with-mixed-requirements-yaml/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/dependent-chart-with-mixed-requirements-yaml/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/dependent-chart-with-mixed-requirements-yaml/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/dependent-chart-with-mixed-requirements-yaml/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/frobnitz/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/frobnitz/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/chartutil/testdata/frobnitz/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/frobnitz/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/chartutil/testdata/frobnitz_backslash/charts/alpine/templates/alpine-pod.yaml b/pkg/chartutil/testdata/frobnitz_backslash/charts/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100755 --- a/pkg/chartutil/testdata/frobnitz_backslash/charts/alpine/templates/alpine-pod.yaml +++ b/pkg/chartutil/testdata/frobnitz_backslash/charts/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/downloader/testdata/signtest/alpine/templates/alpine-pod.yaml b/pkg/downloader/testdata/signtest/alpine/templates/alpine-pod.yaml index 08cf3c2c1f5..c34fa8c472d 100644 --- a/pkg/downloader/testdata/signtest/alpine/templates/alpine-pod.yaml +++ b/pkg/downloader/testdata/signtest/alpine/templates/alpine-pod.yaml @@ -3,7 +3,7 @@ kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: - heritage: {{.Release.Service}} + app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} annotations: diff --git a/pkg/lint/rules/testdata/albatross/templates/svc.yaml b/pkg/lint/rules/testdata/albatross/templates/svc.yaml index 1671481125c..aea11d83325 100644 --- a/pkg/lint/rules/testdata/albatross/templates/svc.yaml +++ b/pkg/lint/rules/testdata/albatross/templates/svc.yaml @@ -5,9 +5,9 @@ kind: Service metadata: name: "{{ .Values.name }}" labels: - heritage: {{ .Release.Service | quote }} - release: {{ .Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" kubeVersion: {{ .Capabilities.KubeVersion.Major }} tillerVersion: {{ .Capabilities.TillerVersion }} spec: From 76f325322a2e76fca1c1ba9bec62a3fada173205 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 8 Aug 2018 11:02:39 -0700 Subject: [PATCH 153/483] bump version to v2.10 --- pkg/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/version/version.go b/pkg/version/version.go index b2ea2c50f91..c4ce4b38113 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -26,7 +26,7 @@ var ( // Increment major number for new feature additions and behavioral changes. // Increment minor number for bug fixes and performance enhancements. // Increment patch number for critical fixes to existing releases. - Version = "v2.8" + Version = "v2.10" // BuildMetadata is extra build time data BuildMetadata = "unreleased" From efadbd88035654b2951f3958167afed014c46bc6 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 1 Aug 2018 14:33:43 -0700 Subject: [PATCH 154/483] ref(*): kubernetes v1.11 support --- cmd/helm/installer/uninstall.go | 5 +- cmd/helm/installer/uninstall_test.go | 16 +-- glide.lock | 160 ++++++--------------- glide.yaml | 14 +- pkg/kube/client.go | 69 ++++----- pkg/kube/client_test.go | 46 ++---- pkg/kube/result.go | 2 +- pkg/kube/result_test.go | 9 +- pkg/kube/wait.go | 27 ++-- pkg/tiller/environment/environment.go | 2 +- pkg/tiller/environment/environment_test.go | 2 +- pkg/tiller/release_server_test.go | 2 +- 12 files changed, 119 insertions(+), 235 deletions(-) diff --git a/cmd/helm/installer/uninstall.go b/cmd/helm/installer/uninstall.go index 14735ea8505..54e79bdf442 100644 --- a/cmd/helm/installer/uninstall.go +++ b/cmd/helm/installer/uninstall.go @@ -19,10 +19,8 @@ package installer // import "k8s.io/helm/cmd/helm/installer" import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" - "k8s.io/kubernetes/pkg/kubectl" ) const ( @@ -52,8 +50,7 @@ func deleteService(client coreclient.ServicesGetter, namespace string) error { // We need to use the reaper instead of the kube API because GC for deployment dependents // is not yet supported at the k8s server level (<= 1.5) func deleteDeployment(client internalclientset.Interface, namespace string) error { - reaper, _ := kubectl.ReaperFor(extensions.Kind("Deployment"), client) - err := reaper.Stop(namespace, deploymentName, 0, nil) + err := client.Extensions().Deployments(namespace).Delete(deploymentName, &metav1.DeleteOptions{}) return ingoreNotFound(err) } diff --git a/cmd/helm/installer/uninstall_test.go b/cmd/helm/installer/uninstall_test.go index 195b209bc31..7e5be8aaacb 100644 --- a/cmd/helm/installer/uninstall_test.go +++ b/cmd/helm/installer/uninstall_test.go @@ -34,8 +34,8 @@ func TestUninstall(t *testing.T) { t.Errorf("unexpected error: %#+v", err) } - if actions := fc.Actions(); len(actions) != 7 { - t.Errorf("unexpected actions: %v, expected 7 actions got %d", actions, len(actions)) + if actions := fc.Actions(); len(actions) != 3 { + t.Errorf("unexpected actions: %v, expected 3 actions got %d", actions, len(actions)) } } @@ -50,8 +50,8 @@ func TestUninstall_serviceNotFound(t *testing.T) { t.Errorf("unexpected error: %#+v", err) } - if actions := fc.Actions(); len(actions) != 7 { - t.Errorf("unexpected actions: %v, expected 7 actions got %d", actions, len(actions)) + if actions := fc.Actions(); len(actions) != 3 { + t.Errorf("unexpected actions: %v, expected 3 actions got %d", actions, len(actions)) } } @@ -66,8 +66,8 @@ func TestUninstall_deploymentNotFound(t *testing.T) { t.Errorf("unexpected error: %#+v", err) } - if actions := fc.Actions(); len(actions) != 7 { - t.Errorf("unexpected actions: %v, expected 7 actions got %d", actions, len(actions)) + if actions := fc.Actions(); len(actions) != 3 { + t.Errorf("unexpected actions: %v, expected 3 actions got %d", actions, len(actions)) } } @@ -82,7 +82,7 @@ func TestUninstall_secretNotFound(t *testing.T) { t.Errorf("unexpected error: %#+v", err) } - if actions := fc.Actions(); len(actions) != 7 { - t.Errorf("unexpected actions: %v, expect 7 actions got %d", actions, len(actions)) + if actions := fc.Actions(); len(actions) != 3 { + t.Errorf("unexpected actions: %v, expect 3 actions got %d", actions, len(actions)) } } diff --git a/glide.lock b/glide.lock index eef256fd151..9a89616efef 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 41304a2eabc68608507c034304ce87cbf76924c90caaafbe42a9be16e6265868 -updated: 2018-06-19T14:50:56.238468981-05:00 +hash: 9d3eee153a34027ed93ccbcbfb4778baead73ed3f5bd4c665114e02aef747606 +updated: 2018-08-01T07:48:30.2009451Z imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -15,7 +15,7 @@ imports: subpackages: - winterm - name: github.com/Azure/go-autorest - version: d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab + version: 1ff28809256a84bb6966640ff3d0371af82ccba4 subpackages: - autorest - autorest/adal @@ -27,6 +27,13 @@ imports: - quantile - name: github.com/BurntSushi/toml version: b26d9c308763d68093482582cea63d69be07a0f0 +- name: github.com/chai2010/gettext-go + version: c6fed771bfd517099caf0f7a961671fa8ed08723 + subpackages: + - gettext + - gettext/mo + - gettext/plural + - gettext/po - name: github.com/cpuguy83/go-md2man version: 71acacd42f85e5e82f70a55327789582a5200a90 subpackages: @@ -70,6 +77,7 @@ imports: - pkg/longpath - pkg/mount - pkg/parsers + - pkg/parsers/operatingsystem - pkg/stdcopy - pkg/sysinfo - pkg/system @@ -146,7 +154,7 @@ imports: - compiler - extensions - name: github.com/gophercloud/gophercloud - version: 6da026c32e2d622cc242d32984259c77237aefe1 + version: 781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d subpackages: - openstack - openstack/identity/v2/tenants @@ -169,8 +177,6 @@ imports: version: a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4 subpackages: - simplelru -- name: github.com/howeyc/gopass - version: bf9dde6d0d2c004a008c27aaee91170c786f6db8 - name: github.com/huandu/xstrings version: 3959339b333561bf62a38b424fd41517c2c90f40 - name: github.com/imdario/mergo @@ -178,7 +184,7 @@ imports: - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 - name: github.com/json-iterator/go - version: 13f86432b882000a51c6e610c620974462691a97 + version: f2b4162afba35581b6d4a50d3b8f34e33c144682 - name: github.com/mailru/easyjson version: 2f5df55504ebc322e4d52d34df6a1f5b503bf26d subpackages: @@ -201,6 +207,10 @@ imports: - pbutil - name: github.com/mitchellh/go-wordwrap version: ad45545899c7b13c020ea92b2072220eefad42b8 +- name: github.com/modern-go/concurrent + version: bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 +- name: github.com/modern-go/reflect2 + version: 05fbef0ca5da472bbf96c9322b84a53edc03c9fd - name: github.com/opencontainers/go-digest version: a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb - name: github.com/opencontainers/image-spec @@ -208,8 +218,6 @@ imports: subpackages: - specs-go - specs-go/v1 -- name: github.com/pborman/uuid - version: ca53cad383cad2479bbba7f7a1a05797ec1386e4 - name: github.com/peterbourgon/diskv version: 5f041e8faa004a95c88a202771f4cc3e991971e6 - name: github.com/pkg/errors @@ -244,15 +252,15 @@ imports: - name: github.com/sirupsen/logrus version: 89742aefa4b206dcf400792f3bd35b542998eb3b - name: github.com/spf13/cobra - version: f62e98d28ab7ad31d707ba837a966378465c7b57 + version: c439c4fa093711d42e1b01acb1235b52004753c1 subpackages: - doc - name: github.com/spf13/pflag - version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7 + version: 583c0c0531f06d5278b7d917446061adc344b5cd - name: github.com/technosophos/moniker version: a5dbd03a2245d554160e3ae6bfdcf969fe58b431 - name: golang.org/x/crypto - version: 81e90905daefcd6fd217b62423c0908922eadb30 + version: 49796115aa4b964c318aad4f3084fdb41e9aa067 subpackages: - cast5 - ed25519 @@ -361,7 +369,7 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: 8b7507fac302640dd5f1efbf9643199952cc58db + version: 2d6f90ab1293a1fb871cf149423ebb72aa7423aa subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -389,6 +397,7 @@ imports: - rbac/v1alpha1 - rbac/v1beta1 - scheduling/v1alpha1 + - scheduling/v1beta1 - settings/v1alpha1 - storage/v1 - storage/v1alpha1 @@ -398,19 +407,19 @@ imports: subpackages: - pkg/features - name: k8s.io/apimachinery - version: f6313580a4d36c7c74a3d845dda6e116642c4f90 + version: 103fd098999dc9c0c88536f5c9ad2e5da39373ae subpackages: - pkg/api/equality - pkg/api/errors - pkg/api/meta + - pkg/api/meta/testrestmapper - pkg/api/resource - pkg/api/validation - - pkg/apimachinery - - pkg/apimachinery/announced - - pkg/apimachinery/registered + - pkg/api/validation/path - 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 @@ -444,7 +453,6 @@ imports: - pkg/util/runtime - pkg/util/sets - pkg/util/strategicpatch - - pkg/util/uuid - pkg/util/validation - pkg/util/validation/field - pkg/util/wait @@ -455,7 +463,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: f7914ed3085badf66a1b6f3a5218ada28f7bd084 + version: 8b122ec9e3bbab91a262d17a39325e69349dc44d subpackages: - pkg/apis/audit - pkg/authentication/authenticator @@ -464,53 +472,13 @@ imports: - pkg/endpoints/request - pkg/features - pkg/util/feature - - pkg/util/flag - name: k8s.io/client-go - version: 23781f4d6632d88e869066eaebb743857aa1ef9b + version: 59698c7d9724b0f95f9dc9e7f7dfdcc3dfeceb82 subpackages: - discovery - discovery/fake - dynamic - - informers - - informers/admissionregistration - - informers/admissionregistration/v1alpha1 - - informers/admissionregistration/v1beta1 - - informers/apps - - informers/apps/v1 - - informers/apps/v1beta1 - - informers/apps/v1beta2 - - informers/autoscaling - - informers/autoscaling/v1 - - informers/autoscaling/v2beta1 - - informers/batch - - informers/batch/v1 - - informers/batch/v1beta1 - - informers/batch/v2alpha1 - - informers/certificates - - informers/certificates/v1beta1 - - informers/core - - informers/core/v1 - - informers/events - - informers/events/v1beta1 - - informers/extensions - - informers/extensions/v1beta1 - - informers/internalinterfaces - - informers/networking - - informers/networking/v1 - - informers/policy - - informers/policy/v1beta1 - - informers/rbac - - informers/rbac/v1 - - informers/rbac/v1alpha1 - - informers/rbac/v1beta1 - - informers/scheduling - - informers/scheduling/v1alpha1 - - informers/settings - - informers/settings/v1alpha1 - - informers/storage - - informers/storage/v1 - - informers/storage/v1alpha1 - - informers/storage/v1beta1 + - dynamic/fake - kubernetes - kubernetes/fake - kubernetes/scheme @@ -562,6 +530,8 @@ imports: - kubernetes/typed/rbac/v1beta1/fake - kubernetes/typed/scheduling/v1alpha1 - kubernetes/typed/scheduling/v1alpha1/fake + - kubernetes/typed/scheduling/v1beta1 + - kubernetes/typed/scheduling/v1beta1/fake - kubernetes/typed/settings/v1alpha1 - kubernetes/typed/settings/v1alpha1/fake - kubernetes/typed/storage/v1 @@ -570,32 +540,11 @@ imports: - kubernetes/typed/storage/v1alpha1/fake - kubernetes/typed/storage/v1beta1 - kubernetes/typed/storage/v1beta1/fake - - listers/admissionregistration/v1alpha1 - - listers/admissionregistration/v1beta1 - listers/apps/v1 - - listers/apps/v1beta1 - - listers/apps/v1beta2 - - listers/autoscaling/v1 - - listers/autoscaling/v2beta1 - - listers/batch/v1 - - listers/batch/v1beta1 - - listers/batch/v2alpha1 - - listers/certificates/v1beta1 - listers/core/v1 - - listers/events/v1beta1 - - listers/extensions/v1beta1 - - listers/networking/v1 - - listers/policy/v1beta1 - - listers/rbac/v1 - - listers/rbac/v1alpha1 - - listers/rbac/v1beta1 - - listers/scheduling/v1alpha1 - - listers/settings/v1alpha1 - - listers/storage/v1 - - listers/storage/v1alpha1 - - listers/storage/v1beta1 - pkg/apis/clientauthentication - pkg/apis/clientauthentication/v1alpha1 + - pkg/apis/clientauthentication/v1beta1 - pkg/version - plugin/pkg/client/auth - plugin/pkg/client/auth/azure @@ -606,6 +555,7 @@ imports: - rest - rest/fake - rest/watch + - restmapper - scale - scale/scheme - scale/scheme/appsint @@ -632,20 +582,21 @@ imports: - transport/spdy - util/buffer - util/cert + - util/connrotation - util/exec - util/flowcontrol - util/homedir - util/integer - util/jsonpath - util/retry - - util/workqueue - name: k8s.io/kube-openapi - version: 39cb288412c48cb533ba4be5d6c28620b9a0c1b4 + version: 91cfa479c814065e420cee7ed227db0f63a5854e subpackages: - pkg/util/proto + - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 32ac1c9073b132b8ba18aa830f46b77dcceb0723 + version: 8b3d76091fd500b7c59c83e113c9048ee612b205 subpackages: - pkg/api/events - pkg/api/legacyscheme @@ -697,7 +648,6 @@ imports: - pkg/apis/core/pods - pkg/apis/core/v1 - pkg/apis/core/v1/helper - - pkg/apis/core/v1/helper/qos - pkg/apis/core/validation - pkg/apis/events - pkg/apis/events/install @@ -722,6 +672,7 @@ imports: - pkg/apis/scheduling - pkg/apis/scheduling/install - pkg/apis/scheduling/v1alpha1 + - pkg/apis/scheduling/v1beta1 - pkg/apis/settings - pkg/apis/settings/install - pkg/apis/settings/v1alpha1 @@ -767,36 +718,30 @@ imports: - pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake - - pkg/cloudprovider - pkg/controller - - pkg/controller/daemon - - pkg/controller/daemon/util - pkg/controller/deployment/util - - pkg/controller/history - - pkg/controller/statefulset - - pkg/controller/volume/events - - pkg/controller/volume/persistentvolume - - pkg/controller/volume/persistentvolume/metrics - pkg/credentialprovider - pkg/features - pkg/fieldpath + - pkg/generated - pkg/kubectl - pkg/kubectl/apps - - pkg/kubectl/categories + - pkg/kubectl/cmd/get - pkg/kubectl/cmd/templates - pkg/kubectl/cmd/testing - pkg/kubectl/cmd/util - pkg/kubectl/cmd/util/openapi - pkg/kubectl/cmd/util/openapi/testing - pkg/kubectl/cmd/util/openapi/validation - - pkg/kubectl/plugins - - pkg/kubectl/resource + - pkg/kubectl/genericclioptions + - pkg/kubectl/genericclioptions/printers + - pkg/kubectl/genericclioptions/resource - pkg/kubectl/scheme - pkg/kubectl/util - pkg/kubectl/util/hash + - pkg/kubectl/util/i18n - pkg/kubectl/util/slice - pkg/kubectl/util/term - - pkg/kubectl/util/transport - pkg/kubectl/validation - pkg/kubelet/apis - pkg/kubelet/types @@ -805,38 +750,25 @@ imports: - pkg/printers/internalversion - pkg/registry/rbac/validation - pkg/scheduler/algorithm - - pkg/scheduler/algorithm/predicates - pkg/scheduler/algorithm/priorities/util - pkg/scheduler/api - - pkg/scheduler/schedulercache + - pkg/scheduler/cache - pkg/scheduler/util - - pkg/scheduler/volumebinder - pkg/security/apparmor - pkg/serviceaccount - pkg/util/file - - pkg/util/goroutinemap - - pkg/util/goroutinemap/exponentialbackoff - pkg/util/hash - pkg/util/interrupt - - pkg/util/io - pkg/util/labels - - pkg/util/metrics - - pkg/util/mount - pkg/util/net/sets - pkg/util/node - - pkg/util/nsenter - pkg/util/parsers - pkg/util/pointer - pkg/util/slice - pkg/util/taints - pkg/version - - pkg/volume - - pkg/volume/util - - pkg/volume/util/fs - - pkg/volume/util/recyclerclient - - pkg/volume/util/types - name: k8s.io/utils - version: aedf551cdb8b0119df3a19c65fde413a13b34997 + version: 258e2a2fa64568210fbd6267cf1d8fd87c3cb86e subpackages: - clock - exec diff --git a/glide.yaml b/glide.yaml index a101a11eef3..e32df1d4e3c 100644 --- a/glide.yaml +++ b/glide.yaml @@ -4,9 +4,9 @@ import: subpackages: - context - package: github.com/spf13/cobra - version: f62e98d28ab7ad31d707ba837a966378465c7b57 + version: c439c4fa093711d42e1b01acb1235b52004753c1 - package: github.com/spf13/pflag - version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7 + version: 583c0c0531f06d5278b7d917446061adc344b5cd - package: github.com/Masterminds/vcs version: ~1.11.0 # Pin version of mergo that is compatible with both sprig and Kubernetes @@ -49,15 +49,15 @@ import: - package: github.com/grpc-ecosystem/go-grpc-prometheus - package: k8s.io/kubernetes - version: release-1.10 + version: release-1.11 - package: k8s.io/client-go - version: kubernetes-1.10.0 + version: kubernetes-1.11.1 - package: k8s.io/api - version: release-1.10 + version: kubernetes-1.11.1 - package: k8s.io/apimachinery - version: release-1.10 + version: kubernetes-1.11.1 - package: k8s.io/apiserver - version: release-1.10 + version: kubernetes-1.11.1 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 39187da42e1..167da9eef75 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -42,14 +42,14 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/tools/clientcmd" + "k8s.io/kubernetes/pkg/api/legacyscheme" batchinternal "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl" + "k8s.io/kubernetes/pkg/kubectl/cmd/get" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/validation" - "k8s.io/kubernetes/pkg/printers" ) const ( @@ -63,18 +63,17 @@ var ErrNoObjectsVisited = goerrors.New("no objects visited") // Client represents a client capable of communicating with the Kubernetes API. type Client struct { cmdutil.Factory - // SchemaCacheDir is the path for loading cached schema. - SchemaCacheDir string - Log func(string, ...interface{}) } // New creates a new Client. -func New(config clientcmd.ClientConfig) *Client { +func New(getter genericclioptions.RESTClientGetter) *Client { + if getter == nil { + getter = genericclioptions.NewConfigFlags() + } return &Client{ - Factory: cmdutil.NewFactory(config), - SchemaCacheDir: clientcmd.RecommendedSchemaFile, - Log: nopLogger, + Factory: cmdutil.NewFactory(getter), + Log: nopLogger, } } @@ -111,8 +110,8 @@ func (c *Client) Create(namespace string, reader io.Reader, timeout int64, shoul func (c *Client) newBuilder(namespace string, reader io.Reader) *resource.Result { return c.NewBuilder(). - Internal(). ContinueOnError(). + WithScheme(legacyscheme.Scheme). Schema(c.validator()). NamespaceParam(namespace). DefaultNamespace(). @@ -179,7 +178,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // versions per cluster, but this certainly won't hurt anything, so let's be safe. gvk := info.ResourceMapping().GroupVersionKind vk := gvk.Version + "/" + gvk.Kind - objs[vk] = append(objs[vk], info.AsInternal()) + objs[vk] = append(objs[vk], asVersioned(info)) //Get the relation pods objPods, err = c.getSelectRelationPod(info, objPods) @@ -205,10 +204,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // an object type changes, so we can just rely on that. Problem is it doesn't seem to keep // track of tab widths. buf := new(bytes.Buffer) - p, err := cmdutil.PrinterForOptions(&printers.PrintOptions{}) - if err != nil { - return "", err - } + p, _ := get.NewHumanPrintFlags().ToPrinter("") for t, ot := range objs { if _, err = buf.WriteString("==> " + t + "\n"); err != nil { return "", err @@ -297,7 +293,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader for _, info := range original.Difference(target) { c.Log("Deleting %q in %s...", info.Name, info.Namespace) - if err := deleteResource(c, info); err != nil { + if err := deleteResource(info); err != nil { c.Log("Failed to delete %q, err: %s", info.Name, err) } } @@ -317,7 +313,7 @@ func (c *Client) Delete(namespace string, reader io.Reader) error { } return perform(infos, func(info *resource.Info) error { c.Log("Starting delete for %q %s", info.Name, info.Mapping.GroupVersionKind.Kind) - err := deleteResource(c, info) + err := deleteResource(info) return c.skipIfNotFound(err) }) } @@ -379,17 +375,11 @@ func createResource(info *resource.Info) error { return info.Refresh(obj, true) } -func deleteResource(c *Client, info *resource.Info) error { - reaper, err := c.Reaper(info.Mapping) - if err != nil { - // If there is no reaper for this resources, delete it. - if kubectl.IsNoSuchReaperError(err) { - return resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name) - } - return err - } - c.Log("Using reaper for deleting %q", info.Name) - return reaper.Stop(info.Namespace, info.Name, 0, nil) +func deleteResource(info *resource.Info) error { + policy := metav1.DeletePropagationBackground + opts := &metav1.DeleteOptions{PropagationPolicy: &policy} + _, err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, opts) + return err } func createPatch(target *resource.Info, current runtime.Object) ([]byte, types.PatchType, error) { @@ -411,7 +401,7 @@ func createPatch(target *resource.Info, current runtime.Object) ([]byte, types.P } // Get a versioned object - versionedObject, err := target.Versioned() + versionedObject := asVersioned(target) // Unstructured objects, such as CRDs, may not have an not registered error // returned from ConvertToVersion. Anything that's unstructured should @@ -455,7 +445,7 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, if force { // Attempt to delete... - if err := deleteResource(c, target); err != nil { + if err := deleteResource(target); err != nil { return err } log.Printf("Deleted %s: %q", kind, target.Name) @@ -483,7 +473,7 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, return nil } - versioned := target.AsVersioned() + versioned := asVersioned(target) selector, ok := getSelectorFromObject(versioned) if !ok { return nil @@ -695,14 +685,7 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] c.Log("get relation pod of object: %s/%s/%s", info.Namespace, info.Mapping.GroupVersionKind.Kind, info.Name) - versioned, err := info.Versioned() - switch { - case runtime.IsNotRegisteredError(err): - return objPods, nil - case err != nil: - return objPods, err - } - + versioned := asVersioned(info) selector, ok := getSelectorFromObject(versioned) if !ok { return objPods, nil @@ -743,3 +726,7 @@ func isFoundPod(podItem []core.Pod, pod core.Pod) bool { } return false } + +func asVersioned(info *resource.Info) runtime.Object { + return cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) +} diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 6e33ca27f96..617fce35283 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -23,25 +23,20 @@ import ( "net/http" "strings" "testing" - "time" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/dynamic" "k8s.io/client-go/rest/fake" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/scheme" ) -var unstructuredSerializer = dynamic.ContentConfig().NegotiatedSerializer +var unstructuredSerializer = resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) @@ -98,24 +93,6 @@ func newResponse(code int, obj runtime.Object) (*http.Response, error) { return &http.Response{StatusCode: code, Header: header, Body: body}, nil } -type fakeReaper struct { - name string -} - -func (r *fakeReaper) Stop(namespace, name string, timeout time.Duration, gracePeriod *metav1.DeleteOptions) error { - r.name = name - return nil -} - -type fakeReaperFactory struct { - cmdutil.Factory - reaper kubectl.Reaper -} - -func (f *fakeReaperFactory) Reaper(mapping *meta.RESTMapping) (kubectl.Reaper, error) { - return f.reaper, nil -} - type testClient struct { *Client *cmdtesting.TestFactory @@ -144,8 +121,8 @@ func TestUpdate(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() + tf.UnstructuredClient = &fake.RESTClient{ - GroupVersion: schema.GroupVersion{Version: "v1"}, NegotiatedSerializer: unstructuredSerializer, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { p, m := req.URL.Path, req.Method @@ -180,11 +157,12 @@ func TestUpdate(t *testing.T) { }), } - c := newTestClient() - reaper := &fakeReaper{} - rf := &fakeReaperFactory{Factory: tf, reaper: reaper} - c.Client.Factory = rf - codec := legacyscheme.Codecs.LegacyCodec(scheme.Versions...) + c := &Client{ + Factory: tf, + Log: nopLogger, + } + codec := legacyscheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) + if err := c.Update(core.NamespaceDefault, objBody(codec, &listA), objBody(codec, &listB), false, false, 0, false); err != nil { t.Fatal(err) } @@ -205,6 +183,7 @@ func TestUpdate(t *testing.T) { "/namespaces/default/pods/otter:GET", "/namespaces/default/pods/dolphin:GET", "/namespaces/default/pods:POST", + "/namespaces/default/pods/squid:DELETE", } if len(expectedActions) != len(actions) { t.Errorf("unexpected number of requests, expected %d, got %d", len(expectedActions), len(actions)) @@ -215,11 +194,6 @@ func TestUpdate(t *testing.T) { t.Errorf("expected %s request got %s", v, actions[k]) } } - - if reaper.name != "squid" { - t.Errorf("unexpected reaper: %#v", reaper) - } - } func TestBuild(t *testing.T) { diff --git a/pkg/kube/result.go b/pkg/kube/result.go index f90d77ad5af..0c6289e4994 100644 --- a/pkg/kube/result.go +++ b/pkg/kube/result.go @@ -16,7 +16,7 @@ limitations under the License. package kube // import "k8s.io/helm/pkg/kube" -import "k8s.io/kubernetes/pkg/kubectl/resource" +import "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" // Result provides convenience methods for comparing collections of Infos. type Result []*resource.Info diff --git a/pkg/kube/result_test.go b/pkg/kube/result_test.go index 0780ad9fcd7..503473c053a 100644 --- a/pkg/kube/result_test.go +++ b/pkg/kube/result_test.go @@ -19,15 +19,14 @@ package kube // import "k8s.io/helm/pkg/kube" import ( "testing" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" ) func TestResult(t *testing.T) { - mapping, err := testapi.Default.RESTMapper().RESTMapping(schema.GroupKind{Kind: "Pod"}) - if err != nil { - t.Fatal(err) + mapping := &meta.RESTMapping{ + Resource: schema.GroupVersionResource{Group: "group", Version: "version", Resource: "pod"}, } info := func(name string) *resource.Info { diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index ed9bc10a651..960409df993 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -27,7 +27,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" podutil "k8s.io/kubernetes/pkg/api/v1/pod" @@ -37,8 +36,8 @@ import ( // deployment holds associated replicaSets for a deployment type deployment struct { - replicaSets *extensions.ReplicaSet - deployment *extensions.Deployment + replicaSets *appsv1.ReplicaSet + deployment *appsv1.Deployment } // waitForResources polls to get the current status of all pods, PVCs, and Services @@ -56,11 +55,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { pvc := []v1.PersistentVolumeClaim{} deployments := []deployment{} for _, v := range created { - obj, err := v.Versioned() - if err != nil && !runtime.IsNotRegisteredError(err) { - return false, err - } - switch value := obj.(type) { + switch value := asVersioned(v).(type) { case *v1.ReplicationController: list, err := getPods(kcs, value.Namespace, value.Spec.Selector) if err != nil { @@ -74,12 +69,12 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { } pods = append(pods, *pod) case *appsv1.Deployment: - currentDeployment, err := kcs.ExtensionsV1beta1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) + currentDeployment, err := kcs.AppsV1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) if err != nil { return false, err } // Find RS associated with deployment - newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.ExtensionsV1beta1()) + newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.AppsV1()) if err != nil || newReplicaSet == nil { return false, err } @@ -89,12 +84,12 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { } deployments = append(deployments, newDeployment) case *appsv1beta1.Deployment: - currentDeployment, err := kcs.ExtensionsV1beta1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) + currentDeployment, err := kcs.AppsV1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) if err != nil { return false, err } // Find RS associated with deployment - newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.ExtensionsV1beta1()) + newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.AppsV1()) if err != nil || newReplicaSet == nil { return false, err } @@ -104,12 +99,12 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { } deployments = append(deployments, newDeployment) case *appsv1beta2.Deployment: - currentDeployment, err := kcs.ExtensionsV1beta1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) + currentDeployment, err := kcs.AppsV1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) if err != nil { return false, err } // Find RS associated with deployment - newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.ExtensionsV1beta1()) + newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.AppsV1()) if err != nil || newReplicaSet == nil { return false, err } @@ -119,12 +114,12 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { } deployments = append(deployments, newDeployment) case *extensions.Deployment: - currentDeployment, err := kcs.ExtensionsV1beta1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) + currentDeployment, err := kcs.AppsV1().Deployments(value.Namespace).Get(value.Name, metav1.GetOptions{}) if err != nil { return false, err } // Find RS associated with deployment - newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.ExtensionsV1beta1()) + newReplicaSet, err := deploymentutil.GetNewReplicaSet(currentDeployment, kcs.AppsV1()) if err != nil || newReplicaSet == nil { return false, err } diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index b38230bab17..c9ddab3ab11 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -27,7 +27,7 @@ import ( "time" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/engine" diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 0c10cda3718..b835a976dcb 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -23,7 +23,7 @@ import ( "time" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/kube" diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index b3b1bc49d0a..122ab9dd416 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -32,7 +32,7 @@ import ( "google.golang.org/grpc/metadata" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/hooks" From 59a60a6e7c91f42ebb76e8257fbf013f12ba5a57 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 1 Aug 2018 15:45:34 -0700 Subject: [PATCH 155/483] docs(generated): regenerate markdown docs --- docs/helm/helm.md | 5 +++-- docs/helm/helm_completion.md | 12 +++++++++--- docs/helm/helm_create.md | 7 ++++--- docs/helm/helm_delete.md | 5 +++-- docs/helm/helm_dependency.md | 10 ++++++++-- docs/helm/helm_dependency_build.md | 5 +++-- docs/helm/helm_dependency_list.md | 10 ++++++++-- docs/helm/helm_dependency_update.md | 5 +++-- docs/helm/helm_fetch.md | 5 +++-- docs/helm/helm_get.md | 5 +++-- docs/helm/helm_get_hooks.md | 5 +++-- docs/helm/helm_get_manifest.md | 5 +++-- docs/helm/helm_get_values.md | 5 +++-- docs/helm/helm_history.md | 5 +++-- docs/helm/helm_home.md | 12 +++++++++--- docs/helm/helm_init.md | 7 ++++--- docs/helm/helm_inspect.md | 7 ++++--- docs/helm/helm_inspect_chart.md | 7 ++++--- docs/helm/helm_inspect_readme.md | 7 ++++--- docs/helm/helm_inspect_values.md | 7 ++++--- docs/helm/helm_install.md | 7 ++++--- docs/helm/helm_lint.md | 5 +++-- docs/helm/helm_list.md | 5 +++-- docs/helm/helm_package.md | 5 +++-- docs/helm/helm_plugin.md | 10 ++++++++-- docs/helm/helm_plugin_install.md | 7 ++++--- docs/helm/helm_plugin_list.md | 12 +++++++++--- docs/helm/helm_plugin_remove.md | 12 +++++++++--- docs/helm/helm_plugin_update.md | 12 +++++++++--- docs/helm/helm_repo.md | 10 ++++++++-- docs/helm/helm_repo_add.md | 5 +++-- docs/helm/helm_repo_index.md | 5 +++-- docs/helm/helm_repo_list.md | 10 ++++++++-- docs/helm/helm_repo_remove.md | 10 ++++++++-- docs/helm/helm_repo_update.md | 12 +++++++++--- docs/helm/helm_reset.md | 7 ++++--- docs/helm/helm_rollback.md | 5 +++-- docs/helm/helm_search.md | 7 ++++--- docs/helm/helm_serve.md | 7 ++++--- docs/helm/helm_status.md | 5 +++-- docs/helm/helm_template.md | 5 +++-- docs/helm/helm_test.md | 7 ++++--- docs/helm/helm_upgrade.md | 7 ++++--- docs/helm/helm_verify.md | 5 +++-- docs/helm/helm_version.md | 7 ++++--- 45 files changed, 215 insertions(+), 110 deletions(-) diff --git a/docs/helm/helm.md b/docs/helm/helm.md index ae27de40112..67ac9a4a270 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -4,7 +4,6 @@ The Helm package manager for Kubernetes. ### Synopsis - The Kubernetes package manager To begin working with Helm, run the 'helm init' command: @@ -33,6 +32,7 @@ Environment: ``` --debug enable verbose output + -h, --help help for helm --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") --host string address of Tiller. Overrides $HELM_HOST --kube-context string name of the kubeconfig context to use @@ -42,6 +42,7 @@ Environment: ``` ### SEE ALSO + * [helm completion](helm_completion.md) - Generate autocompletions script for the specified shell (bash or zsh) * [helm create](helm_create.md) - create a new chart with the given name * [helm delete](helm_delete.md) - given a release name, delete the release from Kubernetes @@ -69,4 +70,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_completion.md b/docs/helm/helm_completion.md index 64a6056f829..4403930763d 100644 --- a/docs/helm/helm_completion.md +++ b/docs/helm/helm_completion.md @@ -5,7 +5,6 @@ Generate autocompletions script for the specified shell (bash or zsh) ### Synopsis - Generate autocompletions script for Helm for the specified shell (bash or zsh). This command can generate shell autocompletions. e.g. @@ -18,7 +17,13 @@ Can be sourced as such ``` -helm completion SHELL +helm completion SHELL [flags] +``` + +### Options + +``` + -h, --help help for completion ``` ### Options inherited from parent commands @@ -34,6 +39,7 @@ helm completion SHELL ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_create.md b/docs/helm/helm_create.md index 7ae947ed724..0e20d9860f2 100644 --- a/docs/helm/helm_create.md +++ b/docs/helm/helm_create.md @@ -5,7 +5,6 @@ create a new chart with the given name ### Synopsis - This command creates a chart directory along with the common files and directories used in a chart. @@ -31,12 +30,13 @@ will be overwritten, but other files will be left alone. ``` -helm create NAME +helm create NAME [flags] ``` ### Options ``` + -h, --help help for create -p, --starter string the named Helm starter scaffold ``` @@ -53,6 +53,7 @@ helm create NAME ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_delete.md b/docs/helm/helm_delete.md index 442e5e96c10..3c6a4684446 100644 --- a/docs/helm/helm_delete.md +++ b/docs/helm/helm_delete.md @@ -5,7 +5,6 @@ given a release name, delete the release from Kubernetes ### Synopsis - This command takes a release name, and then deletes the release from Kubernetes. It removes all of the resources associated with the last release of the chart. @@ -22,6 +21,7 @@ helm delete [flags] RELEASE_NAME [...] ``` --description string specify a description for the release --dry-run simulate a delete + -h, --help help for delete --no-hooks prevent hooks from running during deletion --purge remove the release from the store and make its name free for later use --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) @@ -46,6 +46,7 @@ helm delete [flags] RELEASE_NAME [...] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_dependency.md b/docs/helm/helm_dependency.md index b0085c6c738..317860bdba0 100644 --- a/docs/helm/helm_dependency.md +++ b/docs/helm/helm_dependency.md @@ -5,7 +5,6 @@ manage a chart's dependencies ### Synopsis - Manage the dependencies of a chart. Helm charts store their dependencies in 'charts/'. For chart developers, it is @@ -54,6 +53,12 @@ repository added to helm by "helm add repo". Version matching is also supported for this case. +### Options + +``` + -h, --help help for dependency +``` + ### Options inherited from parent commands ``` @@ -67,9 +72,10 @@ for this case. ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm dependency build](helm_dependency_build.md) - rebuild the charts/ directory based on the requirements.lock file * [helm dependency list](helm_dependency_list.md) - list the dependencies for the given chart * [helm dependency update](helm_dependency_update.md) - update charts/ based on the contents of requirements.yaml -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_dependency_build.md b/docs/helm/helm_dependency_build.md index eea2fa02c5b..fba70f2ec76 100644 --- a/docs/helm/helm_dependency_build.md +++ b/docs/helm/helm_dependency_build.md @@ -5,7 +5,6 @@ rebuild the charts/ directory based on the requirements.lock file ### Synopsis - Build out the charts/ directory from the requirements.lock file. Build is used to reconstruct a chart's dependencies to the state specified in @@ -23,6 +22,7 @@ helm dependency build [flags] CHART ### Options ``` + -h, --help help for build --keyring string keyring containing public keys (default "~/.gnupg/pubring.gpg") --verify verify the packages against signatures ``` @@ -40,6 +40,7 @@ helm dependency build [flags] CHART ``` ### SEE ALSO + * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_dependency_list.md b/docs/helm/helm_dependency_list.md index d6bc0175a4c..da754c5d1e0 100644 --- a/docs/helm/helm_dependency_list.md +++ b/docs/helm/helm_dependency_list.md @@ -5,7 +5,6 @@ list the dependencies for the given chart ### Synopsis - List all of the dependencies declared in a chart. This can take chart archives and chart directories as input. It will not alter @@ -19,6 +18,12 @@ if it cannot find a requirements.yaml. helm dependency list [flags] CHART ``` +### Options + +``` + -h, --help help for list +``` + ### Options inherited from parent commands ``` @@ -32,6 +37,7 @@ helm dependency list [flags] CHART ``` ### SEE ALSO + * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_dependency_update.md b/docs/helm/helm_dependency_update.md index 90b81ecea25..88bf3fafd12 100644 --- a/docs/helm/helm_dependency_update.md +++ b/docs/helm/helm_dependency_update.md @@ -5,7 +5,6 @@ update charts/ based on the contents of requirements.yaml ### Synopsis - Update the on-disk dependencies to mirror the requirements.yaml file. This command verifies that the required charts, as expressed in 'requirements.yaml', @@ -27,6 +26,7 @@ helm dependency update [flags] CHART ### Options ``` + -h, --help help for update --keyring string keyring containing public keys (default "~/.gnupg/pubring.gpg") --skip-refresh do not refresh the local repository cache --verify verify the packages against signatures @@ -45,6 +45,7 @@ helm dependency update [flags] CHART ``` ### SEE ALSO + * [helm dependency](helm_dependency.md) - manage a chart's dependencies -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_fetch.md b/docs/helm/helm_fetch.md index c347d162059..81c0a95961a 100644 --- a/docs/helm/helm_fetch.md +++ b/docs/helm/helm_fetch.md @@ -5,7 +5,6 @@ download a chart from a repository and (optionally) unpack it in local directory ### Synopsis - Retrieve a package from a package repository, and download it locally. This is useful for fetching packages to inspect, modify, or repackage. It can @@ -31,6 +30,7 @@ helm fetch [flags] [chart URL | repo/chartname] [...] --cert-file string identify HTTPS client using this SSL certificate file -d, --destination string location to write the chart. If this and tardir are specified, tardir is appended to this (default ".") --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. + -h, --help help for fetch --key-file string identify HTTPS client using this SSL key file --keyring string keyring containing public keys (default "~/.gnupg/pubring.gpg") --password string chart repository password @@ -56,6 +56,7 @@ helm fetch [flags] [chart URL | repo/chartname] [...] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index 3a1b3d44215..e7337b533f1 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -5,7 +5,6 @@ download a named release ### Synopsis - This command shows the details of a named release. It can be used to get extended information about the release, including: @@ -25,6 +24,7 @@ helm get [flags] RELEASE_NAME ### Options ``` + -h, --help help for get --revision int32 get the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -47,9 +47,10 @@ helm get [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm get hooks](helm_get_hooks.md) - download all hooks for a named release * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release * [helm get values](helm_get_values.md) - download the values file for a named release -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_get_hooks.md b/docs/helm/helm_get_hooks.md index 9f3d5b0b26a..d7097fd599b 100644 --- a/docs/helm/helm_get_hooks.md +++ b/docs/helm/helm_get_hooks.md @@ -5,7 +5,6 @@ download all hooks for a named release ### Synopsis - This command downloads hooks for a given release. Hooks are formatted in YAML and separated by the YAML '---\n' separator. @@ -18,6 +17,7 @@ helm get hooks [flags] RELEASE_NAME ### Options ``` + -h, --help help for hooks --revision int32 get the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -40,6 +40,7 @@ helm get hooks [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_get_manifest.md b/docs/helm/helm_get_manifest.md index 6cae9001f19..60bfeac0b47 100644 --- a/docs/helm/helm_get_manifest.md +++ b/docs/helm/helm_get_manifest.md @@ -5,7 +5,6 @@ download the manifest for a named release ### Synopsis - This command fetches the generated manifest for a given release. A manifest is a YAML-encoded representation of the Kubernetes resources that @@ -20,6 +19,7 @@ helm get manifest [flags] RELEASE_NAME ### Options ``` + -h, --help help for manifest --revision int32 get the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -42,6 +42,7 @@ helm get manifest [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_get_values.md b/docs/helm/helm_get_values.md index 01fee2cd214..7208d588519 100644 --- a/docs/helm/helm_get_values.md +++ b/docs/helm/helm_get_values.md @@ -5,7 +5,6 @@ download the values file for a named release ### Synopsis - This command downloads a values file for a given release. @@ -17,6 +16,7 @@ helm get values [flags] RELEASE_NAME ``` -a, --all dump all (computed) values + -h, --help help for values --revision int32 get the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -39,6 +39,7 @@ helm get values [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_history.md b/docs/helm/helm_history.md index e5028f9cbe9..7f0a68928ad 100755 --- a/docs/helm/helm_history.md +++ b/docs/helm/helm_history.md @@ -5,7 +5,6 @@ fetch release history ### Synopsis - History prints historical revisions for a given release. A default maximum of 256 revisions will be returned. Setting '--max' @@ -29,6 +28,7 @@ helm history [flags] RELEASE_NAME ``` --col-width uint specifies the max column width of output (default 60) + -h, --help help for history --max int32 maximum number of revision to include in history (default 256) -o, --output string prints the output in the specified format (json|table|yaml) (default "table") --tls enable TLS for request @@ -52,6 +52,7 @@ helm history [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_home.md b/docs/helm/helm_home.md index 9af12c91a3c..19230242400 100644 --- a/docs/helm/helm_home.md +++ b/docs/helm/helm_home.md @@ -5,13 +5,18 @@ displays the location of HELM_HOME ### Synopsis - This command displays the location of HELM_HOME. This is where any helm configuration files live. ``` -helm home +helm home [flags] +``` + +### Options + +``` + -h, --help help for home ``` ### Options inherited from parent commands @@ -27,6 +32,7 @@ helm home ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_init.md b/docs/helm/helm_init.md index ec775520a1f..430cc3d0e88 100644 --- a/docs/helm/helm_init.md +++ b/docs/helm/helm_init.md @@ -5,7 +5,6 @@ initialize Helm on both client and server ### Synopsis - This command installs Tiller (the Helm server-side component) onto your Kubernetes Cluster and sets up local configuration in $HELM_HOME (default ~/.helm/). @@ -27,7 +26,7 @@ To dump a manifest containing the Tiller deployment YAML, combine the ``` -helm init +helm init [flags] ``` ### Options @@ -37,6 +36,7 @@ helm init -c, --client-only if set does not install Tiller --dry-run do not install local or remote --force-upgrade force upgrade of Tiller to the current helm version + -h, --help help for init --history-max int limit the maximum number of revisions saved per release. Use 0 for no limit. --local-repo-url string URL for local repository (default "http://127.0.0.1:8879/charts") --net-host install Tiller with net=host @@ -70,6 +70,7 @@ helm init ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_inspect.md b/docs/helm/helm_inspect.md index 4bc904f63d1..86689eeaa18 100644 --- a/docs/helm/helm_inspect.md +++ b/docs/helm/helm_inspect.md @@ -5,7 +5,6 @@ inspect a chart ### Synopsis - This command inspects a chart and displays information. It takes a chart reference ('stable/drupal'), a full path to a directory or packaged chart, or a URL. @@ -13,7 +12,7 @@ Inspect prints the contents of the Chart.yaml file and the values.yaml file. ``` -helm inspect [CHART] +helm inspect [CHART] [flags] ``` ### Options @@ -21,6 +20,7 @@ helm inspect [CHART] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + -h, --help help for inspect --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") --password string chart repository password where to locate the requested chart @@ -43,9 +43,10 @@ helm inspect [CHART] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm inspect chart](helm_inspect_chart.md) - shows inspect chart * [helm inspect readme](helm_inspect_readme.md) - shows inspect readme * [helm inspect values](helm_inspect_values.md) - shows inspect values -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_inspect_chart.md b/docs/helm/helm_inspect_chart.md index 257f26051bb..2b9adbb7ee8 100644 --- a/docs/helm/helm_inspect_chart.md +++ b/docs/helm/helm_inspect_chart.md @@ -5,13 +5,12 @@ shows inspect chart ### Synopsis - This command inspects a chart (directory, file, or URL) and displays the contents of the Charts.yaml file ``` -helm inspect chart [CHART] +helm inspect chart [CHART] [flags] ``` ### Options @@ -19,6 +18,7 @@ helm inspect chart [CHART] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + -h, --help help for chart --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") --password string chart repository password where to locate the requested chart @@ -41,6 +41,7 @@ helm inspect chart [CHART] ``` ### SEE ALSO + * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_inspect_readme.md b/docs/helm/helm_inspect_readme.md index 8ff7d892e4c..d222cd53a8e 100644 --- a/docs/helm/helm_inspect_readme.md +++ b/docs/helm/helm_inspect_readme.md @@ -5,13 +5,12 @@ shows inspect readme ### Synopsis - This command inspects a chart (directory, file, or URL) and displays the contents of the README file ``` -helm inspect readme [CHART] +helm inspect readme [CHART] [flags] ``` ### Options @@ -19,6 +18,7 @@ helm inspect readme [CHART] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + -h, --help help for readme --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") --repo string chart repository url where to locate the requested chart @@ -39,6 +39,7 @@ helm inspect readme [CHART] ``` ### SEE ALSO + * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_inspect_values.md b/docs/helm/helm_inspect_values.md index 50ff6ac244b..9cca2fc3202 100644 --- a/docs/helm/helm_inspect_values.md +++ b/docs/helm/helm_inspect_values.md @@ -5,13 +5,12 @@ shows inspect values ### Synopsis - This command inspects a chart (directory, file, or URL) and displays the contents of the values.yaml file ``` -helm inspect values [CHART] +helm inspect values [CHART] [flags] ``` ### Options @@ -19,6 +18,7 @@ helm inspect values [CHART] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + -h, --help help for values --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") --password string chart repository password where to locate the requested chart @@ -41,6 +41,7 @@ helm inspect values [CHART] ``` ### SEE ALSO + * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 6e0948e8f9b..05cdf1e4a41 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -5,7 +5,6 @@ install a chart archive ### Synopsis - This command installs a chart archive. The install argument must be a chart reference, a path to a packaged chart, @@ -73,7 +72,7 @@ charts in a repository, use 'helm search'. ``` -helm install [CHART] +helm install [CHART] [flags] ``` ### Options @@ -85,6 +84,7 @@ helm install [CHART] --description string specify a description for the release --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. --dry-run simulate an install + -h, --help help for install --key-file string identify HTTPS client using this SSL key file --keyring string location of public keys used for verification (default "~/.gnupg/pubring.gpg") -n, --name string release name. If unspecified, it will autogenerate one for you @@ -125,6 +125,7 @@ helm install [CHART] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_lint.md b/docs/helm/helm_lint.md index 9c328a08626..bf168184ee9 100644 --- a/docs/helm/helm_lint.md +++ b/docs/helm/helm_lint.md @@ -5,7 +5,6 @@ examines a chart for possible issues ### Synopsis - This command takes a path to a chart and runs a series of tests to verify that the chart is well-formed. @@ -21,6 +20,7 @@ helm lint [flags] PATH ### Options ``` + -h, --help help for lint --namespace string namespace to put the release into (default "default") --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) @@ -42,6 +42,7 @@ helm lint [flags] PATH ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 25-Jul-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_list.md b/docs/helm/helm_list.md index 17b2573b8db..bf740239d71 100755 --- a/docs/helm/helm_list.md +++ b/docs/helm/helm_list.md @@ -5,7 +5,6 @@ list releases ### Synopsis - This command lists all of the releases. By default, it lists only releases that are deployed or failed. Flags like @@ -46,6 +45,7 @@ helm list [flags] [FILTER] --deleting show releases that are currently being deleted --deployed show deployed releases. If no other is specified, this will be automatically enabled --failed show failed releases + -h, --help help for list -m, --max int maximum number of releases to fetch (default 256) --namespace string show releases within a specific namespace -o, --offset string next release name in the list, used to offset from start value @@ -74,6 +74,7 @@ helm list [flags] [FILTER] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_package.md b/docs/helm/helm_package.md index 30d06fcf05e..b772fa70cc7 100644 --- a/docs/helm/helm_package.md +++ b/docs/helm/helm_package.md @@ -5,7 +5,6 @@ package a chart directory into a chart archive ### Synopsis - This command packages a chart into a versioned chart archive file. If a path is given, this will look at that path for a chart (which must contain a Chart.yaml file) and then package that directory. @@ -26,6 +25,7 @@ helm package [flags] [CHART_PATH] [...] --app-version string set the appVersion on the chart to this version -u, --dependency-update update dependencies from "requirements.yaml" to dir "charts/" before packaging -d, --destination string location to write the chart. (default ".") + -h, --help help for package --key string name of the key to use when signing. Used if --sign is true --keyring string location of a public keyring (default "~/.gnupg/pubring.gpg") --save save packaged chart to local chart repository (default true) @@ -46,6 +46,7 @@ helm package [flags] [CHART_PATH] [...] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_plugin.md b/docs/helm/helm_plugin.md index bb0498d8782..5aa57b69cf7 100644 --- a/docs/helm/helm_plugin.md +++ b/docs/helm/helm_plugin.md @@ -5,10 +5,15 @@ add, list, or remove Helm plugins ### Synopsis - Manage client-side Helm plugins. +### Options + +``` + -h, --help help for plugin +``` + ### Options inherited from parent commands ``` @@ -22,10 +27,11 @@ Manage client-side Helm plugins. ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm plugin install](helm_plugin_install.md) - install one or more Helm plugins * [helm plugin list](helm_plugin_list.md) - list installed Helm plugins * [helm plugin remove](helm_plugin_remove.md) - remove one or more Helm plugins * [helm plugin update](helm_plugin_update.md) - update one or more Helm plugins -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_plugin_install.md b/docs/helm/helm_plugin_install.md index ab45850bf2a..f30bfff551e 100644 --- a/docs/helm/helm_plugin_install.md +++ b/docs/helm/helm_plugin_install.md @@ -5,7 +5,6 @@ install one or more Helm plugins ### Synopsis - This command allows you to install a plugin from a url to a VCS repo or a local path. Example usage: @@ -13,12 +12,13 @@ Example usage: ``` -helm plugin install [options] ... +helm plugin install [options] ... [flags] ``` ### Options ``` + -h, --help help for install --version string specify a version constraint. If this is not specified, the latest version is installed ``` @@ -35,6 +35,7 @@ helm plugin install [options] ... ``` ### SEE ALSO + * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_plugin_list.md b/docs/helm/helm_plugin_list.md index dc13cdf7af9..373462e2b1d 100644 --- a/docs/helm/helm_plugin_list.md +++ b/docs/helm/helm_plugin_list.md @@ -4,11 +4,16 @@ list installed Helm plugins ### Synopsis - list installed Helm plugins ``` -helm plugin list +helm plugin list [flags] +``` + +### Options + +``` + -h, --help help for list ``` ### Options inherited from parent commands @@ -24,6 +29,7 @@ helm plugin list ``` ### SEE ALSO + * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_plugin_remove.md b/docs/helm/helm_plugin_remove.md index 2ef833217d2..30f222c9fa9 100644 --- a/docs/helm/helm_plugin_remove.md +++ b/docs/helm/helm_plugin_remove.md @@ -4,11 +4,16 @@ remove one or more Helm plugins ### Synopsis - remove one or more Helm plugins ``` -helm plugin remove ... +helm plugin remove ... [flags] +``` + +### Options + +``` + -h, --help help for remove ``` ### Options inherited from parent commands @@ -24,6 +29,7 @@ helm plugin remove ... ``` ### SEE ALSO + * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_plugin_update.md b/docs/helm/helm_plugin_update.md index 93bc3e76450..65b16cd9dc1 100644 --- a/docs/helm/helm_plugin_update.md +++ b/docs/helm/helm_plugin_update.md @@ -4,11 +4,16 @@ update one or more Helm plugins ### Synopsis - update one or more Helm plugins ``` -helm plugin update ... +helm plugin update ... [flags] +``` + +### Options + +``` + -h, --help help for update ``` ### Options inherited from parent commands @@ -24,6 +29,7 @@ helm plugin update ... ``` ### SEE ALSO + * [helm plugin](helm_plugin.md) - add, list, or remove Helm plugins -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo.md b/docs/helm/helm_repo.md index 32e9d02b256..0b73fbcd0b3 100644 --- a/docs/helm/helm_repo.md +++ b/docs/helm/helm_repo.md @@ -5,7 +5,6 @@ add, list, remove, update, and index chart repositories ### Synopsis - This command consists of multiple subcommands to interact with chart repositories. It can be used to add, remove, list, and index chart repositories. @@ -13,6 +12,12 @@ Example usage: $ helm repo add [NAME] [REPO_URL] +### Options + +``` + -h, --help help for repo +``` + ### Options inherited from parent commands ``` @@ -26,6 +31,7 @@ Example usage: ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm repo add](helm_repo_add.md) - add a chart repository * [helm repo index](helm_repo_index.md) - generate an index file given a directory containing packaged charts @@ -33,4 +39,4 @@ Example usage: * [helm repo remove](helm_repo_remove.md) - remove a chart repository * [helm repo update](helm_repo_update.md) - update information of available charts locally from chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo_add.md b/docs/helm/helm_repo_add.md index 1deb0cb5cc3..29947147d8a 100644 --- a/docs/helm/helm_repo_add.md +++ b/docs/helm/helm_repo_add.md @@ -4,7 +4,6 @@ add a chart repository ### Synopsis - add a chart repository ``` @@ -16,6 +15,7 @@ helm repo add [flags] [NAME] [URL] ``` --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file + -h, --help help for add --key-file string identify HTTPS client using this SSL key file --no-update raise error if repo is already registered --password string chart repository password @@ -35,6 +35,7 @@ helm repo add [flags] [NAME] [URL] ``` ### SEE ALSO + * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo_index.md b/docs/helm/helm_repo_index.md index baa1291de49..4660489f9b9 100644 --- a/docs/helm/helm_repo_index.md +++ b/docs/helm/helm_repo_index.md @@ -5,7 +5,6 @@ generate an index file given a directory containing packaged charts ### Synopsis - Read the current directory and generate an index file based on the charts found. This tool is used for creating an 'index.yaml' file for a chart repository. To @@ -23,6 +22,7 @@ helm repo index [flags] [DIR] ### Options ``` + -h, --help help for index --merge string merge the generated index into the given index --url string url of chart repository ``` @@ -40,6 +40,7 @@ helm repo index [flags] [DIR] ``` ### SEE ALSO + * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo_list.md b/docs/helm/helm_repo_list.md index 00221ed248c..bebaa633319 100644 --- a/docs/helm/helm_repo_list.md +++ b/docs/helm/helm_repo_list.md @@ -4,13 +4,18 @@ list chart repositories ### Synopsis - list chart repositories ``` helm repo list [flags] ``` +### Options + +``` + -h, --help help for list +``` + ### Options inherited from parent commands ``` @@ -24,6 +29,7 @@ helm repo list [flags] ``` ### SEE ALSO + * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo_remove.md b/docs/helm/helm_repo_remove.md index 272ecea47f1..89f43a13024 100644 --- a/docs/helm/helm_repo_remove.md +++ b/docs/helm/helm_repo_remove.md @@ -4,13 +4,18 @@ remove a chart repository ### Synopsis - remove a chart repository ``` helm repo remove [flags] [NAME] ``` +### Options + +``` + -h, --help help for remove +``` + ### Options inherited from parent commands ``` @@ -24,6 +29,7 @@ helm repo remove [flags] [NAME] ``` ### SEE ALSO + * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_repo_update.md b/docs/helm/helm_repo_update.md index f0215da487b..0d14f63edd5 100644 --- a/docs/helm/helm_repo_update.md +++ b/docs/helm/helm_repo_update.md @@ -5,7 +5,6 @@ update information of available charts locally from chart repositories ### Synopsis - Update gets the latest information about charts from the respective chart repositories. Information is cached locally, where it is used by commands like 'helm search'. @@ -14,7 +13,13 @@ future releases. ``` -helm repo update +helm repo update [flags] +``` + +### Options + +``` + -h, --help help for update ``` ### Options inherited from parent commands @@ -30,6 +35,7 @@ helm repo update ``` ### SEE ALSO + * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_reset.md b/docs/helm/helm_reset.md index 74d5ecc0e95..772ac42c37e 100644 --- a/docs/helm/helm_reset.md +++ b/docs/helm/helm_reset.md @@ -5,20 +5,20 @@ uninstalls Tiller from a cluster ### Synopsis - This command uninstalls Tiller (the Helm server-side component) from your Kubernetes Cluster and optionally deletes local configuration in $HELM_HOME (default ~/.helm/) ``` -helm reset +helm reset [flags] ``` ### Options ``` -f, --force forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.) + -h, --help help for reset --remove-helm-home if set deletes $HELM_HOME --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -41,6 +41,7 @@ helm reset ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index 40d3ad83b3b..5862b180aae 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -5,7 +5,6 @@ roll back a release to a previous revision ### Synopsis - This command rolls back a release to a previous revision. The first argument of the rollback command is the name of a release, and the @@ -23,6 +22,7 @@ helm rollback [flags] [RELEASE] [REVISION] --description string specify a description for the release --dry-run simulate a rollback --force force resource update through delete/recreate if needed + -h, --help help for rollback --no-hooks prevent hooks from running during rollback --recreate-pods performs pods restart for the resource if applicable --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) @@ -48,6 +48,7 @@ helm rollback [flags] [RELEASE] [REVISION] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_search.md b/docs/helm/helm_search.md index ffee22ce4bd..c45a397e3f3 100644 --- a/docs/helm/helm_search.md +++ b/docs/helm/helm_search.md @@ -5,7 +5,6 @@ search for a keyword in charts ### Synopsis - Search reads through all of the repositories configured on the system, and looks for matches. @@ -13,13 +12,14 @@ Repositories are managed with 'helm repo' commands. ``` -helm search [keyword] +helm search [keyword] [flags] ``` ### Options ``` --col-width uint specifies the max column width of output (default 60) + -h, --help help for search -r, --regexp use regular expressions for searching -v, --version string search using semantic versioning constraints -l, --versions show the long listing, with each version of each chart on its own line @@ -38,6 +38,7 @@ helm search [keyword] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_serve.md b/docs/helm/helm_serve.md index e300ee63304..5e25f2a2f23 100644 --- a/docs/helm/helm_serve.md +++ b/docs/helm/helm_serve.md @@ -5,7 +5,6 @@ start a local http web server ### Synopsis - This command starts a local chart repository server that serves charts from a local directory. The new server will provide HTTP access to a repository. By default, it will @@ -21,13 +20,14 @@ for more information on hosting chart repositories in a production setting. ``` -helm serve +helm serve [flags] ``` ### Options ``` --address string address to listen on (default "127.0.0.1:8879") + -h, --help help for serve --repo-path string local directory path from which to serve charts --url string external URL of chart repository ``` @@ -45,6 +45,7 @@ helm serve ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 22b47c85156..9dca005fd6b 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -5,7 +5,6 @@ displays the status of the named release ### Synopsis - This command shows the status of a named release. The status consists of: - last deployment time @@ -23,6 +22,7 @@ helm status [flags] RELEASE_NAME ### Options ``` + -h, --help help for status -o, --output string output the status in the specified format (json or yaml) --revision int32 if set, display the status of the named release with revision --tls enable TLS for request @@ -46,6 +46,7 @@ helm status [flags] RELEASE_NAME ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index f456f74beda..d7770fb7f59 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -5,7 +5,6 @@ locally render templates ### Synopsis - Render chart templates locally and display the output. This does not require Tiller. However, any values that would normally be @@ -26,6 +25,7 @@ helm template [flags] CHART ``` -x, --execute stringArray only execute the given templates + -h, --help help for template --is-upgrade set .Release.IsUpgrade instead of .Release.IsInstall --kube-version string kubernetes version used as Capabilities.KubeVersion.Major/Minor (default "1.9") -n, --name string release name (default "RELEASE-NAME") @@ -52,6 +52,7 @@ helm template [flags] CHART ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jul-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_test.md b/docs/helm/helm_test.md index 5a84c3b1895..e55c5df6860 100644 --- a/docs/helm/helm_test.md +++ b/docs/helm/helm_test.md @@ -5,7 +5,6 @@ test a release ### Synopsis - The test command runs the tests for a release. The argument this command takes is the name of a deployed release. @@ -13,13 +12,14 @@ The tests to be run are defined in the chart that was installed. ``` -helm test [RELEASE] +helm test [RELEASE] [flags] ``` ### Options ``` --cleanup delete test pods upon completion + -h, --help help for test --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -42,6 +42,7 @@ helm test [RELEASE] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index 67907023304..522464c6b31 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -5,7 +5,6 @@ upgrade a release ### Synopsis - This command upgrades a release to a new version of a chart. The upgrade arguments must be a release and chart. The chart @@ -33,7 +32,7 @@ set for a key called 'foo', the 'newbar' value would take precedence: ``` -helm upgrade [RELEASE] [CHART] +helm upgrade [RELEASE] [CHART] [flags] ``` ### Options @@ -45,6 +44,7 @@ helm upgrade [RELEASE] [CHART] --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. --dry-run simulate an upgrade --force force resource update through delete/recreate if needed + -h, --help help for upgrade -i, --install if a release by this name doesn't already exist, run an install --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring that contains public signing keys (default "~/.gnupg/pubring.gpg") @@ -85,6 +85,7 @@ helm upgrade [RELEASE] [CHART] ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 diff --git a/docs/helm/helm_verify.md b/docs/helm/helm_verify.md index 866b3fbd808..30ed436790d 100644 --- a/docs/helm/helm_verify.md +++ b/docs/helm/helm_verify.md @@ -5,7 +5,6 @@ verify that a chart at the given path has been signed and is valid ### Synopsis - Verify that the given chart has a valid provenance file. Provenance files provide crytographic verification that a chart has not been @@ -23,6 +22,7 @@ helm verify [flags] PATH ### Options ``` + -h, --help help for verify --keyring string keyring containing public keys (default "~/.gnupg/pubring.gpg") ``` @@ -39,6 +39,7 @@ helm verify [flags] PATH ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Jun-2018 +###### Auto generated by spf13/cobra on 1-Aug-2018 diff --git a/docs/helm/helm_version.md b/docs/helm/helm_version.md index 3db529120dc..33d33cf12b5 100644 --- a/docs/helm/helm_version.md +++ b/docs/helm/helm_version.md @@ -5,7 +5,6 @@ print the client/server version information ### Synopsis - Show the client and server versions for Helm and tiller. This will print a representation of the client and server versions of Helm and @@ -24,13 +23,14 @@ use '--server'. ``` -helm version +helm version [flags] ``` ### Options ``` -c, --client client version only + -h, --help help for version -s, --server server version only --short print the version number --template string template for version string format @@ -55,6 +55,7 @@ helm version ``` ### SEE ALSO + * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 7-Aug-2018 +###### Auto generated by spf13/cobra on 10-Aug-2018 From c658639ccc96645286beb119ce2baa31c9512235 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 10 Aug 2018 11:57:57 +0100 Subject: [PATCH 156/483] Add link to doc for Helm Stop plugin Link added to https://github.com/helm/helm/blob/master/docs/related.md#helm-plugins --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index bac9e899bfb..ca5fbf11722 100644 --- a/docs/related.md +++ b/docs/related.md @@ -45,6 +45,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp - [helm-hashtag](https://github.com/balboah/helm-hashtag) - Plugin for tracking docker tag hash digests as values - [helm-unittest](https://github.com/lrills/helm-unittest) - Plugin for unit testing chart locally with YAML +- [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods We also encourage GitHub authors to use the [helm-plugin](https://github.com/search?q=topic%3Ahelm-plugin&type=Repositories) tag on their plugin repositories. From e8b003af9a4fd1f0dc9d3b4a3eae2fca422a2226 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Fri, 10 Aug 2018 15:26:53 -0600 Subject: [PATCH 157/483] docs(alpine): quote release label value (#4460) Labels should be quoted so that values such as "true" or "1" are not interpolated to the wrong type. --- docs/examples/alpine/templates/alpine-pod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml index da9caef781b..41673d0fc6d 100644 --- a/docs/examples/alpine/templates/alpine-pod.yaml +++ b/docs/examples/alpine/templates/alpine-pod.yaml @@ -9,7 +9,7 @@ metadata: heritage: {{ .Release.Service }} # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. - release: {{ .Release.Name }} + release: {{ .Release.Name | quote }} # This makes it easy to audit chart usage. chart: {{ .Chart.Name }}-{{ .Chart.Version }} app: {{ template "alpine.name" . }} From 8f7c0079fe86319c7bca00624e39f49b3e67e2cd Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 13 Aug 2018 09:26:40 -0700 Subject: [PATCH 158/483] sort links alphabetically --- docs/related.md | 75 +++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/docs/related.md b/docs/related.md index ca5fbf11722..ecd86f7e242 100644 --- a/docs/related.md +++ b/docs/related.md @@ -6,46 +6,47 @@ add to this list, please open an [issue](https://github.com/kubernetes/helm/issu or [pull request](https://github.com/kubernetes/helm/pulls). ## Article, Blogs, How-Tos, and Extra Documentation -- [Using Helm to Deploy to Kubernetes](https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/) -- [Honestbee's Helm Chart Conventions](https://gist.github.com/so0k/f927a4b60003cedd101a0911757c605a) + +- [Awesome Helm](https://github.com/cdwv/awesome-helm) - List of awesome Helm resources +- [CI/CD with Kubernetes, Helm & Wercker ](http://www.slideshare.net/Diacode/cicd-with-kubernetes-helm-wercker-madscalability) +- [Creating a Helm Plugin in 3 Steps](http://technosophos.com/2017/03/21/creating-a-helm-plugin.html) - [Deploying Kubernetes Applications with Helm](http://cloudacademy.com/blog/deploying-kubernetes-applications-with-helm/) +- [GitLab, Consumer Driven Contracts, Helm and Kubernetes](https://medium.com/@enxebre/gitlab-consumer-driven-contracts-helm-and-kubernetes-b7235a60a1cb#.xwp1y4tgi) +- [Honestbee's Helm Chart Conventions](https://gist.github.com/so0k/f927a4b60003cedd101a0911757c605a) - [Releasing backward-incompatible changes: Kubernetes, Jenkins, Prometheus Operator, Helm and Traefik](https://medium.com/@enxebre/releasing-backward-incompatible-changes-kubernetes-jenkins-plugin-prometheus-operator-helm-self-6263ca61a1b1#.e0c7elxhq) -- [CI/CD with Kubernetes, Helm & Wercker ](http://www.slideshare.net/Diacode/cicd-with-kubernetes-helm-wercker-madscalability) -- [The missing CI/CD Kubernetes component: Helm package manager](https://hackernoon.com/the-missing-ci-cd-kubernetes-component-helm-package-manager-1fe002aac680#.691sk2zhu) +- [The Missing CI/CD Kubernetes Component: Helm package manager](https://hackernoon.com/the-missing-ci-cd-kubernetes-component-helm-package-manager-1fe002aac680#.691sk2zhu) - [The Workflow "Umbrella" Helm Chart](https://deis.com/blog/2017/workflow-chart-assembly) -- [GitLab, Consumer Driven Contracts, Helm and Kubernetes](https://medium.com/@enxebre/gitlab-consumer-driven-contracts-helm-and-kubernetes-b7235a60a1cb#.xwp1y4tgi) +- [Using Helm to Deploy to Kubernetes](https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/) - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) -- [Creating a Helm Plugin in 3 Steps](http://technosophos.com/2017/03/21/creating-a-helm-plugin.html) -- [Awesome Helm](https://github.com/cdwv/awesome-helm) - List of awesome Helm resources ## Video, Audio, and Podcast - [CI/CD with Jenkins, Kubernetes, and Helm](https://www.youtube.com/watch?v=NVoln4HdZOY): AKA "The Infamous Croc Hunter Video". -- [KubeCon2016: Delivering Kubernetes-Native Applications by Michelle Noorali](https://www.youtube.com/watch?v=zBc1goRfk3k&index=49&list=PLj6h78yzYM2PqgIGU1Qmi8nY7dqn9PCr4) - [Helm with Michelle Noorali and Matthew Butcher](https://gcppodcast.com/post/episode-50-helm-with-michelle-noorali-and-matthew-butcher/): The official Google CloudPlatform Podcast interviews Michelle and Matt about Helm. +- [KubeCon2016: Delivering Kubernetes-Native Applications by Michelle Noorali](https://www.youtube.com/watch?v=zBc1goRfk3k&index=49&list=PLj6h78yzYM2PqgIGU1Qmi8nY7dqn9PCr4) ## Helm Plugins -- [helm-tiller](https://github.com/adamreese/helm-tiller) - Additional commands to work with Tiller -- [Technosophos's Helm Plugins](https://github.com/technosophos/helm-plugins) - Plugins for GitHub, Keybase, and GPG -- [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side -- [Helm Value Store](https://github.com/skuid/helm-value-store) - Plugin for working with Helm deployment values -- [Helm Diff](https://github.com/databus23/helm-diff) - Preview `helm upgrade` as a coloured diff -- [helm-env](https://github.com/adamreese/helm-env) - Plugin to show current environment -- [helm-last](https://github.com/adamreese/helm-last) - Plugin to show the latest release -- [helm-nuke](https://github.com/adamreese/helm-nuke) - Plugin to destroy all releases -- [helm-local](https://github.com/adamreese/helm-local) - Plugin to run Tiller as a local daemon - [App Registry](https://github.com/app-registry/helm-plugin) - Plugin to manage charts via the [App Registry specification](https://github.com/app-registry/spec) -- [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely +- [Helm Diff](https://github.com/databus23/helm-diff) - Preview `helm upgrade` as a coloured diff +- [Helm Value Store](https://github.com/skuid/helm-value-store) - Plugin for working with Helm deployment values +- [Technosophos's Helm Plugins](https://github.com/technosophos/helm-plugins) - Plugins for GitHub, Keybase, and GPG +- [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-edit](https://github.com/mstrzele/helm-edit) - Plugin for editing release's values +- [helm-env](https://github.com/adamreese/helm-env) - Plugin to show current environment - [helm-gcs](https://github.com/nouney/helm-gcs) - Plugin to manage repositories on Google Cloud Storage -- [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-github](https://github.com/sagansystems/helm-github) - Plugin to install Helm Charts from Github repositories -- [helm-monitor](https://github.com/ContainerSolutions/helm-monitor) - Plugin to monitor a release and rollback based on Prometheus/ElasticSearch query -- [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp - [helm-hashtag](https://github.com/balboah/helm-hashtag) - Plugin for tracking docker tag hash digests as values -- [helm-unittest](https://github.com/lrills/helm-unittest) - Plugin for unit testing chart locally with YAML +- [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp +- [helm-last](https://github.com/adamreese/helm-last) - Plugin to show the latest release +- [helm-local](https://github.com/adamreese/helm-local) - Plugin to run Tiller as a local daemon +- [helm-monitor](https://github.com/ContainerSolutions/helm-monitor) - Plugin to monitor a release and rollback based on Prometheus/ElasticSearch query +- [helm-nuke](https://github.com/adamreese/helm-nuke) - Plugin to destroy all releases +- [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely - [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods +- [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side +- [helm-tiller](https://github.com/adamreese/helm-tiller) - Additional commands to work with Tiller +- [helm-unittest](https://github.com/lrills/helm-unittest) - Plugin for unit testing chart locally with YAML We also encourage GitHub authors to use the [helm-plugin](https://github.com/search?q=topic%3Ahelm-plugin&type=Repositories) tag on their plugin repositories. @@ -55,33 +56,33 @@ tag on their plugin repositories. Tools layered on top of Helm or Tiller. - [AppsCode Swift](https://github.com/appscode/swift) - Ajax friendly Helm Tiller Proxy using [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway) -- [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client -- [Chartify](https://github.com/appscode/chartify) - Generate Helm charts from existing Kubernetes resources. -- [VIM-Kubernetes](https://github.com/andrewstuart/vim-kubernetes) - VIM plugin for Kubernetes and Helm -- [Landscaper](https://github.com/Eneco/landscaper/) - "Landscaper takes a set of Helm Chart references with values (a desired state), and realizes this in a Kubernetes cluster." -- [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API -- [Helmfile](https://github.com/roboll/helmfile) - Helmfile is a declarative spec for deploying helm charts +- [Armada](https://github.com/att-comdev/armada) - Manage prefixed releases throughout various Kubernetes namespaces, and removes completed jobs for complex deployments. Used by the [Openstack-Helm](https://github.com/openstack/openstack-helm) team. - [Autohelm](https://github.com/reactiveops/autohelm) - Autohelm is _another_ simple declarative spec for deploying helm charts. Written in python and supports git urls as a source for helm charts. -- [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). -- [Schelm](https://github.com/databus23/schelm) - Render a Helm manifest to a directory -- [Drone.io Helm Plugin](http://plugins.drone.io/ipedrazas/drone-helm/) - Run Helm inside of the Drone CI/CD system +- [ChartMuseum](https://github.com/chartmuseum/chartmuseum) - Helm Chart Repository with support for Amazon S3 and Google Cloud Storage +- [Chartify](https://github.com/appscode/chartify) - Generate Helm charts from existing Kubernetes resources. +- [Codefresh](https://codefresh.io) - Kubernetes native CI/CD and management platform with UI dashboards for managing Helm charts and releases - [Cog](https://github.com/ohaiwalt/cog-helm) - Helm chart to deploy Cog on Kubernetes -- [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories +- [Drone.io Helm Plugin](http://plugins.drone.io/ipedrazas/drone-helm/) - Run Helm inside of the Drone CI/CD system - [Helm Chart Publisher](https://github.com/luizbafilho/helm-chart-publisher) - HTTP API for publishing Helm Charts in an easy way -- [Armada](https://github.com/att-comdev/armada) - Manage prefixed releases throughout various Kubernetes namespaces, and removes completed jobs for complex deployments. Used by the [Openstack-Helm](https://github.com/openstack/openstack-helm) team. -- [ChartMuseum](https://github.com/chartmuseum/chartmuseum) - Helm Chart Repository with support for Amazon S3 and Google Cloud Storage - [Helm.NET](https://github.com/qmfrederik/helm) - A .NET client for Tiller's API -- [Codefresh](https://codefresh.io) - Kubernetes native CI/CD and management platform with UI dashboards for managing Helm charts and releases +- [Helmfile](https://github.com/roboll/helmfile) - Helmfile is a declarative spec for deploying helm charts +- [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). +- [Landscaper](https://github.com/Eneco/landscaper/) - "Landscaper takes a set of Helm Chart references with values (a desired state), and realizes this in a Kubernetes cluster." +- [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories +- [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client +- [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API +- [Schelm](https://github.com/databus23/schelm) - Render a Helm manifest to a directory +- [VIM-Kubernetes](https://github.com/andrewstuart/vim-kubernetes) - VIM plugin for Kubernetes and Helm ## Helm Included Platforms, distributions, and services that include Helm support. -- [Kubernetic](https://kubernetic.com/) - Kubernetes Desktop Client - [Cabin](http://www.skippbox.com/cabin/) - Mobile App for Managing Kubernetes -- [Qstack](https://qstack.com) - [Fabric8](https://fabric8.io) - Integrated development platform for Kubernetes - [Jenkins X](http://jenkins-x.io/) - open source automated CI/CD for Kubernetes which uses Helm for [promoting](http://jenkins-x.io/about/features/#promotion) applications through [environments via GitOps](http://jenkins-x.io/about/features/#environments) +- [Kubernetic](https://kubernetic.com/) - Kubernetes Desktop Client +- [Qstack](https://qstack.com) ## Misc From 204f823b5eefe458b51a8d240cab611a06d03d84 Mon Sep 17 00:00:00 2001 From: muffin87 Date: Tue, 14 Aug 2018 19:13:02 +0200 Subject: [PATCH 159/483] Add basic tutorial for beginners (#4466) --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index ecd86f7e242..09501a598bd 100644 --- a/docs/related.md +++ b/docs/related.md @@ -18,6 +18,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [The Workflow "Umbrella" Helm Chart](https://deis.com/blog/2017/workflow-chart-assembly) - [Using Helm to Deploy to Kubernetes](https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/) - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) +- [A basic walk through Kubernetes Helm](https://github.com/muffin87/helm-tutorial) ## Video, Audio, and Podcast From c4c9287a0ae6d2e6bf458e2577aae65fe93474b0 Mon Sep 17 00:00:00 2001 From: rimas Date: Tue, 14 Aug 2018 10:33:25 -0700 Subject: [PATCH 160/483] add Tillerless Helm blog post and plugin references --- docs/related.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/related.md b/docs/related.md index 09501a598bd..082684d9cda 100644 --- a/docs/related.md +++ b/docs/related.md @@ -19,6 +19,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [Using Helm to Deploy to Kubernetes](https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/) - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) - [A basic walk through Kubernetes Helm](https://github.com/muffin87/helm-tutorial) +- [Tillerless Helm v2](https://rimusz.net/tillerless-helm/) ## Video, Audio, and Podcast @@ -48,6 +49,7 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side - [helm-tiller](https://github.com/adamreese/helm-tiller) - Additional commands to work with Tiller - [helm-unittest](https://github.com/lrills/helm-unittest) - Plugin for unit testing chart locally with YAML +- [Tillerless Helm v2](https://github.com/rimusz/helm-tiller) - Helm plugin for using Tiller locally and in CI/CD pipelines We also encourage GitHub authors to use the [helm-plugin](https://github.com/search?q=topic%3Ahelm-plugin&type=Repositories) tag on their plugin repositories. From 38eb73760b44f25b517f6f2f3c48cbb7dc047bb8 Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Wed, 15 Aug 2018 15:03:18 -0600 Subject: [PATCH 161/483] fix(client): fix bug in list releases to append all releases --- pkg/helm/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index f9774392f13..771c7f3d1d7 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -360,7 +360,7 @@ func (h *Client) list(ctx context.Context, req *rls.ListReleasesRequest) (*rls.L resp = r continue } - resp.Releases = append(resp.Releases, r.GetReleases()[0]) + resp.Releases = append(resp.Releases, r.GetReleases()...) } return resp, nil } From f15d65845019f549679d06e18db9ec7ce7686922 Mon Sep 17 00:00:00 2001 From: Alexey Volkov Date: Thu, 16 Aug 2018 01:31:40 +0300 Subject: [PATCH 162/483] fix: link to custom resource definitions section --- docs/chart_best_practices/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_best_practices/README.md b/docs/chart_best_practices/README.md index 58cc6540704..1160dc28771 100644 --- a/docs/chart_best_practices/README.md +++ b/docs/chart_best_practices/README.md @@ -17,5 +17,5 @@ may find that their internal interests override our suggestions here. - Kubernetes Resources: - [Pods and Pod Specs](pods.md): See the best practices for working with pod specifications. - [Role-Based Access Control](rbac.md): Guidance on creating and using service accounts, roles, and role bindings. - - [Third Party Resources](third_party_resources.md): Third Party Resources (TPRs) have their own associated best practices. + - [Custom Resource Definitions](custom_resource_definitions.md): Custom Resource Definitions (CRDs) have their own associated best practices. From a8229323cd88bf8b4c457bf7b2a4b0d93f81f349 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Thu, 16 Aug 2018 13:28:08 -0400 Subject: [PATCH 163/483] docs(README): Updating for Helm in CNCF Signed-off-by: Matt Farina --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6a35c3f4df6..018099e011a 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# Kubernetes Helm +# Helm [![CircleCI](https://circleci.com/gh/helm/helm.svg?style=svg)](https://circleci.com/gh/helm/helm) [![Go Report Card](https://goreportcard.com/badge/github.com/helm/helm)](https://goreportcard.com/report/github.com/helm/helm) -[![GoDoc](https://godoc.org/github.com/kubernetes/helm?status.svg)](https://godoc.org/github.com/kubernetes/helm) +[![GoDoc](https://godoc.org/k8s.io/helm?status.svg)](https://godoc.org/k8s.io/helm) Helm is a tool for managing Kubernetes charts. Charts are packages of pre-configured Kubernetes resources. Use Helm to: -- Find and use [popular software packaged as Kubernetes charts](https://github.com/helm/charts) -- Share your own applications as Kubernetes charts +- Find and use [popular software packaged as Helm charts](https://github.com/helm/charts) to run in Kubernetes +- Share your own applications as Helm charts - Create reproducible builds of your Kubernetes applications - Intelligently manage your Kubernetes manifest files - Manage releases of Helm packages @@ -63,11 +63,10 @@ You can reach the Helm community and developers via the following channels: - [#helm-users](https://kubernetes.slack.com/messages/helm-users) - [#helm-dev](https://kubernetes.slack.com/messages/helm-dev) - [#charts](https://kubernetes.slack.com/messages/charts) -- Mailing Lists: - - [Helm Mailing List](https://lists.cncf.io/g/cncf-kubernetes-helm) - - [Kubernetes SIG Apps Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-apps) -- Developer Call: Thursdays at 9:30-10:00 Pacific. [https://zoom.us/j/4526666954](https://zoom.us/j/4526666954) +- Mailing List: + - [Helm Mailing List](https://lists.cncf.io/g/cncf-helm) +- Developer Call: Thursdays at 9:30-10:00 Pacific. [https://zoom.us/j/696660622](https://zoom.us/j/696660622) ### Code of conduct -Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). +Participation in the Helm community is governed by the [Code of Conduct](code-of-conduct.md). From 1ed6ffbdb08ab3c617ebe9b042a959a7aa098f49 Mon Sep 17 00:00:00 2001 From: Nick Schuch Date: Fri, 17 Aug 2018 13:23:19 +1000 Subject: [PATCH 164/483] Update zoom.us link --- README.md | 2 +- docs/release_checklist.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6a35c3f4df6..8e8f87d6500 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ You can reach the Helm community and developers via the following channels: - Mailing Lists: - [Helm Mailing List](https://lists.cncf.io/g/cncf-kubernetes-helm) - [Kubernetes SIG Apps Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-apps) -- Developer Call: Thursdays at 9:30-10:00 Pacific. [https://zoom.us/j/4526666954](https://zoom.us/j/4526666954) +- Developer Call: Thursdays at 9:30-10:00 Pacific. [https://zoom.us/j/696660622](https://zoom.us/j/696660622) ### Code of conduct diff --git a/docs/release_checklist.md b/docs/release_checklist.md index fcd3429ad98..96d7e56254a 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -223,7 +223,7 @@ The community keeps growing, and we'd love to see you there! - Join the discussion in [Kubernetes Slack](https://slack.k8s.io/): - `#helm-users` for questions and just to hang out - `#helm-dev` for discussing PRs, code, and bugs -- Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom.us/j/4526666954) +- Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom.us/j/696660622) - Test, debug, and contribute charts: [GitHub/kubernetes/charts](https://github.com/kubernetes/charts) ## Installation and Upgrading From d92939119993174ae264dfec06db7cb1b07e37c9 Mon Sep 17 00:00:00 2001 From: Jon Huhn Date: Fri, 17 Aug 2018 09:34:59 -0500 Subject: [PATCH 165/483] Fix typo in parser.go --- pkg/strvals/parser.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index 1fd9ab81e05..532a8c4acab 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -94,7 +94,7 @@ func ParseIntoFile(s string, dest map[string]interface{}, runesToVal runesToVal) return t.parse() } -// ParseIntoString parses a strvals line nad merges the result into dest. +// ParseIntoString parses a strvals line and merges the result into dest. // // This method always returns a string as the value. func ParseIntoString(s string, dest map[string]interface{}) error { From c15a355da75570b74ad3b93ba70a7c38702169af Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 17 Aug 2018 13:09:24 -0700 Subject: [PATCH 166/483] strip out all extra lines other than the first for parsing --- scripts/get | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/get b/scripts/get index 79dd6950040..29cd47e1a4e 100755 --- a/scripts/get +++ b/scripts/get @@ -78,9 +78,9 @@ checkDesiredVersion() { # Use the GitHub releases webpage for the project to find the desired version for this project. local release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION:-latest}" if type "curl" > /dev/null; then - TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') + TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | head -n 1 | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') elif type "wget" > /dev/null; then - TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | grep -v no-underline | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') + TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | grep -v no-underline | head -n 1 | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') fi if [ "x$TAG" == "x" ]; then echo "Cannot determine ${DESIRED_VERSION} tag." From 8c69e1af4fdc904daf6b2613607c0a4492b1a181 Mon Sep 17 00:00:00 2001 From: Dustin Specker Date: Fri, 24 Aug 2018 06:58:20 -0500 Subject: [PATCH 167/483] docs: remove extraneous "it" --- docs/chart_template_guide/subcharts_and_globals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/subcharts_and_globals.md b/docs/chart_template_guide/subcharts_and_globals.md index 33274effe0f..a288556d82d 100644 --- a/docs/chart_template_guide/subcharts_and_globals.md +++ b/docs/chart_template_guide/subcharts_and_globals.md @@ -201,7 +201,7 @@ will only accept a string literal. The Go template language provides a `block` keyword that allows developers to provide a default implementation which is overridden later. In Helm charts, blocks are not -the best tool for overriding because it if multiple implementations of the same block +the best tool for overriding because if multiple implementations of the same block are provided, the one selected is unpredictable. The suggestion is to instead use `include`. From 7306b4c28eadcd06a9f090546d6edec8a0067ac0 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 24 Aug 2018 16:17:41 +0100 Subject: [PATCH 168/483] Fix helm create note for k8 label convention changes Update to note as per changes in Issue #4335 . Otherwise cannot retrieve the pod with the label names. --- pkg/chartutil/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index ef70efed968..cff3b89ebb6 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -250,7 +250,7 @@ const defaultNotes = `1. Get the application URL by running these commands: export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include ".fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.service.port }} {{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ include ".name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include ".name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:80 {{- end }} From a4e2e8b505e47336fa893da3a297fbe6094bba94 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Thu, 23 Aug 2018 16:54:44 -0400 Subject: [PATCH 169/483] Moving from CLA to DCO in contribution guide Signed-off-by: Matt Farina --- CONTRIBUTING.md | 78 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 81ed009d475..715bf7490be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,21 +10,75 @@ you are reporting a _security vulnerability_, please email a report to [cncf-kubernetes-helm-security@lists.cncf.io](mailto:cncf-kubernetes-helm-security@lists.cncf.io). This will give us a chance to try to fix the issue before it is exploited in the wild. -## Contributor License Agreements +## Sign Your Work -We'd love to accept your patches! Before we can take them, we have to jump a -couple of legal hurdles. +The sign-off is a simple line at the end of the explanation for a commit. All +commits needs to be signed. Your signature certifies that you wrote the patch or +otherwise have the right to contribute the material. The rules are pretty simple, +if you can certify the below (from [developercertificate.org](http://developercertificate.org/)): -The Cloud Native Computing Foundation (CNCF) CLA [must be signed](https://github.com/kubernetes/community/blob/master/CLA.md) by all contributors. -Please fill out either the individual or corporate Contributor License -Agreement (CLA). +``` +Developer Certificate of Origin +Version 1.1 -Once you are CLA'ed, we'll be able to accept your pull requests. For any issues that you face during this process, -please add a comment [here](https://github.com/kubernetes/kubernetes/issues/27796) explaining the issue and we will help get it sorted out. +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 -***NOTE***: Only original source code from you and other people that have -signed the CLA can be accepted into the repository. This policy does not -apply to [third_party](third_party/) and [vendor](vendor/). +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. + +Note: If your git config information is set properly then viewing the + `git log` information for your commit will look something like this: + +``` +Author: Joe Smith +Date: Thu Feb 2 11:41:15 2018 -0800 + + Update README + + Signed-off-by: Joe Smith +``` + +Notice the `Author` and `Signed-off-by` lines match. If they don't +your PR will be rejected by the automated DCO check. ## Support Channels @@ -215,8 +269,6 @@ The following tables define all label types used for Helm. It is split up by cat | ----- | ----------- | | `awaiting review` | The PR has been triaged and is ready for someone to review | | `breaking` | The PR has breaking changes (such as API changes) | -| `cncf-cla: no` | The PR submitter has **not** signed the project CLA. | -| `cncf-cla: yes` | The PR submitter has signed the project CLA. This is required to merge. | | `in progress` | Indicates that a maintainer is looking at the PR, even if no review has been posted yet | | `needs pick` | Indicates that the PR needs to be picked into a feature branch (generally bugfix branches). Once it has been, the `picked` label should be applied and this one removed | | `needs rebase` | A helper label used to indicate that the PR needs to be rebased before it can be merged. Used for easy filtering | From 0b3924b2ac7ea2204523e976647825788d854481 Mon Sep 17 00:00:00 2001 From: Tim Hobbs Date: Fri, 24 Aug 2018 18:03:23 +0200 Subject: [PATCH 170/483] Messages are encrypted when using TLS When helm client and tiller use TLS their messages are encrypted, not unencrypted ;) --- docs/securing_installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index a489cc837fc..454e0cc1267 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -57,7 +57,7 @@ Shared and production clusters -- for the most part -- should use Helm 2.7.2 at For more information about the proper steps to configure Tiller and use Helm properly with TLS configured, see [Using SSL between Helm and Tiller](tiller_ssl.md). -When Helm clients are connecting from outside of the cluster, the security between the Helm client and the API server is managed by Kubernetes itself. You may want to ensure that this link is secure. Note that if you are using the TLS configuration recommended above, not even the Kubernetes API server has access to the unencrypted messages between the client and Tiller. +When Helm clients are connecting from outside of the cluster, the security between the Helm client and the API server is managed by Kubernetes itself. You may want to ensure that this link is secure. Note that if you are using the TLS configuration recommended above, not even the Kubernetes API server has access to the encrypted messages between the client and Tiller. ### Tiller's Release Information From 0b4e086e0572ae405a65af0a61c2dbe5a4ced2e5 Mon Sep 17 00:00:00 2001 From: Jon Huhn Date: Fri, 24 Aug 2018 13:38:36 -0500 Subject: [PATCH 171/483] Fix typo in message.go --- pkg/lint/support/message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/lint/support/message.go b/pkg/lint/support/message.go index 4dd485c98e1..5efbc7a61ca 100644 --- a/pkg/lint/support/message.go +++ b/pkg/lint/support/message.go @@ -18,7 +18,7 @@ package support import "fmt" -// Severity indicatest the severity of a Message. +// Severity indicates the severity of a Message. const ( // UnknownSev indicates that the severity of the error is unknown, and should not stop processing. UnknownSev = iota From eeb3a1454a54194bada37661dab57d397c3e899b Mon Sep 17 00:00:00 2001 From: smurfralf Date: Fri, 17 Aug 2018 17:45:36 -0400 Subject: [PATCH 172/483] Improve documentation for helm upgrade (#4030) Expand and clarify documentation for `helm upgrade` to include nuances of command line values setting. Fixes issue #4030 --- cmd/helm/upgrade.go | 61 ++++++++++++----- docs/helm/helm_upgrade.md | 63 +++++++++++++----- docs/man/man1/helm_upgrade.1 | 126 +++++++++++++++++++++++++++-------- 3 files changed, 189 insertions(+), 61 deletions(-) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index ba0649e396b..55ed63c130c 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -29,30 +29,57 @@ import ( ) const upgradeDesc = ` -This command upgrades a release to a new version of a chart. +This command upgrades a release to a specified version of a chart and/or updates chart values. -The upgrade arguments must be a release and chart. The chart -argument can be either: a chart reference('stable/mariadb'), a path to a chart directory, -a packaged chart, or a fully qualified URL. For chart references, the latest -version will be specified unless the '--version' flag is set. +Required arguments are release and chart. The chart argument can be one of: + - a chart reference('stable/mariadb'); use '--version' and '--devel' flags for versions other than latest, + - a path to a chart directory, + - a packaged chart, + - a fully qualified URL. -To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line. To force string -values in '--set', use '--set-string' instead. In case a value is large and therefore -you want not to use neither '--values' nor '--set', use '--set-file' to read the -single large value from file. +To customize the chart values use any of + - '--values'/'-f' to pass in a yaml file holding settings, + - '--set' to provide one or more key=val pairs directly, + - '--set-string' to provide key=val forcing val to be stored as a string, + - '--set-file' to provide key=path to read a single large value from a file at path. -You can specify the '--values'/'-f' flag multiple times. The priority will be given to the -last (right-most) file specified. For example, if both myvalues.yaml and override.yaml -contained a key called 'Test', the value set in override.yaml would take precedence: +To edit or append to the existing customized values add the + '--reuse-values' flag, otherwise any existing customized values are ignored. + +If no chart value arguments are provided on the command line, any existing customized values are carried +forward. To revert to use only values provided in the chart, use the '--reset-values' flag. + +You can specify any of the chart value flags multiple times. The priority will be given to the last +(right-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key +called 'Test', the value set in override.yaml would take precedence: $ helm upgrade -f myvalues.yaml -f override.yaml redis ./redis -You can specify the '--set' flag multiple times. The priority will be given to the -last (right-most) set specified. For example, if both 'bar' and 'newbar' values are -set for a key called 'foo', the 'newbar' value would take precedence: +Note that the key name provided to the '--set', '--set-string' and '--set-file' flags can reference +structure elements. Examples: + - mybool=TRUE + - livenessProbe.timeoutSeconds=10 + - metrics.annotations[0]=hey,metrics.annotations[1]=ho + +which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. + +Note that the value side of the key=val provided to '--set' and '--set-string' flags will pass through +shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with +special characters in unexpected ways, for example + + $ helm upgrade --set pwd=3jk$o2,z=f\30.e redis ./redis + +results in "pwd: 3jk" and "z: f30.e". Use single quotes to avoid shell evaluation and argument delimiters, +and use backslash to escape yaml special characters: + + $ helm upgrade --set pwd='3jk$o2z=f\\30.e' redis ./redis + +which results in the expected "pwd: 3jk$o2z=f\30.e". If a single quote occurs in your value then follow +your shell convention for escaping it; for example in bash: + + $ helm upgrade --set pwd='3jk$o2z=f\\30with'\''quote' - $ helm upgrade --set foo=bar --set foo=newbar redis ./redis +which results in "pwd: 3jk$o2z=f\30with'quote". ` type upgradeCmd struct { diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index 522464c6b31..6dcb25387b2 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -5,30 +5,57 @@ upgrade a release ### Synopsis -This command upgrades a release to a new version of a chart. +This command upgrades a release to a specified version of a chart and/or updates chart values. -The upgrade arguments must be a release and chart. The chart -argument can be either: a chart reference('stable/mariadb'), a path to a chart directory, -a packaged chart, or a fully qualified URL. For chart references, the latest -version will be specified unless the '--version' flag is set. +Required arguments are release and chart. The chart argument can be one of: + - a chart reference('stable/mariadb'); use '--version' and '--devel' flags for versions other than latest, + - a path to a chart directory, + - a packaged chart, + - a fully qualified URL. -To override values in a chart, use either the '--values' flag and pass in a file -or use the '--set' flag and pass configuration from the command line. To force string -values in '--set', use '--set-string' instead. In case a value is large and therefore -you want not to use neither '--values' nor '--set', use '--set-file' to read the -single large value from file. +To customize the chart values use any of + - '--values'/'-f' to pass in a yaml file holding settings, + - '--set' to provide one or more key=val pairs directly, + - '--set-string' to provide key=val forcing val to be stored as a string, + - '--set-file' to provide key=path to read a single large value from a file at path. -You can specify the '--values'/'-f' flag multiple times. The priority will be given to the -last (right-most) file specified. For example, if both myvalues.yaml and override.yaml -contained a key called 'Test', the value set in override.yaml would take precedence: +To edit or append to the existing customized values add the + '--reuse-values' flag, otherwise any existing customized values are ignored. + +If no chart value arguments are provided on the command line, any existing customized values are carried +forward. To revert to use only values provided in the chart, use the '--reset-values' flag. + +You can specify any of the chart value flags multiple times. The priority will be given to the last +(right-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key +called 'Test', the value set in override.yaml would take precedence: $ helm upgrade -f myvalues.yaml -f override.yaml redis ./redis -You can specify the '--set' flag multiple times. The priority will be given to the -last (right-most) set specified. For example, if both 'bar' and 'newbar' values are -set for a key called 'foo', the 'newbar' value would take precedence: +Note that the key name provided to the '--set', '--set-string' and '--set-file' flags can reference +structure elements. Examples: + - mybool=TRUE + - livenessProbe.timeoutSeconds=10 + - metrics.annotations[0]=hey,metrics.annotations[1]=ho + +which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. + +Note that the value side of the key=val provided to '--set' and '--set-string' flags will pass through +shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with +special characters in unexpected ways, for example + + $ helm upgrade --set pwd=3jk$o2,z=f\30.e redis ./redis + +results in "pwd: 3jk" and "z: f30.e". Use single quotes to avoid shell evaluation and argument delimiters, +and use backslash to escape yaml special characters: + + $ helm upgrade --set pwd='3jk$o2z=f\\30.e' redis ./redis + +which results in the expected "pwd: 3jk$o2z=f\30.e". If a single quote occurs in your value then follow +your shell convention for escaping it; for example in bash: + + $ helm upgrade --set pwd='3jk$o2z=f\\30with'\''quote' - $ helm upgrade --set foo=bar --set foo=newbar redis ./redis +which results in "pwd: 3jk$o2z=f\30with'quote". ``` @@ -88,4 +115,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 17-Aug-2018 diff --git a/docs/man/man1/helm_upgrade.1 b/docs/man/man1/helm_upgrade.1 index 24bba7c85da..202f3d8c1fa 100644 --- a/docs/man/man1/helm_upgrade.1 +++ b/docs/man/man1/helm_upgrade.1 @@ -1,6 +1,4 @@ -.TH "HELM" "1" "May 2017" "Auto generated by spf13/cobra" "" -.nh -.ad l +.TH "HELM" "1" "Aug 2018" "Auto generated by spf13/cobra" "" "" .SH NAME @@ -15,22 +13,32 @@ helm\-upgrade \- upgrade a release .SH DESCRIPTION .PP -This command upgrades a release to a new version of a chart. +This command upgrades a release to a specified version of a chart +and/or updates chart values. .PP -The upgrade arguments must be a release and chart. The chart -argument can be either: a chart reference('stable/mariadb'), a path to a chart directory, -a packaged chart, or a fully qualified URL. For chart references, the latest -version will be specified unless the '\-\-version' flag is set. +Required arguments are release and chart. The chart argument can be one of: + \- a chart reference('stable/mariadb'); use '\-\-version' and '\-\-devel' flags for versions other than latest, + \- a path to a chart directory, + \- a packaged chart, + \- a fully qualified URL. .PP -To override values in a chart, use either the '\-\-values' flag and pass in a file -or use the '\-\-set' flag and pass configuration from the command line. +To customize the chart values use any of + \- '\-\-values'/'\-f' to pass in a yaml file holding settings, + \- '\-\-set' to provide one or more key=val pairs directly, + \- '\-\-set\-string' to provide key=val forcing val to be stored as a string, + \- '\-\-set\-file' to provide key=path to read a single large value from a file at path. .PP -You can specify the '\-\-values'/'\-f' flag multiple times. The priority will be given to the -last (right\-most) file specified. For example, if both myvalues.yaml and override.yaml -contained a key called 'Test', the value set in override.yaml would take precedence: +To edit or append to the existing customized values add the + '\-\-reuse\-values' flag, otherwise any existing customized values are ignored. + +.PP +If no chart value arguments are provided on the command line, any existing customized values are carried forward. To revert to use only values provided in the chart, use the '\-\-reset\-values' flag. + +.PP +You can specify any of the chart value flags multiple times. The priority will be given to the last (right\-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key called 'Test', the value set in override.yaml would take precedence: .PP .RS @@ -42,19 +50,53 @@ $ helm upgrade \-f myvalues.yaml \-f override.yaml redis ./redis .RE .PP -You can specify the '\-\-set' flag multiple times. The priority will be given to the -last (right\-most) set specified. For example, if both 'bar' and 'newbar' values are -set for a key called 'foo', the 'newbar' value would take precedence: +Note that the key name provided to the '\-\-set', '\-\-set\-string' and '\-\-set\-file' flags can reference structure elements. Examples: + \- mybool=TRUE + \- livenessProbe.timeoutSeconds=10 + \- metrics.annotations[0]=hey,metrics.annotations[1]=ho + +.PP +which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. + +.PP +Note that the value side of the key=val provided to '\-\-set' and '\-\-set\-string' flags will pass through shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with special characters in unexpected ways, for example + +.PP +.RS + +.nf +$ helm upgrade \-\-set pwd=3jk$o2,z=f\\30.e redis ./redis + +.fi +.RE + +.PP +results in "pwd: 3jk" and "z: f30.e". Use single quotes to avoid shell evaulation and argument delimiters, and use backslash to escape yaml special characters: + +.PP +.RS + +.nf +$ helm upgrade \-\-set pwd='3jk$o2z=f\\\\30.e' redis ./redis + +.fi +.RE + +.PP +which results in the expected "pwd: 3jk$o2z=f\\30.e". If a single quote occurs in your value then follow your shell convention for escaping it; for example in bash: .PP .RS .nf -$ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis +$ helm upgrade \-\-set pwd='3jk$o2z=f\\\\30with'\\''quote' .fi .RE +.PP +which results in "pwd: 3jk$o2z=f\\30with'quote". + .SH OPTIONS .PP @@ -65,9 +107,13 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis \fB\-\-cert\-file\fP="" identify HTTPS client using this SSL certificate file +.PP +\fB\-\-description\fP="" + specify the description to use for the upgrade, rather than the default + .PP \fB\-\-devel\fP[=false] - use development versions, too. Equivalent to version '>0.0.0\-a'. If \-\-version is set, this is ignored. + use development versions, too. Equivalent to version '>0.0.0\-0'. If \-\-version is set, this is ignored. .PP \fB\-\-dry\-run\fP[=false] @@ -90,13 +136,17 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis path to the keyring that contains public signing keys .PP -\fB\-\-namespace\fP="default" - namespace to install the release into (only used if \-\-install is set) +\fB\-\-namespace\fP="" + namespace to install the release into (only used if \-\-install is set). Defaults to the current kube config namespace .PP \fB\-\-no\-hooks\fP[=false] disable pre/post upgrade hooks +.PP +\fB\-\-password\fP="" + chart repository password where to locate the requested chart + .PP \fB\-\-recreate\-pods\fP[=false] performs pods restart for the resource if applicable @@ -111,15 +161,23 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis .PP \fB\-\-reuse\-values\fP[=false] - when upgrading, reuse the last release's values, and merge in any new values. If '\-\-reset\-values' is specified, this is ignored. + when upgrading, reuse the last release's values and merge in any overrides from the command line via \-\-set and \-f. If '\-\-reset\-values' is specified, this is ignored. .PP \fB\-\-set\fP=[] set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) +.PP +\fB\-\-set\-file\fP=[] + set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) + +.PP +\fB\-\-set\-string\fP=[] + set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + .PP \fB\-\-timeout\fP=300 - time in seconds to wait for any individual kubernetes operation (like Jobs for hooks) + time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) .PP \fB\-\-tls\fP[=false] @@ -133,6 +191,10 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis \fB\-\-tls\-cert\fP="$HELM\_HOME/cert.pem" path to TLS certificate file +.PP +\fB\-\-tls\-hostname\fP="" + the server name used to verify the hostname on the returned certificates from the server + .PP \fB\-\-tls\-key\fP="$HELM\_HOME/key.pem" path to TLS key file @@ -141,6 +203,10 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis \fB\-\-tls\-verify\fP[=false] enable TLS for request and verify remote +.PP +\fB\-\-username\fP="" + chart repository username where to locate the requested chart + .PP \fB\-f\fP, \fB\-\-values\fP=[] specify values in a YAML file or a URL(can specify multiple) @@ -168,16 +234,24 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis location of your Helm config. Overrides $HELM\_HOME .PP -\fB\-\-host\fP="localhost:44134" - address of tiller. Overrides $HELM\_HOST +\fB\-\-host\fP="" + address of Tiller. Overrides $HELM\_HOST .PP \fB\-\-kube\-context\fP="" name of the kubeconfig context to use +.PP +\fB\-\-kubeconfig\fP="" + absolute path to the kubeconfig file to use + +.PP +\fB\-\-tiller\-connection\-timeout\fP=300 + the duration (in seconds) Helm will wait to establish a connection to tiller + .PP \fB\-\-tiller\-namespace\fP="kube\-system" - namespace of tiller + namespace of Tiller .SH SEE ALSO @@ -187,4 +261,4 @@ $ helm upgrade \-\-set foo=bar \-\-set foo=newbar redis ./redis .SH HISTORY .PP -19\-May\-2017 Auto generated by spf13/cobra +17\-Aug\-2018 Auto generated by spf13/cobra From c4d6b5a434bf87c33e5fd0ad5679af015c924844 Mon Sep 17 00:00:00 2001 From: smurfralf Date: Fri, 24 Aug 2018 14:40:30 -0400 Subject: [PATCH 173/483] Tweeks per bacon review --- cmd/helm/upgrade.go | 8 +++---- docs/helm/helm_upgrade.md | 10 ++++----- docs/man/man1/helm_upgrade.1 | 41 +++++++++++++++++++++++------------- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 55ed63c130c..23875289c7b 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -37,17 +37,17 @@ Required arguments are release and chart. The chart argument can be one of: - a packaged chart, - a fully qualified URL. -To customize the chart values use any of +To customize the chart values, use any of - '--values'/'-f' to pass in a yaml file holding settings, - '--set' to provide one or more key=val pairs directly, - '--set-string' to provide key=val forcing val to be stored as a string, - '--set-file' to provide key=path to read a single large value from a file at path. -To edit or append to the existing customized values add the +To edit or append to the existing customized values, add the '--reuse-values' flag, otherwise any existing customized values are ignored. If no chart value arguments are provided on the command line, any existing customized values are carried -forward. To revert to use only values provided in the chart, use the '--reset-values' flag. +forward. If you want to revert to just the values provided in the chart, use the '--reset-values' flag. You can specify any of the chart value flags multiple times. The priority will be given to the last (right-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key @@ -61,7 +61,7 @@ structure elements. Examples: - livenessProbe.timeoutSeconds=10 - metrics.annotations[0]=hey,metrics.annotations[1]=ho -which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. +which sets the top level key mybool to true, the nested timeoutSeconds to 10, and two array values, respectively. Note that the value side of the key=val provided to '--set' and '--set-string' flags will pass through shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index 6dcb25387b2..f18bcf6a718 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -13,17 +13,17 @@ Required arguments are release and chart. The chart argument can be one of: - a packaged chart, - a fully qualified URL. -To customize the chart values use any of +To customize the chart values, use any of - '--values'/'-f' to pass in a yaml file holding settings, - '--set' to provide one or more key=val pairs directly, - '--set-string' to provide key=val forcing val to be stored as a string, - '--set-file' to provide key=path to read a single large value from a file at path. -To edit or append to the existing customized values add the +To edit or append to the existing customized values, add the '--reuse-values' flag, otherwise any existing customized values are ignored. If no chart value arguments are provided on the command line, any existing customized values are carried -forward. To revert to use only values provided in the chart, use the '--reset-values' flag. +forward. If you want to revert to just the values provided in the chart, use the '--reset-values' flag. You can specify any of the chart value flags multiple times. The priority will be given to the last (right-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key @@ -37,7 +37,7 @@ structure elements. Examples: - livenessProbe.timeoutSeconds=10 - metrics.annotations[0]=hey,metrics.annotations[1]=ho -which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. +which sets the top level key mybool to true, the nested timeoutSeconds to 10, and two array values, respectively. Note that the value side of the key=val provided to '--set' and '--set-string' flags will pass through shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with @@ -115,4 +115,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 17-Aug-2018 +###### Auto generated by spf13/cobra on 24-Aug-2018 diff --git a/docs/man/man1/helm_upgrade.1 b/docs/man/man1/helm_upgrade.1 index 202f3d8c1fa..602c3136f17 100644 --- a/docs/man/man1/helm_upgrade.1 +++ b/docs/man/man1/helm_upgrade.1 @@ -8,13 +8,12 @@ helm\-upgrade \- upgrade a release .SH SYNOPSIS .PP -\fBhelm upgrade [RELEASE] [CHART]\fP +\fBhelm upgrade [RELEASE] [CHART] [flags]\fP .SH DESCRIPTION .PP -This command upgrades a release to a specified version of a chart -and/or updates chart values. +This command upgrades a release to a specified version of a chart and/or updates chart values. .PP Required arguments are release and chart. The chart argument can be one of: @@ -24,21 +23,24 @@ Required arguments are release and chart. The chart argument can be one of: \- a fully qualified URL. .PP -To customize the chart values use any of +To customize the chart values, use any of \- '\-\-values'/'\-f' to pass in a yaml file holding settings, \- '\-\-set' to provide one or more key=val pairs directly, \- '\-\-set\-string' to provide key=val forcing val to be stored as a string, \- '\-\-set\-file' to provide key=path to read a single large value from a file at path. .PP -To edit or append to the existing customized values add the +To edit or append to the existing customized values, add the '\-\-reuse\-values' flag, otherwise any existing customized values are ignored. .PP -If no chart value arguments are provided on the command line, any existing customized values are carried forward. To revert to use only values provided in the chart, use the '\-\-reset\-values' flag. +If no chart value arguments are provided on the command line, any existing customized values are carried +forward. If you want to revert to just the values provided in the chart, use the '\-\-reset\-values' flag. .PP -You can specify any of the chart value flags multiple times. The priority will be given to the last (right\-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key called 'Test', the value set in override.yaml would take precedence: +You can specify any of the chart value flags multiple times. The priority will be given to the last +(right\-most) value specified. For example, if both myvalues.yaml and override.yaml contained a key +called 'Test', the value set in override.yaml would take precedence: .PP .RS @@ -50,16 +52,19 @@ $ helm upgrade \-f myvalues.yaml \-f override.yaml redis ./redis .RE .PP -Note that the key name provided to the '\-\-set', '\-\-set\-string' and '\-\-set\-file' flags can reference structure elements. Examples: +Note that the key name provided to the '\-\-set', '\-\-set\-string' and '\-\-set\-file' flags can reference +structure elements. Examples: \- mybool=TRUE \- livenessProbe.timeoutSeconds=10 \- metrics.annotations[0]=hey,metrics.annotations[1]=ho .PP -which sets the top level key mybool to true, the nested timeoutSeconds to 10 and two array values respectively. +which sets the top level key mybool to true, the nested timeoutSeconds to 10, and two array values, respectively. .PP -Note that the value side of the key=val provided to '\-\-set' and '\-\-set\-string' flags will pass through shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with special characters in unexpected ways, for example +Note that the value side of the key=val provided to '\-\-set' and '\-\-set\-string' flags will pass through +shell evaluation followed by yaml type parsing to produce the final value. This may alter inputs with +special characters in unexpected ways, for example .PP .RS @@ -71,7 +76,8 @@ $ helm upgrade \-\-set pwd=3jk$o2,z=f\\30.e redis ./redis .RE .PP -results in "pwd: 3jk" and "z: f30.e". Use single quotes to avoid shell evaulation and argument delimiters, and use backslash to escape yaml special characters: +results in "pwd: 3jk" and "z: f30.e". Use single quotes to avoid shell evaluation and argument delimiters, +and use backslash to escape yaml special characters: .PP .RS @@ -83,7 +89,8 @@ $ helm upgrade \-\-set pwd='3jk$o2z=f\\\\30.e' redis ./redis .RE .PP -which results in the expected "pwd: 3jk$o2z=f\\30.e". If a single quote occurs in your value then follow your shell convention for escaping it; for example in bash: +which results in the expected "pwd: 3jk$o2z=f\\30.e". If a single quote occurs in your value then follow +your shell convention for escaping it; for example in bash: .PP .RS @@ -123,6 +130,10 @@ which results in "pwd: 3jk$o2z=f\\30with'quote". \fB\-\-force\fP[=false] force resource update through delete/recreate if needed +.PP +\fB\-h\fP, \fB\-\-help\fP[=false] + help for upgrade + .PP \fB\-i\fP, \fB\-\-install\fP[=false] if a release by this name doesn't already exist, run an install @@ -132,7 +143,7 @@ which results in "pwd: 3jk$o2z=f\\30with'quote". identify HTTPS client using this SSL key file .PP -\fB\-\-keyring\fP="~/.gnupg/pubring.gpg" +\fB\-\-keyring\fP="/Users/grapevine/.gnupg/pubring.gpg" path to the keyring that contains public signing keys .PP @@ -230,7 +241,7 @@ which results in "pwd: 3jk$o2z=f\\30with'quote". enable verbose output .PP -\fB\-\-home\fP="~/.helm" +\fB\-\-home\fP="/Users/grapevine/.helm" location of your Helm config. Overrides $HELM\_HOME .PP @@ -261,4 +272,4 @@ which results in "pwd: 3jk$o2z=f\\30with'quote". .SH HISTORY .PP -17\-Aug\-2018 Auto generated by spf13/cobra +24\-Aug\-2018 Auto generated by spf13/cobra From 17151b99eadd4402e7c38a4808d3f186b55df31e Mon Sep 17 00:00:00 2001 From: mattjmcnaughton Date: Mon, 4 Jun 2018 21:17:54 -0400 Subject: [PATCH 174/483] Add containerized options for tests in Makefile Add an option to run the `test-unit`, `test-style`, and `test` steps from the `Makefile` insides of a docker container. Doing so isolates this component of helm development from any other aspect of your global go environment. These commands all have the name `docker-*`. Long term, there may be reproducibility benefits to running all of the Make steps in a container by default, in which case `containerized-test-unit` could become `test-unit`. --- Makefile | 23 +++++++++++++++++++++++ docs/developers.md | 6 +++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6264cd8148a..9b85887128a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm +DEV_IMAGE ?= golang:1.10 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 @@ -87,17 +88,39 @@ test: TESTFLAGS += -race -v test: test-style test: test-unit +.PHONY: docker-test +docker-test: docker-binary +docker-test: TESTFLAGS += -race -v +docker-test: docker-test-style +docker-test: docker-test-unit + .PHONY: test-unit test-unit: @echo @echo "==> Running unit tests <==" HELM_HOME=/no/such/dir $(GO) test $(GOFLAGS) -run $(TESTS) $(PKG) $(TESTFLAGS) +.PHONY: docker-test-unit +docker-test-unit: check-docker + docker run \ + -v $(shell pwd):/go/src/k8s.io/helm \ + -w /go/src/k8s.io/helm \ + $(DEV_IMAGE) \ + bash -c "HELM_HOME=/no/such/dir go test $(GOFLAGS) -run $(TESTS) $(PKG) $(TESTFLAGS)" + .PHONY: test-style test-style: @scripts/validate-go.sh @scripts/validate-license.sh +.PHONY: docker-test-style +docker-test-style: check-docker + docker run \ + -v $(CURDIR):/go/src/k8s.io/helm \ + -w /go/src/k8s.io/helm \ + $(DEV_IMAGE) \ + bash -c "scripts/validate-go.sh && scripts/validate-license.sh" + .PHONY: protoc protoc: $(MAKE) -C _proto/ all diff --git a/docs/developers.md b/docs/developers.md index e18c28d5dcd..ca6b591fe90 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -27,7 +27,8 @@ This will build both Helm and Tiller. `make bootstrap` will attempt to install certain tools if they are missing. To run all the tests (without running the tests for `vendor/`), run -`make test`. +`make test`. To run all tests in a containerized environment, run `make +docker-test`. To run Helm and Tiller locally, you can run `bin/helm` or `bin/tiller`. @@ -209,6 +210,9 @@ We follow the Go coding style standards very closely. Typically, running We also typically follow the conventions recommended by `go lint` and `gometalinter`. Run `make test-style` to test the style conformance. +If you do not want to install all the linters from `gometalinter` into your +global Go environment, you can run `make docker-test-style` which will +run the same tests, but isolated within a docker container. Read more: From 518a9d63e6cdcc06a816c6b6ca27ff36fe1636ec Mon Sep 17 00:00:00 2001 From: roc Date: Wed, 11 Jul 2018 20:44:28 +0800 Subject: [PATCH 175/483] feat(helm): hiding password input on terminal When using "helm repo add" with "--username" and without "--password", hide user's input with a password prompt. This allows users to not expose their passwords to the command line history. --- cmd/helm/repo_add.go | 20 ++++++++++++++++++++ glide.yaml | 1 + 2 files changed, 21 insertions(+) diff --git a/cmd/helm/repo_add.go b/cmd/helm/repo_add.go index 906a9aef496..bfb3f0174e6 100644 --- a/cmd/helm/repo_add.go +++ b/cmd/helm/repo_add.go @@ -22,9 +22,11 @@ import ( "github.com/spf13/cobra" + "golang.org/x/crypto/ssh/terminal" "k8s.io/helm/pkg/getter" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/repo" + "syscall" ) type repoAddCmd struct { @@ -73,6 +75,16 @@ func newRepoAddCmd(out io.Writer) *cobra.Command { } func (a *repoAddCmd) run() error { + if a.username != "" && a.password == "" { + fmt.Fprint(a.out, "Password:") + password, err := readPassword() + fmt.Fprintln(a.out) + if err != nil { + return err + } + a.password = password + } + if err := addRepository(a.name, a.url, a.username, a.password, a.home, a.certFile, a.keyFile, a.caFile, a.noupdate); err != nil { return err } @@ -80,6 +92,14 @@ func (a *repoAddCmd) run() error { return nil } +func readPassword() (string, error) { + password, err := terminal.ReadPassword(int(syscall.Stdin)) + if err != nil { + return "", err + } + return string(password), nil +} + func addRepository(name, url, username, password string, home helmpath.Home, certFile, keyFile, caFile string, noUpdate bool) error { f, err := repo.LoadRepositoriesFile(home.RepositoryFile()) if err != nil { diff --git a/glide.yaml b/glide.yaml index e32df1d4e3c..68a5d91ad60 100644 --- a/glide.yaml +++ b/glide.yaml @@ -33,6 +33,7 @@ import: - package: golang.org/x/crypto subpackages: - openpgp + - ssh/terminal # pin version of golang.org/x/sys that is compatible with golang.org/x/crypto - package: golang.org/x/sys version: 43eea11 From 1b34a511d4ae38e43518e99a8250330515e3a93c Mon Sep 17 00:00:00 2001 From: aswinkarthik Date: Wed, 15 Aug 2018 18:20:15 +0530 Subject: [PATCH 176/483] fix(helm): Add --tiller-tls-hostname flag to 'helm init' This will fix the bug where 'helm init --wait' fails when TLS is used. Signed-off-by: aswinkarthik --- cmd/helm/helm.go | 2 +- cmd/helm/init.go | 1 + docs/helm/helm_init.md | 49 +++++++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index cdb6313e218..6cb1c78ea27 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -286,7 +286,7 @@ func newClient() helm.Interface { if tlsKeyFile == "" { tlsKeyFile = settings.Home.TLSKey() } - debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsKeyFile, tlsCertFile, tlsCaCertFile) + debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsServerName, tlsKeyFile, tlsCertFile, tlsCaCertFile) tlsopts := tlsutil.Options{ ServerName: tlsServerName, KeyFile: tlsKeyFile, diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 138fa14d73c..630847f3bc9 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -126,6 +126,7 @@ func newInitCmd(out io.Writer) *cobra.Command { f.StringVar(&tlsKeyFile, "tiller-tls-key", "", "path to TLS key file to install with Tiller") f.StringVar(&tlsCertFile, "tiller-tls-cert", "", "path to TLS certificate file to install with Tiller") f.StringVar(&tlsCaCertFile, "tls-ca-cert", "", "path to CA root certificate") + f.StringVar(&tlsServerName, "tiller-tls-hostname", settings.TillerHost, "the server name used to verify the hostname on the returned certificates from Tiller") f.StringVar(&stableRepositoryURL, "stable-repo-url", stableRepositoryURL, "URL for stable repository") f.StringVar(&localRepositoryURL, "local-repo-url", localRepositoryURL, "URL for local repository") diff --git a/docs/helm/helm_init.md b/docs/helm/helm_init.md index 430cc3d0e88..f1aad315905 100644 --- a/docs/helm/helm_init.md +++ b/docs/helm/helm_init.md @@ -32,29 +32,30 @@ helm init [flags] ### Options ``` - --canary-image use the canary Tiller image - -c, --client-only if set does not install Tiller - --dry-run do not install local or remote - --force-upgrade force upgrade of Tiller to the current helm version - -h, --help help for init - --history-max int limit the maximum number of revisions saved per release. Use 0 for no limit. - --local-repo-url string URL for local repository (default "http://127.0.0.1:8879/charts") - --net-host install Tiller with net=host - --node-selectors string labels to specify the node on which Tiller is installed (app=tiller,helm=rocks) - -o, --output OutputFormat skip installation and output Tiller's manifest in specified format (json or yaml) - --override stringArray override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2) - --replicas int amount of tiller instances to run on the cluster (default 1) - --service-account string name of service account - --skip-refresh do not refresh (download) the local repository cache - --stable-repo-url string URL for stable repository (default "https://kubernetes-charts.storage.googleapis.com") - -i, --tiller-image string override Tiller image - --tiller-tls install Tiller with TLS enabled - --tiller-tls-cert string path to TLS certificate file to install with Tiller - --tiller-tls-key string path to TLS key file to install with Tiller - --tiller-tls-verify install Tiller with TLS enabled and to verify remote certificates - --tls-ca-cert string path to CA root certificate - --upgrade upgrade if Tiller is already installed - --wait block until Tiller is running and ready to receive requests + --canary-image use the canary Tiller image + -c, --client-only if set does not install Tiller + --dry-run do not install local or remote + --force-upgrade force upgrade of Tiller to the current helm version + -h, --help help for init + --history-max int limit the maximum number of revisions saved per release. Use 0 for no limit. + --local-repo-url string URL for local repository (default "http://127.0.0.1:8879/charts") + --net-host install Tiller with net=host + --node-selectors string labels to specify the node on which Tiller is installed (app=tiller,helm=rocks) + -o, --output OutputFormat skip installation and output Tiller's manifest in specified format (json or yaml) + --override stringArray override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2) + --replicas int amount of tiller instances to run on the cluster (default 1) + --service-account string name of service account + --skip-refresh do not refresh (download) the local repository cache + --stable-repo-url string URL for stable repository (default "https://kubernetes-charts.storage.googleapis.com") + -i, --tiller-image string override Tiller image + --tiller-tls install Tiller with TLS enabled + --tiller-tls-cert string path to TLS certificate file to install with Tiller + --tiller-tls-hostname string the server name used to verify the hostname on the returned certificates from Tiller + --tiller-tls-key string path to TLS key file to install with Tiller + --tiller-tls-verify install Tiller with TLS enabled and to verify remote certificates + --tls-ca-cert string path to CA root certificate + --upgrade upgrade if Tiller is already installed + --wait block until Tiller is running and ready to receive requests ``` ### Options inherited from parent commands @@ -73,4 +74,4 @@ helm init [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 1-Sep-2018 From 380ca1a9232c1b022011bd5c5a946a0206518a3f Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Mon, 16 Jul 2018 15:14:00 -0400 Subject: [PATCH 177/483] feat(helm): add ability to sort release list by chart name Signed-off-by: Arash Deshmeh --- _proto/hapi/services/tiller.proto | 1 + cmd/helm/list.go | 41 ++++--- docs/helm/helm_list.md | 3 +- pkg/proto/hapi/services/tiller.pb.go | 171 ++++++++++++++------------- pkg/releaseutil/sorter.go | 23 ++++ pkg/releaseutil/sorter_test.go | 16 +++ pkg/tiller/release_list.go | 2 + pkg/tiller/release_list_test.go | 43 +++++++ 8 files changed, 197 insertions(+), 103 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index a94a90a4a1a..6c44ce6e052 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -124,6 +124,7 @@ message ListSort{ UNKNOWN = 0; NAME = 1; LAST_RELEASED = 2; + CHART_NAME = 3; } // SortOrder defines sort orders to augment sorting operations. diff --git a/cmd/helm/list.go b/cmd/helm/list.go index ed70702d546..4467b6ec7ea 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -60,24 +60,25 @@ flag with the '--offset' flag allows you to page through results. ` type listCmd struct { - filter string - short bool - limit int - offset string - byDate bool - sortDesc bool - out io.Writer - all bool - deleted bool - deleting bool - deployed bool - failed bool - namespace string - superseded bool - pending bool - client helm.Interface - colWidth uint - output string + filter string + short bool + limit int + offset string + byDate bool + sortDesc bool + out io.Writer + all bool + deleted bool + deleting bool + deployed bool + failed bool + namespace string + superseded bool + pending bool + client helm.Interface + colWidth uint + output string + byChartName bool } type listResult struct { @@ -133,6 +134,7 @@ func newListCmd(client helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&list.namespace, "namespace", "", "show releases within a specific namespace") f.UintVar(&list.colWidth, "col-width", 60, "specifies the max column width of output") f.StringVar(&list.output, "output", "", "output the specified format (json or yaml)") + f.BoolVarP(&list.byChartName, "chart-name", "c", false, "sort by chart name") // TODO: Do we want this as a feature of 'helm list'? //f.BoolVar(&list.superseded, "history", true, "show historical releases") @@ -145,6 +147,9 @@ func (l *listCmd) run() error { if l.byDate { sortBy = services.ListSort_LAST_RELEASED } + if l.byChartName { + sortBy = services.ListSort_CHART_NAME + } sortOrder := services.ListSort_ASC if l.sortDesc { diff --git a/docs/helm/helm_list.md b/docs/helm/helm_list.md index bf740239d71..5087c8a5902 100755 --- a/docs/helm/helm_list.md +++ b/docs/helm/helm_list.md @@ -39,6 +39,7 @@ helm list [flags] [FILTER] ``` -a, --all show all releases, not just the ones marked DEPLOYED + -c, --chart-name sort by chart name --col-width uint specifies the max column width of output (default 60) -d, --date sort by release date --deleted show deleted releases @@ -77,4 +78,4 @@ helm list [flags] [FILTER] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 1-Sep-2018 diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index c0b9ab7d31b..044d54e9194 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -66,17 +66,20 @@ const ( ListSort_UNKNOWN ListSort_SortBy = 0 ListSort_NAME ListSort_SortBy = 1 ListSort_LAST_RELEASED ListSort_SortBy = 2 + ListSort_CHART_NAME ListSort_SortBy = 3 ) var ListSort_SortBy_name = map[int32]string{ 0: "UNKNOWN", 1: "NAME", 2: "LAST_RELEASED", + 3: "CHART_NAME", } var ListSort_SortBy_value = map[string]int32{ "UNKNOWN": 0, "NAME": 1, "LAST_RELEASED": 2, + "CHART_NAME": 3, } func (x ListSort_SortBy) String() string { @@ -110,7 +113,7 @@ func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescript // // Releases can be retrieved in chunks by setting limit and offset. // -// Releases can be sorted according to a few pre-determined sort stategies. +// Releases can be sorted according to a few pre-determined sort strategies. type ListReleasesRequest struct { // Limit is the maximum number of releases to be returned. Limit int64 `protobuf:"varint,1,opt,name=limit" json:"limit,omitempty"` @@ -609,9 +612,9 @@ type InstallReleaseRequest struct { Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` // DisableHooks causes the server to skip running any hooks for the install. DisableHooks bool `protobuf:"varint,5,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` - // Namepace is the kubernetes namespace of the release. + // Namespace is the kubernetes namespace of the release. Namespace string `protobuf:"bytes,6,opt,name=namespace" json:"namespace,omitempty"` - // ReuseName requests that Tiller re-uses a name, instead of erroring out. + // Reuse_name requests that Tiller re-uses a name, instead of erroring out. ReuseName bool `protobuf:"varint,7,opt,name=reuse_name,json=reuseName" json:"reuse_name,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. Timeout int64 `protobuf:"varint,8,opt,name=timeout" json:"timeout,omitempty"` @@ -1412,85 +1415,85 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1267 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x6e, 0xe3, 0x44, - 0x17, 0x6e, 0xe2, 0x7c, 0x9e, 0x74, 0xf3, 0x66, 0x67, 0xb3, 0xad, 0xeb, 0x77, 0x41, 0xc1, 0x08, - 0x36, 0xbb, 0xb0, 0x29, 0x04, 0xfe, 0x20, 0x21, 0xa4, 0x6e, 0x36, 0x6a, 0x0b, 0xa5, 0x2b, 0x39, - 0xdb, 0x45, 0x42, 0x40, 0xe4, 0x26, 0x93, 0xd6, 0xac, 0x63, 0x07, 0xcf, 0xb8, 0x6c, 0x2f, 0x00, - 0x24, 0xee, 0x83, 0x0b, 0xe1, 0x3e, 0xb8, 0x0e, 0xfe, 0x23, 0xcf, 0x87, 0xeb, 0x71, 0xec, 0xd4, - 0xf4, 0x4f, 0xe3, 0x99, 0x73, 0xe6, 0x7c, 0x3c, 0xcf, 0x9c, 0x33, 0xa7, 0x60, 0x5c, 0xda, 0x2b, - 0x67, 0x9f, 0xe0, 0xe0, 0xca, 0x99, 0x61, 0xb2, 0x4f, 0x1d, 0xd7, 0xc5, 0xc1, 0x60, 0x15, 0xf8, - 0xd4, 0x47, 0xdd, 0x48, 0x36, 0x90, 0xb2, 0x01, 0x97, 0x19, 0x3b, 0xec, 0xc4, 0xec, 0xd2, 0x0e, - 0x28, 0xff, 0xcb, 0xb5, 0x8d, 0xdd, 0xe4, 0xbe, 0xef, 0x2d, 0x9c, 0x0b, 0x21, 0xe0, 0x2e, 0x02, - 0xec, 0x62, 0x9b, 0x60, 0xf9, 0xab, 0x1c, 0x92, 0x32, 0xc7, 0x5b, 0xf8, 0x42, 0xf0, 0x7f, 0x45, - 0x40, 0x31, 0xa1, 0xd3, 0x20, 0xf4, 0x84, 0x70, 0x4f, 0x11, 0x12, 0x6a, 0xd3, 0x90, 0x28, 0xce, - 0xae, 0x70, 0x40, 0x1c, 0xdf, 0x93, 0xbf, 0x5c, 0x66, 0xfe, 0x55, 0x86, 0x07, 0x27, 0x0e, 0xa1, - 0x16, 0x3f, 0x48, 0x2c, 0xfc, 0x4b, 0x88, 0x09, 0x45, 0x5d, 0xa8, 0xba, 0xce, 0xd2, 0xa1, 0x7a, - 0xa9, 0x57, 0xea, 0x6b, 0x16, 0x5f, 0xa0, 0x1d, 0xa8, 0xf9, 0x8b, 0x05, 0xc1, 0x54, 0x2f, 0xf7, - 0x4a, 0xfd, 0xa6, 0x25, 0x56, 0xe8, 0x2b, 0xa8, 0x13, 0x3f, 0xa0, 0xd3, 0xf3, 0x6b, 0x5d, 0xeb, - 0x95, 0xfa, 0xed, 0xe1, 0x07, 0x83, 0x2c, 0x9c, 0x06, 0x91, 0xa7, 0x89, 0x1f, 0xd0, 0x41, 0xf4, - 0xe7, 0xf9, 0xb5, 0x55, 0x23, 0xec, 0x37, 0xb2, 0xbb, 0x70, 0x5c, 0x8a, 0x03, 0xbd, 0xc2, 0xed, - 0xf2, 0x15, 0x3a, 0x04, 0x60, 0x76, 0xfd, 0x60, 0x8e, 0x03, 0xbd, 0xca, 0x4c, 0xf7, 0x0b, 0x98, - 0x7e, 0x19, 0xe9, 0x5b, 0x4d, 0x22, 0x3f, 0xd1, 0x97, 0xb0, 0xcd, 0x21, 0x99, 0xce, 0xfc, 0x39, - 0x26, 0x7a, 0xad, 0xa7, 0xf5, 0xdb, 0xc3, 0x3d, 0x6e, 0x4a, 0xc2, 0x3f, 0xe1, 0xa0, 0x8d, 0xfc, - 0x39, 0xb6, 0x5a, 0x5c, 0x3d, 0xfa, 0x26, 0xe8, 0x11, 0x34, 0x3d, 0x7b, 0x89, 0xc9, 0xca, 0x9e, - 0x61, 0xbd, 0xce, 0x22, 0xbc, 0xd9, 0x30, 0x7f, 0x82, 0x86, 0x74, 0x6e, 0x0e, 0xa1, 0xc6, 0x53, - 0x43, 0x2d, 0xa8, 0x9f, 0x9d, 0x7e, 0x73, 0xfa, 0xf2, 0xbb, 0xd3, 0xce, 0x16, 0x6a, 0x40, 0xe5, - 0xf4, 0xe0, 0xdb, 0x71, 0xa7, 0x84, 0xee, 0xc3, 0xbd, 0x93, 0x83, 0xc9, 0xab, 0xa9, 0x35, 0x3e, - 0x19, 0x1f, 0x4c, 0xc6, 0x2f, 0x3a, 0x65, 0xf3, 0x5d, 0x68, 0xc6, 0x31, 0xa3, 0x3a, 0x68, 0x07, - 0x93, 0x11, 0x3f, 0xf2, 0x62, 0x3c, 0x19, 0x75, 0x4a, 0xe6, 0x1f, 0x25, 0xe8, 0xaa, 0x14, 0x91, - 0x95, 0xef, 0x11, 0x1c, 0x71, 0x34, 0xf3, 0x43, 0x2f, 0xe6, 0x88, 0x2d, 0x10, 0x82, 0x8a, 0x87, - 0xdf, 0x4a, 0x86, 0xd8, 0x77, 0xa4, 0x49, 0x7d, 0x6a, 0xbb, 0x8c, 0x1d, 0xcd, 0xe2, 0x0b, 0xf4, - 0x29, 0x34, 0x44, 0xea, 0x44, 0xaf, 0xf4, 0xb4, 0x7e, 0x6b, 0xf8, 0x50, 0x05, 0x44, 0x78, 0xb4, - 0x62, 0x35, 0xf3, 0x10, 0x76, 0x0f, 0xb1, 0x8c, 0x84, 0xe3, 0x25, 0x6f, 0x4c, 0xe4, 0xd7, 0x5e, - 0x62, 0x16, 0x4c, 0xe4, 0xd7, 0x5e, 0x62, 0xa4, 0x43, 0x5d, 0x5c, 0x37, 0x16, 0x4e, 0xd5, 0x92, - 0x4b, 0x93, 0x82, 0xbe, 0x6e, 0x48, 0xe4, 0x95, 0x65, 0xe9, 0x43, 0xa8, 0x44, 0x95, 0xc0, 0xcc, - 0xb4, 0x86, 0x48, 0x8d, 0xf3, 0xd8, 0x5b, 0xf8, 0x16, 0x93, 0xab, 0x54, 0x69, 0x69, 0xaa, 0x8e, - 0x92, 0x5e, 0x47, 0xbe, 0x47, 0xb1, 0x47, 0xef, 0x16, 0xff, 0x09, 0xec, 0x65, 0x58, 0x12, 0x09, - 0xec, 0x43, 0x5d, 0x84, 0xc6, 0xac, 0xe5, 0xe2, 0x2a, 0xb5, 0xcc, 0xdf, 0x34, 0xe8, 0x9e, 0xad, - 0xe6, 0x36, 0xc5, 0x52, 0xb4, 0x21, 0xa8, 0xc7, 0x50, 0x65, 0x1d, 0x45, 0x60, 0x71, 0x9f, 0xdb, - 0xe6, 0x6d, 0x67, 0x14, 0xfd, 0xb5, 0xb8, 0x1c, 0x3d, 0x85, 0xda, 0x95, 0xed, 0x86, 0x98, 0x30, - 0x20, 0x62, 0xd4, 0x84, 0x26, 0x6b, 0x47, 0x96, 0xd0, 0x40, 0xbb, 0x50, 0x9f, 0x07, 0xd7, 0x51, - 0x3f, 0x61, 0x25, 0xd8, 0xb0, 0x6a, 0xf3, 0xe0, 0xda, 0x0a, 0x3d, 0xf4, 0x3e, 0xdc, 0x9b, 0x3b, - 0xc4, 0x3e, 0x77, 0xf1, 0xf4, 0xd2, 0xf7, 0xdf, 0x10, 0x56, 0x85, 0x0d, 0x6b, 0x5b, 0x6c, 0x1e, - 0x45, 0x7b, 0xc8, 0x88, 0x6e, 0xd2, 0x2c, 0xc0, 0x36, 0xc5, 0x7a, 0x8d, 0xc9, 0xe3, 0x75, 0x84, - 0x21, 0x75, 0x96, 0xd8, 0x0f, 0x29, 0x2b, 0x1d, 0xcd, 0x92, 0x4b, 0xf4, 0x1e, 0x6c, 0x07, 0x98, - 0x60, 0x3a, 0x15, 0x51, 0x36, 0xd8, 0xc9, 0x16, 0xdb, 0x7b, 0xcd, 0xc3, 0x42, 0x50, 0xf9, 0xd5, - 0x76, 0xa8, 0xde, 0x64, 0x22, 0xf6, 0xcd, 0x8f, 0x85, 0x04, 0xcb, 0x63, 0x20, 0x8f, 0x85, 0x04, - 0x8b, 0x63, 0x5d, 0xa8, 0x2e, 0xfc, 0x60, 0x86, 0xf5, 0x16, 0x93, 0xf1, 0x05, 0xea, 0x41, 0x6b, - 0x8e, 0xc9, 0x2c, 0x70, 0x56, 0x34, 0x62, 0x74, 0x9b, 0x61, 0x9a, 0xdc, 0x32, 0x8f, 0xe0, 0x61, - 0x8a, 0x86, 0xbb, 0x32, 0xfa, 0x7b, 0x19, 0x76, 0x2c, 0xdf, 0x75, 0xcf, 0xed, 0xd9, 0x9b, 0x02, - 0x9c, 0x26, 0xe0, 0x2f, 0x6f, 0x86, 0x5f, 0xcb, 0x80, 0x3f, 0x71, 0x4d, 0x2b, 0xca, 0x35, 0x55, - 0x88, 0xa9, 0xe6, 0x13, 0x53, 0x53, 0x89, 0x91, 0xa8, 0xd7, 0x13, 0xa8, 0xc7, 0x90, 0x36, 0x36, - 0x40, 0xda, 0x5c, 0x87, 0xf4, 0x6b, 0xd8, 0x5d, 0xc3, 0xe1, 0xae, 0xa0, 0xfe, 0x53, 0x86, 0x87, - 0xc7, 0x1e, 0xa1, 0xb6, 0xeb, 0xa6, 0x30, 0x8d, 0x6b, 0xa2, 0x54, 0xb8, 0x26, 0xca, 0xff, 0xa5, - 0x26, 0x34, 0x85, 0x14, 0xc9, 0x60, 0x25, 0xc1, 0x60, 0xa1, 0x3a, 0x51, 0xba, 0x53, 0x2d, 0xd5, - 0x9d, 0xd0, 0x3b, 0x00, 0xfc, 0x62, 0x33, 0xe3, 0x1c, 0xfc, 0x26, 0xdb, 0x39, 0x15, 0xcd, 0x48, - 0xf2, 0xd5, 0xc8, 0xe6, 0x2b, 0x59, 0x25, 0x7d, 0xe8, 0xc8, 0x78, 0x66, 0xc1, 0x9c, 0xc5, 0x24, - 0x2a, 0xa5, 0x2d, 0xf6, 0x47, 0xc1, 0x3c, 0x8a, 0x2a, 0xcd, 0x61, 0x6b, 0x9d, 0xc3, 0x63, 0xd8, - 0x49, 0xc3, 0x7e, 0x57, 0x0a, 0xff, 0x2c, 0xc1, 0xee, 0x99, 0xe7, 0x64, 0x92, 0x98, 0x55, 0x18, - 0x6b, 0xb0, 0x96, 0x33, 0x60, 0xed, 0x42, 0x75, 0x15, 0x06, 0x17, 0x58, 0xd0, 0xc4, 0x17, 0x49, - 0xbc, 0x2a, 0x2a, 0x5e, 0xa9, 0x8c, 0xab, 0xeb, 0x19, 0x4f, 0x41, 0x5f, 0x8f, 0xf2, 0x8e, 0x39, - 0x47, 0x79, 0xc5, 0x6f, 0x57, 0x93, 0xbf, 0x53, 0xe6, 0x03, 0xb8, 0x7f, 0x88, 0xe9, 0x6b, 0x5e, - 0xa6, 0x02, 0x00, 0x73, 0x0c, 0x28, 0xb9, 0x79, 0xe3, 0x4f, 0x6c, 0xa9, 0xfe, 0xe4, 0x20, 0x27, - 0xf5, 0xa5, 0x96, 0xf9, 0x05, 0xb3, 0x7d, 0xe4, 0x10, 0xea, 0x07, 0xd7, 0x9b, 0xc0, 0xed, 0x80, - 0xb6, 0xb4, 0xdf, 0x8a, 0xa7, 0x2d, 0xfa, 0x34, 0x0f, 0x59, 0x04, 0xf1, 0x51, 0x11, 0x41, 0x72, - 0x50, 0x28, 0x15, 0x1b, 0x14, 0x7e, 0x00, 0xf4, 0x0a, 0xc7, 0x33, 0xcb, 0x2d, 0x6f, 0xac, 0xa4, - 0xa9, 0xac, 0xd2, 0xa4, 0x43, 0x7d, 0xe6, 0x62, 0xdb, 0x0b, 0x57, 0x82, 0x58, 0xb9, 0x34, 0x7f, - 0x84, 0x07, 0x8a, 0x75, 0x11, 0x67, 0x94, 0x0f, 0xb9, 0x10, 0xd6, 0xa3, 0x4f, 0xf4, 0x39, 0xd4, - 0xf8, 0x20, 0xc7, 0x6c, 0xb7, 0x87, 0x8f, 0xd4, 0xb8, 0x99, 0x91, 0xd0, 0x13, 0x93, 0x9f, 0x25, - 0x74, 0x87, 0x7f, 0x37, 0xa0, 0x2d, 0x47, 0x13, 0x3e, 0x66, 0x22, 0x07, 0xb6, 0x93, 0x33, 0x18, - 0x7a, 0x92, 0x3f, 0x85, 0xa6, 0x46, 0x69, 0xe3, 0x69, 0x11, 0x55, 0x9e, 0x81, 0xb9, 0xf5, 0x49, - 0x09, 0x11, 0xe8, 0xa4, 0x47, 0x23, 0xf4, 0x2c, 0xdb, 0x46, 0xce, 0x2c, 0x66, 0x0c, 0x8a, 0xaa, - 0x4b, 0xb7, 0xe8, 0x8a, 0xdd, 0x19, 0x75, 0x9e, 0x41, 0xb7, 0x9a, 0x51, 0x47, 0x28, 0x63, 0xbf, - 0xb0, 0x7e, 0xec, 0xf7, 0x67, 0xb8, 0xa7, 0xbc, 0xb8, 0x28, 0x07, 0xad, 0xac, 0xe9, 0xc8, 0xf8, - 0xa8, 0x90, 0x6e, 0xec, 0x6b, 0x09, 0x6d, 0xb5, 0x8d, 0xa1, 0x1c, 0x03, 0x99, 0x6f, 0x8c, 0xf1, - 0x71, 0x31, 0xe5, 0xd8, 0x1d, 0x81, 0x4e, 0xba, 0x87, 0xe4, 0xf1, 0x98, 0xd3, 0x11, 0xf3, 0x78, - 0xcc, 0x6b, 0x4d, 0xe6, 0x16, 0xb2, 0x01, 0x6e, 0x5a, 0x08, 0x7a, 0x9c, 0x4b, 0x88, 0xda, 0x79, - 0x8c, 0xfe, 0xed, 0x8a, 0xb1, 0x8b, 0x15, 0xfc, 0x2f, 0xf5, 0xa2, 0xa3, 0x1c, 0x68, 0xb2, 0x07, - 0x20, 0xe3, 0x59, 0x41, 0xed, 0x54, 0x52, 0xa2, 0x2b, 0x6d, 0x48, 0x4a, 0x6d, 0x79, 0x1b, 0x92, - 0x4a, 0x35, 0x38, 0x73, 0x0b, 0x39, 0xd0, 0xb6, 0x42, 0x4f, 0xb8, 0x8e, 0xda, 0x02, 0xca, 0x39, - 0xbd, 0xde, 0xd5, 0x8c, 0x27, 0x05, 0x34, 0x6f, 0xea, 0xfb, 0x39, 0x7c, 0xdf, 0x90, 0xaa, 0xe7, - 0x35, 0xf6, 0x5f, 0xf8, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x9d, 0x73, 0x4f, 0x4d, 0x73, - 0x10, 0x00, 0x00, + // 1276 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0x44, + 0x14, 0x6e, 0xe2, 0xfc, 0x9e, 0x74, 0x43, 0x76, 0x36, 0xdb, 0x7a, 0xcd, 0x82, 0x82, 0x11, 0x6c, + 0x76, 0x61, 0x53, 0x08, 0xdc, 0x20, 0x21, 0xa4, 0x6e, 0x36, 0x6a, 0x0b, 0xa5, 0x2b, 0x39, 0xed, + 0x22, 0x21, 0x50, 0xe4, 0x26, 0x93, 0xd6, 0xac, 0x63, 0x07, 0xcf, 0xb8, 0x6c, 0x1f, 0x00, 0x24, + 0xde, 0x83, 0x07, 0xe1, 0x3d, 0x78, 0x0e, 0xee, 0x91, 0xe7, 0xc7, 0xf5, 0x38, 0x76, 0x6a, 0x7a, + 0xd3, 0x78, 0xe6, 0x9c, 0x39, 0x3f, 0xdf, 0x37, 0xe7, 0xcc, 0x29, 0x18, 0x97, 0xf6, 0xca, 0xd9, + 0x23, 0x38, 0xb8, 0x72, 0x66, 0x98, 0xec, 0x51, 0xc7, 0x75, 0x71, 0x30, 0x58, 0x05, 0x3e, 0xf5, + 0x51, 0x37, 0x92, 0x0d, 0xa4, 0x6c, 0xc0, 0x65, 0xc6, 0x0e, 0x3b, 0x31, 0xbb, 0xb4, 0x03, 0xca, + 0xff, 0x72, 0x6d, 0x63, 0x37, 0xb9, 0xef, 0x7b, 0x0b, 0xe7, 0x42, 0x08, 0xb8, 0x8b, 0x00, 0xbb, + 0xd8, 0x26, 0x58, 0xfe, 0x2a, 0x87, 0xa4, 0xcc, 0xf1, 0x16, 0xbe, 0x10, 0xbc, 0xab, 0x08, 0x28, + 0x26, 0x74, 0x1a, 0x84, 0x9e, 0x10, 0x3e, 0x52, 0x84, 0x84, 0xda, 0x34, 0x24, 0x8a, 0xb3, 0x2b, + 0x1c, 0x10, 0xc7, 0xf7, 0xe4, 0x2f, 0x97, 0x99, 0x7f, 0x97, 0xe1, 0xc1, 0xb1, 0x43, 0xa8, 0xc5, + 0x0f, 0x12, 0x0b, 0xff, 0x1a, 0x62, 0x42, 0x51, 0x17, 0xaa, 0xae, 0xb3, 0x74, 0xa8, 0x5e, 0xea, + 0x95, 0xfa, 0x9a, 0xc5, 0x17, 0x68, 0x07, 0x6a, 0xfe, 0x62, 0x41, 0x30, 0xd5, 0xcb, 0xbd, 0x52, + 0xbf, 0x69, 0x89, 0x15, 0xfa, 0x06, 0xea, 0xc4, 0x0f, 0xe8, 0xf4, 0xfc, 0x5a, 0xd7, 0x7a, 0xa5, + 0x7e, 0x7b, 0xf8, 0xd1, 0x20, 0x0b, 0xa7, 0x41, 0xe4, 0x69, 0xe2, 0x07, 0x74, 0x10, 0xfd, 0x79, + 0x71, 0x6d, 0xd5, 0x08, 0xfb, 0x8d, 0xec, 0x2e, 0x1c, 0x97, 0xe2, 0x40, 0xaf, 0x70, 0xbb, 0x7c, + 0x85, 0x0e, 0x00, 0x98, 0x5d, 0x3f, 0x98, 0xe3, 0x40, 0xaf, 0x32, 0xd3, 0xfd, 0x02, 0xa6, 0x5f, + 0x45, 0xfa, 0x56, 0x93, 0xc8, 0x4f, 0xf4, 0x35, 0x6c, 0x73, 0x48, 0xa6, 0x33, 0x7f, 0x8e, 0x89, + 0x5e, 0xeb, 0x69, 0xfd, 0xf6, 0xf0, 0x11, 0x37, 0x25, 0xe1, 0x9f, 0x70, 0xd0, 0x46, 0xfe, 0x1c, + 0x5b, 0x2d, 0xae, 0x1e, 0x7d, 0x13, 0xf4, 0x18, 0x9a, 0x9e, 0xbd, 0xc4, 0x64, 0x65, 0xcf, 0xb0, + 0x5e, 0x67, 0x11, 0xde, 0x6c, 0x98, 0x1e, 0x34, 0xa4, 0x73, 0xf3, 0x05, 0xd4, 0x78, 0x6a, 0xa8, + 0x05, 0xf5, 0xb3, 0x93, 0xef, 0x4e, 0x5e, 0xfd, 0x70, 0xd2, 0xd9, 0x42, 0x0d, 0xa8, 0x9c, 0xec, + 0x7f, 0x3f, 0xee, 0x94, 0xd0, 0x7d, 0xb8, 0x77, 0xbc, 0x3f, 0x39, 0x9d, 0x5a, 0xe3, 0xe3, 0xf1, + 0xfe, 0x64, 0xfc, 0xb2, 0x53, 0x46, 0x6d, 0x80, 0xd1, 0xe1, 0xbe, 0x75, 0x3a, 0x65, 0x2a, 0x9a, + 0xf9, 0x3e, 0x34, 0xe3, 0x1c, 0x50, 0x1d, 0xb4, 0xfd, 0xc9, 0x88, 0x9b, 0x78, 0x39, 0x9e, 0x8c, + 0x3a, 0x25, 0xf3, 0xcf, 0x12, 0x74, 0x55, 0xca, 0xc8, 0xca, 0xf7, 0x08, 0x8e, 0x38, 0x9b, 0xf9, + 0xa1, 0x17, 0x73, 0xc6, 0x16, 0x08, 0x41, 0xc5, 0xc3, 0x6f, 0x25, 0x63, 0xec, 0x3b, 0xd2, 0xa4, + 0x3e, 0xb5, 0x5d, 0xc6, 0x96, 0x66, 0xf1, 0x05, 0xfa, 0x1c, 0x1a, 0x02, 0x0a, 0xa2, 0x57, 0x7a, + 0x5a, 0xbf, 0x35, 0x7c, 0xa8, 0x02, 0x24, 0x3c, 0x5a, 0xb1, 0x9a, 0x79, 0x00, 0xbb, 0x07, 0x58, + 0x46, 0xc2, 0xf1, 0x93, 0x37, 0x28, 0xf2, 0x6b, 0x2f, 0x31, 0x0b, 0x26, 0xf2, 0x6b, 0x2f, 0x31, + 0xd2, 0xa1, 0x2e, 0xae, 0x1f, 0x0b, 0xa7, 0x6a, 0xc9, 0xa5, 0x49, 0x41, 0x5f, 0x37, 0x24, 0xf2, + 0xca, 0xb2, 0xf4, 0x31, 0x54, 0xa2, 0xca, 0x60, 0x66, 0x5a, 0x43, 0xa4, 0xc6, 0x79, 0xe4, 0x2d, + 0x7c, 0x8b, 0xc9, 0x55, 0xea, 0xb4, 0x34, 0x75, 0x87, 0x49, 0xaf, 0x23, 0xdf, 0xa3, 0xd8, 0xa3, + 0x77, 0x8b, 0xff, 0x18, 0x1e, 0x65, 0x58, 0x12, 0x09, 0xec, 0x41, 0x5d, 0x84, 0xc6, 0xac, 0xe5, + 0xe2, 0x2a, 0xb5, 0xcc, 0xdf, 0x35, 0xe8, 0x9e, 0xad, 0xe6, 0x36, 0xc5, 0x52, 0xb4, 0x21, 0xa8, + 0x27, 0x50, 0x65, 0x1d, 0x46, 0x60, 0x71, 0x9f, 0xdb, 0xe6, 0x6d, 0x68, 0x14, 0xfd, 0xb5, 0xb8, + 0x1c, 0x3d, 0x83, 0xda, 0x95, 0xed, 0x86, 0x98, 0x30, 0x20, 0x62, 0xd4, 0x84, 0x26, 0x6b, 0x4f, + 0x96, 0xd0, 0x40, 0xbb, 0x50, 0x9f, 0x07, 0xd7, 0x51, 0x7f, 0x61, 0x25, 0xd9, 0xb0, 0x6a, 0xf3, + 0xe0, 0xda, 0x0a, 0x3d, 0xf4, 0x21, 0xdc, 0x9b, 0x3b, 0xc4, 0x3e, 0x77, 0xf1, 0xf4, 0xd2, 0xf7, + 0xdf, 0x10, 0x56, 0x95, 0x0d, 0x6b, 0x5b, 0x6c, 0x1e, 0x46, 0x7b, 0xc8, 0x88, 0x6e, 0xd2, 0x2c, + 0xc0, 0x36, 0xc5, 0x7a, 0x8d, 0xc9, 0xe3, 0x75, 0x84, 0x21, 0x75, 0x96, 0xd8, 0x0f, 0x29, 0x2b, + 0x25, 0xcd, 0x92, 0x4b, 0xf4, 0x01, 0x6c, 0x07, 0x98, 0x60, 0x3a, 0x15, 0x51, 0x36, 0xd8, 0xc9, + 0x16, 0xdb, 0x7b, 0xcd, 0xc3, 0x42, 0x50, 0xf9, 0xcd, 0x76, 0xa8, 0xde, 0x64, 0x22, 0xf6, 0xcd, + 0x8f, 0x85, 0x04, 0xcb, 0x63, 0x20, 0x8f, 0x85, 0x04, 0x8b, 0x63, 0x5d, 0xa8, 0x2e, 0xfc, 0x60, + 0x86, 0xf5, 0x16, 0x93, 0xf1, 0x05, 0xea, 0x41, 0x6b, 0x8e, 0xc9, 0x2c, 0x70, 0x56, 0x34, 0x62, + 0x74, 0x9b, 0x61, 0x9a, 0xdc, 0x32, 0x0f, 0xe1, 0x61, 0x8a, 0x86, 0xbb, 0x32, 0xfa, 0x47, 0x19, + 0x76, 0x2c, 0xdf, 0x75, 0xcf, 0xed, 0xd9, 0x9b, 0x02, 0x9c, 0x26, 0xe0, 0x2f, 0x6f, 0x86, 0x5f, + 0xcb, 0x80, 0x3f, 0x71, 0x4d, 0x2b, 0xca, 0x35, 0x55, 0x88, 0xa9, 0xe6, 0x13, 0x53, 0x53, 0x89, + 0x91, 0xa8, 0xd7, 0x13, 0xa8, 0xc7, 0x90, 0x36, 0x36, 0x40, 0xda, 0x5c, 0x87, 0xf4, 0x5b, 0xd8, + 0x5d, 0xc3, 0xe1, 0xae, 0xa0, 0xfe, 0x5b, 0x86, 0x87, 0x47, 0x1e, 0xa1, 0xb6, 0xeb, 0xa6, 0x30, + 0x8d, 0x6b, 0xa2, 0x54, 0xb8, 0x26, 0xca, 0xff, 0xa7, 0x26, 0x34, 0x85, 0x14, 0xc9, 0x60, 0x25, + 0xc1, 0x60, 0xa1, 0x3a, 0x51, 0xba, 0x53, 0x2d, 0xd5, 0x9d, 0xd0, 0x7b, 0x00, 0xfc, 0x62, 0x33, + 0xe3, 0x1c, 0xfc, 0x26, 0xdb, 0x39, 0x11, 0xcd, 0x48, 0xf2, 0xd5, 0xc8, 0xe6, 0x2b, 0x59, 0x25, + 0x7d, 0xe8, 0xc8, 0x78, 0x66, 0xc1, 0x9c, 0xc5, 0x24, 0x2a, 0xa5, 0x2d, 0xf6, 0x47, 0xc1, 0x3c, + 0x8a, 0x2a, 0xcd, 0x61, 0x6b, 0x9d, 0xc3, 0x23, 0xd8, 0x49, 0xc3, 0x7e, 0x57, 0x0a, 0xff, 0x2a, + 0xc1, 0xee, 0x99, 0xe7, 0x64, 0x92, 0x98, 0x55, 0x18, 0x6b, 0xb0, 0x96, 0x33, 0x60, 0xed, 0x42, + 0x75, 0x15, 0x06, 0x17, 0x58, 0xd0, 0xc4, 0x17, 0x49, 0xbc, 0x2a, 0x2a, 0x5e, 0xa9, 0x8c, 0xab, + 0xeb, 0x19, 0x4f, 0x41, 0x5f, 0x8f, 0xf2, 0x8e, 0x39, 0x47, 0x79, 0xc5, 0x6f, 0x57, 0x93, 0xbf, + 0x53, 0xe6, 0x03, 0xb8, 0x7f, 0x80, 0xe9, 0x6b, 0x5e, 0xa6, 0x02, 0x00, 0x73, 0x0c, 0x28, 0xb9, + 0x79, 0xe3, 0x4f, 0x6c, 0xa9, 0xfe, 0xe4, 0x60, 0x27, 0xf5, 0xa5, 0x96, 0xf9, 0x15, 0xb3, 0x7d, + 0xe8, 0x10, 0xea, 0x07, 0xd7, 0x9b, 0xc0, 0xed, 0x80, 0xb6, 0xb4, 0xdf, 0x8a, 0xa7, 0x2d, 0xfa, + 0x34, 0x0f, 0x58, 0x04, 0xf1, 0x51, 0x11, 0x41, 0x72, 0x50, 0x28, 0x15, 0x1b, 0x14, 0x7e, 0x02, + 0x74, 0x8a, 0xe3, 0x99, 0xe5, 0x96, 0x37, 0x56, 0xd2, 0x54, 0x56, 0x69, 0xd2, 0xa1, 0x3e, 0x73, + 0xb1, 0xed, 0x85, 0x2b, 0x41, 0xac, 0x5c, 0x9a, 0x3f, 0xc3, 0x03, 0xc5, 0xba, 0x88, 0x33, 0xca, + 0x87, 0x5c, 0x08, 0xeb, 0xd1, 0x27, 0xfa, 0x12, 0x6a, 0x7c, 0xb0, 0x63, 0xb6, 0xdb, 0xc3, 0xc7, + 0x6a, 0xdc, 0xcc, 0x48, 0xe8, 0x89, 0x49, 0xd0, 0x12, 0xba, 0xc3, 0x7f, 0x1a, 0xd0, 0x96, 0xa3, + 0x09, 0x1f, 0x3b, 0x91, 0x03, 0xdb, 0xc9, 0x19, 0x0c, 0x3d, 0xcd, 0x9f, 0x4a, 0x53, 0xa3, 0xb5, + 0xf1, 0xac, 0x88, 0x2a, 0xcf, 0xc0, 0xdc, 0xfa, 0xac, 0x84, 0x08, 0x74, 0xd2, 0xa3, 0x11, 0x7a, + 0x9e, 0x6d, 0x23, 0x67, 0x16, 0x33, 0x06, 0x45, 0xd5, 0xa5, 0x5b, 0x74, 0xc5, 0xee, 0x8c, 0x3a, + 0xcf, 0xa0, 0x5b, 0xcd, 0xa8, 0x23, 0x94, 0xb1, 0x57, 0x58, 0x3f, 0xf6, 0xfb, 0x0b, 0xdc, 0x53, + 0x5e, 0x5c, 0x94, 0x83, 0x56, 0xd6, 0x74, 0x64, 0x7c, 0x52, 0x48, 0x37, 0xf6, 0xb5, 0x84, 0xb6, + 0xda, 0xc6, 0x50, 0x8e, 0x81, 0xcc, 0x37, 0xc6, 0xf8, 0xb4, 0x98, 0x72, 0xec, 0x8e, 0x40, 0x27, + 0xdd, 0x43, 0xf2, 0x78, 0xcc, 0xe9, 0x88, 0x79, 0x3c, 0xe6, 0xb5, 0x26, 0x73, 0x0b, 0xd9, 0x00, + 0x37, 0x2d, 0x04, 0x3d, 0xc9, 0x25, 0x44, 0xed, 0x3c, 0x46, 0xff, 0x76, 0xc5, 0xd8, 0xc5, 0x0a, + 0xde, 0x49, 0xbd, 0xe8, 0x28, 0x07, 0x9a, 0xec, 0x01, 0xc8, 0x78, 0x5e, 0x50, 0x3b, 0x95, 0x94, + 0xe8, 0x4a, 0x1b, 0x92, 0x52, 0x5b, 0xde, 0x86, 0xa4, 0x52, 0x0d, 0xce, 0xdc, 0x42, 0x0e, 0xb4, + 0xad, 0xd0, 0x13, 0xae, 0xa3, 0xb6, 0x80, 0x72, 0x4e, 0xaf, 0x77, 0x35, 0xe3, 0x69, 0x01, 0xcd, + 0x9b, 0xfa, 0x7e, 0x01, 0x3f, 0x36, 0xa4, 0xea, 0x79, 0x8d, 0xfd, 0x57, 0xfe, 0xc5, 0x7f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x38, 0x07, 0x4c, 0x12, 0x83, 0x10, 0x00, 0x00, } diff --git a/pkg/releaseutil/sorter.go b/pkg/releaseutil/sorter.go index 1a13298b0bc..977f4939899 100644 --- a/pkg/releaseutil/sorter.go +++ b/pkg/releaseutil/sorter.go @@ -75,3 +75,26 @@ func SortByRevision(list []*rspb.Release) { } sort.Sort(s) } + +// SortByChartName sorts the list of releases by a +// release's chart name in lexicographical order. +func SortByChartName(list []*rspb.Release) { + s := &sorter{list: list} + s.less = func(i, j int) bool { + chi := s.list[i].Chart + chj := s.list[j].Chart + + ni := "" + if chi != nil && chi.Metadata != nil { + ni = chi.Metadata.Name + } + + nj := "" + if chj != nil && chj.Metadata != nil { + nj = chj.Metadata.Name + } + + return ni < nj + } + sort.Sort(s) +} diff --git a/pkg/releaseutil/sorter_test.go b/pkg/releaseutil/sorter_test.go index a3323bd9614..4b784c0a0c5 100644 --- a/pkg/releaseutil/sorter_test.go +++ b/pkg/releaseutil/sorter_test.go @@ -20,6 +20,7 @@ import ( "testing" "time" + "k8s.io/helm/pkg/proto/hapi/chart" rspb "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/timeconv" ) @@ -40,6 +41,11 @@ func tsRelease(name string, vers int32, dur time.Duration, code rspb.Status_Code Name: name, Version: vers, Info: info, + Chart: &chart.Chart{ + Metadata: &chart.Metadata{ + Name: name, + }, + }, } } @@ -80,3 +86,13 @@ func TestSortByRevision(t *testing.T) { return vi < vj }) } + +func TestSortByChartName(t *testing.T) { + SortByChartName(releases) + + check(t, "ByChartName", func(i, j int) bool { + ni := releases[i].Chart.Metadata.Name + nj := releases[j].Chart.Metadata.Name + return ni < nj + }) +} diff --git a/pkg/tiller/release_list.go b/pkg/tiller/release_list.go index 3344888dcaa..89f7a110094 100644 --- a/pkg/tiller/release_list.go +++ b/pkg/tiller/release_list.go @@ -65,6 +65,8 @@ func (s *ReleaseServer) ListReleases(req *services.ListReleasesRequest, stream s relutil.SortByName(rels) case services.ListSort_LAST_RELEASED: relutil.SortByDate(rels) + case services.ListSort_CHART_NAME: + relutil.SortByChartName(rels) } if req.SortOrder == services.ListSort_DESC { diff --git a/pkg/tiller/release_list_test.go b/pkg/tiller/release_list_test.go index 7b0fe6830d2..b9ab6fe552a 100644 --- a/pkg/tiller/release_list_test.go +++ b/pkg/tiller/release_list_test.go @@ -20,6 +20,7 @@ import ( "fmt" "testing" + "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" ) @@ -147,6 +148,48 @@ func TestListReleasesSort(t *testing.T) { } } +func TestListReleasesSortByChartName(t *testing.T) { + rs := rsFixture() + + // Put them in by reverse order so that the mock doesn't "accidentally" + // sort. + num := 7 + for i := num; i > 0; i-- { + rel := releaseStub() + rel.Name = fmt.Sprintf("rel-%d", num-i) + rel.Chart = &chart.Chart{ + Metadata: &chart.Metadata{ + Name: fmt.Sprintf("chartName-%d", i), + }, + } + if err := rs.env.Releases.Create(rel); err != nil { + t.Fatalf("Could not store mock release: %s", err) + } + } + + limit := 6 + mrs := &mockListServer{} + req := &services.ListReleasesRequest{ + Offset: "", + Limit: int64(limit), + SortBy: services.ListSort_CHART_NAME, + } + if err := rs.ListReleases(req, mrs); err != nil { + t.Fatalf("Failed listing: %s", err) + } + + if len(mrs.val.Releases) != limit { + t.Errorf("Expected %d releases, got %d", limit, len(mrs.val.Releases)) + } + + for i := 0; i < limit; i++ { + n := fmt.Sprintf("chartName-%d", i+1) + if mrs.val.Releases[i].Chart.Metadata.Name != n { + t.Errorf("Expected %q, got %q", n, mrs.val.Releases[i].Chart.Metadata.Name) + } + } +} + func TestListReleasesFilter(t *testing.T) { rs := rsFixture() names := []string{ From 7f703f50a95a48ce960ccc83cb7ed6d1801588cb Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Thu, 17 May 2018 16:50:34 -0400 Subject: [PATCH 178/483] feat(helm): added new helm notes command to display notes provided by the chart of a release Signed-off-by: Arash Deshmeh --- cmd/helm/get.go | 1 + cmd/helm/get_notes.go | 77 +++++++++++++++++++++++++++++++++++++ cmd/helm/get_notes_test.go | 52 +++++++++++++++++++++++++ docs/helm/helm.md | 2 +- docs/helm/helm_get.md | 3 +- docs/helm/helm_get_notes.md | 44 +++++++++++++++++++++ 6 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 cmd/helm/get_notes.go create mode 100644 cmd/helm/get_notes_test.go create mode 100644 docs/helm/helm_get_notes.md diff --git a/cmd/helm/get.go b/cmd/helm/get.go index 5744beb62cc..4170a7cef19 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -75,6 +75,7 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { cmd.AddCommand(addFlagsTLS(newGetValuesCmd(nil, out))) cmd.AddCommand(addFlagsTLS(newGetManifestCmd(nil, out))) cmd.AddCommand(addFlagsTLS(newGetHooksCmd(nil, out))) + cmd.AddCommand(addFlagsTLS(newGetNotesCmd(nil, out))) return cmd } diff --git a/cmd/helm/get_notes.go b/cmd/helm/get_notes.go new file mode 100644 index 00000000000..5b1135ba519 --- /dev/null +++ b/cmd/helm/get_notes.go @@ -0,0 +1,77 @@ +/* +Copyright The Helm Authors. + +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 main + +import ( + "fmt" + "io" + + "github.com/spf13/cobra" + + "k8s.io/helm/pkg/helm" +) + +var getNotesHelp = ` +This command shows notes provided by the chart of a named release. +` + +type getNotesCmd struct { + release string + out io.Writer + client helm.Interface + version int32 +} + +func newGetNotesCmd(client helm.Interface, out io.Writer) *cobra.Command { + get := &getNotesCmd{ + out: out, + client: client, + } + + cmd := &cobra.Command{ + Use: "notes [flags] RELEASE_NAME", + Short: "displays the notes of the named release", + Long: getNotesHelp, + PreRunE: func(_ *cobra.Command, _ []string) error { return setupConnection() }, + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return errReleaseRequired + } + get.release = args[0] + if get.client == nil { + get.client = newClient() + } + return get.run() + }, + } + + cmd.PersistentFlags().Int32Var(&get.version, "revision", 0, "get the notes of the named release with revision") + + return cmd +} + +func (n *getNotesCmd) run() error { + res, err := n.client.ReleaseStatus(n.release, helm.StatusReleaseVersion(n.version)) + if err != nil { + return prettyError(err) + } + + if len(res.Info.Status.Notes) > 0 { + fmt.Fprintf(n.out, "NOTES:\n%s\n", res.Info.Status.Notes) + } + return nil +} diff --git a/cmd/helm/get_notes_test.go b/cmd/helm/get_notes_test.go new file mode 100644 index 00000000000..de655fef37d --- /dev/null +++ b/cmd/helm/get_notes_test.go @@ -0,0 +1,52 @@ +/* +Copyright The Helm Authors. + +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 main + +import ( + "io" + "testing" + + "github.com/spf13/cobra" + + "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/proto/hapi/release" +) + +func TestGetNotesCmd(t *testing.T) { + tests := []releaseCase{ + { + name: "get notes of a deployed release", + args: []string{"flummoxed-chickadee"}, + expected: "NOTES:\nrelease notes\n", + rels: []*release.Release{ + releaseMockWithStatus(&release.Status{ + Code: release.Status_DEPLOYED, + Notes: "release notes", + }), + }, + }, + { + name: "get notes requires release name arg", + err: true, + }, + } + + runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { + return newGetNotesCmd(c, out) + }) + +} diff --git a/docs/helm/helm.md b/docs/helm/helm.md index 67ac9a4a270..c1a11c4a3f5 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -70,4 +70,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 1-Sep-2018 diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index e7337b533f1..3b99c93d55d 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -51,6 +51,7 @@ helm get [flags] RELEASE_NAME * [helm](helm.md) - The Helm package manager for Kubernetes. * [helm get hooks](helm_get_hooks.md) - download all hooks for a named release * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release +* [helm get notes](helm_get_notes.md) - displays the notes of the named release * [helm get values](helm_get_values.md) - download the values file for a named release -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 1-Sep-2018 diff --git a/docs/helm/helm_get_notes.md b/docs/helm/helm_get_notes.md new file mode 100644 index 00000000000..076aaaa59cc --- /dev/null +++ b/docs/helm/helm_get_notes.md @@ -0,0 +1,44 @@ +## helm get notes + +displays the notes of the named release + +### Synopsis + + +This command shows notes provided by the chart of a named release. + + +``` +helm get notes [flags] RELEASE_NAME +``` + +### Options + +``` + -h, --help help for notes + --revision int32 get the notes of the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote +``` + +### Options inherited from parent commands + +``` + --debug enable verbose output + --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") + --host string address of Tiller. Overrides $HELM_HOST + --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use + --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) + --tiller-namespace string namespace of Tiller (default "kube-system") +``` + +### SEE ALSO + +* [helm get](helm_get.md) - download a named release + +###### Auto generated by spf13/cobra on 1-Sep-2018 From 2e9855b98ba0a04a4aa1576f3ed769b0dbd15c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6berl?= Date: Mon, 3 Sep 2018 15:57:41 +0200 Subject: [PATCH 179/483] Set proxy for all connections, fixes #4326 (#4579) Signed-off-by: Christian Koeberl --- pkg/getter/httpgetter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/getter/httpgetter.go b/pkg/getter/httpgetter.go index 4987e951abd..66ea8286322 100644 --- a/pkg/getter/httpgetter.go +++ b/pkg/getter/httpgetter.go @@ -83,6 +83,7 @@ func NewHTTPGetter(URL, CertFile, KeyFile, CAFile string) (*HttpGetter, error) { var client HttpGetter tr := &http.Transport{ DisableCompression: true, + Proxy: http.ProxyFromEnvironment, } if (CertFile != "" && KeyFile != "") || CAFile != "" { tlsConf, err := tlsutil.NewTLSConfig(URL, CertFile, KeyFile, CAFile) @@ -90,7 +91,6 @@ func NewHTTPGetter(URL, CertFile, KeyFile, CAFile string) (*HttpGetter, error) { return &client, fmt.Errorf("can't create TLS config: %s", err.Error()) } tr.TLSClientConfig = tlsConf - tr.Proxy = http.ProxyFromEnvironment } client.client = &http.Client{Transport: tr} return &client, nil From 37a731db798de00bf94837e207a8a418c76b6557 Mon Sep 17 00:00:00 2001 From: Fabian Ruff Date: Tue, 4 Sep 2018 20:19:33 +0200 Subject: [PATCH 180/483] Avoid importing k8s.io/kubernetes from pkg/helm (#4499) * Avoid importing k8s.io/kubernetes from pkg/helm When writing a helm client (e.g. a helm plugin) that talks to tiller importing k8s.io/helm/pkg/helm to get the grpc client is key. This pkg should not have a dependency to the k8s.io/kubernetes to avoid pulling in a lot of code that is only used within tiller and blow up binary sizes. Signed-off-by: Fabian Ruff * Add references to pull request in errors message Signed-off-by: Fabian Ruff * copy helper function from pkg/storage/driver Signed-off-by: Fabian Ruff * Move storage errors to seperate package Signed-off-by: Fabian Ruff * Keep old error variables for backward compatibility Signed-off-by: Fabian Ruff --- cmd/helm/upgrade.go | 4 ++-- pkg/helm/fake.go | 8 ++++---- pkg/helm/helm_test.go | 14 ++++++++++++++ pkg/storage/driver/cfgmaps.go | 9 +++++---- pkg/storage/driver/driver.go | 15 +++++++-------- pkg/storage/driver/memory.go | 15 ++++++++------- pkg/storage/driver/records.go | 3 ++- pkg/storage/driver/secrets.go | 9 +++++---- pkg/storage/errors/errors.go | 27 +++++++++++++++++++++++++++ 9 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 pkg/storage/errors/errors.go diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 1eeafec038a..8647a273732 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -26,7 +26,7 @@ import ( "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/renderutil" - "k8s.io/helm/pkg/storage/driver" + storageerrors "k8s.io/helm/pkg/storage/errors" ) const upgradeDesc = ` @@ -207,7 +207,7 @@ func (u *upgradeCmd) run() error { } } - if err != nil && strings.Contains(err.Error(), driver.ErrReleaseNotFound(u.release).Error()) { + if err != nil && strings.Contains(err.Error(), storageerrors.ErrReleaseNotFound(u.release).Error()) { fmt.Fprintf(u.out, "Release %q does not exist. Installing it now.\n", u.release) ic := &installCmd{ chartPath: chartPath, diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index ffb5b40c9c4..46be7d39875 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -31,7 +31,7 @@ import ( rls "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/proto/hapi/version" "k8s.io/helm/pkg/renderutil" - storage "k8s.io/helm/pkg/storage/driver" + storageerrors "k8s.io/helm/pkg/storage/errors" ) // FakeClient implements Interface @@ -138,7 +138,7 @@ func (c *FakeClient) DeleteRelease(rlsName string, opts ...DeleteOption) (*rls.U } } - return nil, storage.ErrReleaseNotFound(rlsName) + return nil, storageerrors.ErrReleaseNotFound(rlsName) } // GetVersion returns a fake version @@ -212,7 +212,7 @@ func (c *FakeClient) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.G }, nil } } - return nil, storage.ErrReleaseNotFound(rlsName) + return nil, storageerrors.ErrReleaseNotFound(rlsName) } // ReleaseContent returns the configuration for the matching release name in the fake release client. @@ -224,7 +224,7 @@ func (c *FakeClient) ReleaseContent(rlsName string, opts ...ContentOption) (resp }, nil } } - return resp, storage.ErrReleaseNotFound(rlsName) + return resp, storageerrors.ErrReleaseNotFound(rlsName) } // ReleaseHistory returns a release's revision history. diff --git a/pkg/helm/helm_test.go b/pkg/helm/helm_test.go index fe7150cc02f..7fb794f543b 100644 --- a/pkg/helm/helm_test.go +++ b/pkg/helm/helm_test.go @@ -18,8 +18,10 @@ package helm // import "k8s.io/helm/pkg/helm" import ( "errors" + "os/exec" "path/filepath" "reflect" + "strings" "testing" "github.com/golang/protobuf/proto" @@ -361,3 +363,15 @@ func loadChart(t *testing.T, name string) *cpb.Chart { } return c } + +func TestDoesNotImportKubernetes(t *testing.T) { + cmd := exec.Command("go", "list", "-f", "{{.Deps}}", ".") + output, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("Failed to execute %s %s: %s", cmd.Path, strings.Join(cmd.Args, " "), err) + } + + if strings.Contains(string(output), "k8s.io/kubernetes") { + t.Fatal("k8s.io/helm/pkg/helm contains a dependency on k8s.io/kubernetes. See https://github.com/helm/helm/pull/4499 for more details.") + } +} diff --git a/pkg/storage/driver/cfgmaps.go b/pkg/storage/driver/cfgmaps.go index 3f5ee204afd..a534b67acdf 100644 --- a/pkg/storage/driver/cfgmaps.go +++ b/pkg/storage/driver/cfgmaps.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" ) var _ Driver = (*ConfigMaps)(nil) @@ -65,7 +66,7 @@ func (cfgmaps *ConfigMaps) Get(key string) (*rspb.Release, error) { obj, err := cfgmaps.impl.Get(key, metav1.GetOptions{}) if err != nil { if apierrors.IsNotFound(err) { - return nil, ErrReleaseNotFound(key) + return nil, storageerrors.ErrReleaseNotFound(key) } cfgmaps.Log("get: failed to get %q: %s", key, err) @@ -131,7 +132,7 @@ func (cfgmaps *ConfigMaps) Query(labels map[string]string) ([]*rspb.Release, err } if len(list.Items) == 0 { - return nil, ErrReleaseNotFound(labels["NAME"]) + return nil, storageerrors.ErrReleaseNotFound(labels["NAME"]) } var results []*rspb.Release @@ -164,7 +165,7 @@ func (cfgmaps *ConfigMaps) Create(key string, rls *rspb.Release) error { // push the configmap object out into the kubiverse if _, err := cfgmaps.impl.Create(obj); err != nil { if apierrors.IsAlreadyExists(err) { - return ErrReleaseExists(key) + return storageerrors.ErrReleaseExists(key) } cfgmaps.Log("create: failed to create: %s", err) @@ -202,7 +203,7 @@ func (cfgmaps *ConfigMaps) Delete(key string) (rls *rspb.Release, err error) { // fetch the release to check existence if rls, err = cfgmaps.Get(key); err != nil { if apierrors.IsNotFound(err) { - return nil, ErrReleaseExists(rls.Name) + return nil, storageerrors.ErrReleaseExists(rls.Name) } cfgmaps.Log("delete: failed to get release %q: %s", key, err) diff --git a/pkg/storage/driver/driver.go b/pkg/storage/driver/driver.go index d8c4122b558..3bcbd4a7ed4 100644 --- a/pkg/storage/driver/driver.go +++ b/pkg/storage/driver/driver.go @@ -17,18 +17,17 @@ limitations under the License. package driver // import "k8s.io/helm/pkg/storage/driver" import ( - "fmt" - rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" ) var ( - // ErrReleaseNotFound indicates that a release is not found. - ErrReleaseNotFound = func(release string) error { return fmt.Errorf("release: %q not found", release) } - // ErrReleaseExists indicates that a release already exists. - ErrReleaseExists = func(release string) error { return fmt.Errorf("release: %q already exists", release) } - // ErrInvalidKey indicates that a release key could not be parsed. - ErrInvalidKey = func(release string) error { return fmt.Errorf("release: %q invalid key", release) } + // ErrReleaseNotFound has been deprecated; please use storageerrors.ErrReleaseNotFound instead. + ErrReleaseNotFound = storageerrors.ErrReleaseNotFound + // ErrReleaseExists has been deprecated; please use storageerrors.ErrReleaseExists instead. + ErrReleaseExists = storageerrors.ErrReleaseExists + // ErrInvalidKey has been deprecated; please use storageerrors.ErrInvalidKey instead. + ErrInvalidKey = storageerrors.ErrInvalidKey ) // Creator is the interface that wraps the Create method. diff --git a/pkg/storage/driver/memory.go b/pkg/storage/driver/memory.go index ea3faf26b44..700b87e0884 100644 --- a/pkg/storage/driver/memory.go +++ b/pkg/storage/driver/memory.go @@ -22,6 +22,7 @@ import ( "sync" rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" ) var _ Driver = (*Memory)(nil) @@ -53,16 +54,16 @@ func (mem *Memory) Get(key string) (*rspb.Release, error) { case 2: name, ver := elems[0], elems[1] if _, err := strconv.Atoi(ver); err != nil { - return nil, ErrInvalidKey(key) + return nil, storageerrors.ErrInvalidKey(key) } if recs, ok := mem.cache[name]; ok { if r := recs.Get(key); r != nil { return r.rls, nil } } - return nil, ErrReleaseNotFound(key) + return nil, storageerrors.ErrReleaseNotFound(key) default: - return nil, ErrInvalidKey(key) + return nil, storageerrors.ErrInvalidKey(key) } } @@ -131,7 +132,7 @@ func (mem *Memory) Update(key string, rls *rspb.Release) error { rs.Replace(key, newRecord(key, rls)) return nil } - return ErrReleaseNotFound(rls.Name) + return storageerrors.ErrReleaseNotFound(rls.Name) } // Delete deletes a release or returns ErrReleaseNotFound. @@ -141,12 +142,12 @@ func (mem *Memory) Delete(key string) (*rspb.Release, error) { elems := strings.Split(key, ".v") if len(elems) != 2 { - return nil, ErrInvalidKey(key) + return nil, storageerrors.ErrInvalidKey(key) } name, ver := elems[0], elems[1] if _, err := strconv.Atoi(ver); err != nil { - return nil, ErrInvalidKey(key) + return nil, storageerrors.ErrInvalidKey(key) } if recs, ok := mem.cache[name]; ok { if r := recs.Remove(key); r != nil { @@ -155,7 +156,7 @@ func (mem *Memory) Delete(key string) (*rspb.Release, error) { return r.rls, nil } } - return nil, ErrReleaseNotFound(key) + return nil, storageerrors.ErrReleaseNotFound(key) } // wlock locks mem for writing diff --git a/pkg/storage/driver/records.go b/pkg/storage/driver/records.go index bc793d8b3fb..56d7d694f64 100644 --- a/pkg/storage/driver/records.go +++ b/pkg/storage/driver/records.go @@ -23,6 +23,7 @@ import ( "github.com/golang/protobuf/proto" rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" ) // records holds a list of in-memory release records @@ -38,7 +39,7 @@ func (rs *records) Add(r *record) error { } if rs.Exists(r.key) { - return ErrReleaseExists(r.key) + return storageerrors.ErrReleaseExists(r.key) } *rs = append(*rs, r) diff --git a/pkg/storage/driver/secrets.go b/pkg/storage/driver/secrets.go index 1b8064e5375..328da20c458 100644 --- a/pkg/storage/driver/secrets.go +++ b/pkg/storage/driver/secrets.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" ) var _ Driver = (*Secrets)(nil) @@ -65,7 +66,7 @@ func (secrets *Secrets) Get(key string) (*rspb.Release, error) { obj, err := secrets.impl.Get(key, metav1.GetOptions{}) if err != nil { if apierrors.IsNotFound(err) { - return nil, ErrReleaseNotFound(key) + return nil, storageerrors.ErrReleaseNotFound(key) } secrets.Log("get: failed to get %q: %s", key, err) @@ -131,7 +132,7 @@ func (secrets *Secrets) Query(labels map[string]string) ([]*rspb.Release, error) } if len(list.Items) == 0 { - return nil, ErrReleaseNotFound(labels["NAME"]) + return nil, storageerrors.ErrReleaseNotFound(labels["NAME"]) } var results []*rspb.Release @@ -164,7 +165,7 @@ func (secrets *Secrets) Create(key string, rls *rspb.Release) error { // push the secret object out into the kubiverse if _, err := secrets.impl.Create(obj); err != nil { if apierrors.IsAlreadyExists(err) { - return ErrReleaseExists(rls.Name) + return storageerrors.ErrReleaseExists(rls.Name) } secrets.Log("create: failed to create: %s", err) @@ -202,7 +203,7 @@ func (secrets *Secrets) Delete(key string) (rls *rspb.Release, err error) { // fetch the release to check existence if rls, err = secrets.Get(key); err != nil { if apierrors.IsNotFound(err) { - return nil, ErrReleaseExists(rls.Name) + return nil, storageerrors.ErrReleaseExists(rls.Name) } secrets.Log("delete: failed to get release %q: %s", key, err) diff --git a/pkg/storage/errors/errors.go b/pkg/storage/errors/errors.go new file mode 100644 index 00000000000..38662d1ca1d --- /dev/null +++ b/pkg/storage/errors/errors.go @@ -0,0 +1,27 @@ +/* +Copyright The Helm Authors. + +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 errors // import "k8s.io/helm/pkg/storage/errors" +import "fmt" + +var ( + // ErrReleaseNotFound indicates that a release is not found. + ErrReleaseNotFound = func(release string) error { return fmt.Errorf("release: %q not found", release) } + // ErrReleaseExists indicates that a release already exists. + ErrReleaseExists = func(release string) error { return fmt.Errorf("release: %q already exists", release) } + // ErrInvalidKey indicates that a release key could not be parsed. + ErrInvalidKey = func(release string) error { return fmt.Errorf("release: %q invalid key", release) } +) From 941b1f4d68b6cf3d299df880152d90227e1a441e Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 7 Sep 2018 12:22:12 -0700 Subject: [PATCH 181/483] fix(release_server): handle the case when requested values is empty (#4604) Signed-off-by: Matthew Fisher --- pkg/tiller/release_server.go | 6 +++++- pkg/tiller/release_update_test.go | 5 ++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index e847c63fcfb..e913579aad5 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -139,7 +139,11 @@ func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current // merge new values with current if current.Config != nil && current.Config.Raw != "" && current.Config.Raw != "{}\n" { - req.Values.Raw = current.Config.Raw + "\n" + req.Values.Raw + if req.Values.Raw != "{}\n" { + req.Values.Raw = current.Config.Raw + "\n" + req.Values.Raw + } else { + req.Values.Raw = current.Config.Raw + "\n" + } } req.Chart.Values = &chart.Config{Raw: nv} diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 5edd53b82f3..1f189a8b77a 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -159,12 +159,11 @@ func TestUpdateRelease_ReuseValuesWithNoValues(t *testing.T) { {Name: "templates/hello", Data: []byte("hello: world")}, }, }, - Values: &chart.Config{Raw: ""}, + Values: &chart.Config{Raw: "{}\n"}, ReuseValues: true, } - _, err = rs.UpdateRelease(c, req) - if err != nil { + if _, err := rs.UpdateRelease(c, req); err != nil { t.Fatalf("Failed updated: %s", err) } } From bef59e40dc75874edcaef683da644ac162820fb3 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 7 Sep 2018 13:23:40 -0700 Subject: [PATCH 182/483] allow settings TLS flags from environment variables (#4590) Signed-off-by: Matthew Fisher --- cmd/helm/delete.go | 1 + cmd/helm/get.go | 14 +-- cmd/helm/get_hooks.go | 4 +- cmd/helm/get_manifest.go | 4 +- cmd/helm/get_notes.go | 4 +- cmd/helm/get_values.go | 6 +- cmd/helm/helm.go | 52 ++++-------- cmd/helm/history.go | 1 + cmd/helm/install.go | 1 + cmd/helm/list.go | 1 + cmd/helm/release_testing.go | 1 + cmd/helm/reset.go | 1 + cmd/helm/rollback.go | 1 + cmd/helm/status.go | 6 +- cmd/helm/upgrade.go | 1 + cmd/helm/version.go | 1 + docs/helm/helm.md | 7 +- pkg/helm/environment/environment.go | 69 ++++++++++++--- pkg/helm/environment/environment_test.go | 103 +++++++++++++++-------- 19 files changed, 184 insertions(+), 94 deletions(-) diff --git a/cmd/helm/delete.go b/cmd/helm/delete.go index ad7c6049a91..b78956ab646 100755 --- a/cmd/helm/delete.go +++ b/cmd/helm/delete.go @@ -78,6 +78,7 @@ func newDeleteCmd(c helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.BoolVar(&del.dryRun, "dry-run", false, "simulate a delete") f.BoolVar(&del.disableHooks, "no-hooks", false, "prevent hooks from running during deletion") f.BoolVar(&del.purge, "purge", false, "remove the release from the store and make its name free for later use") diff --git a/cmd/helm/get.go b/cmd/helm/get.go index 4170a7cef19..719e0779dd9 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -70,12 +70,14 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } - cmd.Flags().Int32Var(&get.version, "revision", 0, "get the named release with revision") - - cmd.AddCommand(addFlagsTLS(newGetValuesCmd(nil, out))) - cmd.AddCommand(addFlagsTLS(newGetManifestCmd(nil, out))) - cmd.AddCommand(addFlagsTLS(newGetHooksCmd(nil, out))) - cmd.AddCommand(addFlagsTLS(newGetNotesCmd(nil, out))) + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&get.version, "revision", 0, "get the named release with revision") + + cmd.AddCommand(newGetValuesCmd(nil, out)) + cmd.AddCommand(newGetManifestCmd(nil, out)) + cmd.AddCommand(newGetHooksCmd(nil, out)) + cmd.AddCommand(newGetNotesCmd(nil, out)) return cmd } diff --git a/cmd/helm/get_hooks.go b/cmd/helm/get_hooks.go index 9192db99823..1f288245d55 100644 --- a/cmd/helm/get_hooks.go +++ b/cmd/helm/get_hooks.go @@ -57,7 +57,9 @@ func newGetHooksCmd(client helm.Interface, out io.Writer) *cobra.Command { return ghc.run() }, } - cmd.Flags().Int32Var(&ghc.version, "revision", 0, "get the named release with revision") + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&ghc.version, "revision", 0, "get the named release with revision") return cmd } diff --git a/cmd/helm/get_manifest.go b/cmd/helm/get_manifest.go index f4ae11e58bf..206c9d2957e 100644 --- a/cmd/helm/get_manifest.go +++ b/cmd/helm/get_manifest.go @@ -60,7 +60,9 @@ func newGetManifestCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } - cmd.Flags().Int32Var(&get.version, "revision", 0, "get the named release with revision") + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&get.version, "revision", 0, "get the named release with revision") return cmd } diff --git a/cmd/helm/get_notes.go b/cmd/helm/get_notes.go index 5b1135ba519..eaa3bc815b8 100644 --- a/cmd/helm/get_notes.go +++ b/cmd/helm/get_notes.go @@ -59,7 +59,9 @@ func newGetNotesCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } - cmd.PersistentFlags().Int32Var(&get.version, "revision", 0, "get the notes of the named release with revision") + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&get.version, "revision", 0, "get the notes of the named release with revision") return cmd } diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index 12a48f1daf1..a4f4fc2836a 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -58,8 +58,10 @@ func newGetValuesCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } - cmd.Flags().Int32Var(&get.version, "revision", 0, "get the named release with revision") - cmd.Flags().BoolVarP(&get.allValues, "all", "a", false, "dump all (computed) values") + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&get.version, "revision", 0, "get the named release with revision") + f.BoolVarP(&get.allValues, "all", "a", false, "dump all (computed) values") return cmd } diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 6cb1c78ea27..75fa2dc3867 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -47,10 +47,6 @@ var ( tlsVerify bool // enable TLS and verify remote certificates tlsEnable bool // enable TLS - tlsCaCertDefault = "$HELM_HOME/ca.pem" - tlsCertDefault = "$HELM_HOME/cert.pem" - tlsKeyDefault = "$HELM_HOME/key.pem" - tillerTunnel *kube.Tunnel settings helm_env.EnvSettings ) @@ -77,6 +73,11 @@ Environment: $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") + $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") + $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") + $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") ` func newRootCmd(args []string) *cobra.Command { @@ -114,18 +115,18 @@ func newRootCmd(args []string) *cobra.Command { newVerifyCmd(out), // release commands - addFlagsTLS(newDeleteCmd(nil, out)), - addFlagsTLS(newGetCmd(nil, out)), - addFlagsTLS(newHistoryCmd(nil, out)), - addFlagsTLS(newInstallCmd(nil, out)), - addFlagsTLS(newListCmd(nil, out)), - addFlagsTLS(newRollbackCmd(nil, out)), - addFlagsTLS(newStatusCmd(nil, out)), - addFlagsTLS(newUpgradeCmd(nil, out)), - - addFlagsTLS(newReleaseTestCmd(nil, out)), - addFlagsTLS(newResetCmd(nil, out)), - addFlagsTLS(newVersionCmd(nil, out)), + newDeleteCmd(nil, out), + newGetCmd(nil, out), + newHistoryCmd(nil, out), + newInstallCmd(nil, out), + newListCmd(nil, out), + newRollbackCmd(nil, out), + newStatusCmd(nil, out), + newUpgradeCmd(nil, out), + + newReleaseTestCmd(nil, out), + newResetCmd(nil, out), + newVersionCmd(nil, out), newCompletionCmd(out), newHomeCmd(out), @@ -142,9 +143,6 @@ func newRootCmd(args []string) *cobra.Command { flags.Parse(args) - // set defaults from environment - settings.Init(flags) - // Find and add plugins loadPlugins(cmd, out) @@ -276,7 +274,7 @@ func ensureHelmClient(h helm.Interface) helm.Interface { func newClient() helm.Interface { options := []helm.Option{helm.Host(settings.TillerHost), helm.ConnectTimeout(settings.TillerConnectionTimeout)} - if tlsVerify || tlsEnable { + if settings.TLSVerify || settings.TLSEnable { if tlsCaCertFile == "" { tlsCaCertFile = settings.Home.TLSCaCert() } @@ -306,17 +304,3 @@ func newClient() helm.Interface { } return helm.NewClient(options...) } - -// addFlagsTLS adds the flags for supporting client side TLS to the -// helm command (only those that invoke communicate to Tiller.) -func addFlagsTLS(cmd *cobra.Command) *cobra.Command { - - // add flags - cmd.Flags().StringVar(&tlsServerName, "tls-hostname", settings.TillerHost, "the server name used to verify the hostname on the returned certificates from the server") - cmd.Flags().StringVar(&tlsCaCertFile, "tls-ca-cert", tlsCaCertDefault, "path to TLS CA certificate file") - cmd.Flags().StringVar(&tlsCertFile, "tls-cert", tlsCertDefault, "path to TLS certificate file") - cmd.Flags().StringVar(&tlsKeyFile, "tls-key", tlsKeyDefault, "path to TLS key file") - cmd.Flags().BoolVar(&tlsVerify, "tls-verify", false, "enable TLS for request and verify remote") - cmd.Flags().BoolVar(&tlsEnable, "tls", false, "enable TLS for request") - return cmd -} diff --git a/cmd/helm/history.go b/cmd/helm/history.go index 6e0b48d338a..51bc34e75a7 100644 --- a/cmd/helm/history.go +++ b/cmd/helm/history.go @@ -88,6 +88,7 @@ func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.Int32Var(&his.max, "max", 256, "maximum number of revision to include in history") f.UintVar(&his.colWidth, "col-width", 60, "specifies the max column width of output") f.StringVarP(&his.outputFormat, "output", "o", "table", "prints the output in the specified format (json|table|yaml)") diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 1c2dca7efd6..7f84f335558 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -193,6 +193,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.VarP(&inst.valueFiles, "values", "f", "specify values in a YAML file or a URL(can specify multiple)") f.StringVarP(&inst.name, "name", "n", "", "release name. If unspecified, it will autogenerate one for you") f.StringVar(&inst.namespace, "namespace", "", "namespace to install the release into. Defaults to the current kube config namespace.") diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 4467b6ec7ea..384fca6197d 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -120,6 +120,7 @@ func newListCmd(client helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.BoolVarP(&list.short, "short", "q", false, "output short (quiet) listing format") f.BoolVarP(&list.byDate, "date", "d", false, "sort by release date") f.BoolVarP(&list.sortDesc, "reverse", "r", false, "reverse the sort order") diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index 0c9debb3f1a..c7231cf0431 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -64,6 +64,7 @@ func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.Int64Var(&rlsTest.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&rlsTest.cleanup, "cleanup", false, "delete test pods upon completion") diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index 5b0914e8231..ffae0a613ee 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -77,6 +77,7 @@ func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.BoolVarP(&d.force, "force", "f", false, "forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.)") f.BoolVar(&d.removeHelmHome, "remove-helm-home", false, "if set deletes $HELM_HOME") diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 5c85afc3bcb..a06b205c844 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -78,6 +78,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.BoolVar(&rollback.dryRun, "dry-run", false, "simulate a rollback") f.BoolVar(&rollback.recreate, "recreate-pods", false, "performs pods restart for the resource if applicable") f.BoolVar(&rollback.force, "force", false, "force resource update through delete/recreate if needed") diff --git a/cmd/helm/status.go b/cmd/helm/status.go index be057a28e42..fe53081a444 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -76,8 +76,10 @@ func newStatusCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } - cmd.PersistentFlags().Int32Var(&status.version, "revision", 0, "if set, display the status of the named release with revision") - cmd.PersistentFlags().StringVarP(&status.outfmt, "output", "o", "", "output the status in the specified format (json or yaml)") + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&status.version, "revision", 0, "if set, display the status of the named release with revision") + f.StringVarP(&status.outfmt, "output", "o", "", "output the status in the specified format (json or yaml)") return cmd } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 8647a273732..905a2c17599 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -147,6 +147,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { } f := cmd.Flags() + settings.AddFlagsTLS(f) f.VarP(&upgrade.valueFiles, "values", "f", "specify values in a YAML file or a URL(can specify multiple)") f.BoolVar(&upgrade.dryRun, "dry-run", false, "simulate an upgrade") f.BoolVar(&upgrade.recreate, "recreate-pods", false, "performs pods restart for the resource if applicable") diff --git a/cmd/helm/version.go b/cmd/helm/version.go index 922e744b29d..e0d9e5e7313 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -77,6 +77,7 @@ func newVersionCmd(c helm.Interface, out io.Writer) *cobra.Command { }, } f := cmd.Flags() + settings.AddFlagsTLS(f) f.BoolVarP(&version.showClient, "client", "c", false, "client version only") f.BoolVarP(&version.showServer, "server", "s", false, "server version only") f.BoolVar(&version.short, "short", false, "print the version number") diff --git a/docs/helm/helm.md b/docs/helm/helm.md index c1a11c4a3f5..136721c36d5 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -26,6 +26,11 @@ Environment: $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") + $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") + $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") + $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") ### Options @@ -70,4 +75,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 1-Sep-2018 +###### Auto generated by spf13/cobra on 4-Sep-2018 diff --git a/pkg/helm/environment/environment.go b/pkg/helm/environment/environment.go index 4241bbb8a42..05d955d69a7 100644 --- a/pkg/helm/environment/environment.go +++ b/pkg/helm/environment/environment.go @@ -32,6 +32,19 @@ import ( "k8s.io/helm/pkg/helm/helmpath" ) +const ( + // DefaultTLSCaCert is the default value for HELM_TLS_CA_CERT + DefaultTLSCaCert = "$HELM_HOME/ca.pem" + // DefaultTLSCert is the default value for HELM_TLS_CERT + DefaultTLSCert = "$HELM_HOME/cert.pem" + // DefaultTLSKeyFile is the default value for HELM_TLS_KEY_FILE + DefaultTLSKeyFile = "$HELM_HOME/key.pem" + // DefaultTLSEnable is the default value for HELM_TLS_ENABLE + DefaultTLSEnable = false + // DefaultTLSVerify is the default value for HELM_TLS_VERIFY + DefaultTLSVerify = false +) + // DefaultHelmHome is the default HELM_HOME. var DefaultHelmHome = filepath.Join(homedir.HomeDir(), ".helm") @@ -39,7 +52,7 @@ var DefaultHelmHome = filepath.Join(homedir.HomeDir(), ".helm") type EnvSettings struct { // TillerHost is the host and port of Tiller. TillerHost string - // TillerConnectionTimeout is the duration (in seconds) helm will wait to establish a connection to tiller. + // TillerConnectionTimeout is the duration (in seconds) helm will wait to establish a connection to Tiller. TillerConnectionTimeout int64 // TillerNamespace is the namespace in which Tiller runs. TillerNamespace string @@ -51,6 +64,18 @@ type EnvSettings struct { KubeContext string // KubeConfig is the path to an explicit kubeconfig file. This overwrites the value in $KUBECONFIG KubeConfig string + // TLSEnable tells helm to communicate with Tiller via TLS + TLSEnable bool + // TLSVerify tells helm to communicate with Tiller via TLS and to verify remote certificates served by Tiller + TLSVerify bool + // TLSServerName tells helm to verify the hostname on the returned certificates from Tiller + TLSServerName string + // TLSCaCertFile is the path to a TLS CA certificate file + TLSCaCertFile string + // TLSCertFile is the path to a TLS certificate file + TLSCertFile string + // TLSKeyFile is the path to a TLS key file + TLSKeyFile string } // AddFlags binds flags to the given flagset. @@ -62,15 +87,45 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&s.Debug, "debug", false, "enable verbose output") fs.StringVar(&s.TillerNamespace, "tiller-namespace", "kube-system", "namespace of Tiller") fs.Int64Var(&s.TillerConnectionTimeout, "tiller-connection-timeout", int64(300), "the duration (in seconds) Helm will wait to establish a connection to tiller") + + envMap := map[string]string{ + "debug": "HELM_DEBUG", + "home": "HELM_HOME", + "host": "HELM_HOST", + "tiller-namespace": "TILLER_NAMESPACE", + } + + for name, envar := range envMap { + setFlagFromEnv(name, envar, fs) + } } -// Init sets values from the environment. -func (s *EnvSettings) Init(fs *pflag.FlagSet) { +// AddFlagsTLS adds the flags for supporting client side TLS to the given flagset. +func (s *EnvSettings) AddFlagsTLS(fs *pflag.FlagSet) { + fs.StringVar(&s.TLSServerName, "tls-hostname", s.TillerHost, "the server name used to verify the hostname on the returned certificates from the server") + fs.StringVar(&s.TLSCaCertFile, "tls-ca-cert", DefaultTLSCaCert, "path to TLS CA certificate file") + fs.StringVar(&s.TLSCertFile, "tls-cert", DefaultTLSCert, "path to TLS certificate file") + fs.StringVar(&s.TLSKeyFile, "tls-key", DefaultTLSKeyFile, "path to TLS key file") + fs.BoolVar(&s.TLSVerify, "tls-verify", DefaultTLSVerify, "enable TLS for request and verify remote") + fs.BoolVar(&s.TLSEnable, "tls", DefaultTLSEnable, "enable TLS for request") + + envMap := map[string]string{ + "tls-hostname": "HELM_TLS_HOSTNAME", + "tls-ca-cert": "HELM_TLS_CA_CERT", + "tls-cert": "HELM_TLS_CERT", + "tls-key": "HELM_TLS_KEY", + "tls-verify": "HELM_TLS_VERIFY", + "tls": "HELM_TLS_ENABLE", + } + for name, envar := range envMap { setFlagFromEnv(name, envar, fs) } } +// Init is deprecated; calling `.AddFlags` or `.AddFlagsTLS` directly will set the flags to their default values from the environment, so this is a no-op. +func (s *EnvSettings) Init(fs *pflag.FlagSet) {} + // PluginDirs is the path to the plugin directories. func (s EnvSettings) PluginDirs() string { if d, ok := os.LookupEnv("HELM_PLUGIN"); ok { @@ -79,14 +134,6 @@ func (s EnvSettings) PluginDirs() string { return s.Home.Plugins() } -// envMap maps flag names to envvars -var envMap = map[string]string{ - "debug": "HELM_DEBUG", - "home": "HELM_HOME", - "host": "HELM_HOST", - "tiller-namespace": "TILLER_NAMESPACE", -} - func setFlagFromEnv(name, envar string, fs *pflag.FlagSet) { if fs.Changed(name) { return diff --git a/pkg/helm/environment/environment_test.go b/pkg/helm/environment/environment_test.go index 35958e7917d..fb05254edf2 100644 --- a/pkg/helm/environment/environment_test.go +++ b/pkg/helm/environment/environment_test.go @@ -36,49 +36,78 @@ func TestEnvSettings(t *testing.T) { // expected values home, host, ns, kcontext, kconfig, plugins string - debug bool + debug, tlsverify bool }{ { - name: "defaults", - args: []string{}, - home: DefaultHelmHome, - plugins: helmpath.Home(DefaultHelmHome).Plugins(), - ns: "kube-system", + name: "defaults", + args: []string{}, + home: DefaultHelmHome, + plugins: helmpath.Home(DefaultHelmHome).Plugins(), + ns: "kube-system", + tlsverify: false, }, { - name: "with flags set", - args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns", "--kubeconfig", "/bar"}, - home: "/foo", - plugins: helmpath.Home("/foo").Plugins(), - host: "here", - ns: "myns", - kconfig: "/bar", - debug: true, + name: "with flags set", + args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns", "--kubeconfig", "/bar"}, + home: "/foo", + plugins: helmpath.Home("/foo").Plugins(), + host: "here", + ns: "myns", + kconfig: "/bar", + debug: true, + tlsverify: false, }, { - name: "with envvars set", - args: []string{}, - envars: map[string]string{"HELM_HOME": "/bar", "HELM_HOST": "there", "HELM_DEBUG": "1", "TILLER_NAMESPACE": "yourns"}, - home: "/bar", - plugins: helmpath.Home("/bar").Plugins(), - host: "there", - ns: "yourns", - debug: true, + name: "with envvars set", + args: []string{}, + envars: map[string]string{"HELM_HOME": "/bar", "HELM_HOST": "there", "HELM_DEBUG": "1", "TILLER_NAMESPACE": "yourns"}, + home: "/bar", + plugins: helmpath.Home("/bar").Plugins(), + host: "there", + ns: "yourns", + debug: true, + tlsverify: false, }, { - name: "with flags and envvars set", - args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns"}, - envars: map[string]string{"HELM_HOME": "/bar", "HELM_HOST": "there", "HELM_DEBUG": "1", "TILLER_NAMESPACE": "yourns", "HELM_PLUGIN": "glade"}, - home: "/foo", - plugins: "glade", - host: "here", - ns: "myns", - debug: true, + name: "with TLS envvars set", + args: []string{}, + envars: map[string]string{"HELM_HOME": "/bar", "HELM_HOST": "there", "HELM_DEBUG": "1", "TILLER_NAMESPACE": "yourns", "HELM_TLS_VERIFY": "1"}, + home: "/bar", + plugins: helmpath.Home("/bar").Plugins(), + host: "there", + ns: "yourns", + debug: true, + tlsverify: true, + }, + { + name: "with flags and envvars set", + args: []string{"--home", "/foo", "--host=here", "--debug", "--tiller-namespace=myns"}, + envars: map[string]string{"HELM_HOME": "/bar", "HELM_HOST": "there", "HELM_DEBUG": "1", "TILLER_NAMESPACE": "yourns", "HELM_PLUGIN": "glade"}, + home: "/foo", + plugins: "glade", + host: "here", + ns: "myns", + debug: true, + tlsverify: false, }, } - cleanup := resetEnv() - defer cleanup() + allEnvvars := map[string]string{ + "HELM_DEBUG": "", + "HELM_HOME": "", + "HELM_HOST": "", + "TILLER_NAMESPACE": "", + "HELM_PLUGIN": "", + "HELM_TLS_HOSTNAME": "", + "HELM_TLS_CA_CERT": "", + "HELM_TLS_CERT": "", + "HELM_TLS_KEY": "", + "HELM_TLS_VERIFY": "", + "HELM_TLS_ENABLE": "", + } + + resetEnv(allEnvvars) + defer resetEnv(allEnvvars) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -90,6 +119,7 @@ func TestEnvSettings(t *testing.T) { settings := &EnvSettings{} settings.AddFlags(flags) + settings.AddFlagsTLS(flags) flags.Parse(tt.args) settings.Init(flags) @@ -115,17 +145,20 @@ func TestEnvSettings(t *testing.T) { if settings.KubeConfig != tt.kconfig { t.Errorf("expected kubeconfig %q, got %q", tt.kconfig, settings.KubeConfig) } + if settings.TLSVerify != tt.tlsverify { + t.Errorf("expected tls-verify %t, got %t", tt.tlsverify, settings.TLSVerify) + } - cleanup() + resetEnv(tt.envars) }) } } -func resetEnv() func() { +func resetEnv(envars map[string]string) func() { origEnv := os.Environ() // ensure any local envvars do not hose us - for _, e := range envMap { + for e := range envars { os.Unsetenv(e) } From 10db6a6fb56253aaa1aadf14cc7e5bd1a76aa6f8 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Fri, 7 Sep 2018 13:24:10 -0700 Subject: [PATCH 183/483] introduce `helm init --automount-service-account-token` (#4589) Signed-off-by: Matthew Fisher --- cmd/helm/init.go | 1 + cmd/helm/installer/install.go | 3 +- cmd/helm/installer/install_test.go | 15 ++++++++- cmd/helm/installer/options.go | 3 ++ docs/helm/helm_init.md | 51 +++++++++++++++--------------- docs/install.md | 1 + 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 630847f3bc9..425c1007440 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -139,6 +139,7 @@ func newInitCmd(out io.Writer) *cobra.Command { f.StringVar(&i.opts.NodeSelectors, "node-selectors", "", "labels to specify the node on which Tiller is installed (app=tiller,helm=rocks)") f.VarP(&i.opts.Output, "output", "o", "skip installation and output Tiller's manifest in specified format (json or yaml)") f.StringArrayVar(&i.opts.Values, "override", []string{}, "override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2)") + f.BoolVar(&i.opts.AutoMountServiceAccountToken, "automount-service-account-token", true, "auto-mount the given service account to tiller") return cmd } diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 055601440da..c9ba1b0ca31 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -218,7 +218,8 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Labels: labels, }, Spec: v1.PodSpec{ - ServiceAccountName: opts.ServiceAccount, + ServiceAccountName: opts.ServiceAccount, + AutomountServiceAccountToken: &opts.AutoMountServiceAccountToken, Containers: []v1.Container{ { Name: "tiller", diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index d5f3dfec062..561b3ed6d29 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -80,7 +80,8 @@ func TestDeploymentForServiceAccount(t *testing.T) { {"withoutSA", "", false, "gcr.io/kubernetes-helm/tiller:latest", "IfNotPresent", ""}, } for _, tt := range tests { - d, err := Deployment(&Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary, ServiceAccount: tt.serviceAccount}) + opts := &Options{Namespace: v1.NamespaceDefault, ImageSpec: tt.image, UseCanary: tt.canary, ServiceAccount: tt.serviceAccount} + d, err := Deployment(opts) if err != nil { t.Fatalf("%s: error %q", tt.name, err) } @@ -88,6 +89,18 @@ func TestDeploymentForServiceAccount(t *testing.T) { if got := d.Spec.Template.Spec.ServiceAccountName; got != tt.serviceAccount { t.Errorf("%s: expected service account value %q, got %q", tt.name, tt.serviceAccount, got) } + if got := *d.Spec.Template.Spec.AutomountServiceAccountToken; got != false { + t.Errorf("%s: expected AutomountServiceAccountToken = %t, got %t", tt.name, false, got) + } + + opts.AutoMountServiceAccountToken = true + d, err = Deployment(opts) + if err != nil { + t.Fatalf("%s: error %q", tt.name, err) + } + if got := *d.Spec.Template.Spec.AutomountServiceAccountToken; got != true { + t.Errorf("%s: expected AutomountServiceAccountToken = %t, got %t", tt.name, true, got) + } } } diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 95aa3988d84..729bdf20ba0 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -47,6 +47,9 @@ type Options struct { // ServiceAccount is the Kubernetes service account to add to Tiller. ServiceAccount string + // AutoMountServiceAccountToken determines whether or not the service account should be added to Tiller. + AutoMountServiceAccountToken bool + // Force allows to force upgrading tiller if deployed version is greater than current version ForceUpgrade bool diff --git a/docs/helm/helm_init.md b/docs/helm/helm_init.md index f1aad315905..72fd9e86b36 100644 --- a/docs/helm/helm_init.md +++ b/docs/helm/helm_init.md @@ -32,30 +32,31 @@ helm init [flags] ### Options ``` - --canary-image use the canary Tiller image - -c, --client-only if set does not install Tiller - --dry-run do not install local or remote - --force-upgrade force upgrade of Tiller to the current helm version - -h, --help help for init - --history-max int limit the maximum number of revisions saved per release. Use 0 for no limit. - --local-repo-url string URL for local repository (default "http://127.0.0.1:8879/charts") - --net-host install Tiller with net=host - --node-selectors string labels to specify the node on which Tiller is installed (app=tiller,helm=rocks) - -o, --output OutputFormat skip installation and output Tiller's manifest in specified format (json or yaml) - --override stringArray override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2) - --replicas int amount of tiller instances to run on the cluster (default 1) - --service-account string name of service account - --skip-refresh do not refresh (download) the local repository cache - --stable-repo-url string URL for stable repository (default "https://kubernetes-charts.storage.googleapis.com") - -i, --tiller-image string override Tiller image - --tiller-tls install Tiller with TLS enabled - --tiller-tls-cert string path to TLS certificate file to install with Tiller - --tiller-tls-hostname string the server name used to verify the hostname on the returned certificates from Tiller - --tiller-tls-key string path to TLS key file to install with Tiller - --tiller-tls-verify install Tiller with TLS enabled and to verify remote certificates - --tls-ca-cert string path to CA root certificate - --upgrade upgrade if Tiller is already installed - --wait block until Tiller is running and ready to receive requests + --automount-service-account-token auto-mount the given service account to tiller (default true) + --canary-image use the canary Tiller image + -c, --client-only if set does not install Tiller + --dry-run do not install local or remote + --force-upgrade force upgrade of Tiller to the current helm version + -h, --help help for init + --history-max int limit the maximum number of revisions saved per release. Use 0 for no limit. + --local-repo-url string URL for local repository (default "http://127.0.0.1:8879/charts") + --net-host install Tiller with net=host + --node-selectors string labels to specify the node on which Tiller is installed (app=tiller,helm=rocks) + -o, --output OutputFormat skip installation and output Tiller's manifest in specified format (json or yaml) + --override stringArray override values for the Tiller Deployment manifest (can specify multiple or separate values with commas: key1=val1,key2=val2) + --replicas int amount of tiller instances to run on the cluster (default 1) + --service-account string name of service account + --skip-refresh do not refresh (download) the local repository cache + --stable-repo-url string URL for stable repository (default "https://kubernetes-charts.storage.googleapis.com") + -i, --tiller-image string override Tiller image + --tiller-tls install Tiller with TLS enabled + --tiller-tls-cert string path to TLS certificate file to install with Tiller + --tiller-tls-hostname string the server name used to verify the hostname on the returned certificates from Tiller + --tiller-tls-key string path to TLS key file to install with Tiller + --tiller-tls-verify install Tiller with TLS enabled and to verify remote certificates + --tls-ca-cert string path to CA root certificate + --upgrade upgrade if Tiller is already installed + --wait block until Tiller is running and ready to receive requests ``` ### Options inherited from parent commands @@ -74,4 +75,4 @@ helm init [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Sep-2018 +###### Auto generated by spf13/cobra on 4-Sep-2018 diff --git a/docs/install.md b/docs/install.md index 52b55baef03..6e2426f7587 100755 --- a/docs/install.md +++ b/docs/install.md @@ -132,6 +132,7 @@ You can explicitly tell `helm init` to... - Install to a particular cluster with `--kube-context` - Install into a particular namespace with `--tiller-namespace` - Install Tiller with a Service Account with `--service-account` (for [RBAC enabled clusters](securing_installation.md#rbac)) +- Install Tiller without mounting a service account with `--automount-service-account false` Once Tiller is installed, running `helm version` should show you both the client and server version. (If it shows only the client version, From c539454c9cddaa50f1de184062e172cea4932aa8 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Sat, 8 Sep 2018 04:36:16 +0800 Subject: [PATCH 184/483] Fix grammer for tests (#4599) Signed-off-by: Ian Chen --- docs/chart_tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_tests.md b/docs/chart_tests.md index d1cfe501713..2d1852eb542 100644 --- a/docs/chart_tests.md +++ b/docs/chart_tests.md @@ -8,7 +8,7 @@ Example tests: - Validate that your configuration from the values.yaml file was properly injected. - Make sure your username and password work correctly - Make sure an incorrect username and password does not work -- Assert that your services are up and correctly load balancing +- Assert that your services are up and correctly loadbalanced. - etc. You can run the pre-defined tests in Helm on a release using the command `helm test `. For a chart consumer, this is a great way to sanity check that their release of a chart (or application) works as expected. From 094b97ab5d7e2f6eda6d0ab0f2ede9cf578c003c Mon Sep 17 00:00:00 2001 From: Anton Osmond Date: Fri, 7 Sep 2018 21:41:40 +0100 Subject: [PATCH 185/483] Be explicit about where occurences of will be replaced in starter charts (#4548) Signed-off-by: Anton Osmond --- docs/charts.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/charts.md b/docs/charts.md index 0414136ce2e..37e7fe0387d 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -848,8 +848,10 @@ considerations in mind: - The `Chart.yaml` will be overwritten by the generator. - Users will expect to modify such a chart's contents, so documentation should indicate how users can do so. -- All occurrences of `` will be replaced with the specified chart - name so that starter charts can be used as templates. +- All occurrences of `` in files within the `templates` directory + will be replaced with the specified chart name so that starter charts can be + used as templates. Additionally, occurrences of `` in + `values.yaml` will also be replaced. Currently the only way to add a chart to `$HELM_HOME/starters` is to manually copy it there. In your chart's documentation, you may want to explain that From ba260dca4aff6a62bd27d7c8c01d1e78937375b9 Mon Sep 17 00:00:00 2001 From: Thomas Garlot Date: Sun, 9 Sep 2018 20:33:27 +0200 Subject: [PATCH 186/483] 4611 - Remove deadlink to deis.com (#4613) Signed-off-by: tgarlot --- docs/related.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/related.md b/docs/related.md index 082684d9cda..366cfb6a402 100644 --- a/docs/related.md +++ b/docs/related.md @@ -15,7 +15,6 @@ or [pull request](https://github.com/kubernetes/helm/pulls). - [Honestbee's Helm Chart Conventions](https://gist.github.com/so0k/f927a4b60003cedd101a0911757c605a) - [Releasing backward-incompatible changes: Kubernetes, Jenkins, Prometheus Operator, Helm and Traefik](https://medium.com/@enxebre/releasing-backward-incompatible-changes-kubernetes-jenkins-plugin-prometheus-operator-helm-self-6263ca61a1b1#.e0c7elxhq) - [The Missing CI/CD Kubernetes Component: Helm package manager](https://hackernoon.com/the-missing-ci-cd-kubernetes-component-helm-package-manager-1fe002aac680#.691sk2zhu) -- [The Workflow "Umbrella" Helm Chart](https://deis.com/blog/2017/workflow-chart-assembly) - [Using Helm to Deploy to Kubernetes](https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/) - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) - [A basic walk through Kubernetes Helm](https://github.com/muffin87/helm-tutorial) From 2b33bf6ba719e602c026d07ae483327d84da6b7c Mon Sep 17 00:00:00 2001 From: Robert James Hernandez Date: Mon, 10 Sep 2018 15:39:55 +0000 Subject: [PATCH 187/483] Fix for checking helm version slice bounds out of range (#4609) * fix(helm): Use env to locate bash Leverage '/usr/bin/env bash` for find bash instead of hardcoding '/bin/bash' since some *nix OSes have it installed elsewhere. Signed-off-by: Robert James Hernandez * test(helm): Adding case for versions short flag When git sha is empty if being built from tarball running 'helm version --short' should just ignore '--short' since sha is empty. Adding test to ensure this is the case. Signed-off-by: Robert James Hernandez * fix(helm): ignore short flag when sha is empty Signed-off-by: Robert James Hernandez --- Makefile | 2 +- cmd/helm/version.go | 2 +- cmd/helm/version_test.go | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9b85887128a..f824481cac3 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ BINDIR := $(CURDIR)/bin BINARIES := helm tiller # Required for globs to work correctly -SHELL=/bin/bash +SHELL=/usr/bin/env bash .PHONY: all all: build diff --git a/cmd/helm/version.go b/cmd/helm/version.go index e0d9e5e7313..1c292e19d35 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -145,7 +145,7 @@ func getK8sVersion() (*apiVersion.Info, error) { } func formatVersion(v *pb.Version, short bool) string { - if short { + if short && v.GitCommit != "" { return fmt.Sprintf("%s+g%s", v.SemVer, v.GitCommit[:7]) } return fmt.Sprintf("%#v", v) diff --git a/cmd/helm/version_test.go b/cmd/helm/version_test.go index 5519131c209..c1223ef919e 100644 --- a/cmd/helm/version_test.go +++ b/cmd/helm/version_test.go @@ -57,6 +57,12 @@ func TestVersion(t *testing.T) { flags: []string{"--template", "{{ .Client.SemVer }} {{ .Server.SemVer }}"}, expected: lver + " " + sver, }, + { + name: "client short empty git", + args: []string{}, + flags: []string{"-c", "--short"}, + expected: lver, + }, } settings.TillerHost = "fake-localhost" runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { From 5b236324468ad8958c351dd3c734880c0fa5d561 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 10 Sep 2018 11:14:03 -0700 Subject: [PATCH 188/483] Fix race condition in `helm list` (#4620) * Fix race in helm list when partitioning Problem: The chunks slice that is passed through the channel is reused for each partition. This means that encoding the release into a message is racing with populating the next partition, causing the results to sometimes not fit in the message, and the release list to be incorrect Solution: Allocate a new slice for each partition Issue #3322 Signed-off-by: Brian Marshall (cherry picked from commit a0858e29d877b8aa19478133865e45958ff21a9e) * fix import sorting Signed-off-by: Matthew Fisher * ref(release_server_test): use NewReleaseServer() Signed-off-by: Matthew Fisher * add unit test for race condition in `helm list` Signed-off-by: Matthew Fisher --- pkg/tiller/release_list.go | 5 +++-- pkg/tiller/release_list_test.go | 23 +++++++++++++++++++++++ pkg/tiller/release_server_test.go | 16 ++++------------ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/pkg/tiller/release_list.go b/pkg/tiller/release_list.go index 89f7a110094..3299d3ef270 100644 --- a/pkg/tiller/release_list.go +++ b/pkg/tiller/release_list.go @@ -18,11 +18,12 @@ package tiller import ( "fmt" + "regexp" + "github.com/golang/protobuf/proto" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" relutil "k8s.io/helm/pkg/releaseutil" - "regexp" ) // ListReleases lists the releases found by the server. @@ -140,7 +141,7 @@ func (s *ReleaseServer) partition(rels []*release.Release, cap int) <-chan []*re s.Log("partitioned at %d with %d releases (cap=%d)", fill, len(chunk), cap) chunks <- chunk // reset paritioning state - chunk = chunk[:0] + chunk = nil fill = 0 } chunk = append(chunk, rls) diff --git a/pkg/tiller/release_list_test.go b/pkg/tiller/release_list_test.go index b9ab6fe552a..f2d19cf96ed 100644 --- a/pkg/tiller/release_list_test.go +++ b/pkg/tiller/release_list_test.go @@ -274,3 +274,26 @@ func TestReleasesNamespace(t *testing.T) { t.Errorf("Expected 2 releases, got %d", len(mrs.val.Releases)) } } + +func TestReleasePartition(t *testing.T) { + var rl []*release.Release + rs := rsFixture() + rs.Log = t.Logf + num := 7 + for i := 0; i < num; i++ { + rel := releaseStub() + rel.Name = fmt.Sprintf("rel-%d", i) + rl = append(rl, rel) + } + visited := map[string]bool{} + + chunks := rs.partition(rl, 0) + for chunk := range chunks { + for _, rel := range chunk { + if visited[rel.Name] { + t.Errorf("%s was already visited", rel.Name) + } + visited[rel.Name] = true + } + } +} diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 122ab9dd416..f3fca739098 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -112,24 +112,16 @@ data: name: value ` -func rsFixture() *ReleaseServer { - clientset := fake.NewSimpleClientset() - return &ReleaseServer{ - ReleaseModule: &LocalReleaseModule{ - clientset: clientset, - }, - env: MockEnvironment(), - clientset: clientset, - Log: func(_ string, _ ...interface{}) {}, - } -} - type chartOptions struct { *chart.Chart } type chartOption func(*chartOptions) +func rsFixture() *ReleaseServer { + return NewReleaseServer(MockEnvironment(), fake.NewSimpleClientset(), false) +} + func buildChart(opts ...chartOption) *chart.Chart { c := &chartOptions{ Chart: &chart.Chart{ From b4b693c3168421c8cd7165e2fb5eb2233adefa6a Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Mon, 10 Sep 2018 15:00:57 -0400 Subject: [PATCH 189/483] feat(helm): output option for helm get values command, allow json and yaml formats (#4596) Signed-off-by: Arash Deshmeh --- cmd/helm/get_values.go | 41 +++++++++++++++++++++++++++++------- cmd/helm/get_values_test.go | 33 ++++++++++++++++++++++++++++- docs/helm/helm_get_values.md | 3 ++- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index a4f4fc2836a..38eb5f4bb27 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "encoding/json" "fmt" "io" @@ -36,6 +37,7 @@ type getValuesCmd struct { out io.Writer client helm.Interface version int32 + output string } func newGetValuesCmd(client helm.Interface, out io.Writer) *cobra.Command { @@ -62,6 +64,7 @@ func newGetValuesCmd(client helm.Interface, out io.Writer) *cobra.Command { settings.AddFlagsTLS(f) f.Int32Var(&get.version, "revision", 0, "get the named release with revision") f.BoolVarP(&get.allValues, "all", "a", false, "dump all (computed) values") + f.StringVar(&get.output, "output", "yaml", "output the specified format (json or yaml)") return cmd } @@ -72,20 +75,42 @@ func (g *getValuesCmd) run() error { return prettyError(err) } + values, err := chartutil.ReadValues([]byte(res.Release.Config.Raw)) + if err != nil { + return err + } + // If the user wants all values, compute the values and return. if g.allValues { - cfg, err := chartutil.CoalesceValues(res.Release.Chart, res.Release.Config) - if err != nil { - return err - } - cfgStr, err := cfg.YAML() + values, err = chartutil.CoalesceValues(res.Release.Chart, res.Release.Config) if err != nil { return err } - fmt.Fprintln(g.out, cfgStr) - return nil } - fmt.Fprintln(g.out, res.Release.Config.Raw) + result, err := formatValues(g.output, values) + if err != nil { + return err + } + fmt.Fprintln(g.out, result) return nil } + +func formatValues(format string, values chartutil.Values) (string, error) { + switch format { + case "", "yaml": + out, err := values.YAML() + if err != nil { + return "", err + } + return out, nil + case "json": + out, err := json.Marshal(values) + if err != nil { + return "", fmt.Errorf("Failed to Marshal JSON output: %s", err) + } + return string(out), nil + default: + return "", fmt.Errorf("Unknown output format %q", format) + } +} diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index 35c84f2ec64..aec5ce0c2db 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -23,22 +23,53 @@ import ( "github.com/spf13/cobra" "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" ) func TestGetValuesCmd(t *testing.T) { + releaseWithValues := helm.ReleaseMock(&helm.MockReleaseOptions{ + Name: "thomas-guide", + Chart: &chart.Chart{Values: &chart.Config{Raw: `foo2: "bar2"`}}, + Config: &chart.Config{Raw: `foo: "bar"`}, + }) + tests := []releaseCase{ { name: "get values with a release", resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"}), args: []string{"thomas-guide"}, - expected: "name: \"value\"", + expected: "name: value", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"})}, }, + { + name: "get values with json format", + resp: releaseWithValues, + args: []string{"thomas-guide"}, + flags: []string{"--output", "json"}, + expected: "{\"foo\":\"bar\"}", + rels: []*release.Release{releaseWithValues}, + }, + { + name: "get all values with json format", + resp: releaseWithValues, + args: []string{"thomas-guide"}, + flags: []string{"--all", "--output", "json"}, + expected: "{\"foo\":\"bar\",\"foo2\":\"bar2\"}", + rels: []*release.Release{releaseWithValues}, + }, { name: "get values requires release name arg", err: true, }, + { + name: "get values with invalid output format", + resp: releaseWithValues, + args: []string{"thomas-guide"}, + flags: []string{"--output", "INVALID_FORMAT"}, + rels: []*release.Release{releaseWithValues}, + err: true, + }, } cmd := func(c *helm.FakeClient, out io.Writer) *cobra.Command { return newGetValuesCmd(c, out) diff --git a/docs/helm/helm_get_values.md b/docs/helm/helm_get_values.md index 7208d588519..87d21b954a5 100644 --- a/docs/helm/helm_get_values.md +++ b/docs/helm/helm_get_values.md @@ -17,6 +17,7 @@ helm get values [flags] RELEASE_NAME ``` -a, --all dump all (computed) values -h, --help help for values + --output string output the specified format (json or yaml) (default "yaml") --revision int32 get the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -42,4 +43,4 @@ helm get values [flags] RELEASE_NAME * [helm get](helm_get.md) - download a named release -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 7-Sep-2018 From 5211bfa110ab4b99ad53800098f4928711521b96 Mon Sep 17 00:00:00 2001 From: Pratyush Verma Date: Wed, 12 Sep 2018 21:22:27 +0800 Subject: [PATCH 190/483] Fix type in Values File (#4629) Fix typo Signed-off-by: Pratyush Verma --- docs/chart_template_guide/values_files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/values_files.md b/docs/chart_template_guide/values_files.md index 32a178735ee..a15047667b8 100644 --- a/docs/chart_template_guide/values_files.md +++ b/docs/chart_template_guide/values_files.md @@ -4,7 +4,7 @@ In the previous section we looked at the built-in objects that Helm templates of - The `values.yaml` file in the chart - If this is a subchart, the `values.yaml` file of a parent chart -- A values file if passed into `helm install` or `helm upgrade` with the `-f` flag (`helm install -f myvals.yaml ./mychart`) +- A values file is passed into `helm install` or `helm upgrade` with the `-f` flag (`helm install -f myvals.yaml ./mychart`) - Individual parameters passed with `--set` (such as `helm install --set foo=bar ./mychart`) The list above is in order of specificity: `values.yaml` is the default, which can be overridden by a parent chart's `values.yaml`, which can in turn be overridden by a user-supplied values file, which can in turn be overridden by `--set` parameters. From 91994818a7d3b74dd1eceb6d502324639cb55f72 Mon Sep 17 00:00:00 2001 From: Nenad Stojanovikj Date: Wed, 12 Sep 2018 15:22:12 +0200 Subject: [PATCH 191/483] Clearer wording when using pipelines Signed-off-by: Nenad Stojanovikj --- docs/chart_template_guide/control_structures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 1844bd3936c..9ecd55142bd 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -40,7 +40,7 @@ A pipeline is evaluated as _false_ if the value is: - a `nil` (empty or null) - an empty collection (`map`, `slice`, `tuple`, `dict`, `array`) -Under all other conditions, the condition is true. +In any other case, the condition is evaluated to _true_ and the pipeline is executed. Let's add a simple conditional to our ConfigMap. We'll add another setting if the drink is set to coffee: From 00297088015cfb945d31f13d73bafba9dd441605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helgi=20=C3=9Eormar=20=C3=9Eorbj=C3=B6rnsson?= <70530+helgi@users.noreply.github.com> Date: Wed, 12 Sep 2018 21:09:32 -0700 Subject: [PATCH 192/483] test and build with golang 1.11 (#4637) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit linters were failing with: pkg/urlutil/urlutil_test.go:1::warning: file is not gofmted with -s (gofmt) Signed-off-by: Helgi Þorbjörnsson --- .circleci/config.yml | 2 +- Makefile | 2 +- pkg/urlutil/urlutil_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index df9786d823d..96f53ee402d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: working_directory: /go/src/k8s.io/helm parallelism: 3 docker: - - image: golang:1.10 + - image: golang:1.11 environment: PROJECT_NAME: "kubernetes-helm" steps: diff --git a/Makefile b/Makefile index f824481cac3..0677cafe4d2 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm -DEV_IMAGE ?= golang:1.10 +DEV_IMAGE ?= golang:1.11 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 diff --git a/pkg/urlutil/urlutil_test.go b/pkg/urlutil/urlutil_test.go index 616c4f14f49..b2af24e6364 100644 --- a/pkg/urlutil/urlutil_test.go +++ b/pkg/urlutil/urlutil_test.go @@ -65,8 +65,8 @@ func TestEqual(t *testing.T) { func TestExtractHostname(t *testing.T) { tests := map[string]string{ - "http://example.com": "example.com", - "https://example.com/foo": "example.com", + "http://example.com": "example.com", + "https://example.com/foo": "example.com", "https://example.com:31337/not/with/a/bang/but/a/whimper": "example.com", } for start, expect := range tests { From 71ba25a5a94fc9adaedc8adb1a454e15ba6aae23 Mon Sep 17 00:00:00 2001 From: Carlos Tadeu Panato Junior Date: Fri, 14 Sep 2018 16:36:11 +0200 Subject: [PATCH 193/483] change kubernetes to helm in docs and yaml files when refer the repository (#4640) Signed-off-by: cpanato --- CONTRIBUTING.md | 6 +++--- SECURITY_CONTACTS | 2 +- .../helmhome/repository/cache/testing-index.yaml | 4 ++-- cmd/helm/testdata/testcharts/alpine/Chart.yaml | 2 +- cmd/helm/testdata/testcharts/novals/Chart.yaml | 2 +- .../testdata/testcharts/signtest/alpine/Chart.yaml | 2 +- docs/chart_repository.md | 6 +++--- docs/chart_repository_faq.md | 2 +- docs/chart_repository_sync_example.md | 2 +- docs/chart_template_guide/builtin_objects.md | 2 +- docs/chart_template_guide/wrapping_up.md | 2 +- docs/charts.md | 2 +- docs/developers.md | 4 ++-- docs/examples/alpine/Chart.yaml | 4 ++-- docs/examples/nginx/Chart.yaml | 2 +- docs/helm/helm_serve.md | 2 +- docs/install.md | 12 ++++++------ docs/install_faq.md | 8 ++++---- docs/man/man1/helm_serve.1 | 2 +- docs/quickstart.md | 2 +- docs/related.md | 4 ++-- docs/release_checklist.md | 8 ++++---- .../repository/cache/kubernetes-charts-index.yaml | 4 ++-- .../helmhome/repository/cache/malformed-index.yaml | 2 +- .../helmhome/repository/cache/testing-index.yaml | 4 ++-- .../repository/cache/testing-querystring-index.yaml | 2 +- pkg/downloader/testdata/signtest/alpine/Chart.yaml | 2 +- .../repository/cache/kubernetes-charts-index.yaml | 4 ++-- 28 files changed, 50 insertions(+), 50 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 715bf7490be..23dc297b0d5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ The Kubernetes Helm project accepts contributions via GitHub pull requests. This ## Reporting a Security Issue Most of the time, when you find a bug in Helm, it should be reported -using [GitHub issues](https://github.com/kubernetes/helm/issues). However, if +using [GitHub issues](https://github.com/helm/helm/issues). However, if you are reporting a _security vulnerability_, please email a report to [cncf-kubernetes-helm-security@lists.cncf.io](mailto:cncf-kubernetes-helm-security@lists.cncf.io). This will give us a chance to try to fix the issue before it is exploited in the wild. @@ -84,7 +84,7 @@ your PR will be rejected by the automated DCO check. Whether you are a user or contributor, official support channels include: -- GitHub [issues](https://github.com/kubernetes/helm/issues/new) +- GitHub [issues](https://github.com/helm/helm/issues/new) - Slack [Kubernetes Slack](http://slack.kubernetes.io/): - User: #helm-users - Contributor: #helm-dev @@ -177,7 +177,7 @@ contributing to Helm. All issue types follow the same general lifecycle. Differe 3. Submit a pull request. Coding conventions and standards are explained in the official developer docs: -https://github.com/kubernetes/helm/blob/master/docs/developers.md +https://github.com/helm/helm/blob/master/docs/developers.md The next section contains more information on the workflow followed for PRs diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS index 7298ea2d290..28569205dd5 100644 --- a/SECURITY_CONTACTS +++ b/SECURITY_CONTACTS @@ -8,7 +8,7 @@ # and will be removed and replaced if they violate that agreement. # # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE -# INSTRUCTIONS AT https://github.com/kubernetes/helm/blob/master/CONTRIBUTING.md#reporting-a-security-issue +# INSTRUCTIONS AT https://github.com/helm/helm/blob/master/CONTRIBUTING.md#reporting-a-security-issue adamreese bacongobbler diff --git a/cmd/helm/testdata/helmhome/repository/cache/testing-index.yaml b/cmd/helm/testdata/helmhome/repository/cache/testing-index.yaml index 96c98c38c4b..e18e90d29b2 100644 --- a/cmd/helm/testdata/helmhome/repository/cache/testing-index.yaml +++ b/cmd/helm/testdata/helmhome/repository/cache/testing-index.yaml @@ -6,7 +6,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.1.0 appVersion: 1.2.3 description: Deploy a basic Alpine Linux pod @@ -19,7 +19,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.2.0 appVersion: 2.3.4 description: Deploy a basic Alpine Linux pod diff --git a/cmd/helm/testdata/testcharts/alpine/Chart.yaml b/cmd/helm/testdata/testcharts/alpine/Chart.yaml index 6fbb27f1811..fea865aa55d 100644 --- a/cmd/helm/testdata/testcharts/alpine/Chart.yaml +++ b/cmd/helm/testdata/testcharts/alpine/Chart.yaml @@ -2,5 +2,5 @@ description: Deploy a basic Alpine Linux pod home: https://k8s.io/helm name: alpine sources: -- https://github.com/kubernetes/helm +- https://github.com/helm/helm version: 0.1.0 diff --git a/cmd/helm/testdata/testcharts/novals/Chart.yaml b/cmd/helm/testdata/testcharts/novals/Chart.yaml index ce1a81da679..85f7a5d8332 100644 --- a/cmd/helm/testdata/testcharts/novals/Chart.yaml +++ b/cmd/helm/testdata/testcharts/novals/Chart.yaml @@ -2,5 +2,5 @@ description: Deploy a basic Alpine Linux pod home: https://k8s.io/helm name: novals sources: -- https://github.com/kubernetes/helm +- https://github.com/helm/helm version: 0.2.0 diff --git a/cmd/helm/testdata/testcharts/signtest/alpine/Chart.yaml b/cmd/helm/testdata/testcharts/signtest/alpine/Chart.yaml index 6fbb27f1811..fea865aa55d 100644 --- a/cmd/helm/testdata/testcharts/signtest/alpine/Chart.yaml +++ b/cmd/helm/testdata/testcharts/signtest/alpine/Chart.yaml @@ -2,5 +2,5 @@ description: Deploy a basic Alpine Linux pod home: https://k8s.io/helm name: alpine sources: -- https://github.com/kubernetes/helm +- https://github.com/helm/helm version: 0.1.0 diff --git a/docs/chart_repository.md b/docs/chart_repository.md index 01d457e6324..91ae3a3c4ab 100644 --- a/docs/chart_repository.md +++ b/docs/chart_repository.md @@ -21,7 +21,7 @@ optionally some packaged charts. When you're ready to share your charts, the preferred way to do so is by uploading them to a chart repository. **Note:** For Helm 2.0.0, chart repositories do not have any intrinsic -authentication. There is an [issue tracking progress](https://github.com/kubernetes/helm/issues/1038) +authentication. There is an [issue tracking progress](https://github.com/helm/helm/issues/1038) in GitHub. Because a chart repository can be any HTTP server that can serve YAML and tar @@ -78,7 +78,7 @@ entries: home: https://k8s.io/helm name: alpine sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm urls: - https://technosophos.github.io/tscharts/alpine-0.2.0.tgz version: 0.2.0 @@ -88,7 +88,7 @@ entries: home: https://k8s.io/helm name: alpine sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm urls: - https://technosophos.github.io/tscharts/alpine-0.1.0.tgz version: 0.1.0 diff --git a/docs/chart_repository_faq.md b/docs/chart_repository_faq.md index a3e6392bac6..a3340b661d1 100644 --- a/docs/chart_repository_faq.md +++ b/docs/chart_repository_faq.md @@ -3,7 +3,7 @@ This section tracks some of the more frequently encountered issues with using chart repositories. **We'd love your help** making this document better. To add, correct, or remove -information, [file an issue](https://github.com/kubernetes/helm/issues) or +information, [file an issue](https://github.com/helm/helm/issues) or send us a pull request. ## Fetching diff --git a/docs/chart_repository_sync_example.md b/docs/chart_repository_sync_example.md index de140c6360f..931275431d9 100644 --- a/docs/chart_repository_sync_example.md +++ b/docs/chart_repository_sync_example.md @@ -29,7 +29,7 @@ Upload the contents of the directory to your GCS bucket by running `scripts/sync For example: ```console $ pwd -/Users/funuser/go/src/github.com/kubernetes/helm +/Users/funuser/go/src/github.com/helm/helm $ scripts/sync-repo.sh fantastic-charts/ fantastic-charts Getting ready to sync your local directory (fantastic-charts/) to a remote repository at gs://fantastic-charts Verifying Prerequisites.... diff --git a/docs/chart_template_guide/builtin_objects.md b/docs/chart_template_guide/builtin_objects.md index 11982229bcf..2108940ecca 100644 --- a/docs/chart_template_guide/builtin_objects.md +++ b/docs/chart_template_guide/builtin_objects.md @@ -16,7 +16,7 @@ In the previous section, we use `{{.Release.Name}}` to insert the name of a rele - `Release.IsInstall`: This is set to `true` if the current operation is an install. - `Values`: Values passed into the template from the `values.yaml` file and from user-supplied files. By default, `Values` is empty. - `Chart`: The contents of the `Chart.yaml` file. Any data in `Chart.yaml` will be accessible here. For example `{{.Chart.Name}}-{{.Chart.Version}}` will print out the `mychart-0.1.0`. - - The available fields are listed in the [Charts Guide](https://github.com/kubernetes/helm/blob/master/docs/charts.md#the-chartyaml-file) + - The available fields are listed in the [Charts Guide](https://github.com/helm/helm/blob/master/docs/charts.md#the-chartyaml-file) - `Files`: This provides access to all non-special files in a chart. While you cannot use it to access templates, you can use it to access other files in the chart. See the section _Accessing Files_ for more. - `Files.Get` is a function for getting a file by name (`.Files.Get config.ini`) - `Files.GetBytes` is a function for getting the contents of a file as an array of bytes instead of as a string. This is useful for things like images. diff --git a/docs/chart_template_guide/wrapping_up.md b/docs/chart_template_guide/wrapping_up.md index 1ed7c602a5c..1a8d6c552e5 100755 --- a/docs/chart_template_guide/wrapping_up.md +++ b/docs/chart_template_guide/wrapping_up.md @@ -17,4 +17,4 @@ Sometimes it's easier to ask a few questions and get answers from experienced de - [Kubernetes Slack](https://slack.k8s.io/): `#helm` -Finally, if you find errors or omissions in this document, want to suggest some new content, or would like to contribute, visit [The Helm Project](https://github.com/kubernetes/helm). +Finally, if you find errors or omissions in this document, want to suggest some new content, or would like to contribute, visit [The Helm Project](https://github.com/helm/helm). diff --git a/docs/charts.md b/docs/charts.md index 37e7fe0387d..669d90164c2 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -488,7 +488,7 @@ the Kubernetes objects from the charts and all its dependencies are Hence a single release is created with all the objects for the chart and its dependencies. The install order of Kubernetes types is given by the enumeration InstallOrder in kind_sorter.go -(see [the Helm source file](https://github.com/kubernetes/helm/blob/master/pkg/tiller/kind_sorter.go#L26)). +(see [the Helm source file](https://github.com/helm/helm/blob/master/pkg/tiller/kind_sorter.go#L26)). ## Templates and Values diff --git a/docs/developers.md b/docs/developers.md index ca6b591fe90..4f1da2d9694 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -132,7 +132,7 @@ elegant and high-quality open source code so that our users will benefit. Make sure you have read and understood the main CONTRIBUTING guide: -https://github.com/kubernetes/helm/blob/master/CONTRIBUTING.md +https://github.com/helm/helm/blob/master/CONTRIBUTING.md ### Structure of the Code @@ -162,7 +162,7 @@ We accept changes to the code via GitHub Pull Requests (PRs). One workflow for doing this is as follows: 1. Go to your `$GOPATH/src/k8s.io` directory and `git clone` the - `github.com/kubernetes/helm` repository. + `github.com/helm/helm` repository. 2. Fork that repository into your GitHub account 3. Add your repository as a remote for `$GOPATH/src/k8s.io/helm` 4. Create a new working branch (`git checkout -b feat/my-feature`) and diff --git a/docs/examples/alpine/Chart.yaml b/docs/examples/alpine/Chart.yaml index f4b660d4f82..e56f8a46958 100644 --- a/docs/examples/alpine/Chart.yaml +++ b/docs/examples/alpine/Chart.yaml @@ -1,7 +1,7 @@ name: alpine description: Deploy a basic Alpine Linux pod version: 0.1.0 -home: https://github.com/kubernetes/helm +home: https://github.com/helm/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm appVersion: 3.3 diff --git a/docs/examples/nginx/Chart.yaml b/docs/examples/nginx/Chart.yaml index 807455210a2..3d6f5751b39 100644 --- a/docs/examples/nginx/Chart.yaml +++ b/docs/examples/nginx/Chart.yaml @@ -7,7 +7,7 @@ keywords: - nginx - www - web -home: https://github.com/kubernetes/helm +home: https://github.com/helm/helm sources: - https://hub.docker.com/_/nginx/ maintainers: diff --git a/docs/helm/helm_serve.md b/docs/helm/helm_serve.md index 5e25f2a2f23..62a68595a06 100644 --- a/docs/helm/helm_serve.md +++ b/docs/helm/helm_serve.md @@ -15,7 +15,7 @@ This command is intended to be used for educational and testing purposes only. It is best to rely on a dedicated web server or a cloud-hosted solution like Google Cloud Storage for production use. -See https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories +See https://github.com/helm/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories for more information on hosting chart repositories in a production setting. diff --git a/docs/install.md b/docs/install.md index 6e2426f7587..96d9bc9f784 100755 --- a/docs/install.md +++ b/docs/install.md @@ -13,11 +13,11 @@ releases. ### From the Binary Releases -Every [release](https://github.com/kubernetes/helm/releases) of Helm +Every [release](https://github.com/helm/helm/releases) of Helm provides binary releases for a variety of OSes. These binary versions can be manually downloaded and installed. -1. Download your [desired version](https://github.com/kubernetes/helm/releases) +1. Download your [desired version](https://github.com/helm/helm/releases) 2. Unpack it (`tar -zxvf helm-v2.0.0-linux-amd64.tgz`) 3. Find the `helm` binary in the unpacked directory, and move it to its desired destination (`mv linux-amd64/helm /usr/local/bin/helm`) @@ -57,18 +57,18 @@ choco install kubernetes-helm ## From Script Helm now has an installer script that will automatically grab the latest version -of the Helm client and [install it locally](https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get). +of the Helm client and [install it locally](https://raw.githubusercontent.com/helm/helm/master/scripts/get). You can fetch that script, and then execute it locally. It's well documented so that you can read through it and understand what it is doing before you run it. ``` -$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh +$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh $ chmod 700 get_helm.sh $ ./get_helm.sh ``` -Yes, you can `curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash` that if you want to live on the edge. +Yes, you can `curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash` that if you want to live on the edge. ### From Canary Builds @@ -96,7 +96,7 @@ You must have a working Go environment with $ cd $GOPATH $ mkdir -p src/k8s.io $ cd src/k8s.io -$ git clone https://github.com/kubernetes/helm.git +$ git clone https://github.com/helm/helm.git $ cd helm $ make bootstrap build ``` diff --git a/docs/install_faq.md b/docs/install_faq.md index f2eae5b48b9..d4840417f14 100644 --- a/docs/install_faq.md +++ b/docs/install_faq.md @@ -4,7 +4,7 @@ This section tracks some of the more frequently encountered issues with installi or getting started with Helm. **We'd love your help** making this document better. To add, correct, or remove -information, [file an issue](https://github.com/kubernetes/helm/issues) or +information, [file an issue](https://github.com/helm/helm/issues) or send us a pull request. ## Downloading @@ -94,8 +94,8 @@ recommends reading this: Here are a few resolved issues that may help you get started: -- https://github.com/kubernetes/helm/issues/1371 -- https://github.com/kubernetes/helm/issues/966 +- https://github.com/helm/helm/issues/1371 +- https://github.com/helm/helm/issues/966 **Q: Trying to use Helm, I get the error "lookup XXXXX on 8.8.8.8:53: no such host"** @@ -113,7 +113,7 @@ follows. On each of the control plane nodes: 3) Remove the k8s api server container (kubelet will recreate it) 4) Then `systemctl restart docker` (or reboot the node) for it to pick up the /etc/resolv.conf changes -See this issue for more information: https://github.com/kubernetes/helm/issues/1455 +See this issue for more information: https://github.com/helm/helm/issues/1455 **Q: On GKE (Google Container Engine) I get "No SSH tunnels currently open"** diff --git a/docs/man/man1/helm_serve.1 b/docs/man/man1/helm_serve.1 index a4a9c51da79..f43f5ab057f 100644 --- a/docs/man/man1/helm_serve.1 +++ b/docs/man/man1/helm_serve.1 @@ -29,7 +29,7 @@ Google Cloud Storage for production use. .PP See -\[la]https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories\[ra] +\[la]https://github.com/helm/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories\[ra] for more information on hosting chart repositories in a production setting. diff --git a/docs/quickstart.md b/docs/quickstart.md index 8622137b23d..e7b70d4cad0 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -43,7 +43,7 @@ to [configure a service account and rules](rbac.md) before proceeding. ## Install Helm Download a binary release of the Helm client. You can use tools like -`homebrew`, or look at [the official releases page](https://github.com/kubernetes/helm/releases). +`homebrew`, or look at [the official releases page](https://github.com/helm/helm/releases). For more details, or for other options, see [the installation guide](install.md). diff --git a/docs/related.md b/docs/related.md index 366cfb6a402..2ad1e9b20fd 100644 --- a/docs/related.md +++ b/docs/related.md @@ -2,8 +2,8 @@ The Helm community has produced many extra tools, plugins, and documentation about Helm. We love to hear about these projects. If you have anything you'd like to -add to this list, please open an [issue](https://github.com/kubernetes/helm/issues) -or [pull request](https://github.com/kubernetes/helm/pulls). +add to this list, please open an [issue](https://github.com/helm/helm/issues) +or [pull request](https://github.com/helm/helm/pulls). ## Article, Blogs, How-Tos, and Extra Documentation diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 96d7e56254a..a84cad713c9 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -39,12 +39,12 @@ Just kidding! :trollface: All releases will be of the form vX.Y.Z where X is the major version number, Y is the minor version number and Z is the patch release number. This project strictly follows [semantic versioning](http://semver.org/) so following this step is critical. -It is important to note that this document assumes that the git remote in your repository that corresponds to "https://github.com/kubernetes/helm" is named "upstream". If yours is not (for example, if you've chosen to name it "origin" or something similar instead), be sure to adjust the listed snippets for your local environment accordingly. If you are not sure what your upstream remote is named, use a command like `git remote -v` to find out. +It is important to note that this document assumes that the git remote in your repository that corresponds to "https://github.com/helm/helm" is named "upstream". If yours is not (for example, if you've chosen to name it "origin" or something similar instead), be sure to adjust the listed snippets for your local environment accordingly. If you are not sure what your upstream remote is named, use a command like `git remote -v` to find out. If you don't have an upstream remote, you can add one easily using something like: ```shell -git remote add upstream git@github.com:kubernetes/helm.git +git remote add upstream git@github.com:helm/helm.git ``` In this doc, we are going to reference a few environment variables as well, which you may want to set for convenience. For major/minor releases, use the following: @@ -134,7 +134,7 @@ In order for others to start testing, we can now push the release branch upstrea git push upstream $RELEASE_BRANCH_NAME ``` -Make sure to check [helm on CircleCI](https://circleci.com/gh/kubernetes/helm) and make sure the release passed CI before proceeding. +Make sure to check [helm on CircleCI](https://circleci.com/gh/helm/helm) and make sure the release passed CI before proceeding. If anyone is available, let others peer-review the branch before continuing to ensure that all the proper changes have been made and all of the commits for the release are there. @@ -240,7 +240,7 @@ Download Helm X.Y. The common platform binaries are here: Once you have the client installed, upgrade Tiller with `helm init --upgrade`. -The [Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart-guide) will get you going from there. For **upgrade instructions** or detailed installation notes, check the [install guide](https://docs.helm.sh/using_helm/#installing-helm). You can also use a [script to install](https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get) on any system with `bash`. +The [Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart-guide) will get you going from there. For **upgrade instructions** or detailed installation notes, check the [install guide](https://docs.helm.sh/using_helm/#installing-helm). You can also use a [script to install](https://raw.githubusercontent.com/helm/helm/master/scripts/get) on any system with `bash`. ## What's Next diff --git a/pkg/downloader/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml index 28d272ae24a..8af3546155f 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml @@ -7,7 +7,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.1.0 description: Deploy a basic Alpine Linux pod keywords: [] @@ -20,7 +20,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.2.0 description: Deploy a basic Alpine Linux pod keywords: [] diff --git a/pkg/downloader/testdata/helmhome/repository/cache/malformed-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/malformed-index.yaml index 1956e9f8349..f51257233fb 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/malformed-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/malformed-index.yaml @@ -7,7 +7,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 1.2.3 description: Deploy a basic Alpine Linux pod keywords: [] diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml index 14cdffecee6..7543a59f547 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml @@ -7,7 +7,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 1.2.3 description: Deploy a basic Alpine Linux pod keywords: [] @@ -21,7 +21,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.2.0 description: Deploy a basic Alpine Linux pod keywords: [] diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-querystring-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-querystring-index.yaml index 1956e9f8349..f51257233fb 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-querystring-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-querystring-index.yaml @@ -7,7 +7,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 1.2.3 description: Deploy a basic Alpine Linux pod keywords: [] diff --git a/pkg/downloader/testdata/signtest/alpine/Chart.yaml b/pkg/downloader/testdata/signtest/alpine/Chart.yaml index 6fbb27f1811..fea865aa55d 100644 --- a/pkg/downloader/testdata/signtest/alpine/Chart.yaml +++ b/pkg/downloader/testdata/signtest/alpine/Chart.yaml @@ -2,5 +2,5 @@ description: Deploy a basic Alpine Linux pod home: https://k8s.io/helm name: alpine sources: -- https://github.com/kubernetes/helm +- https://github.com/helm/helm version: 0.1.0 diff --git a/pkg/resolver/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml b/pkg/resolver/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml index e2d438701d8..bfade3dbc0c 100644 --- a/pkg/resolver/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml +++ b/pkg/resolver/testdata/helmhome/repository/cache/kubernetes-charts-index.yaml @@ -7,7 +7,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.2.0 description: Deploy a basic Alpine Linux pod keywords: [] @@ -20,7 +20,7 @@ entries: checksum: 0e6661f193211d7a5206918d42f5c2a9470b737d home: https://k8s.io/helm sources: - - https://github.com/kubernetes/helm + - https://github.com/helm/helm version: 0.1.0 description: Deploy a basic Alpine Linux pod keywords: [] From 5a38e8fea9a4ef5eae81f132107d952c4cc48368 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Mon, 17 Sep 2018 10:46:57 -0600 Subject: [PATCH 194/483] chore: update Sprig to 2.16 (#4652) Signed-off-by: Matt Butcher --- glide.lock | 11 ++++++----- glide.yaml | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/glide.lock b/glide.lock index 9a89616efef..298de261277 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 9d3eee153a34027ed93ccbcbfb4778baead73ed3f5bd4c665114e02aef747606 -updated: 2018-08-01T07:48:30.2009451Z +hash: a4a7df055da2413c8e42cb127833a77d6a2910396efdabf5a7dc5af956478fef +updated: 2018-09-13T18:30:19.732109-06:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -39,7 +39,7 @@ imports: subpackages: - md2man - name: github.com/cyphar/filepath-securejoin - version: 06bda8370f45268db985f7af15732444d94ed51c + version: a261ee33d7a517f054effbf451841abaafe3e0fd - name: github.com/davecgh/go-spew version: 782f4967f2dc4564575ca782fe2d04090b5faca8 subpackages: @@ -196,7 +196,7 @@ imports: - name: github.com/Masterminds/semver version: 517734cc7d6470c0d07130e40fd40bdeb9bcd3fd - name: github.com/Masterminds/sprig - version: 6b2a58267f6a8b1dc8e2eb5519b984008fa85e8c + version: 15f9564e7e9cf0da02a48e0d25f12a7b83559aa6 - name: github.com/Masterminds/vcs version: 3084677c2c188840777bff30054f2b553729d329 - name: github.com/mattn/go-runewidth @@ -596,7 +596,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 8b3d76091fd500b7c59c83e113c9048ee612b205 + version: 2e809eed16445fff9dcbfc56e9936cf76ccbdadc subpackages: - pkg/api/events - pkg/api/legacyscheme @@ -786,3 +786,4 @@ testImports: version: e3a8ff8ce36581f87a15341206f205b1da467059 subpackages: - assert + - require diff --git a/glide.yaml b/glide.yaml index 68a5d91ad60..716fc56ef84 100644 --- a/glide.yaml +++ b/glide.yaml @@ -13,7 +13,7 @@ import: - package: github.com/imdario/mergo version: 6633656539c1639d9d78127b7d47c622b5d7b6dc - package: github.com/Masterminds/sprig - version: ^2.15.0 + version: ^2.16.0 - package: github.com/ghodss/yaml - package: github.com/Masterminds/semver version: ~1.3.1 From a297a0a7fe14779e7cfdcfa15a13237a34b42af7 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 17 Sep 2018 09:48:51 -0700 Subject: [PATCH 195/483] fix merge conflicts/linter errors (#4653) Signed-off-by: Matthew Fisher --- cmd/helm/serve.go | 2 +- pkg/tiller/hooks.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/helm/serve.go b/cmd/helm/serve.go index 81f2785c34b..7ddae6ca208 100644 --- a/cmd/helm/serve.go +++ b/cmd/helm/serve.go @@ -38,7 +38,7 @@ This command is intended to be used for educational and testing purposes only. It is best to rely on a dedicated web server or a cloud-hosted solution like Google Cloud Storage for production use. -See https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories +See https://github.com/helm/helm/blob/master/docs/chart_repository.md#hosting-chart-repositories for more information on hosting chart repositories in a production setting. ` diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index 6c3543f61f0..0fb7c92f809 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -53,6 +53,7 @@ var deletePolices = map[string]release.Hook_DeletePolicy{ hooks.BeforeHookCreation: release.Hook_BEFORE_HOOK_CREATION, } +// Manifest represents a manifest file, which has a name and some content. type Manifest = manifest.Manifest type result struct { From e868da1705f879bd5ec405c5f45601f593b3148a Mon Sep 17 00:00:00 2001 From: Steve Wolter Date: Mon, 17 Sep 2018 21:41:27 +0200 Subject: [PATCH 196/483] Check for err before working with newRelease. (#4630) Should fix #4585. Signed-off-by: Steve Wolter --- pkg/tiller/release_update.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index 5cd82dfc5b0..8f3cc4e8e39 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -150,6 +150,8 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( return nil, err } + res := &services.UpdateReleaseResponse{} + newRelease, err := s.prepareRelease(&services.InstallReleaseRequest{ Chart: req.Chart, Values: req.Values, @@ -161,11 +163,6 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( Timeout: req.Timeout, Wait: req.Wait, }) - - // update new release with next revision number so as to append to the old release's history - newRelease.Version = oldRelease.Version + 1 - - res := &services.UpdateReleaseResponse{Release: newRelease} if err != nil { s.Log("failed update prepare step: %s", err) // On dry run, append the manifest contents to a failed release. This is @@ -176,6 +173,10 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) ( return res, err } + // update new release with next revision number so as to append to the old release's history + newRelease.Version = oldRelease.Version + 1 + res.Release = newRelease + if req.DryRun { s.Log("dry run for %s", newRelease.Name) res.Release.Info.Description = "Dry run complete" From 7b821dd52fffa135cfe78611299b0491f7f03d39 Mon Sep 17 00:00:00 2001 From: Louis Munro Date: Mon, 17 Sep 2018 17:04:19 -0400 Subject: [PATCH 197/483] Make ping() request a specific image. Add a getTillerPodImage method. (#4622) Signed-off-by: Louis Munro --- cmd/helm/init.go | 14 +++++++------- cmd/helm/installer/install.go | 4 ++-- cmd/helm/installer/options.go | 3 ++- pkg/helm/portforwarder/portforwarder.go | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 425c1007440..4be54e675bf 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -274,7 +274,7 @@ func (i *initCmd) run() error { if err := installer.Upgrade(i.kubeClient, &i.opts); err != nil { return fmt.Errorf("error when upgrading: %s", err) } - if err := i.ping(); err != nil { + if err := i.ping(i.opts.SelectImage()); err != nil { return err } fmt.Fprintln(i.out, "\nTiller (the Helm server-side component) has been upgraded to the current version.") @@ -290,7 +290,7 @@ func (i *initCmd) run() error { "For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation") } } - if err := i.ping(); err != nil { + if err := i.ping(i.opts.SelectImage()); err != nil { return err } } else { @@ -301,13 +301,13 @@ func (i *initCmd) run() error { return nil } -func (i *initCmd) ping() error { +func (i *initCmd) ping(image string) error { if i.wait { _, kubeClient, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return err } - if !watchTillerUntilReady(settings.TillerNamespace, kubeClient, settings.TillerConnectionTimeout) { + if !watchTillerUntilReady(settings.TillerNamespace, kubeClient, settings.TillerConnectionTimeout, image) { return fmt.Errorf("tiller was not found. polling deadline exceeded") } @@ -439,7 +439,7 @@ func ensureRepoFileFormat(file string, out io.Writer) error { // want to wait before we call New(). // // Returns true if it exists. If the timeout was reached and it could not find the pod, it returns false. -func watchTillerUntilReady(namespace string, client kubernetes.Interface, timeout int64) bool { +func watchTillerUntilReady(namespace string, client kubernetes.Interface, timeout int64, newImage string) bool { deadlinePollingChan := time.NewTimer(time.Duration(timeout) * time.Second).C checkTillerPodTicker := time.NewTicker(500 * time.Millisecond) doneChan := make(chan bool) @@ -448,8 +448,8 @@ func watchTillerUntilReady(namespace string, client kubernetes.Interface, timeou go func() { for range checkTillerPodTicker.C { - _, err := portforwarder.GetTillerPodName(client.CoreV1(), namespace) - if err == nil { + image, err := portforwarder.GetTillerPodImage(client.CoreV1(), namespace) + if err == nil && image == newImage { doneChan <- true break } diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index c9ba1b0ca31..6027fdba814 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -68,7 +68,7 @@ func Upgrade(client kubernetes.Interface, opts *Options) error { if semverCompare(tillerImage) == -1 && !opts.ForceUpgrade { return errors.New("current Tiller version is newer, use --force-upgrade to downgrade") } - obj.Spec.Template.Spec.Containers[0].Image = opts.selectImage() + obj.Spec.Template.Spec.Containers[0].Image = opts.SelectImage() obj.Spec.Template.Spec.Containers[0].ImagePullPolicy = opts.pullPolicy() obj.Spec.Template.Spec.ServiceAccountName = opts.ServiceAccount if _, err := client.ExtensionsV1beta1().Deployments(opts.Namespace).Update(obj); err != nil { @@ -223,7 +223,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Containers: []v1.Container{ { Name: "tiller", - Image: opts.selectImage(), + Image: opts.SelectImage(), ImagePullPolicy: opts.pullPolicy(), Ports: []v1.ContainerPort{ {ContainerPort: 44134, Name: "tiller"}, diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 729bdf20ba0..196ad8de499 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -99,7 +99,8 @@ type Options struct { Values []string } -func (opts *Options) selectImage() string { +// SelectImage returns the image according to whether UseCanary is true or not +func (opts *Options) SelectImage() string { switch { case opts.UseCanary: return defaultImage + ":canary" diff --git a/pkg/helm/portforwarder/portforwarder.go b/pkg/helm/portforwarder/portforwarder.go index cc3261d1ca7..e962eef7fa9 100644 --- a/pkg/helm/portforwarder/portforwarder.go +++ b/pkg/helm/portforwarder/portforwarder.go @@ -54,6 +54,21 @@ func GetTillerPodName(client corev1.PodsGetter, namespace string) (string, error return pod.ObjectMeta.GetName(), nil } +// GetTillerPodImage fetches the image of tiller pod running in the given namespace. +func GetTillerPodImage(client corev1.PodsGetter, namespace string) (string, error) { + selector := tillerPodLabels.AsSelector() + pod, err := getFirstRunningPod(client, namespace, selector) + if err != nil { + return "", err + } + for _, c := range pod.Spec.Containers { + if c.Name == "tiller" { + return c.Image, nil + } + } + return "", fmt.Errorf("could not find a tiller pod") +} + func getFirstRunningPod(client corev1.PodsGetter, namespace string, selector labels.Selector) (*v1.Pod, error) { options := metav1.ListOptions{LabelSelector: selector.String()} pods, err := client.Pods(namespace).List(options) From 1832d525b0690de34c03b1c8d953c7d82b72755d Mon Sep 17 00:00:00 2001 From: Yuya Takeyama Date: Tue, 18 Sep 2018 06:13:32 +0900 Subject: [PATCH 198/483] Add --no-sudo option (#4649) Signed-off-by: Yuya Takeyama --- scripts/get | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/get b/scripts/get index 29cd47e1a4e..326660a894b 100755 --- a/scripts/get +++ b/scripts/get @@ -18,6 +18,7 @@ # the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get PROJECT_NAME="helm" +USE_SUDO="true" : ${HELM_INSTALL_DIR:="/usr/local/bin"} @@ -50,7 +51,7 @@ initOS() { runAsRoot() { local CMD="$*" - if [ $EUID -ne 0 ]; then + if [ $EUID -ne 0 -a $USE_SUDO = "true" ]; then CMD="sudo $CMD" fi @@ -180,6 +181,7 @@ help () { echo -e "\t[--help|-h ] ->> prints this help" echo -e "\t[--version|-v ] . When not defined it defaults to latest" echo -e "\te.g. --version v2.4.0 or -v latest" + echo -e "\t[--no-sudo] ->> install without sudo" } # cleanup temporary files to avoid https://github.com/helm/helm/issues/2977 @@ -209,6 +211,9 @@ while [[ $# -gt 0 ]]; do exit 0 fi ;; + '--no-sudo') + USE_SUDO="false" + ;; '--help'|-h) help exit 0 From b7ea1c612da4aa2a5e205c2d56612f37e328b097 Mon Sep 17 00:00:00 2001 From: Yuya Takeyama Date: Tue, 18 Sep 2018 06:52:21 +0900 Subject: [PATCH 199/483] Install tiller as well if it exists (#4648) * Install tiller as well if it exists Signed-off-by: Yuya Takeyama * Fix message ref: https://github.com/helm/helm/pull/4648#discussion_r218229227 Signed-off-by: Yuya Takeyama --- scripts/get | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/get b/scripts/get index 326660a894b..40fb2f69f36 100755 --- a/scripts/get +++ b/scripts/get @@ -18,6 +18,7 @@ # the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get PROJECT_NAME="helm" +TILLER_NAME="tiller" USE_SUDO="true" : ${HELM_INSTALL_DIR:="/usr/local/bin"} @@ -142,8 +143,16 @@ installFile() { mkdir -p "$HELM_TMP" tar xf "$HELM_TMP_FILE" -C "$HELM_TMP" HELM_TMP_BIN="$HELM_TMP/$OS-$ARCH/$PROJECT_NAME" - echo "Preparing to install into ${HELM_INSTALL_DIR}" + TILLER_TMP_BIN="$HELM_TMP/$OS-$ARCH/$TILLER_NAME" + echo "Preparing to install $PROJECT_NAME and $TILLER_NAME into ${HELM_INSTALL_DIR}" runAsRoot cp "$HELM_TMP_BIN" "$HELM_INSTALL_DIR" + echo "$PROJECT_NAME installed into $HELM_INSTALL_DIR/$PROJECT_NAME" + if [ -x "$TILLER_TMP_BIN" ]; then + runAsRoot cp "$TILLER_TMP_BIN" "$HELM_INSTALL_DIR" + echo "$TILLER_NAME installed into $HELM_INSTALL_DIR/$TILLER_NAME" + else + echo "info: $TILLER_NAME binary was not found in this release; skipping $TILLER_NAME installation" + fi } # fail_trap is executed if an error occurs. @@ -165,7 +174,6 @@ fail_trap() { # testVersion tests the installed client to make sure it is working. testVersion() { set +e - echo "$PROJECT_NAME installed into $HELM_INSTALL_DIR/$PROJECT_NAME" HELM="$(which $PROJECT_NAME)" if [ "$?" = "1" ]; then echo "$PROJECT_NAME not found. Is $HELM_INSTALL_DIR on your "'$PATH?' From 4dd9047586f0cfa8ed77a21d2f1062c382f27d3e Mon Sep 17 00:00:00 2001 From: Qiang Li Date: Tue, 18 Sep 2018 13:55:22 -0700 Subject: [PATCH 200/483] fix(helm): fix selector typo in service template for 'helm create' (#4663) changed instancelease to instance in service template closes #4661 Signed-off-by: Qiang Li --- pkg/chartutil/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index cff3b89ebb6..43fb5f7d3eb 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -232,7 +232,7 @@ spec: name: http selector: app.kubernetes.io/name: {{ include ".name" . }} - app.kubernetes.io/instancelease: {{ .Release.Name }} + app.kubernetes.io/instance: {{ .Release.Name }} ` const defaultNotes = `1. Get the application URL by running these commands: From fbda50a452b6db58faf2016b17c206ee27ddc999 Mon Sep 17 00:00:00 2001 From: Caleb Delnay Date: Tue, 18 Sep 2018 17:00:30 -0400 Subject: [PATCH 201/483] Fix credentials not set for ResolveChartVersion default HTTP client (#4662) Fixes Issue #4299 and Issue #4445 Signed-off-by: Caleb Delnay --- pkg/downloader/chart_downloader.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 92c8f9165d7..5e62872995f 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -170,8 +170,11 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge if err != nil { return u, nil, err } - getter, err := getterConstructor(ref, "", "", "") - return u, getter, err + g, err := getterConstructor(ref, "", "", "") + if t, ok := g.(*getter.HttpGetter); ok { + t.SetCredentials(c.Username, c.Password) + } + return u, g, err } return u, nil, err } From 8be42bae885a04b4acc242cf420911145b32ee1c Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 19 Sep 2018 11:20:32 -0700 Subject: [PATCH 202/483] fix(helm): fix regression with TLS flags/environment variables not being parsed (#4657) * fix(helm): fix regression with TLS flags/envvars This change fixes some of the assumptions made in an earlier commit. Helm's TLS flags and environment variables were not respected because they were parsed well before execution (during settings.AddFlagsTLS()), causing erroneous behaviour at runtime. By re-introducing environment.Init(), Helm can properly parse environment variables at the correct time. One change that had to occur in this PR is the fact that we need to call settings.Init() each time we call settings.AddFlagsTLS(). This is because each command owns its own FlagSet, so we need to parse each flagset to read and propagate the environment variables correctly. I also noticed that we were maintaining two separate variables for each TLS value. Refactoring out some of the older code to all use the settings object makes the code much cleaner to read and fixes an issue where setting a flag or environment variable would propagate to the settings object, but we'd be reading from tlsEnable. I've also added some unit tests to ensure this regression doesn't occur again. Signed-off-by: Matthew Fisher * fix bug where os.ExpandEnv() on the default value causes differing behaviour Signed-off-by: Matthew Fisher * add more context to the TODO/FIXME messages Signed-off-by: Matthew Fisher --- cmd/helm/delete.go | 3 + cmd/helm/get.go | 3 + cmd/helm/get_hooks.go | 4 + cmd/helm/get_manifest.go | 4 + cmd/helm/get_notes.go | 3 + cmd/helm/get_values.go | 4 + cmd/helm/helm.go | 49 ++-- cmd/helm/helm_test.go | 310 +++++++++++++++++++++++ cmd/helm/history.go | 3 + cmd/helm/init.go | 18 ++ cmd/helm/install.go | 3 + cmd/helm/list.go | 3 + cmd/helm/release_testing.go | 3 + cmd/helm/reset.go | 3 + cmd/helm/rollback.go | 3 + cmd/helm/status.go | 3 + cmd/helm/upgrade.go | 3 + cmd/helm/version.go | 3 + pkg/helm/environment/environment.go | 49 ++-- pkg/helm/environment/environment_test.go | 1 + 20 files changed, 429 insertions(+), 46 deletions(-) diff --git a/cmd/helm/delete.go b/cmd/helm/delete.go index b78956ab646..4f52ffdd9a6 100755 --- a/cmd/helm/delete.go +++ b/cmd/helm/delete.go @@ -85,6 +85,9 @@ func newDeleteCmd(c helm.Interface, out io.Writer) *cobra.Command { f.Int64Var(&del.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.StringVar(&del.description, "description", "", "specify a description for the release") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/get.go b/cmd/helm/get.go index 719e0779dd9..20a4c042f7e 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -79,6 +79,9 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { cmd.AddCommand(newGetHooksCmd(nil, out)) cmd.AddCommand(newGetNotesCmd(nil, out)) + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/get_hooks.go b/cmd/helm/get_hooks.go index 1f288245d55..310b2ec73ea 100644 --- a/cmd/helm/get_hooks.go +++ b/cmd/helm/get_hooks.go @@ -60,6 +60,10 @@ func newGetHooksCmd(client helm.Interface, out io.Writer) *cobra.Command { f := cmd.Flags() settings.AddFlagsTLS(f) f.Int32Var(&ghc.version, "revision", 0, "get the named release with revision") + + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/get_manifest.go b/cmd/helm/get_manifest.go index 206c9d2957e..1cc7e3543d6 100644 --- a/cmd/helm/get_manifest.go +++ b/cmd/helm/get_manifest.go @@ -63,6 +63,10 @@ func newGetManifestCmd(client helm.Interface, out io.Writer) *cobra.Command { f := cmd.Flags() settings.AddFlagsTLS(f) f.Int32Var(&get.version, "revision", 0, "get the named release with revision") + + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/get_notes.go b/cmd/helm/get_notes.go index eaa3bc815b8..c7c3d77974b 100644 --- a/cmd/helm/get_notes.go +++ b/cmd/helm/get_notes.go @@ -63,6 +63,9 @@ func newGetNotesCmd(client helm.Interface, out io.Writer) *cobra.Command { settings.AddFlagsTLS(f) f.Int32Var(&get.version, "revision", 0, "get the notes of the named release with revision") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index 38eb5f4bb27..7cdfa636f96 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -65,6 +65,10 @@ func newGetValuesCmd(client helm.Interface, out io.Writer) *cobra.Command { f.Int32Var(&get.version, "revision", 0, "get the named release with revision") f.BoolVarP(&get.allValues, "all", "a", false, "dump all (computed) values") f.StringVar(&get.output, "output", "yaml", "output the specified format (json or yaml)") + + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 75fa2dc3867..7f2bf369abe 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -40,13 +40,6 @@ import ( ) var ( - tlsServerName string // overrides the server name used to verify the hostname on the returned certificates from the server. - tlsCaCertFile string // path to TLS CA certificate file - tlsCertFile string // path to TLS certificate file - tlsKeyFile string // path to TLS key file - tlsVerify bool // enable TLS and verify remote certificates - tlsEnable bool // enable TLS - tillerTunnel *kube.Tunnel settings helm_env.EnvSettings ) @@ -87,9 +80,21 @@ func newRootCmd(args []string) *cobra.Command { Long: globalUsage, SilenceUsage: true, PersistentPreRun: func(*cobra.Command, []string) { - tlsCaCertFile = os.ExpandEnv(tlsCaCertFile) - tlsCertFile = os.ExpandEnv(tlsCertFile) - tlsKeyFile = os.ExpandEnv(tlsKeyFile) + if settings.TLSCaCertFile == helm_env.DefaultTLSCaCert || settings.TLSCaCertFile == "" { + settings.TLSCaCertFile = settings.Home.TLSCaCert() + } else { + settings.TLSCaCertFile = os.ExpandEnv(settings.TLSCaCertFile) + } + if settings.TLSCertFile == helm_env.DefaultTLSCert || settings.TLSCertFile == "" { + settings.TLSCertFile = settings.Home.TLSCert() + } else { + settings.TLSCertFile = os.ExpandEnv(settings.TLSCertFile) + } + if settings.TLSKeyFile == helm_env.DefaultTLSKeyFile || settings.TLSKeyFile == "" { + settings.TLSKeyFile = settings.Home.TLSKey() + } else { + settings.TLSKeyFile = os.ExpandEnv(settings.TLSKeyFile) + } }, PersistentPostRun: func(*cobra.Command, []string) { teardown() @@ -143,6 +148,9 @@ func newRootCmd(args []string) *cobra.Command { flags.Parse(args) + // set defaults from environment + settings.Init(flags) + // Find and add plugins loadPlugins(cmd, out) @@ -275,24 +283,15 @@ func newClient() helm.Interface { options := []helm.Option{helm.Host(settings.TillerHost), helm.ConnectTimeout(settings.TillerConnectionTimeout)} if settings.TLSVerify || settings.TLSEnable { - if tlsCaCertFile == "" { - tlsCaCertFile = settings.Home.TLSCaCert() - } - if tlsCertFile == "" { - tlsCertFile = settings.Home.TLSCert() - } - if tlsKeyFile == "" { - tlsKeyFile = settings.Home.TLSKey() - } - debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", tlsServerName, tlsKeyFile, tlsCertFile, tlsCaCertFile) + debug("Host=%q, Key=%q, Cert=%q, CA=%q\n", settings.TLSServerName, settings.TLSKeyFile, settings.TLSCertFile, settings.TLSCaCertFile) tlsopts := tlsutil.Options{ - ServerName: tlsServerName, - KeyFile: tlsKeyFile, - CertFile: tlsCertFile, + ServerName: settings.TLSServerName, + KeyFile: settings.TLSKeyFile, + CertFile: settings.TLSCertFile, InsecureSkipVerify: true, } - if tlsVerify { - tlsopts.CaCertFile = tlsCaCertFile + if settings.TLSVerify { + tlsopts.CaCertFile = settings.TLSCaCertFile tlsopts.InsecureSkipVerify = false } tlscfg, err := tlsutil.ClientConfig(tlsopts) diff --git a/cmd/helm/helm_test.go b/cmd/helm/helm_test.go index c872af8c368..3551eb5349f 100644 --- a/cmd/helm/helm_test.go +++ b/cmd/helm/helm_test.go @@ -30,6 +30,7 @@ import ( "github.com/spf13/cobra" "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/helm/environment" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/repo" @@ -229,6 +230,315 @@ func TestRootCmd(t *testing.T) { } } +func TestTLSFlags(t *testing.T) { + cleanup := resetEnv() + defer cleanup() + + homePath := os.Getenv("HELM_HOME") + if homePath == "" { + homePath = filepath.Join(os.Getenv("HOME"), ".helm") + } + + home := helmpath.Home(homePath) + + tests := []struct { + name string + args []string + envars map[string]string + settings environment.EnvSettings + }{ + { + name: "defaults", + args: []string{"version", "-c"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls enable", + args: []string{"version", "-c", "--tls"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: true, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls verify", + args: []string{"version", "-c", "--tls-verify"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: true, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls servername", + args: []string{"version", "-c", "--tls-hostname=foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "foo", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls cacert", + args: []string{"version", "-c", "--tls-ca-cert=/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: "/foo", + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls cert", + args: []string{"version", "-c", "--tls-cert=/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: "/foo", + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls key", + args: []string{"version", "-c", "--tls-key=/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: "/foo", + }, + }, + { + name: "tls enable envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_ENABLE": "true"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: true, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls verify envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_VERIFY": "true"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: true, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls servername envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_HOSTNAME": "foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "foo", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls cacert envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_CA_CERT": "/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: "/foo", + TLSCertFile: home.TLSCert(), + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls cert envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_CERT": "/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: "/foo", + TLSKeyFile: home.TLSKey(), + }, + }, + { + name: "tls key envvar", + args: []string{"version", "-c"}, + envars: map[string]string{"HELM_TLS_KEY": "/foo"}, + settings: environment.EnvSettings{ + TillerHost: "", + TillerConnectionTimeout: 300, + TillerNamespace: "kube-system", + Home: home, + Debug: false, + KubeContext: "", + KubeConfig: "", + TLSEnable: false, + TLSVerify: false, + TLSServerName: "", + TLSCaCertFile: home.TLSCaCert(), + TLSCertFile: home.TLSCert(), + TLSKeyFile: "/foo", + }, + }, + } + + // ensure not set locally + tlsEnvvars := []string{ + "HELM_TLS_HOSTNAME", + "HELM_TLS_CA_CERT", + "HELM_TLS_CERT", + "HELM_TLS_KEY", + "HELM_TLS_VERIFY", + "HELM_TLS_ENABLE", + } + + for i := range tlsEnvvars { + os.Unsetenv(tlsEnvvars[i]) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + for k, v := range tt.envars { + os.Setenv(k, v) + defer os.Unsetenv(k) + } + + cmd := newRootCmd(tt.args) + cmd.SetOutput(ioutil.Discard) + cmd.SetArgs(tt.args) + cmd.Run = func(*cobra.Command, []string) {} + if err := cmd.Execute(); err != nil { + t.Errorf("unexpected error: %s", err) + } + + if settings != tt.settings { + t.Errorf("expected settings %v, got %v", tt.settings, settings) + } + }) + } +} + func resetEnv() func() { origSettings := settings origEnv := os.Environ() diff --git a/cmd/helm/history.go b/cmd/helm/history.go index 51bc34e75a7..365346e8919 100644 --- a/cmd/helm/history.go +++ b/cmd/helm/history.go @@ -93,6 +93,9 @@ func newHistoryCmd(c helm.Interface, w io.Writer) *cobra.Command { f.UintVar(&his.colWidth, "col-width", 60, "specifies the max column width of output") f.StringVarP(&his.outputFormat, "output", "o", "table", "prints the output in the specified format (json|table|yaml)") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 4be54e675bf..b628dc00874 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -70,6 +70,12 @@ var ( // This is the IPv4 loopback, not localhost, because we have to force IPv4 // for Dockerized Helm: https://github.com/kubernetes/helm/issues/1410 localRepositoryURL = "http://127.0.0.1:8879/charts" + tlsServerName string // overrides the server name used to verify the hostname on the returned certificates from the server. + tlsCaCertFile string // path to TLS CA certificate file + tlsCertFile string // path to TLS certificate file + tlsKeyFile string // path to TLS key file + tlsVerify bool // enable TLS and verify remote certificates + tlsEnable bool // enable TLS ) type initCmd struct { @@ -121,6 +127,10 @@ func newInitCmd(out io.Writer) *cobra.Command { f.BoolVar(&i.skipRefresh, "skip-refresh", false, "do not refresh (download) the local repository cache") f.BoolVar(&i.wait, "wait", false, "block until Tiller is running and ready to receive requests") + // TODO: replace TLS flags with pkg/helm/environment.AddFlagsTLS() in Helm 3 + // + // NOTE (bacongobbler): we can't do this in Helm 2 because the flag names differ, and `helm init --tls-ca-cert` + // doesn't conform with the rest of the TLS flag names (should be --tiller-tls-ca-cert in Helm 3) f.BoolVar(&tlsEnable, "tiller-tls", false, "install Tiller with TLS enabled") f.BoolVar(&tlsVerify, "tiller-tls-verify", false, "install Tiller with TLS enabled and to verify remote certificates") f.StringVar(&tlsKeyFile, "tiller-tls-key", "", "path to TLS key file to install with Tiller") @@ -166,6 +176,14 @@ func (i *initCmd) tlsOptions() error { return errors.New("missing required TLS CA file") } } + + // FIXME: remove once we use pkg/helm/environment.AddFlagsTLS() in Helm 3 + settings.TLSEnable = tlsEnable + settings.TLSVerify = tlsVerify + settings.TLSServerName = tlsServerName + settings.TLSCaCertFile = tlsCaCertFile + settings.TLSCertFile = tlsCertFile + settings.TLSKeyFile = tlsKeyFile } return nil } diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 7f84f335558..c5c6b9a49c2 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -220,6 +220,9 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&inst.depUp, "dep-up", false, "run helm dependency update before installing the chart") f.StringVar(&inst.description, "description", "", "specify a description for the release") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 384fca6197d..3ca3fbbfa33 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -140,6 +140,9 @@ func newListCmd(client helm.Interface, out io.Writer) *cobra.Command { // TODO: Do we want this as a feature of 'helm list'? //f.BoolVar(&list.superseded, "history", true, "show historical releases") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index c7231cf0431..f39d9b81f32 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -68,6 +68,9 @@ func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { f.Int64Var(&rlsTest.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&rlsTest.cleanup, "cleanup", false, "delete test pods upon completion") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index ffae0a613ee..eb1dce7f1e6 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -81,6 +81,9 @@ func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVarP(&d.force, "force", "f", false, "forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.)") f.BoolVar(&d.removeHelmHome, "remove-helm-home", false, "if set deletes $HELM_HOME") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index a06b205c844..0c46fa81883 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -87,6 +87,9 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&rollback.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") f.StringVar(&rollback.description, "description", "", "specify a description for the release") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/status.go b/cmd/helm/status.go index fe53081a444..b03453adca3 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -81,6 +81,9 @@ func newStatusCmd(client helm.Interface, out io.Writer) *cobra.Command { f.Int32Var(&status.version, "revision", 0, "if set, display the status of the named release with revision") f.StringVarP(&status.outfmt, "output", "o", "", "output the status in the specified format (json or yaml)") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 905a2c17599..d05987b8a72 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -177,6 +177,9 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.MarkDeprecated("disable-hooks", "use --no-hooks instead") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/cmd/helm/version.go b/cmd/helm/version.go index 1c292e19d35..a803a990bac 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -83,6 +83,9 @@ func newVersionCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&version.short, "short", false, "print the version number") f.StringVar(&version.template, "template", "", "template for version string format") + // set defaults from environment + settings.InitTLS(f) + return cmd } diff --git a/pkg/helm/environment/environment.go b/pkg/helm/environment/environment.go index 05d955d69a7..76348c3bdd0 100644 --- a/pkg/helm/environment/environment.go +++ b/pkg/helm/environment/environment.go @@ -87,17 +87,6 @@ func (s *EnvSettings) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&s.Debug, "debug", false, "enable verbose output") fs.StringVar(&s.TillerNamespace, "tiller-namespace", "kube-system", "namespace of Tiller") fs.Int64Var(&s.TillerConnectionTimeout, "tiller-connection-timeout", int64(300), "the duration (in seconds) Helm will wait to establish a connection to tiller") - - envMap := map[string]string{ - "debug": "HELM_DEBUG", - "home": "HELM_HOME", - "host": "HELM_HOST", - "tiller-namespace": "TILLER_NAMESPACE", - } - - for name, envar := range envMap { - setFlagFromEnv(name, envar, fs) - } } // AddFlagsTLS adds the flags for supporting client side TLS to the given flagset. @@ -108,23 +97,38 @@ func (s *EnvSettings) AddFlagsTLS(fs *pflag.FlagSet) { fs.StringVar(&s.TLSKeyFile, "tls-key", DefaultTLSKeyFile, "path to TLS key file") fs.BoolVar(&s.TLSVerify, "tls-verify", DefaultTLSVerify, "enable TLS for request and verify remote") fs.BoolVar(&s.TLSEnable, "tls", DefaultTLSEnable, "enable TLS for request") +} - envMap := map[string]string{ - "tls-hostname": "HELM_TLS_HOSTNAME", - "tls-ca-cert": "HELM_TLS_CA_CERT", - "tls-cert": "HELM_TLS_CERT", - "tls-key": "HELM_TLS_KEY", - "tls-verify": "HELM_TLS_VERIFY", - "tls": "HELM_TLS_ENABLE", +// Init sets values from the environment. +func (s *EnvSettings) Init(fs *pflag.FlagSet) { + for name, envar := range envMap { + setFlagFromEnv(name, envar, fs) } +} - for name, envar := range envMap { +// InitTLS sets TLS values from the environment. +func (s *EnvSettings) InitTLS(fs *pflag.FlagSet) { + for name, envar := range tlsEnvMap { setFlagFromEnv(name, envar, fs) } } -// Init is deprecated; calling `.AddFlags` or `.AddFlagsTLS` directly will set the flags to their default values from the environment, so this is a no-op. -func (s *EnvSettings) Init(fs *pflag.FlagSet) {} +// envMap maps flag names to envvars +var envMap = map[string]string{ + "debug": "HELM_DEBUG", + "home": "HELM_HOME", + "host": "HELM_HOST", + "tiller-namespace": "TILLER_NAMESPACE", +} + +var tlsEnvMap = map[string]string{ + "tls-hostname": "HELM_TLS_HOSTNAME", + "tls-ca-cert": "HELM_TLS_CA_CERT", + "tls-cert": "HELM_TLS_CERT", + "tls-key": "HELM_TLS_KEY", + "tls-verify": "HELM_TLS_VERIFY", + "tls": "HELM_TLS_ENABLE", +} // PluginDirs is the path to the plugin directories. func (s EnvSettings) PluginDirs() string { @@ -134,6 +138,9 @@ func (s EnvSettings) PluginDirs() string { return s.Home.Plugins() } +// setFlagFromEnv looks up and sets a flag if the corresponding environment variable changed. +// if the flag with the corresponding name was set during fs.Parse(), then the environment +// variable is ignored. func setFlagFromEnv(name, envar string, fs *pflag.FlagSet) { if fs.Changed(name) { return diff --git a/pkg/helm/environment/environment_test.go b/pkg/helm/environment/environment_test.go index fb05254edf2..675582cf62d 100644 --- a/pkg/helm/environment/environment_test.go +++ b/pkg/helm/environment/environment_test.go @@ -123,6 +123,7 @@ func TestEnvSettings(t *testing.T) { flags.Parse(tt.args) settings.Init(flags) + settings.InitTLS(flags) if settings.Home != helmpath.Home(tt.home) { t.Errorf("expected home %q, got %q", tt.home, settings.Home) From 1a54463bdb1e4cf9b6f93fa2f7452c77e68bb54e Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Tue, 25 Sep 2018 17:18:21 -0400 Subject: [PATCH 203/483] fix(helm): fix paths in the ingress template and values file written by helm create Signed-off-by: Arash Deshmeh --- pkg/chartutil/create.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 43fb5f7d3eb..61dce9fa4a5 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -71,7 +71,7 @@ ingress: annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" - path: / + paths: [] hosts: - chart-example.local tls: [] @@ -123,7 +123,7 @@ const defaultIgnore = `# Patterns to ignore when building packages. const defaultIngress = `{{- if .Values.ingress.enabled -}} {{- $fullName := include ".fullname" . -}} -{{- $ingressPath := .Values.ingress.path -}} +{{- $ingressPaths := .Values.ingress.paths -}} apiVersion: extensions/v1beta1 kind: Ingress metadata: @@ -153,10 +153,12 @@ spec: - host: {{ . | quote }} http: paths: - - path: {{ $ingressPath }} + {{- range $ingressPaths }} + - path: {{ . }} backend: serviceName: {{ $fullName }} servicePort: http + {{- end }} {{- end }} {{- end }} ` @@ -237,8 +239,10 @@ spec: const defaultNotes = `1. Get the application URL by running these commands: {{- if .Values.ingress.enabled }} -{{- range .Values.ingress.hosts }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ . }}{{ $.Values.ingress.path }} +{{- range $host := .Values.ingress.hosts }} + {{- range $.Values.ingress.paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host }}{{ . }} + {{- end }} {{- end }} {{- else if contains "NodePort" .Values.service.type }} export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include ".fullname" . }}) From 12ace315eaac2e0e1bcc5ba79551dd90f3ebdd3e Mon Sep 17 00:00:00 2001 From: Colin Panisset Date: Thu, 27 Sep 2018 10:38:39 +1000 Subject: [PATCH 204/483] Don't assume that the returned error from the storage driver isn't nil (#3625) (#4627) Signed-off-by: Colin Panisset --- pkg/tiller/release_server.go | 21 +++++++++--- pkg/tiller/release_server_test.go | 57 +++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index e913579aad5..e562be20366 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -202,15 +202,28 @@ func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) { return "", fmt.Errorf("a release named %s already exists.\nRun: helm ls --all %s; to check the status of the release\nOr run: helm del --purge %s; to delete it", start, start, start) } + moniker := moniker.New() + newname, err := s.createUniqName(moniker) + if err != nil { + return "ERROR", err + } + + s.Log("info: Created new release name %s", newname) + return newname, nil + +} + +func (s *ReleaseServer) createUniqName(m moniker.Namer) (string, error) { maxTries := 5 for i := 0; i < maxTries; i++ { - namer := moniker.New() - name := namer.NameSep("-") + name := m.NameSep("-") if len(name) > releaseNameMaxLen { name = name[:releaseNameMaxLen] } - if _, err := s.env.Releases.Get(name, 1); strings.Contains(err.Error(), "not found") { - return name, nil + if _, err := s.env.Releases.Get(name, 1); err != nil { + if strings.Contains(err.Error(), "not found") { + return name, nil + } } s.Log("info: generated name %s is taken. Searching again.", name) } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index f3fca739098..b8adb4bb2f3 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -28,6 +28,7 @@ import ( "github.com/ghodss/yaml" "github.com/golang/protobuf/ptypes/timestamp" + "github.com/technosophos/moniker" "golang.org/x/net/context" "google.golang.org/grpc/metadata" "k8s.io/kubernetes/pkg/apis/core" @@ -380,6 +381,62 @@ func TestUniqName(t *testing.T) { } } +type fakeNamer struct { + name string +} + +func NewFakeNamer(nam string) moniker.Namer { + return &fakeNamer{ + name: nam, + } +} + +func (f *fakeNamer) Name() string { + return f.NameSep(" ") +} + +func (f *fakeNamer) NameSep(sep string) string { + return f.name +} + +func TestCreateUniqueName(t *testing.T) { + rs := rsFixture() + + rel1 := releaseStub() + rel1.Name = "happy-panda" + + rs.env.Releases.Create(rel1) + + tests := []struct { + name string + expect string + err bool + }{ + {"happy-panda", "ERROR", true}, + {"wobbly-octopus", "[a-z]+-[a-z]+", false}, + } + + for _, tt := range tests { + m := NewFakeNamer(tt.name) + u, err := rs.createUniqName(m) + if err != nil { + if tt.err { + continue + } + t.Fatal(err) + } + if tt.err { + t.Errorf("Expected an error for %q", tt.name) + } + if match, err := regexp.MatchString(tt.expect, u); err != nil { + t.Fatal(err) + } else if !match { + t.Errorf("Expected %q to match %q", u, tt.expect) + } + } + +} + func releaseWithKeepStub(rlsName string) *release.Release { ch := &chart.Chart{ Metadata: &chart.Metadata{ From 597c4fb421306f9673f43a27b0927af3884da84b Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Fri, 28 Sep 2018 08:22:52 -0600 Subject: [PATCH 205/483] docs(provenance): update explanation of new GnuPG format (#4710) Signed-off-by: Matt Butcher --- docs/provenance.md | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/docs/provenance.md b/docs/provenance.md index 331074e8ca2..d8f9e408966 100644 --- a/docs/provenance.md +++ b/docs/provenance.md @@ -22,12 +22,17 @@ Prerequisites: - A valid PGP keypair in a binary (not ASCII-armored) format - The `helm` command line tool -- GnuPG command line tools (optional) +- GnuPG >=2.1 command line tools (optional) - Keybase command line tools (optional) **NOTE:** If your PGP private key has a passphrase, you will be prompted to enter that passphrase for any commands that support the `--sign` option. +**NOTE:** The keyfile format for GnuPG changed in version 2.1. Prior to that release +it was unnecessary to export keys out of GnuPG, and you could instead point Helm +at your `*.gpg` files. With 2.1, the new `.kbx` format was introduced, and this +format is not supported by Helm. + Creating a new chart is the same as before: ``` @@ -42,10 +47,10 @@ the name under which the signing key is known and the keyring containing the cor $ helm package --sign --key 'helm signing key' --keyring path/to/keyring.secret mychart ``` -**TIP:** for GnuPG users, your secret keyring is in `~/.gnupg/secring.gpg`. You can +**TIP:** for GnuPG users, your secret keyring is in `~/.gnupg/secring.kbx`. You can use `gpg --list-secret-keys` to list the keys you have. -**Warning:** the GnuPG v2 store your secret keyring using a new format 'kbx' on the default location '~/.gnupg/pubring.kbx'. Please use the following command to convert your keyring to the legacy gpg format: +**Warning:** the GnuPG v2.1 store your secret keyring using a new format 'kbx' on the default location '~/.gnupg/pubring.kbx'. Please use the following command to convert your keyring to the legacy gpg format: ``` $ gpg --export-secret-keys >~/.gnupg/secring.gpg @@ -95,24 +100,16 @@ Prerequisites: The first step is to import your keybase keys into your local GnuPG keyring: ``` -$ keybase pgp export -s | gpg --import +$ keybase pgp export -s > secring.gpg ``` -This will convert your Keybase key into the OpenPGP format, and then import it -locally into your `~/.gnupg/secring.gpg` file. - -You can double check by running `gpg --list-secret-keys`. +This will convert your Keybase key into the OpenPGP format, and then place it +locally into your `secring.gpg` file. -``` -$ gpg --list-secret-keys 1 ↵ -/Users/mattbutcher/.gnupg/secring.gpg -------------------------------------- -sec 2048R/1FC18762 2016-07-25 -uid technosophos (keybase.io/technosophos) -ssb 2048R/D125E546 2016-07-25 -``` +> Tip: If you need to add a Keybase key to an existing keyring, you will need to +> do `keybase pgp export -s | gpg --import && gpg --export-secret-keys --outfile secring.gpg` -Note that your secret key will have an identifier string: +Your secret key will have an identifier string: ``` technosophos (keybase.io/technosophos) From 2ef61fdf5c46fdc47ac264926e70e0590e7b6f94 Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Mon, 1 Oct 2018 15:27:17 -0400 Subject: [PATCH 206/483] feat(helm): use apps/v1 as deployment apiVersion (#4725) Use 'apps/v1' as the apiVersion field for the deployment.yaml written by the 'helm create' command, rather than the deprecated 'apps/v1beta2'. Signed-off-by: Arash Deshmeh --- pkg/chartutil/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 43fb5f7d3eb..24a9dabcc4e 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -161,7 +161,7 @@ spec: {{- end }} ` -const defaultDeployment = `apiVersion: apps/v1beta2 +const defaultDeployment = `apiVersion: apps/v1 kind: Deployment metadata: name: {{ include ".fullname" . }} From dbf84cd229eed678e8adf8b3bb60da6f641ae4cd Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Thu, 4 Oct 2018 10:28:34 -0700 Subject: [PATCH 207/483] ref(*): kubernetes v1.12 support Signed-off-by: Adam Reese --- cmd/helm/helm.go | 17 +-- cmd/helm/installer/uninstall.go | 12 +- cmd/helm/installer/uninstall_test.go | 16 +-- cmd/helm/reset.go | 7 +- cmd/helm/reset_test.go | 6 +- cmd/rudder/rudder.go | 8 +- cmd/tiller/tiller.go | 7 +- glide.lock | 97 +++++++-------- glide.yaml | 121 +++++++++---------- pkg/helm/portforwarder/portforwarder_test.go | 2 +- pkg/kube/client.go | 60 ++++----- pkg/kube/client_test.go | 30 ++--- pkg/kube/namespace.go | 16 +-- pkg/kube/namespace_test.go | 4 +- pkg/kube/result.go | 2 +- pkg/kube/result_test.go | 2 +- pkg/releasetesting/environment.go | 4 +- pkg/releasetesting/test_suite.go | 10 +- pkg/releasetesting/test_suite_test.go | 10 +- pkg/storage/driver/cfgmaps.go | 12 +- pkg/storage/driver/cfgmaps_test.go | 4 +- pkg/storage/driver/mock_test.go | 53 ++++---- pkg/storage/driver/secrets.go | 12 +- pkg/storage/driver/secrets_test.go | 4 +- pkg/tiller/environment/environment.go | 10 +- pkg/tiller/environment/environment_test.go | 10 +- pkg/tiller/release_modules.go | 4 +- pkg/tiller/release_server.go | 6 +- pkg/tiller/release_server_test.go | 10 +- 29 files changed, 267 insertions(+), 289 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 7f2bf369abe..02a1e6edb75 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -28,10 +28,10 @@ import ( "google.golang.org/grpc/status" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/helm/pkg/helm" helm_env "k8s.io/helm/pkg/helm/environment" "k8s.io/helm/pkg/helm/portforwarder" @@ -256,21 +256,6 @@ func getKubeClient(context string, kubeconfig string) (*rest.Config, kubernetes. return config, client, nil } -// getInternalKubeClient creates a Kubernetes config and an "internal" client for a given kubeconfig context. -// -// Prefer the similar getKubeClient if you don't need to use such an internal client. -func getInternalKubeClient(context string, kubeconfig string) (internalclientset.Interface, error) { - config, err := configForContext(context, kubeconfig) - if err != nil { - return nil, err - } - client, err := internalclientset.NewForConfig(config) - if err != nil { - return nil, fmt.Errorf("could not get Kubernetes client: %s", err) - } - return client, nil -} - // ensureHelmClient returns a new helm client impl. if h is not nil. func ensureHelmClient(h helm.Interface) helm.Interface { if h != nil { diff --git a/cmd/helm/installer/uninstall.go b/cmd/helm/installer/uninstall.go index 54e79bdf442..db824ca0b20 100644 --- a/cmd/helm/installer/uninstall.go +++ b/cmd/helm/installer/uninstall.go @@ -19,8 +19,8 @@ package installer // import "k8s.io/helm/cmd/helm/installer" import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" + "k8s.io/client-go/kubernetes" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" ) const ( @@ -30,7 +30,7 @@ const ( ) // Uninstall uses Kubernetes client to uninstall Tiller. -func Uninstall(client internalclientset.Interface, opts *Options) error { +func Uninstall(client kubernetes.Interface, opts *Options) error { if err := deleteService(client.Core(), opts.Namespace); err != nil { return err } @@ -41,7 +41,7 @@ func Uninstall(client internalclientset.Interface, opts *Options) error { } // deleteService deletes the Tiller Service resource -func deleteService(client coreclient.ServicesGetter, namespace string) error { +func deleteService(client corev1.ServicesGetter, namespace string) error { err := client.Services(namespace).Delete(serviceName, &metav1.DeleteOptions{}) return ingoreNotFound(err) } @@ -49,13 +49,13 @@ func deleteService(client coreclient.ServicesGetter, namespace string) error { // deleteDeployment deletes the Tiller Deployment resource // We need to use the reaper instead of the kube API because GC for deployment dependents // is not yet supported at the k8s server level (<= 1.5) -func deleteDeployment(client internalclientset.Interface, namespace string) error { +func deleteDeployment(client kubernetes.Interface, namespace string) error { err := client.Extensions().Deployments(namespace).Delete(deploymentName, &metav1.DeleteOptions{}) return ingoreNotFound(err) } // deleteSecret deletes the Tiller Secret resource -func deleteSecret(client coreclient.SecretsGetter, namespace string) error { +func deleteSecret(client corev1.SecretsGetter, namespace string) error { err := client.Secrets(namespace).Delete(secretName, &metav1.DeleteOptions{}) return ingoreNotFound(err) } diff --git a/cmd/helm/installer/uninstall_test.go b/cmd/helm/installer/uninstall_test.go index 7e5be8aaacb..68bbd7c723c 100644 --- a/cmd/helm/installer/uninstall_test.go +++ b/cmd/helm/installer/uninstall_test.go @@ -19,17 +19,17 @@ package installer // import "k8s.io/helm/cmd/helm/installer" import ( "testing" + "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/kubernetes/fake" testcore "k8s.io/client-go/testing" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" ) func TestUninstall(t *testing.T) { fc := &fake.Clientset{} - opts := &Options{Namespace: core.NamespaceDefault} + opts := &Options{Namespace: v1.NamespaceDefault} if err := Uninstall(fc, opts); err != nil { t.Errorf("unexpected error: %#+v", err) } @@ -45,7 +45,7 @@ func TestUninstall_serviceNotFound(t *testing.T) { return true, nil, apierrors.NewNotFound(schema.GroupResource{Resource: "services"}, "1") }) - opts := &Options{Namespace: core.NamespaceDefault} + opts := &Options{Namespace: v1.NamespaceDefault} if err := Uninstall(fc, opts); err != nil { t.Errorf("unexpected error: %#+v", err) } @@ -58,10 +58,10 @@ func TestUninstall_serviceNotFound(t *testing.T) { func TestUninstall_deploymentNotFound(t *testing.T) { fc := &fake.Clientset{} fc.AddReactor("delete", "deployments", func(action testcore.Action) (bool, runtime.Object, error) { - return true, nil, apierrors.NewNotFound(core.Resource("deployments"), "1") + return true, nil, apierrors.NewNotFound(schema.GroupResource{Resource: "deployments"}, "1") }) - opts := &Options{Namespace: core.NamespaceDefault} + opts := &Options{Namespace: v1.NamespaceDefault} if err := Uninstall(fc, opts); err != nil { t.Errorf("unexpected error: %#+v", err) } @@ -74,10 +74,10 @@ func TestUninstall_deploymentNotFound(t *testing.T) { func TestUninstall_secretNotFound(t *testing.T) { fc := &fake.Clientset{} fc.AddReactor("delete", "secrets", func(action testcore.Action) (bool, runtime.Object, error) { - return true, nil, apierrors.NewNotFound(core.Resource("secrets"), "1") + return true, nil, apierrors.NewNotFound(schema.GroupResource{Resource: "secrets"}, "1") }) - opts := &Options{Namespace: core.NamespaceDefault} + opts := &Options{Namespace: v1.NamespaceDefault} if err := Uninstall(fc, opts); err != nil { t.Errorf("unexpected error: %#+v", err) } diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index eb1dce7f1e6..887ce34d0a7 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -23,7 +23,8 @@ import ( "os" "github.com/spf13/cobra" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + + "k8s.io/client-go/kubernetes" "k8s.io/helm/cmd/helm/installer" "k8s.io/helm/pkg/helm" @@ -44,7 +45,7 @@ type resetCmd struct { out io.Writer home helmpath.Home client helm.Interface - kubeClient internalclientset.Interface + kubeClient kubernetes.Interface } func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { @@ -90,7 +91,7 @@ func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { // runReset uninstalls tiller from Kubernetes Cluster and deletes local config func (d *resetCmd) run() error { if d.kubeClient == nil { - c, err := getInternalKubeClient(settings.KubeContext, settings.KubeConfig) + _, c, err := getKubeClient(settings.KubeContext, settings.KubeConfig) if err != nil { return fmt.Errorf("could not get kubernetes client: %s", err) } diff --git a/cmd/helm/reset_test.go b/cmd/helm/reset_test.go index 8a74e8af511..78055d86641 100644 --- a/cmd/helm/reset_test.go +++ b/cmd/helm/reset_test.go @@ -23,8 +23,8 @@ import ( "strings" "testing" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" + "k8s.io/api/core/v1" + "k8s.io/client-go/kubernetes/fake" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm/helmpath" @@ -101,7 +101,7 @@ func verifyResetCmd(t *testing.T, tc resetCase) { home: helmpath.Home(home), client: c, kubeClient: fc, - namespace: core.NamespaceDefault, + namespace: v1.NamespaceDefault, } err = cmd.run() diff --git a/cmd/rudder/rudder.go b/cmd/rudder/rudder.go index 8897e78be2c..051640542af 100644 --- a/cmd/rudder/rudder.go +++ b/cmd/rudder/rudder.go @@ -21,12 +21,12 @@ import ( "fmt" "net" + "github.com/spf13/pflag" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/client-go/kubernetes" - "github.com/spf13/pflag" "k8s.io/helm/pkg/kube" rudderAPI "k8s.io/helm/pkg/proto/hapi/rudder" "k8s.io/helm/pkg/tiller" @@ -34,7 +34,7 @@ import ( ) var kubeClient *kube.Client -var clientset internalclientset.Interface +var clientset kubernetes.Interface type options struct { listen string @@ -59,7 +59,7 @@ func main() { opts.regAndParseFlags() var err error kubeClient = kube.New(nil) - clientset, err = kubeClient.ClientSet() + clientset, err = kubeClient.KubernetesClientSet() if err != nil { grpclog.Fatalf("Cannot initialize Kubernetes connection: %s", err) } diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index 4c3623e597b..478ca92f41a 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -39,6 +39,7 @@ import ( // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/storage" @@ -120,7 +121,7 @@ func start() { healthSrv := health.NewServer() healthSrv.SetServingStatus("Tiller", healthpb.HealthCheckResponse_NOT_SERVING) - clientset, err := kube.New(nil).ClientSet() + clientset, err := kube.New(nil).KubernetesClientSet() if err != nil { logger.Fatalf("Cannot initialize Kubernetes connection: %s", err) } @@ -129,13 +130,13 @@ func start() { case storageMemory: env.Releases = storage.Init(driver.NewMemory()) case storageConfigMap: - cfgmaps := driver.NewConfigMaps(clientset.Core().ConfigMaps(namespace())) + cfgmaps := driver.NewConfigMaps(clientset.CoreV1().ConfigMaps(namespace())) cfgmaps.Log = newLogger("storage/driver").Printf env.Releases = storage.Init(cfgmaps) env.Releases.Log = newLogger("storage").Printf case storageSecret: - secrets := driver.NewSecrets(clientset.Core().Secrets(namespace())) + secrets := driver.NewSecrets(clientset.CoreV1().Secrets(namespace())) secrets.Log = newLogger("storage/driver").Printf env.Releases = storage.Init(secrets) diff --git a/glide.lock b/glide.lock index 298de261277..c25f439bd42 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: a4a7df055da2413c8e42cb127833a77d6a2910396efdabf5a7dc5af956478fef -updated: 2018-09-13T18:30:19.732109-06:00 +hash: 30b1d3f31b7bd310a9434e081bae3d5dc18c0a79b3674c0adffccc8d602e9227 +updated: 2018-10-04T17:11:58.043264Z imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -11,22 +11,23 @@ imports: - name: github.com/asaskevich/govalidator version: 7664702784775e51966f0885f5cd27435916517b - name: github.com/Azure/go-ansiterm - version: 19f72df4d05d31cbe1c56bfc8045c96babff6c7e + version: d6e3b3328b783f23731bc4d058875b0371ff8109 subpackages: - winterm - name: github.com/Azure/go-autorest - version: 1ff28809256a84bb6966640ff3d0371af82ccba4 + version: bca49d5b51a50dc5bb17bbf6204c711c6dbded06 subpackages: - autorest - autorest/adal - autorest/azure - autorest/date + - version - name: github.com/beorn7/perks version: 3ac7bf7a47d159a033b107610db8a1b6575507a4 subpackages: - quantile - name: github.com/BurntSushi/toml - version: b26d9c308763d68093482582cea63d69be07a0f0 + version: 3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005 - name: github.com/chai2010/gettext-go version: c6fed771bfd517099caf0f7a961671fa8ed08723 subpackages: @@ -52,7 +53,7 @@ imports: - digestset - reference - name: github.com/docker/docker - version: 4f3616fb1c112e206b88cb7a9922bf49067a7756 + version: a9fbbdc8dd8794b20af358382ab780559bca589d subpackages: - api - api/types @@ -71,19 +72,15 @@ imports: - api/types/versions - api/types/volume - client - - pkg/ioutils - - pkg/jsonlog + - daemon/logger/jsonfilelog/jsonlog - pkg/jsonmessage - - pkg/longpath - pkg/mount - pkg/parsers - pkg/parsers/operatingsystem - pkg/stdcopy - pkg/sysinfo - - pkg/system - pkg/term - pkg/term/windows - - pkg/tlsconfig - name: github.com/docker/go-connections version: 3ede32e2033de7505e6500d6c868c2b9ed9f169d subpackages: @@ -97,7 +94,7 @@ imports: subpackages: - spdy - name: github.com/evanphx/json-patch - version: 94e38aa1586e8a6c8a75770bddf5ff84c48a106b + version: 36442dbdb585210f8d5a1b45e67aa323c197d5c4 - name: github.com/exponent-io/jsonpath version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5 - name: github.com/fatih/camelcase @@ -180,7 +177,7 @@ imports: - name: github.com/huandu/xstrings version: 3959339b333561bf62a38b424fd41517c2c90f40 - name: github.com/imdario/mergo - version: 6633656539c1639d9d78127b7d47c622b5d7b6dc + version: 9316a62528ac99aaecb4e47eadd6dc8aa6533d58 - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 - name: github.com/json-iterator/go @@ -202,7 +199,7 @@ imports: - name: github.com/mattn/go-runewidth version: d6bea18f789704b5f83375793155289da36a3c7f - name: github.com/matttproud/golang_protobuf_extensions - version: fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a + version: c12348ce28de40eed0136aa2b644d0ee0650e56c subpackages: - pbutil - name: github.com/mitchellh/go-wordwrap @@ -256,11 +253,11 @@ imports: subpackages: - doc - name: github.com/spf13/pflag - version: 583c0c0531f06d5278b7d917446061adc344b5cd + version: 298182f68c66c05229eb03ac171abe6e309ee79a - name: github.com/technosophos/moniker version: a5dbd03a2245d554160e3ae6bfdcf969fe58b431 - name: golang.org/x/crypto - version: 49796115aa4b964c318aad4f3084fdb41e9aa067 + version: de0752318171da717af4ce24d0a2e8626afaeb11 subpackages: - cast5 - ed25519 @@ -294,7 +291,7 @@ imports: - jws - jwt - name: golang.org/x/sys - version: 43eea11bc92608addb41b8a406b0407495c106f6 + version: 95c6576299259db960f6c5b9b69ea52422860fce subpackages: - unix - windows @@ -361,7 +358,7 @@ imports: - name: gopkg.in/inf.v0 version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4 - name: gopkg.in/square/go-jose.v2 - version: f8f38de21b4dcd69d0413faf231983f5fd6634b1 + version: 89060dee6a84df9a4dae49f676f0c755037834f1 subpackages: - cipher - json @@ -369,7 +366,7 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: 2d6f90ab1293a1fb871cf149423ebb72aa7423aa + version: fd83cbc87e7632ccd8bbab63d2b673d4e0c631cc subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -383,10 +380,12 @@ imports: - authorization/v1beta1 - autoscaling/v1 - autoscaling/v2beta1 + - autoscaling/v2beta2 - batch/v1 - batch/v1beta1 - batch/v2alpha1 - certificates/v1beta1 + - coordination/v1beta1 - core/v1 - events/v1beta1 - extensions/v1beta1 @@ -403,11 +402,11 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: 898b0eda132e1aeac43a459785144ee4bf9b0a2e + version: 05e89e265cc594459a3d33a63e779d94e6614c63 subpackages: - pkg/features - name: k8s.io/apimachinery - version: 103fd098999dc9c0c88536f5c9ad2e5da39373ae + version: 6dd46049f39503a1fc8d65de4bd566829e95faff subpackages: - pkg/api/equality - pkg/api/errors @@ -447,6 +446,7 @@ imports: - pkg/util/intstr - pkg/util/json - pkg/util/mergepatch + - pkg/util/naming - pkg/util/net - pkg/util/rand - pkg/util/remotecommand @@ -463,7 +463,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 8b122ec9e3bbab91a262d17a39325e69349dc44d + version: e85ad7b666fef0476185731329f4cff1536efff8 subpackages: - pkg/apis/audit - pkg/authentication/authenticator @@ -472,8 +472,14 @@ imports: - pkg/endpoints/request - pkg/features - pkg/util/feature +- name: k8s.io/cli-runtime + version: 79bf4e0b64544d8c490247abae089bea572ddae6 + subpackages: + - pkg/genericclioptions + - pkg/genericclioptions/printers + - pkg/genericclioptions/resource - name: k8s.io/client-go - version: 59698c7d9724b0f95f9dc9e7f7dfdcc3dfeceb82 + version: 1638f8970cefaa404ff3a62950f88b08292b2696 subpackages: - discovery - discovery/fake @@ -504,6 +510,8 @@ imports: - kubernetes/typed/autoscaling/v1/fake - kubernetes/typed/autoscaling/v2beta1 - kubernetes/typed/autoscaling/v2beta1/fake + - kubernetes/typed/autoscaling/v2beta2 + - kubernetes/typed/autoscaling/v2beta2/fake - kubernetes/typed/batch/v1 - kubernetes/typed/batch/v1/fake - kubernetes/typed/batch/v1beta1 @@ -512,6 +520,8 @@ imports: - kubernetes/typed/batch/v2alpha1/fake - kubernetes/typed/certificates/v1beta1 - kubernetes/typed/certificates/v1beta1/fake + - kubernetes/typed/coordination/v1beta1 + - kubernetes/typed/coordination/v1beta1/fake - kubernetes/typed/core/v1 - kubernetes/typed/core/v1/fake - kubernetes/typed/events/v1beta1 @@ -540,8 +550,6 @@ imports: - kubernetes/typed/storage/v1alpha1/fake - kubernetes/typed/storage/v1beta1 - kubernetes/typed/storage/v1beta1/fake - - listers/apps/v1 - - listers/core/v1 - pkg/apis/clientauthentication - pkg/apis/clientauthentication/v1alpha1 - pkg/apis/clientauthentication/v1beta1 @@ -578,6 +586,7 @@ imports: - tools/record - tools/reference - tools/remotecommand + - tools/watch - transport - transport/spdy - util/buffer @@ -590,13 +599,13 @@ imports: - util/jsonpath - util/retry - name: k8s.io/kube-openapi - version: 91cfa479c814065e420cee7ed227db0f63a5854e + version: 0cf8f7e6ed1d2e3d47d02e3b6e559369af24d803 subpackages: - pkg/util/proto - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 2e809eed16445fff9dcbfc56e9936cf76ccbdadc + version: 54a352dda957bce0f88e49b65a6ee8bba8c0ba74 subpackages: - pkg/api/events - pkg/api/legacyscheme @@ -630,6 +639,7 @@ imports: - pkg/apis/autoscaling/install - pkg/apis/autoscaling/v1 - pkg/apis/autoscaling/v2beta1 + - pkg/apis/autoscaling/v2beta2 - pkg/apis/batch - pkg/apis/batch/install - pkg/apis/batch/v1 @@ -638,9 +648,9 @@ imports: - pkg/apis/certificates - pkg/apis/certificates/install - pkg/apis/certificates/v1beta1 - - pkg/apis/componentconfig - - pkg/apis/componentconfig/install - - pkg/apis/componentconfig/v1alpha1 + - pkg/apis/coordination + - pkg/apis/coordination/install + - pkg/apis/coordination/v1beta1 - pkg/apis/core - pkg/apis/core/helper - pkg/apis/core/helper/qos @@ -684,40 +694,24 @@ imports: - pkg/apis/storage/v1beta1 - pkg/capabilities - pkg/client/clientset_generated/internalclientset - - pkg/client/clientset_generated/internalclientset/fake - pkg/client/clientset_generated/internalclientset/scheme - pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion - - pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/apps/internalversion - - pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion - - pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion - - pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion - - pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/batch/internalversion - - pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion - - pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake + - pkg/client/clientset_generated/internalclientset/typed/coordination/internalversion - pkg/client/clientset_generated/internalclientset/typed/core/internalversion - - pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/events/internalversion - - pkg/client/clientset_generated/internalclientset/typed/events/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion - - pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/networking/internalversion - - pkg/client/clientset_generated/internalclientset/typed/networking/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/policy/internalversion - - pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion - - pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion - - pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/settings/internalversion - - pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion - - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake - pkg/controller - pkg/controller/deployment/util - pkg/credentialprovider @@ -733,9 +727,6 @@ imports: - pkg/kubectl/cmd/util/openapi - pkg/kubectl/cmd/util/openapi/testing - pkg/kubectl/cmd/util/openapi/validation - - pkg/kubectl/genericclioptions - - pkg/kubectl/genericclioptions/printers - - pkg/kubectl/genericclioptions/resource - pkg/kubectl/scheme - pkg/kubectl/util - pkg/kubectl/util/hash @@ -763,16 +754,16 @@ imports: - pkg/util/net/sets - pkg/util/node - pkg/util/parsers - - pkg/util/pointer - pkg/util/slice - pkg/util/taints - pkg/version - name: k8s.io/utils - version: 258e2a2fa64568210fbd6267cf1d8fd87c3cb86e + version: 66066c83e385e385ccc3c964b44fd7dcd413d0ed subpackages: - clock - exec - exec/testing + - pointer - name: vbom.ml/util version: db5cfe13f5cc80a4990d98e2e1b0707a4d1a5394 subpackages: @@ -783,7 +774,7 @@ testImports: subpackages: - difflib - name: github.com/stretchr/testify - version: e3a8ff8ce36581f87a15341206f205b1da467059 + version: c679ae2cc0cb27ec3293fea7e254e47386f05d69 subpackages: - assert - require diff --git a/glide.yaml b/glide.yaml index 716fc56ef84..37c3f857e01 100644 --- a/glide.yaml +++ b/glide.yaml @@ -1,69 +1,64 @@ package: k8s.io/helm import: -- package: golang.org/x/net - subpackages: - - context -- package: github.com/spf13/cobra - version: c439c4fa093711d42e1b01acb1235b52004753c1 -- package: github.com/spf13/pflag - version: 583c0c0531f06d5278b7d917446061adc344b5cd -- package: github.com/Masterminds/vcs - version: ~1.11.0 + - package: golang.org/x/net + subpackages: + - context + - package: github.com/spf13/cobra + version: c439c4fa093711d42e1b01acb1235b52004753c1 + - package: github.com/spf13/pflag + version: ~1.0.1 + - package: github.com/Masterminds/vcs # Pin version of mergo that is compatible with both sprig and Kubernetes -- package: github.com/imdario/mergo - version: 6633656539c1639d9d78127b7d47c622b5d7b6dc -- package: github.com/Masterminds/sprig - version: ^2.16.0 -- package: github.com/ghodss/yaml -- package: github.com/Masterminds/semver - version: ~1.3.1 -- package: github.com/technosophos/moniker - version: ~0.2 -- package: github.com/golang/protobuf - version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 - subpackages: - - proto - - ptypes/any - - ptypes/timestamp -- package: google.golang.org/grpc - version: 1.7.2 -- package: github.com/gosuri/uitable -- package: github.com/asaskevich/govalidator - version: ^4.0.0 -- package: golang.org/x/crypto - subpackages: - - openpgp - - ssh/terminal -# pin version of golang.org/x/sys that is compatible with golang.org/x/crypto -- package: golang.org/x/sys - version: 43eea11 - subpackages: - - unix - - windows -- package: github.com/gobwas/glob - version: ^0.2.1 -- package: github.com/evanphx/json-patch -- package: github.com/BurntSushi/toml - version: ~0.3.0 -- package: github.com/prometheus/client_golang - version: 0.8.0 -- package: github.com/grpc-ecosystem/go-grpc-prometheus + - package: github.com/imdario/mergo + version: v0.3.5 + - package: github.com/Masterminds/sprig + version: ^2.16.0 + - package: github.com/ghodss/yaml + - package: github.com/Masterminds/semver + version: ~1.3.1 + - package: github.com/technosophos/moniker + version: ~0.2 + - package: github.com/golang/protobuf + version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 + subpackages: + - proto + - ptypes/any + - ptypes/timestamp + - package: google.golang.org/grpc + version: 1.7.2 + - package: github.com/gosuri/uitable + - package: github.com/asaskevich/govalidator + version: ^4.0.0 + - package: golang.org/x/crypto + subpackages: + - openpgp + - ssh/terminal + - package: github.com/gobwas/glob + version: ^0.2.1 + - package: github.com/evanphx/json-patch + - package: github.com/BurntSushi/toml + version: ~0.3.0 + - package: github.com/prometheus/client_golang + version: 0.8.0 + - package: github.com/grpc-ecosystem/go-grpc-prometheus -- package: k8s.io/kubernetes - version: release-1.11 -- package: k8s.io/client-go - version: kubernetes-1.11.1 -- package: k8s.io/api - version: kubernetes-1.11.1 -- package: k8s.io/apimachinery - version: kubernetes-1.11.1 -- package: k8s.io/apiserver - version: kubernetes-1.11.1 -- package: github.com/cyphar/filepath-securejoin - version: ^0.2.1 + - package: k8s.io/kubernetes + version: release-1.12 + - package: k8s.io/client-go + version: kubernetes-1.12.0 + - package: k8s.io/api + version: kubernetes-1.12.0 + - package: k8s.io/apimachinery + version: kubernetes-1.12.0 + - package: k8s.io/apiserver + version: kubernetes-1.12.0 + - package: k8s.io/cli-runtime + version: kubernetes-1.12.0 + - package: github.com/cyphar/filepath-securejoin + version: ^0.2.1 testImports: -- package: github.com/stretchr/testify - version: ^1.1.4 - subpackages: - - assert + - package: github.com/stretchr/testify + version: ^1.1.4 + subpackages: + - assert diff --git a/pkg/helm/portforwarder/portforwarder_test.go b/pkg/helm/portforwarder/portforwarder_test.go index ad5a23bc8ea..f5efe34431c 100644 --- a/pkg/helm/portforwarder/portforwarder_test.go +++ b/pkg/helm/portforwarder/portforwarder_test.go @@ -76,7 +76,7 @@ func TestGetFirstPod(t *testing.T) { for _, tt := range tests { client := fake.NewSimpleClientset(&v1.PodList{Items: tt.pods}) - name, err := GetTillerPodName(client.Core(), v1.NamespaceDefault) + name, err := GetTillerPodName(client.CoreV1(), v1.NamespaceDefault) if (err != nil) != tt.err { t.Errorf("%q. expected error: %v, got %v", tt.name, tt.err, err) } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 167da9eef75..67960ac46ea 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -18,6 +18,7 @@ package kube // import "k8s.io/helm/pkg/kube" import ( "bytes" + "context" "encoding/json" goerrors "errors" "fmt" @@ -42,20 +43,19 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/watch" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" + watchtools "k8s.io/client-go/tools/watch" "k8s.io/kubernetes/pkg/api/legacyscheme" batchinternal "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/kubectl/cmd/get" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/validation" ) -const ( - // MissingGetHeader is added to Get's output when a resource is not found. - MissingGetHeader = "==> MISSING\nKIND\t\tNAME\n" -) +// MissingGetHeader is added to Get's output when a resource is not found. +const MissingGetHeader = "==> MISSING\nKIND\t\tNAME\n" // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found. var ErrNoObjectsVisited = goerrors.New("no objects visited") @@ -86,7 +86,7 @@ type ResourceActorFunc func(*resource.Info) error // // Namespace will set the namespace. func (c *Client) Create(namespace string, reader io.Reader, timeout int64, shouldWait bool) error { - client, err := c.ClientSet() + client, err := c.KubernetesClientSet() if err != nil { return err } @@ -163,7 +163,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { return "", err } - var objPods = make(map[string][]core.Pod) + var objPods = make(map[string][]v1.Pod) missing := []string{} err = perform(infos, func(info *resource.Info) error { @@ -368,7 +368,7 @@ func perform(infos Result, fn ResourceActorFunc) error { } func createResource(info *resource.Info) error { - obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) + obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object, nil) if err != nil { return err } @@ -438,7 +438,7 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, // send patch to server helper := resource.NewHelper(target.Client, target.Mapping) - obj, err := helper.Patch(target.Namespace, target.Name, patchType, patch) + obj, err := helper.Patch(target.Namespace, target.Name, patchType, patch, nil) if err != nil { kind := target.Mapping.GroupVersionKind.Kind log.Printf("Cannot patch %s: %q (%v)", kind, target.Name, err) @@ -479,12 +479,12 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, return nil } - client, err := c.ClientSet() + client, err := c.KubernetesClientSet() if err != nil { return err } - pods, err := client.Core().Pods(target.Namespace).List(metav1.ListOptions{ + pods, err := client.CoreV1().Pods(target.Namespace).List(metav1.ListOptions{ FieldSelector: fields.Everything().String(), LabelSelector: labels.Set(selector).AsSelector().String(), }) @@ -497,7 +497,7 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, c.Log("Restarting pod: %v/%v", pod.Namespace, pod.Name) // Delete each pod for get them restarted with changed spec. - if err := client.Core().Pods(pod.Namespace).Delete(pod.Name, metav1.NewPreconditionDeleteOptions(string(pod.UID))); err != nil { + if err := client.CoreV1().Pods(pod.Namespace).Delete(pod.Name, metav1.NewPreconditionDeleteOptions(string(pod.UID))); err != nil { return err } } @@ -561,7 +561,9 @@ func (c *Client) watchUntilReady(timeout time.Duration, info *resource.Info) err // In the future, we might want to add some special logic for types // like Ingress, Volume, etc. - _, err = watch.Until(timeout, w, func(e watch.Event) (bool, error) { + ctx, cancel := watchtools.ContextWithOptionalTimeout(context.Background(), timeout) + defer cancel() + _, err = watchtools.UntilWithoutRetry(ctx, w, func(e watch.Event) (bool, error) { switch e.Type { case watch.Added, watch.Modified: // For things like a secret or a config map, this is the best indicator @@ -623,26 +625,26 @@ func scrubValidationError(err error) error { // WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase // and returns said phase (PodSucceeded or PodFailed qualify). -func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) { +func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { infos, err := c.Build(namespace, reader) if err != nil { - return core.PodUnknown, err + return v1.PodUnknown, err } info := infos[0] kind := info.Mapping.GroupVersionKind.Kind if kind != "Pod" { - return core.PodUnknown, fmt.Errorf("%s is not a Pod", info.Name) + return v1.PodUnknown, fmt.Errorf("%s is not a Pod", info.Name) } if err := c.watchPodUntilComplete(timeout, info); err != nil { - return core.PodUnknown, err + return v1.PodUnknown, err } if err := info.Get(); err != nil { - return core.PodUnknown, err + return v1.PodUnknown, err } - status := info.Object.(*core.Pod).Status.Phase + status := info.Object.(*v1.Pod).Status.Phase return status, nil } @@ -654,7 +656,9 @@ func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Inf } c.Log("Watching pod %s for completion with timeout of %v", info.Name, timeout) - _, err = watch.Until(timeout, w, func(e watch.Event) (bool, error) { + ctx, cancel := watchtools.ContextWithOptionalTimeout(context.Background(), timeout) + defer cancel() + _, err = watchtools.UntilWithoutRetry(ctx, w, func(e watch.Event) (bool, error) { return isPodComplete(e) }) @@ -662,15 +666,15 @@ func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Inf } func isPodComplete(event watch.Event) (bool, error) { - o, ok := event.Object.(*core.Pod) + o, ok := event.Object.(*v1.Pod) if !ok { - return true, fmt.Errorf("expected a *core.Pod, got %T", event.Object) + return true, fmt.Errorf("expected a *v1.Pod, got %T", event.Object) } if event.Type == watch.Deleted { return false, fmt.Errorf("pod not found") } switch o.Status.Phase { - case core.PodFailed, core.PodSucceeded: + case v1.PodFailed, v1.PodSucceeded: return true, nil } return false, nil @@ -678,7 +682,7 @@ func isPodComplete(event watch.Event) (bool, error) { //get a kubernetes resources' relation pods // kubernetes resource used select labels to relate pods -func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]core.Pod) (map[string][]core.Pod, error) { +func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]v1.Pod) (map[string][]v1.Pod, error) { if info == nil { return objPods, nil } @@ -691,9 +695,9 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] return objPods, nil } - client, _ := c.ClientSet() + client, _ := c.KubernetesClientSet() - pods, err := client.Core().Pods(info.Namespace).List(metav1.ListOptions{ + pods, err := client.CoreV1().Pods(info.Namespace).List(metav1.ListOptions{ FieldSelector: fields.Everything().String(), LabelSelector: labels.Set(selector).AsSelector().String(), }) @@ -718,7 +722,7 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] return objPods, nil } -func isFoundPod(podItem []core.Pod, pod core.Pod) bool { +func isFoundPod(podItem []v1.Pod, pod v1.Pod) bool { for _, value := range podItem { if (value.Namespace == pod.Namespace) && (value.Name == pod.Name) { return true diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 617fce35283..e505e8f376e 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -24,15 +24,15 @@ import ( "strings" "testing" + "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/client-go/rest/fake" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/core" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/scheme" ) @@ -42,34 +42,34 @@ func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) } -func newPod(name string) core.Pod { - return newPodWithStatus(name, core.PodStatus{}, "") +func newPod(name string) v1.Pod { + return newPodWithStatus(name, v1.PodStatus{}, "") } -func newPodWithStatus(name string, status core.PodStatus, namespace string) core.Pod { - ns := core.NamespaceDefault +func newPodWithStatus(name string, status v1.PodStatus, namespace string) v1.Pod { + ns := v1.NamespaceDefault if namespace != "" { ns = namespace } - return core.Pod{ + return v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: ns, SelfLink: "/api/v1/namespaces/default/pods/" + name, }, - Spec: core.PodSpec{ - Containers: []core.Container{{ + Spec: v1.PodSpec{ + Containers: []v1.Container{{ Name: "app:v4", Image: "abc/app:v4", - Ports: []core.ContainerPort{{Name: "http", ContainerPort: 80}}, + Ports: []v1.ContainerPort{{Name: "http", ContainerPort: 80}}, }}, }, Status: status, } } -func newPodList(names ...string) core.PodList { - var list core.PodList +func newPodList(names ...string) v1.PodList { + var list v1.PodList for _, name := range names { list.Items = append(list.Items, newPod(name)) } @@ -114,8 +114,8 @@ func TestUpdate(t *testing.T) { listA := newPodList("starfish", "otter", "squid") listB := newPodList("starfish", "otter", "dolphin") listC := newPodList("starfish", "otter", "dolphin") - listB.Items[0].Spec.Containers[0].Ports = []core.ContainerPort{{Name: "https", ContainerPort: 443}} - listC.Items[0].Spec.Containers[0].Ports = []core.ContainerPort{{Name: "https", ContainerPort: 443}} + listB.Items[0].Spec.Containers[0].Ports = []v1.ContainerPort{{Name: "https", ContainerPort: 443}} + listC.Items[0].Spec.Containers[0].Ports = []v1.ContainerPort{{Name: "https", ContainerPort: 443}} var actions []string @@ -163,7 +163,7 @@ func TestUpdate(t *testing.T) { } codec := legacyscheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) - if err := c.Update(core.NamespaceDefault, objBody(codec, &listA), objBody(codec, &listB), false, false, 0, false); err != nil { + if err := c.Update(v1.NamespaceDefault, objBody(codec, &listA), objBody(codec, &listB), false, false, 0, false); err != nil { t.Fatal(err) } // TODO: Find a way to test methods that use Client Set diff --git a/pkg/kube/namespace.go b/pkg/kube/namespace.go index 57e62bab7e9..064de3d1722 100644 --- a/pkg/kube/namespace.go +++ b/pkg/kube/namespace.go @@ -17,14 +17,14 @@ limitations under the License. package kube // import "k8s.io/helm/pkg/kube" import ( + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/client-go/kubernetes" ) -func createNamespace(client internalclientset.Interface, namespace string) error { - ns := &core.Namespace{ +func createNamespace(client kubernetes.Interface, namespace string) error { + ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ Name: namespace, Labels: map[string]string{ @@ -32,15 +32,15 @@ func createNamespace(client internalclientset.Interface, namespace string) error }, }, } - _, err := client.Core().Namespaces().Create(ns) + _, err := client.CoreV1().Namespaces().Create(ns) return err } -func getNamespace(client internalclientset.Interface, namespace string) (*core.Namespace, error) { - return client.Core().Namespaces().Get(namespace, metav1.GetOptions{}) +func getNamespace(client kubernetes.Interface, namespace string) (*v1.Namespace, error) { + return client.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{}) } -func ensureNamespace(client internalclientset.Interface, namespace string) error { +func ensureNamespace(client kubernetes.Interface, namespace string) error { _, err := getNamespace(client, namespace) if err != nil && errors.IsNotFound(err) { err = createNamespace(client, namespace) diff --git a/pkg/kube/namespace_test.go b/pkg/kube/namespace_test.go index 79e8e880cb4..3b61414342b 100644 --- a/pkg/kube/namespace_test.go +++ b/pkg/kube/namespace_test.go @@ -20,7 +20,7 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" + "k8s.io/client-go/kubernetes/fake" ) func TestEnsureNamespace(t *testing.T) { @@ -31,7 +31,7 @@ func TestEnsureNamespace(t *testing.T) { if err := ensureNamespace(client, "foo"); err != nil { t.Fatalf("unexpected error: %s", err) } - if _, err := client.Core().Namespaces().Get("foo", metav1.GetOptions{}); err != nil { + if _, err := client.CoreV1().Namespaces().Get("foo", metav1.GetOptions{}); err != nil { t.Fatalf("unexpected error: %s", err) } } diff --git a/pkg/kube/result.go b/pkg/kube/result.go index 0c6289e4994..cc222a66fc5 100644 --- a/pkg/kube/result.go +++ b/pkg/kube/result.go @@ -16,7 +16,7 @@ limitations under the License. package kube // import "k8s.io/helm/pkg/kube" -import "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" +import "k8s.io/cli-runtime/pkg/genericclioptions/resource" // Result provides convenience methods for comparing collections of Infos. type Result []*resource.Info diff --git a/pkg/kube/result_test.go b/pkg/kube/result_test.go index 503473c053a..c4cf989b8be 100644 --- a/pkg/kube/result_test.go +++ b/pkg/kube/result_test.go @@ -21,7 +21,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" ) func TestResult(t *testing.T) { diff --git a/pkg/releasetesting/environment.go b/pkg/releasetesting/environment.go index 17a22c21d6a..ee078e18260 100644 --- a/pkg/releasetesting/environment.go +++ b/pkg/releasetesting/environment.go @@ -22,7 +22,7 @@ import ( "log" "time" - "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/api/core/v1" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" @@ -49,7 +49,7 @@ func (env *Environment) createTestPod(test *test) error { return nil } -func (env *Environment) getTestPodStatus(test *test) (core.PodPhase, error) { +func (env *Environment) getTestPodStatus(test *test) (v1.PodPhase, error) { b := bytes.NewBufferString(test.manifest) status, err := env.KubeClient.WaitAndGetCompletedPodPhase(env.Namespace, b, time.Duration(env.Timeout)*time.Second) if err != nil { diff --git a/pkg/releasetesting/test_suite.go b/pkg/releasetesting/test_suite.go index 79f00301ebb..8ba83fdb2ca 100644 --- a/pkg/releasetesting/test_suite.go +++ b/pkg/releasetesting/test_suite.go @@ -22,7 +22,7 @@ import ( "github.com/ghodss/yaml" "github.com/golang/protobuf/ptypes/timestamp" - "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/api/core/v1" "k8s.io/helm/pkg/hooks" "k8s.io/helm/pkg/proto/hapi/release" @@ -90,7 +90,7 @@ func (ts *TestSuite) Run(env *Environment) error { } resourceCleanExit := true - status := core.PodUnknown + status := v1.PodUnknown if resourceCreated { status, err = env.getTestPodStatus(test) if err != nil { @@ -119,15 +119,15 @@ func (ts *TestSuite) Run(env *Environment) error { return nil } -func (t *test) assignTestResult(podStatus core.PodPhase) error { +func (t *test) assignTestResult(podStatus v1.PodPhase) error { switch podStatus { - case core.PodSucceeded: + case v1.PodSucceeded: if t.expectedSuccess { t.result.Status = release.TestRun_SUCCESS } else { t.result.Status = release.TestRun_FAILURE } - case core.PodFailed: + case v1.PodFailed: if !t.expectedSuccess { t.result.Status = release.TestRun_SUCCESS } else { diff --git a/pkg/releasetesting/test_suite_test.go b/pkg/releasetesting/test_suite_test.go index 828b14e9983..bf85e42075e 100644 --- a/pkg/releasetesting/test_suite_test.go +++ b/pkg/releasetesting/test_suite_test.go @@ -26,7 +26,7 @@ import ( "golang.org/x/net/context" grpc "google.golang.org/grpc" "google.golang.org/grpc/metadata" - "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/api/core/v1" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/proto/hapi/chart" @@ -324,8 +324,8 @@ func newPodSucceededKubeClient() *podSucceededKubeClient { } } -func (p *podSucceededKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Reader, timeout time.Duration) (core.PodPhase, error) { - return core.PodSucceeded, nil +func (p *podSucceededKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Reader, timeout time.Duration) (v1.PodPhase, error) { + return v1.PodSucceeded, nil } type podFailedKubeClient struct { @@ -338,6 +338,6 @@ func newPodFailedKubeClient() *podFailedKubeClient { } } -func (p *podFailedKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Reader, timeout time.Duration) (core.PodPhase, error) { - return core.PodFailed, nil +func (p *podFailedKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Reader, timeout time.Duration) (v1.PodPhase, error) { + return v1.PodFailed, nil } diff --git a/pkg/storage/driver/cfgmaps.go b/pkg/storage/driver/cfgmaps.go index a534b67acdf..5b511d811a8 100644 --- a/pkg/storage/driver/cfgmaps.go +++ b/pkg/storage/driver/cfgmaps.go @@ -22,12 +22,12 @@ import ( "strings" "time" + "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kblabels "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" rspb "k8s.io/helm/pkg/proto/hapi/release" storageerrors "k8s.io/helm/pkg/storage/errors" @@ -41,13 +41,13 @@ const ConfigMapsDriverName = "ConfigMap" // ConfigMaps is a wrapper around an implementation of a kubernetes // ConfigMapsInterface. type ConfigMaps struct { - impl internalversion.ConfigMapInterface + impl corev1.ConfigMapInterface Log func(string, ...interface{}) } // NewConfigMaps initializes a new ConfigMaps wrapping an implementation of // the kubernetes ConfigMapsInterface. -func NewConfigMaps(impl internalversion.ConfigMapInterface) *ConfigMaps { +func NewConfigMaps(impl corev1.ConfigMapInterface) *ConfigMaps { return &ConfigMaps{ impl: impl, Log: func(_ string, _ ...interface{}) {}, @@ -229,7 +229,7 @@ func (cfgmaps *ConfigMaps) Delete(key string) (rls *rspb.Release, err error) { // "OWNER" - owner of the configmap, currently "TILLER". // "NAME" - name of the release. // -func newConfigMapsObject(key string, rls *rspb.Release, lbs labels) (*core.ConfigMap, error) { +func newConfigMapsObject(key string, rls *rspb.Release, lbs labels) (*v1.ConfigMap, error) { const owner = "TILLER" // encode the release @@ -249,7 +249,7 @@ func newConfigMapsObject(key string, rls *rspb.Release, lbs labels) (*core.Confi lbs.set("VERSION", strconv.Itoa(int(rls.Version))) // create and return configmap object - return &core.ConfigMap{ + return &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: key, Labels: lbs.toMap(), diff --git a/pkg/storage/driver/cfgmaps_test.go b/pkg/storage/driver/cfgmaps_test.go index c028e9fdf20..d2e5e942ef0 100644 --- a/pkg/storage/driver/cfgmaps_test.go +++ b/pkg/storage/driver/cfgmaps_test.go @@ -19,7 +19,7 @@ import ( "testing" "github.com/gogo/protobuf/proto" - "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/api/core/v1" rspb "k8s.io/helm/pkg/proto/hapi/release" ) @@ -69,7 +69,7 @@ func TestUNcompressedConfigMapGet(t *testing.T) { } cfgmap.Data["release"] = base64.StdEncoding.EncodeToString(b) var mock MockConfigMapsInterface - mock.objects = map[string]*core.ConfigMap{key: cfgmap} + mock.objects = map[string]*v1.ConfigMap{key: cfgmap} cfgmaps := NewConfigMaps(&mock) // get release with key diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 1ebe7f65051..363d9dd5dc5 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -20,10 +20,11 @@ import ( "fmt" "testing" + "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" + "k8s.io/apimachinery/pkg/runtime/schema" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" rspb "k8s.io/helm/pkg/proto/hapi/release" ) @@ -76,14 +77,14 @@ func newTestFixtureCfgMaps(t *testing.T, releases ...*rspb.Release) *ConfigMaps // MockConfigMapsInterface mocks a kubernetes ConfigMapsInterface type MockConfigMapsInterface struct { - internalversion.ConfigMapInterface + corev1.ConfigMapInterface - objects map[string]*core.ConfigMap + objects map[string]*v1.ConfigMap } // Init initializes the MockConfigMapsInterface with the set of releases. func (mock *MockConfigMapsInterface) Init(t *testing.T, releases ...*rspb.Release) { - mock.objects = map[string]*core.ConfigMap{} + mock.objects = map[string]*v1.ConfigMap{} for _, rls := range releases { objkey := testKey(rls.Name, rls.Version) @@ -97,17 +98,17 @@ func (mock *MockConfigMapsInterface) Init(t *testing.T, releases ...*rspb.Releas } // Get returns the ConfigMap by name. -func (mock *MockConfigMapsInterface) Get(name string, options metav1.GetOptions) (*core.ConfigMap, error) { +func (mock *MockConfigMapsInterface) Get(name string, options metav1.GetOptions) (*v1.ConfigMap, error) { object, ok := mock.objects[name] if !ok { - return nil, apierrors.NewNotFound(core.Resource("tests"), name) + return nil, apierrors.NewNotFound(schema.GroupResource{Resource: "tests"}, name) } return object, nil } // List returns the a of ConfigMaps. -func (mock *MockConfigMapsInterface) List(opts metav1.ListOptions) (*core.ConfigMapList, error) { - var list core.ConfigMapList +func (mock *MockConfigMapsInterface) List(opts metav1.ListOptions) (*v1.ConfigMapList, error) { + var list v1.ConfigMapList for _, cfgmap := range mock.objects { list.Items = append(list.Items, *cfgmap) } @@ -115,20 +116,20 @@ func (mock *MockConfigMapsInterface) List(opts metav1.ListOptions) (*core.Config } // Create creates a new ConfigMap. -func (mock *MockConfigMapsInterface) Create(cfgmap *core.ConfigMap) (*core.ConfigMap, error) { +func (mock *MockConfigMapsInterface) Create(cfgmap *v1.ConfigMap) (*v1.ConfigMap, error) { name := cfgmap.ObjectMeta.Name if object, ok := mock.objects[name]; ok { - return object, apierrors.NewAlreadyExists(core.Resource("tests"), name) + return object, apierrors.NewAlreadyExists(schema.GroupResource{Resource: "tests"}, name) } mock.objects[name] = cfgmap return cfgmap, nil } // Update updates a ConfigMap. -func (mock *MockConfigMapsInterface) Update(cfgmap *core.ConfigMap) (*core.ConfigMap, error) { +func (mock *MockConfigMapsInterface) Update(cfgmap *v1.ConfigMap) (*v1.ConfigMap, error) { name := cfgmap.ObjectMeta.Name if _, ok := mock.objects[name]; !ok { - return nil, apierrors.NewNotFound(core.Resource("tests"), name) + return nil, apierrors.NewNotFound(v1.Resource("tests"), name) } mock.objects[name] = cfgmap return cfgmap, nil @@ -137,7 +138,7 @@ func (mock *MockConfigMapsInterface) Update(cfgmap *core.ConfigMap) (*core.Confi // Delete deletes a ConfigMap by name. func (mock *MockConfigMapsInterface) Delete(name string, opts *metav1.DeleteOptions) error { if _, ok := mock.objects[name]; !ok { - return apierrors.NewNotFound(core.Resource("tests"), name) + return apierrors.NewNotFound(v1.Resource("tests"), name) } delete(mock.objects, name) return nil @@ -154,14 +155,14 @@ func newTestFixtureSecrets(t *testing.T, releases ...*rspb.Release) *Secrets { // MockSecretsInterface mocks a kubernetes SecretsInterface type MockSecretsInterface struct { - internalversion.SecretInterface + corev1.SecretInterface - objects map[string]*core.Secret + objects map[string]*v1.Secret } // Init initializes the MockSecretsInterface with the set of releases. func (mock *MockSecretsInterface) Init(t *testing.T, releases ...*rspb.Release) { - mock.objects = map[string]*core.Secret{} + mock.objects = map[string]*v1.Secret{} for _, rls := range releases { objkey := testKey(rls.Name, rls.Version) @@ -175,17 +176,17 @@ func (mock *MockSecretsInterface) Init(t *testing.T, releases ...*rspb.Release) } // Get returns the Secret by name. -func (mock *MockSecretsInterface) Get(name string, options metav1.GetOptions) (*core.Secret, error) { +func (mock *MockSecretsInterface) Get(name string, options metav1.GetOptions) (*v1.Secret, error) { object, ok := mock.objects[name] if !ok { - return nil, apierrors.NewNotFound(core.Resource("tests"), name) + return nil, apierrors.NewNotFound(schema.GroupResource{Resource: "tests"}, name) } return object, nil } // List returns the a of Secret. -func (mock *MockSecretsInterface) List(opts metav1.ListOptions) (*core.SecretList, error) { - var list core.SecretList +func (mock *MockSecretsInterface) List(opts metav1.ListOptions) (*v1.SecretList, error) { + var list v1.SecretList for _, secret := range mock.objects { list.Items = append(list.Items, *secret) } @@ -193,20 +194,20 @@ func (mock *MockSecretsInterface) List(opts metav1.ListOptions) (*core.SecretLis } // Create creates a new Secret. -func (mock *MockSecretsInterface) Create(secret *core.Secret) (*core.Secret, error) { +func (mock *MockSecretsInterface) Create(secret *v1.Secret) (*v1.Secret, error) { name := secret.ObjectMeta.Name if object, ok := mock.objects[name]; ok { - return object, apierrors.NewAlreadyExists(core.Resource("tests"), name) + return object, apierrors.NewAlreadyExists(schema.GroupResource{Resource: "tests"}, name) } mock.objects[name] = secret return secret, nil } // Update updates a Secret. -func (mock *MockSecretsInterface) Update(secret *core.Secret) (*core.Secret, error) { +func (mock *MockSecretsInterface) Update(secret *v1.Secret) (*v1.Secret, error) { name := secret.ObjectMeta.Name if _, ok := mock.objects[name]; !ok { - return nil, apierrors.NewNotFound(core.Resource("tests"), name) + return nil, apierrors.NewNotFound(schema.GroupResource{Resource: "tests"}, name) } mock.objects[name] = secret return secret, nil @@ -215,7 +216,7 @@ func (mock *MockSecretsInterface) Update(secret *core.Secret) (*core.Secret, err // Delete deletes a Secret by name. func (mock *MockSecretsInterface) Delete(name string, opts *metav1.DeleteOptions) error { if _, ok := mock.objects[name]; !ok { - return apierrors.NewNotFound(core.Resource("tests"), name) + return apierrors.NewNotFound(schema.GroupResource{Resource: "tests"}, name) } delete(mock.objects, name) return nil diff --git a/pkg/storage/driver/secrets.go b/pkg/storage/driver/secrets.go index 328da20c458..b79a8427237 100644 --- a/pkg/storage/driver/secrets.go +++ b/pkg/storage/driver/secrets.go @@ -22,12 +22,12 @@ import ( "strings" "time" + "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kblabels "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" rspb "k8s.io/helm/pkg/proto/hapi/release" storageerrors "k8s.io/helm/pkg/storage/errors" @@ -41,13 +41,13 @@ const SecretsDriverName = "Secret" // Secrets is a wrapper around an implementation of a kubernetes // SecretsInterface. type Secrets struct { - impl internalversion.SecretInterface + impl corev1.SecretInterface Log func(string, ...interface{}) } // NewSecrets initializes a new Secrets wrapping an implmenetation of // the kubernetes SecretsInterface. -func NewSecrets(impl internalversion.SecretInterface) *Secrets { +func NewSecrets(impl corev1.SecretInterface) *Secrets { return &Secrets{ impl: impl, Log: func(_ string, _ ...interface{}) {}, @@ -229,7 +229,7 @@ func (secrets *Secrets) Delete(key string) (rls *rspb.Release, err error) { // "OWNER" - owner of the secret, currently "TILLER". // "NAME" - name of the release. // -func newSecretsObject(key string, rls *rspb.Release, lbs labels) (*core.Secret, error) { +func newSecretsObject(key string, rls *rspb.Release, lbs labels) (*v1.Secret, error) { const owner = "TILLER" // encode the release @@ -249,7 +249,7 @@ func newSecretsObject(key string, rls *rspb.Release, lbs labels) (*core.Secret, lbs.set("VERSION", strconv.Itoa(int(rls.Version))) // create and return secret object - return &core.Secret{ + return &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: key, Labels: lbs.toMap(), diff --git a/pkg/storage/driver/secrets_test.go b/pkg/storage/driver/secrets_test.go index 6c9c63ad441..0d7d1ad8391 100644 --- a/pkg/storage/driver/secrets_test.go +++ b/pkg/storage/driver/secrets_test.go @@ -19,7 +19,7 @@ import ( "testing" "github.com/gogo/protobuf/proto" - "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/api/core/v1" rspb "k8s.io/helm/pkg/proto/hapi/release" ) @@ -69,7 +69,7 @@ func TestUNcompressedSecretGet(t *testing.T) { } secret.Data["release"] = []byte(base64.StdEncoding.EncodeToString(b)) var mock MockSecretsInterface - mock.objects = map[string]*core.Secret{key: secret} + mock.objects = map[string]*v1.Secret{key: secret} secrets := NewSecrets(&mock) // get release with key diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index c9ddab3ab11..86d077b89ed 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -26,8 +26,8 @@ import ( "io" "time" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/engine" @@ -140,7 +140,7 @@ type KubeClient interface { // WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase // and returns said phase (PodSucceeded or PodFailed qualify). - WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) + WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) } // PrintingKubeClient implements KubeClient, but simply prints the reader to @@ -192,9 +192,9 @@ func (p *PrintingKubeClient) BuildUnstructured(ns string, reader io.Reader) (kub } // WaitAndGetCompletedPodPhase implements KubeClient WaitAndGetCompletedPodPhase. -func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) { +func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { _, err := io.Copy(p.Out, reader) - return core.PodUnknown, err + return v1.PodUnknown, err } // Environment provides the context for executing a client request. diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index b835a976dcb..5c19a9b21ed 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -22,8 +22,8 @@ import ( "testing" "time" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/kube" @@ -61,11 +61,11 @@ func (k *mockKubeClient) Build(ns string, reader io.Reader) (kube.Result, error) func (k *mockKubeClient) BuildUnstructured(ns string, reader io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } -func (k *mockKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) { - return core.PodUnknown, nil +func (k *mockKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { + return v1.PodUnknown, nil } -func (k *mockKubeClient) WaitAndGetCompletedPodStatus(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) { +func (k *mockKubeClient) WaitAndGetCompletedPodStatus(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { return "", nil } diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index a587581edbd..9a8c66e96c4 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -23,7 +23,7 @@ import ( "log" "strings" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/client-go/kubernetes" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/kube" @@ -46,7 +46,7 @@ type ReleaseModule interface { // LocalReleaseModule is a local implementation of ReleaseModule type LocalReleaseModule struct { - clientset internalclientset.Interface + clientset kubernetes.Interface } // Create creates a release via kubeclient from provided environment diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index e562be20366..f5e96ed0054 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -28,7 +28,7 @@ import ( "gopkg.in/yaml.v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/discovery" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/client-go/kubernetes" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/hooks" @@ -83,12 +83,12 @@ var ValidName = regexp.MustCompile("^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+ type ReleaseServer struct { ReleaseModule env *environment.Environment - clientset internalclientset.Interface + clientset kubernetes.Interface Log func(string, ...interface{}) } // NewReleaseServer creates a new release server. -func NewReleaseServer(env *environment.Environment, clientset internalclientset.Interface, useRemote bool) *ReleaseServer { +func NewReleaseServer(env *environment.Environment, clientset kubernetes.Interface, useRemote bool) *ReleaseServer { var releaseModule ReleaseModule if useRemote { releaseModule = &RemoteReleaseModule{} diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index b8adb4bb2f3..311f55b306e 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -31,9 +31,9 @@ import ( "github.com/technosophos/moniker" "golang.org/x/net/context" "google.golang.org/grpc/metadata" - "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" - "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/client-go/kubernetes/fake" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/hooks" @@ -605,8 +605,8 @@ func (kc *mockHooksKubeClient) Build(ns string, reader io.Reader) (kube.Result, func (kc *mockHooksKubeClient) BuildUnstructured(ns string, reader io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } -func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) { - return core.PodUnknown, nil +func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { + return v1.PodUnknown, nil } func deletePolicyStub(kubeClient *mockHooksKubeClient) *ReleaseServer { From 6f12ab24a527c0130c11f22aea8886c01178b63b Mon Sep 17 00:00:00 2001 From: Florian Rusch Date: Sat, 6 Oct 2018 10:42:03 +0200 Subject: [PATCH 208/483] Add the .vscode folder to the .helmignore file Signed-off-by: Florian Rusch --- pkg/chartutil/create.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 24a9dabcc4e..3352b7c0ce6 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -119,6 +119,7 @@ const defaultIgnore = `# Patterns to ignore when building packages. .project .idea/ *.tmproj +.vscode/ ` const defaultIngress = `{{- if .Values.ingress.enabled -}} From c23b6363c19f0c779019a47335054c0e6ccec6c6 Mon Sep 17 00:00:00 2001 From: Ryan Smith Date: Sat, 6 Oct 2018 02:24:25 -0700 Subject: [PATCH 209/483] Update circleCI badge to more consistent shield. The shield badge matches the go report and godoc badges. Signed-off-by: RPSeq --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 018099e011a..54f8bc0de49 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Helm -[![CircleCI](https://circleci.com/gh/helm/helm.svg?style=svg)](https://circleci.com/gh/helm/helm) +[![CircleCI](https://circleci.com/gh/helm/helm.svg?style=shield)](https://circleci.com/gh/helm/helm) [![Go Report Card](https://goreportcard.com/badge/github.com/helm/helm)](https://goreportcard.com/report/github.com/helm/helm) [![GoDoc](https://godoc.org/k8s.io/helm?status.svg)](https://godoc.org/k8s.io/helm) From e7d93f231d1a53b5ed63e32aa6d7687e5715b6d2 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Tue, 9 Oct 2018 16:30:29 +0100 Subject: [PATCH 210/483] Fix Slack channel references (#4752) Signed-off-by: Martin Hickey --- README.md | 2 +- docs/chart_template_guide/wrapping_up.md | 6 ++++-- docs/release_checklist.md | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 018099e011a..9342ed87b05 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ The [Helm roadmap uses Github milestones](https://github.com/helm/helm/milestone You can reach the Helm community and developers via the following channels: -- [Kubernetes Slack](http://slack.k8s.io): +- [Kubernetes Slack](https://kubernetes.slack.com): - [#helm-users](https://kubernetes.slack.com/messages/helm-users) - [#helm-dev](https://kubernetes.slack.com/messages/helm-dev) - [#charts](https://kubernetes.slack.com/messages/charts) diff --git a/docs/chart_template_guide/wrapping_up.md b/docs/chart_template_guide/wrapping_up.md index 1a8d6c552e5..6a96632bd62 100755 --- a/docs/chart_template_guide/wrapping_up.md +++ b/docs/chart_template_guide/wrapping_up.md @@ -13,8 +13,10 @@ But there are many things this guide has not covered when it comes to the practi - The [Go template docs](https://godoc.org/text/template) explain the template syntax in detail. - The [Schelm tool](https://github.com/databus23/schelm) is a nice helper utility for debugging charts. -Sometimes it's easier to ask a few questions and get answers from experienced developers. The best place to do that is in the Kubernetes `#Helm` Slack channel: +Sometimes it's easier to ask a few questions and get answers from experienced developers. The best place to do this is in the [Kubernetes Slack](https://kubernetes.slack.com) Helm channels: -- [Kubernetes Slack](https://slack.k8s.io/): `#helm` +- [#helm-users](https://kubernetes.slack.com/messages/helm-users) +- [#helm-dev](https://kubernetes.slack.com/messages/helm-dev) +- [#charts](https://kubernetes.slack.com/messages/charts) Finally, if you find errors or omissions in this document, want to suggest some new content, or would like to contribute, visit [The Helm Project](https://github.com/helm/helm). diff --git a/docs/release_checklist.md b/docs/release_checklist.md index a84cad713c9..3d48e2a4467 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -220,7 +220,7 @@ Helm vX.Y.Z is a feature release. This release, we focused on Date: Wed, 10 Oct 2018 15:38:04 -0400 Subject: [PATCH 211/483] The nil check before the range loop is redundant Signed-off-by: Rijnard van Tonder --- pkg/chartutil/files.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/chartutil/files.go b/pkg/chartutil/files.go index c5496a8b03f..36391c3e828 100644 --- a/pkg/chartutil/files.go +++ b/pkg/chartutil/files.go @@ -36,10 +36,8 @@ type Files map[string][]byte // Given an []*any.Any (the format for files in a chart.Chart), extract a map of files. func NewFiles(from []*any.Any) Files { files := map[string][]byte{} - if from != nil { - for _, f := range from { - files[f.TypeUrl] = f.Value - } + for _, f := range from { + files[f.TypeUrl] = f.Value } return files } From 147c8217c7843b53e98528f6df12890d64c696be Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Fri, 12 Oct 2018 13:49:45 -0600 Subject: [PATCH 212/483] fix(tiller): correctly sort PodDisruptionBudget objects before pods that might use them (#4769) Signed-off-by: Matt Tucker --- pkg/tiller/kind_sorter.go | 2 ++ pkg/tiller/kind_sorter_test.go | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/kind_sorter.go b/pkg/tiller/kind_sorter.go index 65e3f478d02..8aff4e6c11a 100644 --- a/pkg/tiller/kind_sorter.go +++ b/pkg/tiller/kind_sorter.go @@ -31,6 +31,7 @@ var InstallOrder SortOrder = []string{ "ResourceQuota", "LimitRange", "PodSecurityPolicy", + "PodDisruptionBudget", "Secret", "ConfigMap", "StorageClass", @@ -81,6 +82,7 @@ var UninstallOrder SortOrder = []string{ "StorageClass", "ConfigMap", "Secret", + "PodDisruptionBudget", "PodSecurityPolicy", "LimitRange", "ResourceQuota", diff --git a/pkg/tiller/kind_sorter_test.go b/pkg/tiller/kind_sorter_test.go index fb3e8ad577f..1c187e90d5f 100644 --- a/pkg/tiller/kind_sorter_test.go +++ b/pkg/tiller/kind_sorter_test.go @@ -133,6 +133,10 @@ func TestKindSorter(t *testing.T) { Name: "w", Head: &util.SimpleHead{Kind: "APIService"}, }, + { + Name: "z", + Head: &util.SimpleHead{Kind: "PodDisruptionBudget"}, + }, } for _, test := range []struct { @@ -140,8 +144,8 @@ func TestKindSorter(t *testing.T) { order SortOrder expected string }{ - {"install", InstallOrder, "abc3de1fgh2ijklmnopqrstuvw!"}, - {"uninstall", UninstallOrder, "wvmutsrqponlkji2hgf1ed3cba!"}, + {"install", InstallOrder, "abc3zde1fgh2ijklmnopqrstuvw!"}, + {"uninstall", UninstallOrder, "wvmutsrqponlkji2hgf1edz3cba!"}, } { var buf bytes.Buffer t.Run(test.description, func(t *testing.T) { From 5e7548f3c388d4cc9f12cf30a4ac9f6a29bda6fb Mon Sep 17 00:00:00 2001 From: Thomas Yuan Date: Sat, 13 Oct 2018 00:24:33 -0400 Subject: [PATCH 213/483] update rbac.authorization.k8s.io from v1beta1 to v1 (#4771) Signed-off-by: Thomas Yuan --- docs/rbac.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/rbac.md b/docs/rbac.md index 4af36203cc9..7deac70fb0e 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -23,7 +23,7 @@ metadata: name: tiller namespace: kube-system --- -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: tiller @@ -61,7 +61,7 @@ Define a Role that allows Tiller to manage all resources in `tiller-world` like ```yaml kind: Role -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-manager namespace: tiller-world @@ -80,7 +80,7 @@ In `rolebinding-tiller.yaml`, ```yaml kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-binding namespace: tiller-world @@ -137,7 +137,7 @@ Define a Role that allows Tiller to manage all resources in `myorg-users` like i ```yaml kind: Role -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-manager namespace: myorg-users @@ -156,7 +156,7 @@ Bind the service account to that role. In `rolebinding-tiller.yaml`, ```yaml kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-binding namespace: myorg-users @@ -179,7 +179,7 @@ We'll also need to grant Tiller access to read configmaps in myorg-system so it ```yaml kind: Role -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: myorg-system name: tiller-manager @@ -198,7 +198,7 @@ And the respective role binding. In `rolebinding-tiller-myorg-system.yaml`: ```yaml kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 metadata: name: tiller-binding namespace: myorg-system @@ -234,7 +234,7 @@ metadata: name: helm namespace: helm-world --- -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: tiller-user @@ -253,7 +253,7 @@ rules: verbs: - list --- -apiVersion: rbac.authorization.k8s.io/v1beta1 +apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: tiller-user-binding From 8061227ce12cf476743ea23c58d6ea3539582211 Mon Sep 17 00:00:00 2001 From: Etienne Date: Sat, 13 Oct 2018 17:11:31 +0200 Subject: [PATCH 214/483] Add Helm convert plugin (#4766) Signed-off-by: Etienne Tremel --- docs/related.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/related.md b/docs/related.md index 2ad1e9b20fd..b730ea9928d 100644 --- a/docs/related.md +++ b/docs/related.md @@ -32,6 +32,7 @@ or [pull request](https://github.com/helm/helm/pulls). - [Helm Diff](https://github.com/databus23/helm-diff) - Preview `helm upgrade` as a coloured diff - [Helm Value Store](https://github.com/skuid/helm-value-store) - Plugin for working with Helm deployment values - [Technosophos's Helm Plugins](https://github.com/technosophos/helm-plugins) - Plugins for GitHub, Keybase, and GPG +- [helm-convert](https://github.com/ContainerSolutions/helm-convert) - Plugin to convert charts into Kustomize compatible packages - [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-edit](https://github.com/mstrzele/helm-edit) - Plugin for editing release's values - [helm-env](https://github.com/adamreese/helm-env) - Plugin to show current environment @@ -68,7 +69,7 @@ Tools layered on top of Helm or Tiller. - [Helm Chart Publisher](https://github.com/luizbafilho/helm-chart-publisher) - HTTP API for publishing Helm Charts in an easy way - [Helm.NET](https://github.com/qmfrederik/helm) - A .NET client for Tiller's API - [Helmfile](https://github.com/roboll/helmfile) - Helmfile is a declarative spec for deploying helm charts -- [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). +- [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). - [Landscaper](https://github.com/Eneco/landscaper/) - "Landscaper takes a set of Helm Chart references with values (a desired state), and realizes this in a Kubernetes cluster." - [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories - [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client From 1e26b5300b5166fabb90002535aacd2f9cc7d787 Mon Sep 17 00:00:00 2001 From: Anumita Shenoy Date: Tue, 16 Oct 2018 20:16:35 +0530 Subject: [PATCH 215/483] feat(helm): add $HELM_KEY_PASSPHRASE environment variable for signing helm charts (#4778) * feat(helm): add $HELM_KEY_PASSPHRASE environment variable for signing helm charts If $HELM_KEY_PASSPHRASE is set then helm package sign command will not prompt the user to enter the passphrase for the private key Signed-off-by: Anumita Shenoy * docs(helm): added documentation for HELM_KEY_PASSPHRASE Added description for HELM_KEY_PASSPHRASE Signed-off-by: Anumita Shenoy --- cmd/helm/helm.go | 23 +++++++++++++---------- cmd/helm/package.go | 11 ++++++++--- docs/helm/helm.md | 25 ++++++++++++++----------- docs/provenance.md | 4 +++- pkg/helm/environment/environment.go | 8 ++++++++ 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index 02a1e6edb75..ffc2c1ba2fc 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -61,16 +61,19 @@ Common actions from this point include: - helm list: list releases of charts Environment: - $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm - $HELM_HOST set an alternative Tiller host. The format is host:port - $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. - $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") - $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") - $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") - $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") - $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") - $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm + $HELM_HOST set an alternative Tiller host. The format is host:port + $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. + $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") + $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") + $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") + $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") + $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for + the passphrase while signing helm charts + ` func newRootCmd(args []string) *cobra.Command { diff --git a/cmd/helm/package.go b/cmd/helm/package.go index 51686dba7a7..05fdf02f864 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -215,7 +215,7 @@ func (p *packageCmd) clearsign(filename string) error { return err } - if err := signer.DecryptKey(promptUser); err != nil { + if err := signer.DecryptKey(passphraseFetcher); err != nil { return err } @@ -229,8 +229,13 @@ func (p *packageCmd) clearsign(filename string) error { return ioutil.WriteFile(filename+".prov", []byte(sig), 0755) } -// promptUser implements provenance.PassphraseFetcher -func promptUser(name string) ([]byte, error) { +// passphraseFetcher implements provenance.PassphraseFetcher +func passphraseFetcher(name string) ([]byte, error) { + var passphrase = settings.HelmKeyPassphrase() + if passphrase != "" { + return []byte(passphrase), nil + } + fmt.Printf("Password for key %q > ", name) pw, err := terminal.ReadPassword(int(syscall.Stdin)) fmt.Println() diff --git a/docs/helm/helm.md b/docs/helm/helm.md index 136721c36d5..177be7e88da 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -21,16 +21,19 @@ Common actions from this point include: - helm list: list releases of charts Environment: - $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm - $HELM_HOST set an alternative Tiller host. The format is host:port - $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. - $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") - $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") - $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") - $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") - $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") - $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm + $HELM_HOST set an alternative Tiller host. The format is host:port + $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. + $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") + $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") + $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") + $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") + $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for + the passphrase while signing helm charts + ### Options @@ -75,4 +78,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 4-Sep-2018 +###### Auto generated by spf13/cobra on 16-Oct-2018 diff --git a/docs/provenance.md b/docs/provenance.md index d8f9e408966..3a19fcd0758 100644 --- a/docs/provenance.md +++ b/docs/provenance.md @@ -26,7 +26,9 @@ Prerequisites: - Keybase command line tools (optional) **NOTE:** If your PGP private key has a passphrase, you will be prompted to enter -that passphrase for any commands that support the `--sign` option. +that passphrase for any commands that support the `--sign` option. You can set the +HELM_KEY_PASSPHRASE environment variable to that passphrase in case you don't want +to be prompted to enter the passphrase. **NOTE:** The keyfile format for GnuPG changed in version 2.1. Prior to that release it was unnecessary to export keys out of GnuPG, and you could instead point Helm diff --git a/pkg/helm/environment/environment.go b/pkg/helm/environment/environment.go index 76348c3bdd0..6d40fb846ef 100644 --- a/pkg/helm/environment/environment.go +++ b/pkg/helm/environment/environment.go @@ -138,6 +138,14 @@ func (s EnvSettings) PluginDirs() string { return s.Home.Plugins() } +// HelmKeyPassphrase is the passphrase used to sign a helm chart. +func (s EnvSettings) HelmKeyPassphrase() string { + if d, ok := os.LookupEnv("HELM_KEY_PASSPHRASE"); ok { + return d + } + return "" +} + // setFlagFromEnv looks up and sets a flag if the corresponding environment variable changed. // if the flag with the corresponding name was set during fs.Parse(), then the environment // variable is ignored. From f6efe2f0c18637d39b2068cf9625a269cfd6aff8 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Wed, 17 Oct 2018 22:10:46 +0100 Subject: [PATCH 216/483] Add test template example for helm create (#4524) * Add test template example for helm create As helm create ganerates an nginx chart, the example is based on https://github.com/helm/helm/blob/master/docs/examples/nginx/templates/ service-test.yaml Signed-off-by: Martin Hickey * Update after review - https://github.com/helm/helm/pull/4524#pullrequestreview-155183390 - https://github.com/helm/helm/pull/4524#pullrequestreview-155379922 - Fix where app.kubernetes.io/instance was incorrect in service selector Signed-off-by: Martin Hickey * Add doc update Signed-off-by: Martin Hickey * Update GO formatting Signed-off-by: Martin Hickey --- cmd/helm/create.go | 13 +++++++------ cmd/helm/create_test.go | 4 ++-- docs/helm/helm_create.md | 14 ++++++++------ pkg/chartutil/create.go | 33 +++++++++++++++++++++++++++++++-- pkg/chartutil/create_test.go | 8 ++++++++ pkg/chartutil/save.go | 2 +- 6 files changed, 57 insertions(+), 17 deletions(-) diff --git a/cmd/helm/create.go b/cmd/helm/create.go index eaea81e5bb8..7f0f99af8db 100644 --- a/cmd/helm/create.go +++ b/cmd/helm/create.go @@ -38,15 +38,17 @@ something like this: foo/ | - |- .helmignore # Contains patterns to ignore when packaging Helm charts. + |- .helmignore # Contains patterns to ignore when packaging Helm charts. | - |- Chart.yaml # Information about your chart + |- Chart.yaml # Information about your chart | - |- values.yaml # The default values for your templates + |- values.yaml # The default values for your templates | - |- charts/ # Charts that this chart depends on + |- charts/ # Charts that this chart depends on | - |- templates/ # The template files + |- templates/ # The template files + | + |- templates/tests/ # The test files 'helm create' takes a path for an argument. If directories in the given path do not exist, Helm will attempt to create them as it goes. If the given @@ -84,7 +86,6 @@ func newCreateCmd(out io.Writer) *cobra.Command { func (c *createCmd) run() error { fmt.Fprintf(c.out, "Creating %s\n", c.name) - chartname := filepath.Base(c.name) cfile := &chart.Metadata{ Name: chartname, diff --git a/cmd/helm/create_test.go b/cmd/helm/create_test.go index 214432b83b5..3cdf5ebf89f 100644 --- a/cmd/helm/create_test.go +++ b/cmd/helm/create_test.go @@ -143,8 +143,8 @@ func TestCreateStarterCmd(t *testing.T) { t.Errorf("Wrong API version: %q", c.Metadata.ApiVersion) } - if l := len(c.Templates); l != 6 { - t.Errorf("Expected 5 templates, got %d", l) + if l := len(c.Templates); l != 7 { + t.Errorf("Expected 6 templates, got %d", l) } found := false diff --git a/docs/helm/helm_create.md b/docs/helm/helm_create.md index 0e20d9860f2..2dc45a77c23 100644 --- a/docs/helm/helm_create.md +++ b/docs/helm/helm_create.md @@ -13,15 +13,17 @@ something like this: foo/ | - |- .helmignore # Contains patterns to ignore when packaging Helm charts. + |- .helmignore # Contains patterns to ignore when packaging Helm charts. | - |- Chart.yaml # Information about your chart + |- Chart.yaml # Information about your chart | - |- values.yaml # The default values for your templates + |- values.yaml # The default values for your templates | - |- charts/ # Charts that this chart depends on + |- charts/ # Charts that this chart depends on | - |- templates/ # The template files + |- templates/ # The template files + | + |- templates/tests/ # The test files 'helm create' takes a path for an argument. If directories in the given path do not exist, Helm will attempt to create them as it goes. If the given @@ -56,4 +58,4 @@ helm create NAME [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 18-Sep-2018 diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 046155f714d..875083f7e9c 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -44,8 +44,12 @@ const ( ServiceName = "service.yaml" // NotesName is the name of the example NOTES.txt file. NotesName = "NOTES.txt" - // HelpersName is the name of the example NOTES.txt file. + // HelpersName is the name of the example helpers file. HelpersName = "_helpers.tpl" + // TemplatesTestsDir is the relative directory name for templates tests. + TemplatesTestsDir = "templates/tests" + // TestConnectionName is the name of the example connection test file. + TestConnectionName = "test-connection.yaml" ) const defaultValues = `# Default values for %s. @@ -295,6 +299,26 @@ Create chart name and version as used by the chart label. {{- end -}} ` +const defaultTestConnection = `apiVersion: v1 +kind: Pod +metadata: + name: "{{ include ".fullname" . }}-test-connection" + labels: + app.kubernetes.io/name: {{ include ".name" . }} + helm.sh/chart: {{ include ".chart" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/managed-by: {{ .Release.Service }} + annotations: + "helm.sh/hook": test-success +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include ".fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never +` + // CreateFrom creates a new chart, but scaffolds it from the src chart. func CreateFrom(chartfile *chart.Metadata, dest string, src string) error { schart, err := Load(src) @@ -359,7 +383,7 @@ func Create(chartfile *chart.Metadata, dir string) (string, error) { } } - for _, d := range []string{TemplatesDir, ChartsDir} { + for _, d := range []string{TemplatesDir, TemplatesTestsDir, ChartsDir} { if err := os.MkdirAll(filepath.Join(cdir, d), 0755); err != nil { return cdir, err } @@ -404,6 +428,11 @@ func Create(chartfile *chart.Metadata, dir string) (string, error) { path: filepath.Join(cdir, TemplatesDir, HelpersName), content: Transform(defaultHelpers, "", chartfile.Name), }, + { + // test-connection.yaml + path: filepath.Join(cdir, TemplatesTestsDir, TestConnectionName), + content: Transform(defaultTestConnection, "", chartfile.Name), + }, } for _, file := range files { diff --git a/pkg/chartutil/create_test.go b/pkg/chartutil/create_test.go index 96c467e7e9f..a0ddf8fa282 100644 --- a/pkg/chartutil/create_test.go +++ b/pkg/chartutil/create_test.go @@ -75,6 +75,14 @@ func TestCreate(t *testing.T) { } } + for _, f := range []string{TestConnectionName} { + if fi, err := os.Stat(filepath.Join(dir, TemplatesTestsDir, f)); err != nil { + t.Errorf("Expected %s file: %s", f, err) + } else if fi.IsDir() { + t.Errorf("Expected %s to be a file.", f) + } + } + } func TestCreateFrom(t *testing.T) { diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 9b85d071417..5d60485bfea 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -54,7 +54,7 @@ func SaveDir(c *chart.Chart, dest string) error { } } - for _, d := range []string{TemplatesDir, ChartsDir} { + for _, d := range []string{TemplatesDir, ChartsDir, TemplatesTestsDir} { if err := os.MkdirAll(filepath.Join(outdir, d), 0755); err != nil { return err } From d8f38e5cee80d6e6e4ebff2f4ea48534d49647ee Mon Sep 17 00:00:00 2001 From: mgresser Date: Thu, 18 Oct 2018 11:27:37 -0400 Subject: [PATCH 217/483] Grammar fix (#4801) Signed-off-by: Mischa Gresser --- docs/chart_best_practices/labels.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/chart_best_practices/labels.md b/docs/chart_best_practices/labels.md index a43ad9087cf..6b7d24c49a6 100644 --- a/docs/chart_best_practices/labels.md +++ b/docs/chart_best_practices/labels.md @@ -28,9 +28,9 @@ Name|Status|Description `app.kubernetes.io/name` | REC | This should be the app name, reflecting the entire app. Usually `{{ template "name" . }}` is used for this. This is used by many Kubernetes manifests, and is not Helm-specific. `helm.sh/chart` | REC | This should be the chart name and version: `{{ .Chart.Name }}-{{ .Chart.Version \| replace "+" "_" }}`. `app.kubernetes.io/managed-by` | REC | This should always be set to `{{ .Release.Service }}`. It is for finding all things managed by Tiller. -`app.kubernetes.io/instance` | REC | This should be the `{{ .Release.Name }}`. It aid in differentiating between different instances of the same application. +`app.kubernetes.io/instance` | REC | This should be the `{{ .Release.Name }}`. It aids in differentiating between different instances of the same application. `app.kubernetes.io/version` | OPT | The version of the app and can be set to `{{ .Chart.AppVersion }}`. `app.kubernetes.io/component` | OPT | This is a common label for marking the different roles that pieces may play in an application. For example, `app.kubernetes.io/component: frontend`. `app.kubernetes.io/part-of` | OPT | When multiple charts or pieces of software are used together to make one application. For example, application software and a database to produce a website. This can be set to the top level application being supported. -You can find more information on the Kubernetes labels, prefixed with `app.kubernetes.io`, in the [Kubernetes documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). \ No newline at end of file +You can find more information on the Kubernetes labels, prefixed with `app.kubernetes.io`, in the [Kubernetes documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). From ea5d2bb7bdbca360eff4b730498f73815ec94cba Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Thu, 18 Oct 2018 15:44:39 -0400 Subject: [PATCH 218/483] Fix reference to wordpress (#4803) Signed-off-by: Marc Khouzam --- docs/chart_tests.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/chart_tests.md b/docs/chart_tests.md index 2d1852eb542..300eeaf7345 100644 --- a/docs/chart_tests.md +++ b/docs/chart_tests.md @@ -22,10 +22,10 @@ In Helm, there are two test hooks: `test-success` and `test-failure` ## Example Test -Here is an example of a helm test pod definition in an example mariadb chart: +Here is an example of a helm test pod definition in an example wordpress chart. The test verifies the access and login to the mariadb database: ``` -mariadb/ +wordpress/ Chart.yaml README.md values.yaml @@ -64,7 +64,7 @@ spec: ``` ## Steps to Run a Test Suite on a Release -1. `$ helm install mariadb` +1. `$ helm install wordpress` ``` NAME: quirky-walrus LAST DEPLOYED: Mon Feb 13 13:50:43 2017 From bf463ca2df01b26df09a249c72e870f64e9bfbd4 Mon Sep 17 00:00:00 2001 From: JJ Asghar Date: Thu, 18 Oct 2018 14:26:17 -0500 Subject: [PATCH 219/483] Update quickstart.md Updated the MySQL release, and put more output that gets sent to STDOUT with `helm install stable/mysql` Signed-off-by: JJ Asghar --- docs/quickstart.md | 110 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 11 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index e7b70d4cad0..ef3cb460e33 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -12,7 +12,7 @@ The following prerequisites are required for a successful and properly secured u ### Install Kubernetes or have access to a cluster -- You must have Kubernetes installed. For the latest release of Helm, we recommend the latest stable release of Kubernetes, which in most cases is the second-latest minor release. +- You must have Kubernetes installed. For the latest release of Helm, we recommend the latest stable release of Kubernetes, which in most cases is the second-latest minor release. - You should also have a local configured copy of `kubectl`. NOTE: Kubernetes versions prior to 1.6 have limited or no support for role-based access controls (RBAC). @@ -78,11 +78,68 @@ of the official `stable` charts. ```console $ helm repo update # Make sure we get the latest list of charts $ helm install stable/mysql -Released smiling-penguin +NAME: wintering-rodent +LAST DEPLOYED: Thu Oct 18 14:21:18 2018 +NAMESPACE: default +STATUS: DEPLOYED + +RESOURCES: +==> v1/Secret +NAME AGE +wintering-rodent-mysql 0s + +==> v1/ConfigMap +wintering-rodent-mysql-test 0s + +==> v1/PersistentVolumeClaim +wintering-rodent-mysql 0s + +==> v1/Service +wintering-rodent-mysql 0s + +==> v1beta1/Deployment +wintering-rodent-mysql 0s + +==> v1/Pod(related) + +NAME READY STATUS RESTARTS AGE +wintering-rodent-mysql-6986fd6fb-988x7 0/1 Pending 0 0s + + +NOTES: +MySQL can be accessed via port 3306 on the following DNS name from within your cluster: +wintering-rodent-mysql.default.svc.cluster.local + +To get your root password run: + + MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default wintering-rodent-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) + +To connect to your database: + +1. Run an Ubuntu pod that you can use as a client: + + kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il + +2. Install the mysql client: + + $ apt-get update && apt-get install mysql-client -y + +3. Connect using the mysql cli, then provide your password: + $ mysql -h wintering-rodent-mysql -p + +To connect to your database directly from outside the K8s cluster: + MYSQL_HOST=127.0.0.1 + MYSQL_PORT=3306 + + # Execute the following command to route the connection: + kubectl port-forward svc/wintering-rodent-mysql 3306 + + mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD} + ``` In the example above, the `stable/mysql` chart was released, and the name of -our new release is `smiling-penguin`. You get a simple idea of the +our new release is `wintering-rodent`. You get a simple idea of the features of this MySQL chart by running `helm inspect stable/mysql`. Whenever you install a chart, a new release is created. So one chart can @@ -99,8 +156,8 @@ It's easy to see what has been released using Helm: ```console $ helm ls -NAME VERSION UPDATED                   STATUS   CHART -smiling-penguin 1 Wed Sep 28 12:59:46 2016 DEPLOYED mysql-0.1.0 +NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE +wintering-rodent 1 Thu Oct 18 15:06:58 2018 DEPLOYED mysql-0.10.1 5.7.14 default ``` The `helm list` function will show you a list of all deployed releases. @@ -110,17 +167,48 @@ The `helm list` function will show you a list of all deployed releases. To uninstall a release, use the `helm delete` command: ```console -$ helm delete smiling-penguin -Removed smiling-penguin +$ helm delete wintering-rodent +release "wintering-rodent" deleted ``` -This will uninstall `smiling-penguin` from Kubernetes, but you will +This will uninstall `wintering-rodent` from Kubernetes, but you will still be able to request information about that release: ```console -$ helm status smiling-penguin -Status: DELETED -... +$ helm status wintering-rodent +LAST DEPLOYED: Thu Oct 18 14:21:18 2018 +NAMESPACE: default +STATUS: DELETED + +NOTES: +MySQL can be accessed via port 3306 on the following DNS name from within your cluster: +wintering-rodent-mysql.default.svc.cluster.local + +To get your root password run: + + MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default wintering-rodent-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) + +To connect to your database: + +1. Run an Ubuntu pod that you can use as a client: + + kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il + +2. Install the mysql client: + + $ apt-get update && apt-get install mysql-client -y + +3. Connect using the mysql cli, then provide your password: + $ mysql -h wintering-rodent-mysql -p + +To connect to your database directly from outside the K8s cluster: + MYSQL_HOST=127.0.0.1 + MYSQL_PORT=3306 + + # Execute the following command to route the connection: + kubectl port-forward svc/wintering-rodent-mysql 3306 + + mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD} ``` Because Helm tracks your releases even after you've deleted them, you From dd9ed71429999bd267db53c9533a6224ff48e719 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 18 Oct 2018 15:17:09 -0700 Subject: [PATCH 220/483] fix(helm): Update status output to include resource details (#4791) Update of the client-go package changed the status output to only include the age of resources. The new printer in client-go only formats the output to include details of specific resources if the internal representation of resources are passed into the printer. This PR updates helm to convert resources to the internal type before printing. Closes #4712 Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 67960ac46ea..6509a158391 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -163,7 +163,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { return "", err } - var objPods = make(map[string][]v1.Pod) + var objPods = make(map[string][]core.Pod) missing := []string{} err = perform(infos, func(info *resource.Info) error { @@ -178,7 +178,15 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // versions per cluster, but this certainly won't hurt anything, so let's be safe. gvk := info.ResourceMapping().GroupVersionKind vk := gvk.Version + "/" + gvk.Kind - objs[vk] = append(objs[vk], asVersioned(info)) + internalObj, err := asInternal(info) + if err != nil { + c.Log("Warning: conversion to internal type failed: %v", err) + // Add the unstructured object in this situation. It will still get listed, just + // with less information. + objs[vk] = append(objs[vk], info.Object) + } else { + objs[vk] = append(objs[vk], internalObj) + } //Get the relation pods objPods, err = c.getSelectRelationPod(info, objPods) @@ -682,7 +690,7 @@ func isPodComplete(event watch.Event) (bool, error) { //get a kubernetes resources' relation pods // kubernetes resource used select labels to relate pods -func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]v1.Pod) (map[string][]v1.Pod, error) { +func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]core.Pod) (map[string][]core.Pod, error) { if info == nil { return objPods, nil } @@ -705,7 +713,9 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] return objPods, err } - for _, pod := range pods.Items { + for _, externalPod := range pods.Items { + pod := core.Pod{} + legacyscheme.Scheme.Convert(&externalPod, &pod, nil) if pod.APIVersion == "" { pod.APIVersion = "v1" } @@ -722,7 +732,7 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] return objPods, nil } -func isFoundPod(podItem []v1.Pod, pod v1.Pod) bool { +func isFoundPod(podItem []core.Pod, pod core.Pod) bool { for _, value := range podItem { if (value.Namespace == pod.Namespace) && (value.Name == pod.Name) { return true @@ -734,3 +744,8 @@ func isFoundPod(podItem []v1.Pod, pod v1.Pod) bool { func asVersioned(info *resource.Info) runtime.Object { return cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) } + +func asInternal(info *resource.Info) (runtime.Object, error) { + groupVersioner := info.Mapping.GroupVersionKind.GroupKind().WithVersion(runtime.APIVersionInternal).GroupVersion() + return legacyscheme.Scheme.ConvertToVersion(info.Object, groupVersioner) +} From eff909929b79eeaf7510a5a15debd51702561f86 Mon Sep 17 00:00:00 2001 From: Alpha Date: Fri, 19 Oct 2018 12:59:19 +0800 Subject: [PATCH 221/483] UPT: tutorial (#4808) Signed-off-by: Alpha --- docs/using_helm.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/using_helm.md b/docs/using_helm.md index b7fec60ed8b..4b18e2cf2c2 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -94,10 +94,10 @@ simplest, it takes only one argument: The name of the chart. ```console $ helm install stable/mariadb Fetched stable/mariadb-0.3.0 to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz -happy-panda -Last Deployed: Wed Sep 28 12:32:28 2016 -Namespace: default -Status: DEPLOYED +NAME: happy-panda +LAST DEPLOYED: Wed Sep 28 12:32:28 2016 +NAMESPACE: default +STATUS: DEPLOYED Resources: ==> extensions/Deployment From 586dc1db61d5e18921acc36933752f00904337f2 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Wed, 17 Oct 2018 12:40:01 -0700 Subject: [PATCH 222/483] fix(helm): Use line breaks consistently in status output The output from helm status does not have consistent use of line breaks. For some resources there is a line break after the kind header, for others there is not. This is caused by how the printer handles column headers. This removes a line break for all but the first resource listed. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 6509a158391..9e0aeb262f3 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -213,8 +213,13 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // track of tab widths. buf := new(bytes.Buffer) p, _ := get.NewHumanPrintFlags().ToPrinter("") + index := 0 for t, ot := range objs { - if _, err = buf.WriteString("==> " + t + "\n"); err != nil { + kindHeader := fmt.Sprintf("==> %s", t) + if index == 0 { + kindHeader = kindHeader + "\n" + } + if _, err = buf.WriteString(kindHeader); err != nil { return "", err } for _, o := range ot { @@ -226,6 +231,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { if _, err := buf.WriteString("\n"); err != nil { return "", err } + index += 1 } if len(missing) > 0 { buf.WriteString(MissingGetHeader) From 77924fec911168bc490054c67904f1244ab475e3 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 19 Oct 2018 13:22:48 -0400 Subject: [PATCH 223/483] Update Contributing.md to remove mention of CLA (#4804) * Update Contributing.md to remove mention of CLA Signed-off-by: Marc Khouzam * Add hyperlink to git page in CONTRIBUTING.md Signed-off-by: Marc Khouzam --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 23dc297b0d5..7958a9adb17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -172,9 +172,10 @@ contributing to Helm. All issue types follow the same general lifecycle. Differe ## How to Contribute a Patch -1. If you haven't already done so, sign a Contributor License Agreement (see details above). -2. Fork the desired repo, develop and test your code changes. -3. Submit a pull request. +1. Fork the repo, develop and test your code changes. +1. Use sign-off when making each of your commits (see [above](#sign-your-work)). + If you forgot to sign some commits that are part of the contribution, you can ask [git to rewrite your commit history](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History). +1. Submit a pull request. Coding conventions and standards are explained in the official developer docs: https://github.com/helm/helm/blob/master/docs/developers.md From 48ca44b7f092e714f48234250cca04c6581b050a Mon Sep 17 00:00:00 2001 From: Louis-Etienne Date: Wed, 24 Oct 2018 02:00:53 -0400 Subject: [PATCH 224/483] Missing the batch permission in one of the example (#4829) Signed-off-by: Louis-Etienne Dorval --- docs/rbac.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rbac.md b/docs/rbac.md index 7deac70fb0e..4b39ecdc6a3 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -142,7 +142,7 @@ metadata: name: tiller-manager namespace: myorg-users rules: -- apiGroups: ["", "extensions", "apps"] +- apiGroups: ["", "batch", "extensions", "apps"] resources: ["*"] verbs: ["*"] ``` From 440e79ff958becbcbd6135fd4a7fddd553de06af Mon Sep 17 00:00:00 2001 From: masahiro Date: Thu, 25 Oct 2018 22:11:23 +0900 Subject: [PATCH 225/483] Fix cmd/helm use tillerTunnel values (#4777) Signed-off-by: masahiro331 --- cmd/helm/helm.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index ffc2c1ba2fc..f7628e44c49 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -189,13 +189,13 @@ func setupConnection() error { return err } - tunnel, err := portforwarder.New(settings.TillerNamespace, client, config) + tillerTunnel, err = portforwarder.New(settings.TillerNamespace, client, config) if err != nil { return err } - settings.TillerHost = fmt.Sprintf("127.0.0.1:%d", tunnel.Local) - debug("Created tunnel using local port: '%d'\n", tunnel.Local) + settings.TillerHost = fmt.Sprintf("127.0.0.1:%d", tillerTunnel.Local) + debug("Created tunnel using local port: '%d'\n", tillerTunnel.Local) } // Set up the gRPC config. From 1ebbd6989645375abd9268f9b3315e296b52f828 Mon Sep 17 00:00:00 2001 From: Bartel Sielski Date: Tue, 30 Oct 2018 17:24:20 +0100 Subject: [PATCH 226/483] Remove newline at the start of zsh completion file (#4851) Signed-off-by: Bartel Sielski --- cmd/helm/completion.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index b6fbc82d1a1..2181e723c75 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -81,8 +81,7 @@ func runCompletionBash(out io.Writer, cmd *cobra.Command) error { } func runCompletionZsh(out io.Writer, cmd *cobra.Command) error { - zshInitialization := ` -#compdef helm + zshInitialization := `#compdef helm __helm_bash_source() { alias shopt=':' From 6452e90f3f3e24740a88c3690d5e89219c13b7e8 Mon Sep 17 00:00:00 2001 From: Maor Friedman Date: Wed, 31 Oct 2018 15:58:47 +0200 Subject: [PATCH 227/483] Add plugins and tools to docs (#4861) Signed-off-by: Maor --- docs/related.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/related.md b/docs/related.md index b730ea9928d..11ecbf67277 100644 --- a/docs/related.md +++ b/docs/related.md @@ -36,14 +36,19 @@ or [pull request](https://github.com/helm/helm/pulls). - [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-edit](https://github.com/mstrzele/helm-edit) - Plugin for editing release's values - [helm-env](https://github.com/adamreese/helm-env) - Plugin to show current environment +- [helm-export](https://github.com/maorfr/helm-export) - Plugin to export releases from namespace to a file (disaster recovery) - [helm-gcs](https://github.com/nouney/helm-gcs) - Plugin to manage repositories on Google Cloud Storage - [helm-github](https://github.com/sagansystems/helm-github) - Plugin to install Helm Charts from Github repositories - [helm-hashtag](https://github.com/balboah/helm-hashtag) - Plugin for tracking docker tag hash digests as values +- [helm-import](https://github.com/maorfr/helm-import) - Plugin for importing releases from (exported) file to a namespace (disaster recovery) +- [helm-inject](https://github.com/maorfr/helm-inject) - Plugin for injecting additional configurations during release upgrade - [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp - [helm-last](https://github.com/adamreese/helm-last) - Plugin to show the latest release - [helm-local](https://github.com/adamreese/helm-local) - Plugin to run Tiller as a local daemon +- [helm-logs](https://github.com/maorfr/helm-logs) - Plugin to view changed releases over time - [helm-monitor](https://github.com/ContainerSolutions/helm-monitor) - Plugin to monitor a release and rollback based on Prometheus/ElasticSearch query - [helm-nuke](https://github.com/adamreese/helm-nuke) - Plugin to destroy all releases +- [helm-restore](https://github.com/maorfr/helm-restore) - Plugin to restore the last deployed release to its original state - [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely - [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods - [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side @@ -72,6 +77,7 @@ Tools layered on top of Helm or Tiller. - [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). - [Landscaper](https://github.com/Eneco/landscaper/) - "Landscaper takes a set of Helm Chart references with values (a desired state), and realizes this in a Kubernetes cluster." - [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories +- [Orca](https://github.com/maorfr/orca) - Advanced CI\CD tool for Kubernetes and Helm made simple. - [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client - [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API - [Schelm](https://github.com/databus23/schelm) - Render a Helm manifest to a directory From e37dcf4e0b5486380bb302fade7258e8c4ff1dab Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 31 Oct 2018 08:50:08 -0700 Subject: [PATCH 228/483] bump version to v2.11 (#4700) Signed-off-by: Matthew Fisher (cherry picked from commit 3a551d01d8e021679fd3d05ef9b97136e99b79e7) --- pkg/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/version/version.go b/pkg/version/version.go index c4ce4b38113..dae739500fd 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -26,7 +26,7 @@ var ( // Increment major number for new feature additions and behavioral changes. // Increment minor number for bug fixes and performance enhancements. // Increment patch number for critical fixes to existing releases. - Version = "v2.10" + Version = "v2.11" // BuildMetadata is extra build time data BuildMetadata = "unreleased" From 0522b34e056f6dda012a763b7ed2acd4ef552e1f Mon Sep 17 00:00:00 2001 From: Matt Rasmus Date: Wed, 31 Oct 2018 08:51:29 -0700 Subject: [PATCH 229/483] test(tiller): cover crash fixed by #4630 (#4853) While investigating a tiller crash on v2.10.0 (see recent comments in #3125), I pulled down the code and wrote a test replicating the crash I was experiencing. I then realized that the crash had been fixed, and was able to locate the fix in #4630 after running a quck bisect. Since there don't appear to be any tests that cover this crash, and I had written one myself, I figured I might as well put up a PR for it. Here's what the test failure on v2.10.0 looks like: ``` -- FAIL: TestUpdateReleasePendingInstall_Force (0.00s) panic: runtime error: invalid memory address or nil pointer dereference [recovered] panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x50 pc=0x1d128d8] goroutine 235 [running]: testing.tRunner.func1(0xc420493c20) /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:742 +0x29d panic(0x1eb8d80, 0x2a12db0) /usr/local/Cellar/go/1.10/libexec/src/runtime/panic.go:505 +0x229 k8s.io/helm/pkg/tiller.(*ReleaseServer).performUpdateForce(0xc4208210b0, 0xc4202c6dc0, 0x0, 0x0, 0x2174220) /Users/mattrasmus/go/src/k8s.io/helm/pkg/tiller/release_update.go:166 +0x188 k8s.io/helm/pkg/tiller.(*ReleaseServer).UpdateRelease(0xc4208210b0, 0x2191780, 0xc420820f30, 0xc4202c6dc0, 0x29aeb90, 0x38, 0x2d2) /Users/mattrasmus/go/src/k8s.io/helm/pkg/tiller/release_update.go:43 +0x245 k8s.io/helm/pkg/tiller.TestUpdateReleasePendingInstall_Force(0xc420493c20) /Users/mattrasmus/go/src/k8s.io/helm/pkg/tiller/release_update_test.go:549 +0x120 testing.tRunner(0xc420493c20, 0x20e5c70) /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:777 +0xd0 created by testing.(*T).Run /usr/local/Cellar/go/1.10/libexec/src/testing/testing.go:824 +0x2e0 FAIL k8s.io/helm/pkg/tiller 0.118s ``` Signed-off-by: Matt Rasmus --- pkg/tiller/release_update_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 1f189a8b77a..81fad0bc4e4 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -520,6 +520,30 @@ func TestUpdateReleaseCustomDescription_Force(t *testing.T) { compareStoredAndReturnedRelease(t, *rs, *res) } +func TestUpdateReleasePendingInstall_Force(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := namedReleaseStub("forceful-luke", release.Status_PENDING_INSTALL) + rs.env.Releases.Create(rel) + + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: rel.GetChart(), + Force: true, + } + + _, err := rs.UpdateRelease(c, req) + if err == nil { + t.Error("Expected failed update") + } + + expectedError := "a released named forceful-luke is in use, cannot re-use a name that is still in use" + got := err.Error() + if err.Error() != expectedError { + t.Errorf("Expected error %q, got %q", expectedError, got) + } +} + func compareStoredAndReturnedRelease(t *testing.T, rs ReleaseServer, res services.UpdateReleaseResponse) *release.Release { storedRelease, err := rs.env.Releases.Get(res.Release.Name, res.Release.Version) if err != nil { From 662fd4fcf64c27d95a8b973767219e91e7c4db3c Mon Sep 17 00:00:00 2001 From: Zachary Seguin Date: Wed, 31 Oct 2018 14:13:56 -0400 Subject: [PATCH 230/483] Remove executable bits from chartutil generated files (#4839) Signed-off-by: Zachary Seguin --- pkg/chartutil/save.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 5d60485bfea..400b85e91db 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -49,7 +49,7 @@ func SaveDir(c *chart.Chart, dest string) error { // Save values.yaml if c.Values != nil && len(c.Values.Raw) > 0 { vf := filepath.Join(outdir, ValuesfileName) - if err := ioutil.WriteFile(vf, []byte(c.Values.Raw), 0755); err != nil { + if err := ioutil.WriteFile(vf, []byte(c.Values.Raw), 0644); err != nil { return err } } @@ -63,7 +63,7 @@ func SaveDir(c *chart.Chart, dest string) error { // Save templates for _, f := range c.Templates { n := filepath.Join(outdir, f.Name) - if err := ioutil.WriteFile(n, f.Data, 0755); err != nil { + if err := ioutil.WriteFile(n, f.Data, 0644); err != nil { return err } } @@ -77,7 +77,7 @@ func SaveDir(c *chart.Chart, dest string) error { return err } - if err := ioutil.WriteFile(n, f.Value, 0755); err != nil { + if err := ioutil.WriteFile(n, f.Value, 0644); err != nil { return err } } From fb0e03ebded4045bcf8ec8f5b5e0f76a441f1e19 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 31 Oct 2018 11:57:38 -0700 Subject: [PATCH 231/483] ref(kube): use external api types where possible Signed-off-by: Adam Reese --- pkg/kube/client.go | 46 +++++++++++++++++++---------------------- pkg/kube/client_test.go | 20 +++++++++--------- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 6509a158391..198f20f3c7a 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -37,18 +37,17 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/watch" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/client-go/kubernetes/scheme" watchtools "k8s.io/client-go/tools/watch" "k8s.io/kubernetes/pkg/api/legacyscheme" - batchinternal "k8s.io/kubernetes/pkg/apis/batch" - "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/kubectl/cmd/get" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/validation" @@ -111,7 +110,7 @@ func (c *Client) Create(namespace string, reader io.Reader, timeout int64, shoul func (c *Client) newBuilder(namespace string, reader io.Reader) *resource.Result { return c.NewBuilder(). ContinueOnError(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...). Schema(c.validator()). NamespaceParam(namespace). DefaultNamespace(). @@ -163,7 +162,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { return "", err } - var objPods = make(map[string][]core.Pod) + var objPods = make(map[string][]v1.Pod) missing := []string{} err = perform(infos, func(info *resource.Info) error { @@ -493,7 +492,6 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, } pods, err := client.CoreV1().Pods(target.Namespace).List(metav1.ListOptions{ - FieldSelector: fields.Everything().String(), LabelSelector: labels.Set(selector).AsSelector().String(), }) if err != nil { @@ -601,15 +599,15 @@ func (c *Client) watchUntilReady(timeout time.Duration, info *resource.Info) err // // This operates on an event returned from a watcher. func (c *Client) waitForJob(e watch.Event, name string) (bool, error) { - o, ok := e.Object.(*batchinternal.Job) + o, ok := e.Object.(*batch.Job) if !ok { return true, fmt.Errorf("Expected %s to be a *batch.Job, got %T", name, e.Object) } for _, c := range o.Status.Conditions { - if c.Type == batchinternal.JobComplete && c.Status == core.ConditionTrue { + if c.Type == batch.JobComplete && c.Status == v1.ConditionTrue { return true, nil - } else if c.Type == batchinternal.JobFailed && c.Status == core.ConditionTrue { + } else if c.Type == batch.JobFailed && c.Status == v1.ConditionTrue { return true, fmt.Errorf("Job failed: %s", c.Reason) } } @@ -690,7 +688,7 @@ func isPodComplete(event watch.Event) (bool, error) { //get a kubernetes resources' relation pods // kubernetes resource used select labels to relate pods -func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]core.Pod) (map[string][]core.Pod, error) { +func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][]v1.Pod) (map[string][]v1.Pod, error) { if info == nil { return objPods, nil } @@ -706,25 +704,14 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] client, _ := c.KubernetesClientSet() pods, err := client.CoreV1().Pods(info.Namespace).List(metav1.ListOptions{ - FieldSelector: fields.Everything().String(), LabelSelector: labels.Set(selector).AsSelector().String(), }) if err != nil { return objPods, err } - for _, externalPod := range pods.Items { - pod := core.Pod{} - legacyscheme.Scheme.Convert(&externalPod, &pod, nil) - if pod.APIVersion == "" { - pod.APIVersion = "v1" - } - - if pod.Kind == "" { - pod.Kind = "Pod" - } - vk := pod.GroupVersionKind().Version + "/" + pod.GroupVersionKind().Kind - + for _, pod := range pods.Items { + vk := "v1/Pod" if !isFoundPod(objPods[vk], pod) { objPods[vk] = append(objPods[vk], pod) } @@ -732,7 +719,7 @@ func (c *Client) getSelectRelationPod(info *resource.Info, objPods map[string][] return objPods, nil } -func isFoundPod(podItem []core.Pod, pod core.Pod) bool { +func isFoundPod(podItem []v1.Pod, pod v1.Pod) bool { for _, value := range podItem { if (value.Namespace == pod.Namespace) && (value.Name == pod.Name) { return true @@ -742,7 +729,16 @@ func isFoundPod(podItem []core.Pod, pod core.Pod) bool { } func asVersioned(info *resource.Info) runtime.Object { - return cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) + converter := runtime.ObjectConvertor(scheme.Scheme) + groupVersioner := runtime.GroupVersioner(schema.GroupVersions(scheme.Scheme.PrioritizedVersionsAllGroups())) + if info.Mapping != nil { + groupVersioner = info.Mapping.GroupVersionKind.GroupVersion() + } + + if obj, err := converter.ConvertToVersion(info.Object, groupVersioner); err == nil { + return obj + } + return info.Object } func asInternal(info *resource.Info) (runtime.Object, error) { diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index e505e8f376e..de33881c8ec 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -29,16 +29,17 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest/fake" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/api/testapi" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" - "k8s.io/kubernetes/pkg/kubectl/scheme" ) -var unstructuredSerializer = resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer +var ( + codec = scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) + unstructuredSerializer = resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer +) -func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { +func objBody(obj runtime.Object) io.ReadCloser { return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) } @@ -89,7 +90,7 @@ func notFoundBody() *metav1.Status { func newResponse(code int, obj runtime.Object) (*http.Response, error) { header := http.Header{} header.Set("Content-Type", runtime.ContentTypeJSON) - body := ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), obj)))) + body := ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) return &http.Response{StatusCode: code, Header: header, Body: body}, nil } @@ -161,19 +162,18 @@ func TestUpdate(t *testing.T) { Factory: tf, Log: nopLogger, } - codec := legacyscheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) - if err := c.Update(v1.NamespaceDefault, objBody(codec, &listA), objBody(codec, &listB), false, false, 0, false); err != nil { + if err := c.Update(v1.NamespaceDefault, objBody(&listA), objBody(&listB), false, false, 0, false); err != nil { t.Fatal(err) } // TODO: Find a way to test methods that use Client Set // Test with a wait - // if err := c.Update("test", objBody(codec, &listB), objBody(codec, &listC), false, 300, true); err != nil { + // if err := c.Update("test", objBody(&listB), objBody(&listC), false, 300, true); err != nil { // t.Fatal(err) // } // Test with a wait should fail // TODO: A way to make this not based off of an extremely short timeout? - // if err := c.Update("test", objBody(codec, &listC), objBody(codec, &listA), false, 2, true); err != nil { + // if err := c.Update("test", objBody(&listC), objBody(&listA), false, 2, true); err != nil { // t.Fatal(err) // } expectedActions := []string{ From d18fa439e6be76232bd7dd7707768385dfc764cc Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 1 Nov 2018 08:35:20 -0700 Subject: [PATCH 232/483] add s390x architecture to the release notes (#4741) Signed-off-by: Matthew Fisher --- docs/release_checklist.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 3d48e2a4467..58257a94aa4 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -236,6 +236,7 @@ Download Helm X.Y. The common platform binaries are here: - [Linux arm64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz.sha256)) - [Linux i386](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz.sha256)) - [Linux ppc64le](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz.sha256)) +- [Linux s390x](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz.sha256)) - [Windows amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip.sha256)) Once you have the client installed, upgrade Tiller with `helm init --upgrade`. From 8442851a5c566a01d9b4c69b368d64daa04f6a7f Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 1 Nov 2018 08:36:03 -0700 Subject: [PATCH 233/483] docs(release_checklist): fix changelog generation command (#4694) Signed-off-by: Matthew Fisher --- docs/release_checklist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 58257a94aa4..9213b4c1fb5 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -258,7 +258,7 @@ The changelog at the bottom of the release notes can be generated with this comm ```shell PREVIOUS_RELEASE=vX.Y.Z -git log --no-merges --pretty=format:'- %s %H (%aN)' $RELEASE_NAME $PREVIOUS_RELEASE +git log --no-merges --pretty=format:'- %s %H (%aN)' $PREVIOUS_RELEASE..$RELEASE_NAME ``` Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. From c60abb4dd051ac59375335cc6bc9476e73eecf02 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 1 Nov 2018 10:17:46 -0700 Subject: [PATCH 234/483] add special note for RBAC users (#4597) Signed-off-by: Matthew Fisher --- docs/install.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/install.md b/docs/install.md index 96d9bc9f784..e0e3db56d00 100755 --- a/docs/install.md +++ b/docs/install.md @@ -113,6 +113,12 @@ Tiller, the server portion of Helm, typically runs inside of your Kubernetes cluster. But for development, it can also be run locally, and configured to talk to a remote Kubernetes cluster. +### Special Note for RBAC Users + +Most cloud providers enable a feature called Role-Based Access Control - RBAC for short. If your cloud provider enables this feature, you will need to create a service account for Tiller with the right roles and permissions to access resources. + +Check the [Kubernetes Distribution Guide](kubernetes_distros.md) to see if there's any further points of interest on using Helm with your cloud provider. Also check out the guide on [Tiller and Role-Based Access Control](rbac.md) for more information on how to run Tiller in an RBAC-enabled Kubernetes cluster. + ### Easy In-Cluster Installation The easiest way to install `tiller` into the cluster is simply to run From bc817a1914fb7fd70ee3dfb2c40c2d8f61d1fd18 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 14 May 2018 11:44:49 -0700 Subject: [PATCH 235/483] replace with a link to the latest releases page This removes a step required every time we release Helm, making it simpler to cut a new release. Signed-off-by: jgleonard --- README.md | 7 +------ docs/release_checklist.md | 25 ------------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/README.md b/README.md index fb2e16bce71..fc091056ef0 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,7 @@ Think of it like apt/yum/homebrew for Kubernetes. ## Install -Binary downloads of the Helm client can be found at the following links: - -- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-darwin-amd64.tar.gz) -- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-linux-amd64.tar.gz) -- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-linux-386.tar.gz) -- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.2-windows-amd64.tar.gz) +Binary downloads of the Helm client can be found on [the latest Releases page](https://github.com/kubernetes/helm/releases/latest). Unpack the `helm` binary and add it to your PATH and you are good to go! diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 26506985ca5..d678e774824 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -94,31 +94,6 @@ index 2109a0a..6f5a1a4 100644 BuildMetadata = "unreleased" ``` -The README stores links to the latest release for helm. We want to change the version to the first release candidate which we are releasing (more on that in step 5). - -```shell -$ git diff README.md -diff --git a/README.md b/README.md -index 022afd79..547839e2 100644 ---- a/README.md -+++ b/README.md -@@ -34,10 +34,10 @@ Think of it like apt/yum/homebrew for Kubernetes. - - Binary downloads of the Helm client can be found at the following links: - --- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-darwin-amd64.tar.gz) --- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-amd64.tar.gz) --- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-386.tar.gz) --- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-windows-amd64.tar.gz) -+- [OSX](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-darwin-amd64.tar.gz) -+- [Linux](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-linux-amd64.tar.gz) -+- [Linux 32-bit](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-linux-386.tar.gz) -+- [Windows](https://kubernetes-helm.storage.googleapis.com/helm-v2.8.0-windows-amd64.tar.gz) - - Unpack the `helm` binary and add it to your PATH and you are good to go! - macOS/[homebrew](https://brew.sh/) users can also use `brew install kubernetes-helm`. -``` - For patch releases, the old version number will be the latest patch release, so just bump the patch number, incrementing Z by one. ```shell From 61156e66565aaf5903efabcc5710846989a20f84 Mon Sep 17 00:00:00 2001 From: Rajat Jindal Date: Sat, 12 May 2018 17:37:09 -0700 Subject: [PATCH 236/483] fix lint warning Signed-off-by: jgleonard --- pkg/downloader/manager.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 89a839b54aa..9ee1f6f6d07 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -99,11 +99,7 @@ func (m *Manager) Build() error { } // Now we need to fetch every package here into charts/ - if err := m.downloadAll(lock.Dependencies); err != nil { - return err - } - - return nil + return m.downloadAll(lock.Dependencies) } // Update updates a local charts directory. From 21cce62d53b7a4f2431455bf70312830b994b429 Mon Sep 17 00:00:00 2001 From: AdamDang Date: Thu, 17 May 2018 00:05:06 +0800 Subject: [PATCH 237/483] Update capabilities.go Signed-off-by: jgleonard --- pkg/chartutil/capabilities.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/capabilities.go b/pkg/chartutil/capabilities.go index c87c0368ea4..d26aa170751 100644 --- a/pkg/chartutil/capabilities.go +++ b/pkg/chartutil/capabilities.go @@ -42,7 +42,7 @@ var ( type Capabilities struct { // List of all supported API versions APIVersions VersionSet - // KubeVerison is the Kubernetes version + // KubeVersion is the Kubernetes version KubeVersion *version.Info // TillerVersion is the Tiller version // From ab9349c425ab232992121b1d4a1c547dfdb0294b Mon Sep 17 00:00:00 2001 From: jgleonard Date: Thu, 1 Nov 2018 14:56:46 -0400 Subject: [PATCH 238/483] add child NOTES.txt rendering Signed-off-by: jgleonard --- pkg/tiller/release_install_test.go | 4 ++-- pkg/tiller/release_server.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/tiller/release_install_test.go b/pkg/tiller/release_install_test.go index a244e4b720b..73976571eb2 100644 --- a/pkg/tiller/release_install_test.go +++ b/pkg/tiller/release_install_test.go @@ -291,8 +291,8 @@ func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) { t.Logf("rel: %v", rel) - if rel.Info.Status.Notes != notesText { - t.Fatalf("Expected '%s', got '%s'", notesText, rel.Info.Status.Notes) + if !strings.Contains(rel.Info.Status.Notes, notesText) || !strings.Contains(rel.Info.Status.Notes, notesText+" child") { + t.Fatalf("Expected '%s', got '%s'", notesText+"\n"+notesText+" child", rel.Info.Status.Notes) } if rel.Info.Description != "Install complete" { diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 1a2b3c4da4b..e223d9f3235 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -20,7 +20,6 @@ import ( "bytes" "errors" "fmt" - "path" "regexp" "strings" @@ -289,17 +288,18 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values // text file. We have to spin through this map because the file contains path information, so we // look for terminating NOTES.txt. We also remove it from the files so that we don't have to skip // it in the sortHooks. - notes := "" + var notesBuffer bytes.Buffer for k, v := range files { if strings.HasSuffix(k, notesFileSuffix) { - // Only apply the notes if it belongs to the parent chart - // Note: Do not use filePath.Join since it creates a path with \ which is not expected - if k == path.Join(ch.Metadata.Name, "templates", notesFileSuffix) { - notes = v + // If buffer contains data, add newline before adding more + if notesBuffer.Len() > 0 { + notesBuffer.WriteString("\n") } + notesBuffer.WriteString(v) delete(files, k) } } + notes := notesBuffer.String() // Sort hooks, manifests, and partials. Only hooks and manifests are returned, // as partials are not used after renderer.Render. Empty manifests are also From 1518f961af426bfb4ce8f4ef515c4d90b1a475fb Mon Sep 17 00:00:00 2001 From: jgleonard Date: Thu, 1 Nov 2018 14:57:01 -0400 Subject: [PATCH 239/483] fix(helm): add --render-subchart-notes flag to 'helm install' and 'helm upgrade' When 'helm --render-subchart-notes ...' is run, this will include the notes from the subchart when rendered via Tiller. Closes #2751 Signed-off-by: jgleonard --- _proto/hapi/services/tiller.proto | 4 + cmd/helm/install.go | 3 + cmd/helm/upgrade.go | 3 + pkg/helm/client.go | 2 + pkg/helm/option.go | 16 +++ pkg/proto/hapi/services/tiller.pb.go | 176 +++++++++++++++------------ pkg/tiller/release_install.go | 2 +- pkg/tiller/release_install_test.go | 35 +++++- pkg/tiller/release_server.go | 15 ++- pkg/tiller/release_server_test.go | 6 + pkg/tiller/release_update.go | 2 +- pkg/urlutil/urlutil_test.go | 4 +- 12 files changed, 179 insertions(+), 89 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 8daef0cb3e1..e54f6058129 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -209,6 +209,8 @@ message UpdateReleaseRequest { bool reuse_values = 10; // Force resource update through delete/recreate if needed. bool force = 11; + // Render subchart notes if enabled + bool subNotes = 12; } // UpdateReleaseResponse is the response to an update request. @@ -273,6 +275,8 @@ message InstallReleaseRequest { bool wait = 9; bool disable_crd_hook = 10; + + bool subNotes = 11; } // InstallReleaseResponse is the response from a release installation. diff --git a/cmd/helm/install.go b/cmd/helm/install.go index d1c24c2131e..bffb96746be 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -129,6 +129,7 @@ type installCmd struct { password string devel bool depUp bool + subNotes bool certFile string keyFile string @@ -209,6 +210,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.BoolVar(&inst.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") f.BoolVar(&inst.depUp, "dep-up", false, "run helm dependency update before installing the chart") + f.BoolVar(&inst.subNotes, "render-subchart-notes", false, "render subchart notes along with the parent") return cmd } @@ -276,6 +278,7 @@ func (i *installCmd) run() error { helm.InstallReuseName(i.replace), helm.InstallDisableHooks(i.disableHooks), helm.InstallDisableCRDHook(i.disableCRDHook), + helm.InstallSubNotes(i.subNotes), helm.InstallTimeout(i.timeout), helm.InstallWait(i.wait)) if err != nil { diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 4dd433a3924..41a4d7d5cb4 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -78,6 +78,7 @@ type upgradeCmd struct { username string password string devel bool + subNotes bool certFile string keyFile string @@ -139,6 +140,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&upgrade.keyFile, "key-file", "", "identify HTTPS client using this SSL key file") f.StringVar(&upgrade.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.BoolVar(&upgrade.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") + f.BoolVar(&upgrade.subNotes, "render-subchart-notes", false, "render subchart notes along with parent") f.MarkDeprecated("disable-hooks", "use --no-hooks instead") @@ -224,6 +226,7 @@ func (u *upgradeCmd) run() error { helm.UpgradeTimeout(u.timeout), helm.ResetValues(u.resetValues), helm.ReuseValues(u.reuseValues), + helm.UpgradeSubNotes(u.subNotes), helm.UpgradeWait(u.wait)) if err != nil { return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 465ca0af8c3..3d246086fd7 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -95,6 +95,7 @@ func (h *Client) InstallReleaseFromChart(chart *chart.Chart, ns string, opts ... req := &reqOpts.instReq req.Chart = chart req.Namespace = ns + req.SubNotes = reqOpts.subNotes req.DryRun = reqOpts.dryRun req.DisableHooks = reqOpts.disableHooks req.DisableCrdHook = reqOpts.disableCRDHook @@ -171,6 +172,7 @@ func (h *Client) UpdateReleaseFromChart(rlsName string, chart *chart.Chart, opts req.DryRun = reqOpts.dryRun req.Name = rlsName req.DisableHooks = reqOpts.disableHooks + req.SubNotes = reqOpts.subNotes req.Recreate = reqOpts.recreate req.Force = reqOpts.force req.ResetValues = reqOpts.resetValues diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 602e1e3a389..045d45c1d4e 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -53,6 +53,8 @@ type options struct { disableHooks bool // if set, skip CRD hook only disableCRDHook bool + // if set, render SubChart Notes + subNotes bool // name of release releaseName string // tls.Config to use for rpc if tls enabled @@ -311,6 +313,20 @@ func InstallReuseName(reuse bool) InstallOption { } } +// InstallSubNotes will (if true) instruct Tiller to render SubChart Notes +func InstallSubNotes(enable bool) InstallOption { + return func(opts *options) { + opts.subNotes = enable + } +} + +// UpgradeSubNotes will (if true) instruct Tiller to render SubChart Notes +func UpgradeSubNotes(enable bool) UpdateOption { + return func(opts *options) { + opts.subNotes = enable + } +} + // RollbackDisableHooks will disable hooks for a rollback operation func RollbackDisableHooks(disable bool) RollbackOption { return func(opts *options) { diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 4d23bcdad3e..43c8ddcce42 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -376,6 +376,8 @@ type UpdateReleaseRequest struct { ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues" json:"reuse_values,omitempty"` // Force resource update through delete/recreate if needed. Force bool `protobuf:"varint,11,opt,name=force" json:"force,omitempty"` + // Render subchart notes if enabled + SubNotes bool `protobuf:"varint,12,opt,name=subNotes" json:"subNotes,omitempty"` } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } @@ -460,6 +462,13 @@ func (m *UpdateReleaseRequest) GetForce() bool { return false } +func (m *UpdateReleaseRequest) GetSubNotes() bool { + if m != nil { + return m.SubNotes + } + return false +} + // UpdateReleaseResponse is the response to an update request. type UpdateReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -601,6 +610,7 @@ type InstallReleaseRequest struct { // before marking the release as successful. It will wait for as long as timeout Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook" json:"disable_crd_hook,omitempty"` + SubNotes bool `protobuf:"varint,11,opt,name=subNotes" json:"subNotes,omitempty"` } func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } @@ -678,6 +688,13 @@ func (m *InstallReleaseRequest) GetDisableCrdHook() bool { return false } +func (m *InstallReleaseRequest) GetSubNotes() bool { + if m != nil { + return m.SubNotes + } + return false +} + // InstallReleaseResponse is the response from a release installation. type InstallReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -1376,83 +1393,84 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1235 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4, - 0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x6e, 0xfe, 0xd9, 0x69, 0xda, 0xba, 0xfe, 0x2f, 0xa8, 0x18, 0xc1, - 0x66, 0x17, 0x36, 0x85, 0xc0, 0x0d, 0x12, 0x42, 0xea, 0x66, 0xa3, 0xb6, 0x50, 0xba, 0x92, 0xb3, - 0x5d, 0x24, 0x04, 0x44, 0x6e, 0x32, 0x69, 0xcd, 0x3a, 0x76, 0xf0, 0x8c, 0xcb, 0xf6, 0x96, 0x3b, - 0xde, 0x8a, 0x77, 0xe0, 0x92, 0x4b, 0x78, 0x10, 0x34, 0x5f, 0xae, 0x27, 0xb5, 0x5b, 0xd3, 0x9b, - 0x78, 0x66, 0xce, 0xf7, 0xef, 0x9c, 0x39, 0x73, 0x02, 0xd6, 0x85, 0xbb, 0xf4, 0xf6, 0x08, 0x8e, - 0x2e, 0xbd, 0x29, 0x26, 0x7b, 0xd4, 0xf3, 0x7d, 0x1c, 0xf5, 0x97, 0x51, 0x48, 0x43, 0xd4, 0x65, - 0xb4, 0xbe, 0xa2, 0xf5, 0x05, 0xcd, 0xda, 0xe2, 0x12, 0xd3, 0x0b, 0x37, 0xa2, 0xe2, 0x57, 0x70, - 0x5b, 0xdb, 0xe9, 0xf3, 0x30, 0x98, 0x7b, 0xe7, 0x92, 0x20, 0x4c, 0x44, 0xd8, 0xc7, 0x2e, 0xc1, - 0xea, 0xab, 0x09, 0x29, 0x9a, 0x17, 0xcc, 0x43, 0x49, 0xf8, 0xbf, 0x46, 0xa0, 0x98, 0xd0, 0x49, - 0x14, 0x07, 0x92, 0xb8, 0xa3, 0x11, 0x09, 0x75, 0x69, 0x4c, 0x34, 0x63, 0x97, 0x38, 0x22, 0x5e, - 0x18, 0xa8, 0xaf, 0xa0, 0xd9, 0x7f, 0x94, 0x60, 0xe3, 0xd8, 0x23, 0xd4, 0x11, 0x82, 0xc4, 0xc1, - 0xbf, 0xc4, 0x98, 0x50, 0xd4, 0x85, 0xaa, 0xef, 0x2d, 0x3c, 0x6a, 0x1a, 0xbb, 0x46, 0xaf, 0xec, - 0x88, 0x0d, 0xda, 0x82, 0x5a, 0x38, 0x9f, 0x13, 0x4c, 0xcd, 0xd2, 0xae, 0xd1, 0x6b, 0x3a, 0x72, - 0x87, 0xbe, 0x82, 0x3a, 0x09, 0x23, 0x3a, 0x39, 0xbb, 0x32, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, - 0xa0, 0x9f, 0x85, 0x53, 0x9f, 0x59, 0x1a, 0x87, 0x11, 0xed, 0xb3, 0x9f, 0xe7, 0x57, 0x4e, 0x8d, - 0xf0, 0x2f, 0xd3, 0x3b, 0xf7, 0x7c, 0x8a, 0x23, 0xb3, 0x22, 0xf4, 0x8a, 0x1d, 0x3a, 0x00, 0xe0, - 0x7a, 0xc3, 0x68, 0x86, 0x23, 0xb3, 0xca, 0x55, 0xf7, 0x0a, 0xa8, 0x7e, 0xc9, 0xf8, 0x9d, 0x26, - 0x51, 0x4b, 0xf4, 0x25, 0xac, 0x0b, 0x48, 0x26, 0xd3, 0x70, 0x86, 0x89, 0x59, 0xdb, 0x2d, 0xf7, - 0xda, 0x83, 0x1d, 0xa1, 0x4a, 0xc1, 0x3f, 0x16, 0xa0, 0x0d, 0xc3, 0x19, 0x76, 0x5a, 0x82, 0x9d, - 0xad, 0x09, 0x7a, 0x04, 0xcd, 0xc0, 0x5d, 0x60, 0xb2, 0x74, 0xa7, 0xd8, 0xac, 0x73, 0x0f, 0xaf, - 0x0f, 0xec, 0x9f, 0xa0, 0xa1, 0x8c, 0xdb, 0x03, 0xa8, 0x89, 0xd0, 0x50, 0x0b, 0xea, 0xa7, 0x27, - 0xdf, 0x9c, 0xbc, 0xfc, 0xee, 0xa4, 0xb3, 0x86, 0x1a, 0x50, 0x39, 0xd9, 0xff, 0x76, 0xd4, 0x31, - 0xd0, 0x43, 0x78, 0x70, 0xbc, 0x3f, 0x7e, 0x35, 0x71, 0x46, 0xc7, 0xa3, 0xfd, 0xf1, 0xe8, 0x45, - 0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0x78, 0x28, 0x44, 0x5e, 0x8c, - 0xc6, 0xc3, 0x8e, 0x61, 0xff, 0x6e, 0x40, 0x57, 0x4f, 0x11, 0x59, 0x86, 0x01, 0xc1, 0x2c, 0x47, - 0xd3, 0x30, 0x0e, 0x92, 0x1c, 0xf1, 0x0d, 0x42, 0x50, 0x09, 0xf0, 0x5b, 0x95, 0x21, 0xbe, 0x66, - 0x9c, 0x34, 0xa4, 0xae, 0xcf, 0xb3, 0x53, 0x76, 0xc4, 0x06, 0x7d, 0x0a, 0x0d, 0x19, 0x3a, 0x31, - 0x2b, 0xbb, 0xe5, 0x5e, 0x6b, 0xb0, 0xa9, 0x03, 0x22, 0x2d, 0x3a, 0x09, 0x9b, 0x7d, 0x00, 0xdb, - 0x07, 0x58, 0x79, 0x22, 0xf0, 0x52, 0x15, 0xc3, 0xec, 0xba, 0x0b, 0xcc, 0x9d, 0x61, 0x76, 0xdd, - 0x05, 0x46, 0x26, 0xd4, 0x65, 0xb9, 0x71, 0x77, 0xaa, 0x8e, 0xda, 0xda, 0x14, 0xcc, 0x9b, 0x8a, - 0x64, 0x5c, 0x59, 0x9a, 0x3e, 0x84, 0x0a, 0xbb, 0x09, 0x5c, 0x4d, 0x6b, 0x80, 0x74, 0x3f, 0x8f, - 0x82, 0x79, 0xe8, 0x70, 0xba, 0x9e, 0xaa, 0xf2, 0x6a, 0xaa, 0x0e, 0xd3, 0x56, 0x87, 0x61, 0x40, - 0x71, 0x40, 0xef, 0xe7, 0xff, 0x31, 0xec, 0x64, 0x68, 0x92, 0x01, 0xec, 0x41, 0x5d, 0xba, 0xc6, - 0xb5, 0xe5, 0xe2, 0xaa, 0xb8, 0xec, 0xbf, 0x4b, 0xd0, 0x3d, 0x5d, 0xce, 0x5c, 0x8a, 0x15, 0xe9, - 0x16, 0xa7, 0x1e, 0x43, 0x95, 0x77, 0x14, 0x89, 0xc5, 0x43, 0xa1, 0x5b, 0xb4, 0x9d, 0x21, 0xfb, - 0x75, 0x04, 0x1d, 0x3d, 0x85, 0xda, 0xa5, 0xeb, 0xc7, 0x98, 0x70, 0x20, 0x12, 0xd4, 0x24, 0x27, - 0x6f, 0x47, 0x8e, 0xe4, 0x40, 0xdb, 0x50, 0x9f, 0x45, 0x57, 0xac, 0x9f, 0xf0, 0x2b, 0xd8, 0x70, - 0x6a, 0xb3, 0xe8, 0xca, 0x89, 0x03, 0xf4, 0x3e, 0x3c, 0x98, 0x79, 0xc4, 0x3d, 0xf3, 0xf1, 0xe4, - 0x22, 0x0c, 0xdf, 0x10, 0x7e, 0x0b, 0x1b, 0xce, 0xba, 0x3c, 0x3c, 0x64, 0x67, 0xc8, 0x62, 0x95, - 0x34, 0x8d, 0xb0, 0x4b, 0xb1, 0x59, 0xe3, 0xf4, 0x64, 0xcf, 0x30, 0xa4, 0xde, 0x02, 0x87, 0x31, - 0xe5, 0x57, 0xa7, 0xec, 0xa8, 0x2d, 0x7a, 0x0f, 0xd6, 0x23, 0x4c, 0x30, 0x9d, 0x48, 0x2f, 0x1b, - 0x5c, 0xb2, 0xc5, 0xcf, 0x5e, 0x0b, 0xb7, 0x10, 0x54, 0x7e, 0x75, 0x3d, 0x6a, 0x36, 0x39, 0x89, - 0xaf, 0x85, 0x58, 0x4c, 0xb0, 0x12, 0x03, 0x25, 0x16, 0x13, 0x2c, 0xc5, 0xba, 0x50, 0x9d, 0x87, - 0xd1, 0x14, 0x9b, 0x2d, 0x4e, 0x13, 0x1b, 0xfb, 0x10, 0x36, 0x57, 0x40, 0xbe, 0x6f, 0xbe, 0xfe, - 0x31, 0x60, 0xcb, 0x09, 0x7d, 0xff, 0xcc, 0x9d, 0xbe, 0x29, 0x90, 0xb1, 0x14, 0xb8, 0xa5, 0xdb, - 0xc1, 0x2d, 0x67, 0x80, 0x9b, 0x2a, 0xc2, 0x8a, 0x56, 0x84, 0x1a, 0xec, 0xd5, 0x7c, 0xd8, 0x6b, - 0x3a, 0xec, 0x0a, 0xd3, 0x7a, 0x0a, 0xd3, 0x04, 0xb0, 0x46, 0x1a, 0xb0, 0xaf, 0x61, 0xfb, 0x46, - 0x94, 0xf7, 0x85, 0xec, 0xcf, 0x12, 0x6c, 0x1e, 0x05, 0x84, 0xba, 0xbe, 0xbf, 0x82, 0x58, 0x52, - 0xcf, 0x46, 0xe1, 0x7a, 0x2e, 0xfd, 0x97, 0x7a, 0x2e, 0x6b, 0x90, 0xab, 0xfc, 0x54, 0x52, 0xf9, - 0x29, 0x54, 0xe3, 0x5a, 0x67, 0xa9, 0xad, 0x74, 0x16, 0xf4, 0x0e, 0x80, 0x28, 0x4a, 0xae, 0x5c, - 0x40, 0xdb, 0xe4, 0x27, 0x27, 0xb2, 0x91, 0xa8, 0x6c, 0x34, 0xb2, 0xb3, 0x91, 0xae, 0xf0, 0x1e, - 0x74, 0x94, 0x3f, 0xd3, 0x68, 0xc6, 0x7d, 0x92, 0x55, 0xde, 0x96, 0xe7, 0xc3, 0x68, 0xc6, 0xbc, - 0xb2, 0x8f, 0x60, 0x6b, 0x15, 0xd4, 0xfb, 0x26, 0xe8, 0x37, 0x03, 0xb6, 0x4f, 0x03, 0x2f, 0x33, - 0x45, 0x59, 0x45, 0x7d, 0x03, 0xb4, 0x52, 0x06, 0x68, 0x5d, 0xa8, 0x2e, 0xe3, 0xe8, 0x1c, 0xcb, - 0x24, 0x88, 0x4d, 0x1a, 0x8d, 0x8a, 0x86, 0x86, 0x3d, 0x01, 0xf3, 0xa6, 0x0f, 0xf7, 0x8c, 0x88, - 0x79, 0x9d, 0xbc, 0x19, 0x4d, 0xf1, 0x3e, 0xd8, 0x1b, 0xf0, 0xf0, 0x00, 0xd3, 0xd7, 0xe2, 0x02, - 0xc9, 0xf0, 0xec, 0x11, 0xa0, 0xf4, 0xe1, 0xb5, 0x3d, 0x79, 0xa4, 0xdb, 0x53, 0x03, 0x94, 0xe2, - 0x57, 0x5c, 0xf6, 0x17, 0x5c, 0xf7, 0xa1, 0x47, 0x68, 0x18, 0x5d, 0xdd, 0x06, 0x5d, 0x07, 0xca, - 0x0b, 0xf7, 0xad, 0x7c, 0x52, 0xd8, 0xd2, 0x3e, 0xe0, 0x1e, 0x24, 0xa2, 0xd2, 0x83, 0xf4, 0x03, - 0x6d, 0x14, 0x7b, 0xa0, 0x7f, 0x00, 0xf4, 0x0a, 0x27, 0xb3, 0xc2, 0x1d, 0x6f, 0x9b, 0x4a, 0x42, - 0x49, 0x2f, 0x49, 0x13, 0xea, 0x53, 0x1f, 0xbb, 0x41, 0xbc, 0x94, 0x69, 0x53, 0x5b, 0xfb, 0x47, - 0xd8, 0xd0, 0xb4, 0x4b, 0x3f, 0x59, 0x3c, 0xe4, 0x5c, 0x6a, 0x67, 0x4b, 0xf4, 0x39, 0xd4, 0xc4, - 0x00, 0xc5, 0x75, 0xb7, 0x07, 0x8f, 0x74, 0xbf, 0xb9, 0x92, 0x38, 0x90, 0x13, 0x97, 0x23, 0x79, - 0x07, 0x7f, 0x35, 0xa0, 0xad, 0x46, 0x02, 0x31, 0xde, 0x21, 0x0f, 0xd6, 0xd3, 0xb3, 0x0f, 0x7a, - 0x92, 0x3f, 0xfd, 0xad, 0x8c, 0xb0, 0xd6, 0xd3, 0x22, 0xac, 0x22, 0x02, 0x7b, 0xed, 0x13, 0x03, - 0x11, 0xe8, 0xac, 0x8e, 0x24, 0xe8, 0x59, 0xb6, 0x8e, 0x9c, 0x19, 0xc8, 0xea, 0x17, 0x65, 0x57, - 0x66, 0xd1, 0x25, 0xaf, 0x19, 0x7d, 0x8e, 0x40, 0x77, 0xaa, 0xd1, 0x47, 0x17, 0x6b, 0xaf, 0x30, - 0x7f, 0x62, 0xf7, 0x67, 0x78, 0xa0, 0xbd, 0x85, 0x28, 0x07, 0xad, 0xac, 0xa9, 0xc4, 0xfa, 0xa8, - 0x10, 0x6f, 0x62, 0x6b, 0x01, 0x6d, 0xbd, 0x49, 0xa1, 0x1c, 0x05, 0x99, 0xef, 0x83, 0xf5, 0x71, - 0x31, 0xe6, 0xc4, 0x1c, 0x81, 0xce, 0x6a, 0x0f, 0xc9, 0xcb, 0x63, 0x4e, 0xbf, 0xcb, 0xcb, 0x63, - 0x5e, 0x6b, 0xb2, 0xd7, 0x90, 0x0b, 0x70, 0xdd, 0x42, 0xd0, 0xe3, 0xdc, 0x84, 0xe8, 0x9d, 0xc7, - 0xea, 0xdd, 0xcd, 0x98, 0x98, 0x58, 0xc2, 0xff, 0x56, 0x5e, 0x63, 0x94, 0x03, 0x4d, 0xf6, 0x68, - 0x62, 0x3d, 0x2b, 0xc8, 0xbd, 0x12, 0x94, 0xec, 0x4a, 0xb7, 0x04, 0xa5, 0xb7, 0xbc, 0x5b, 0x82, - 0x5a, 0x69, 0x70, 0xf6, 0x1a, 0xf2, 0xa0, 0xed, 0xc4, 0x81, 0x34, 0xcd, 0xda, 0x02, 0xca, 0x91, - 0xbe, 0xd9, 0xd5, 0xac, 0x27, 0x05, 0x38, 0xaf, 0xef, 0xf7, 0x73, 0xf8, 0xbe, 0xa1, 0x58, 0xcf, - 0x6a, 0xfc, 0xdf, 0xef, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc3, 0xd5, 0x55, 0xeb, - 0x0f, 0x00, 0x00, + // 1257 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdf, 0x6f, 0xe3, 0xc4, + 0x13, 0xaf, 0xf3, 0x3b, 0x93, 0x36, 0xdf, 0x74, 0x9b, 0xb6, 0xae, 0xbf, 0x07, 0x2a, 0x46, 0x70, + 0xb9, 0x83, 0x4b, 0x21, 0xf0, 0x82, 0x84, 0x90, 0x7a, 0xb9, 0xa8, 0x2d, 0x94, 0x9c, 0xe4, 0x5c, + 0x0f, 0x09, 0x01, 0x91, 0x9b, 0x6c, 0x5a, 0x73, 0x8e, 0x1d, 0xbc, 0xeb, 0x72, 0x7d, 0xe5, 0x8d, + 0xff, 0x8a, 0xff, 0x83, 0x57, 0xde, 0xf9, 0x13, 0x40, 0xde, 0x1f, 0xae, 0xd7, 0xb5, 0x5b, 0xd3, + 0x97, 0x78, 0x77, 0x67, 0x76, 0x66, 0xf6, 0xf3, 0x99, 0x9d, 0x9d, 0x80, 0x71, 0x69, 0xaf, 0x9c, + 0x03, 0x82, 0x83, 0x2b, 0x67, 0x86, 0xc9, 0x01, 0x75, 0x5c, 0x17, 0x07, 0xfd, 0x55, 0xe0, 0x53, + 0x1f, 0x75, 0x23, 0x59, 0x5f, 0xca, 0xfa, 0x5c, 0x66, 0xec, 0xb0, 0x1d, 0xb3, 0x4b, 0x3b, 0xa0, + 0xfc, 0x97, 0x6b, 0x1b, 0xbb, 0xc9, 0x75, 0xdf, 0x5b, 0x38, 0x17, 0x42, 0xc0, 0x5d, 0x04, 0xd8, + 0xc5, 0x36, 0xc1, 0xf2, 0xab, 0x6c, 0x92, 0x32, 0xc7, 0x5b, 0xf8, 0x42, 0xf0, 0x7f, 0x45, 0x40, + 0x31, 0xa1, 0xd3, 0x20, 0xf4, 0x84, 0x70, 0x4f, 0x11, 0x12, 0x6a, 0xd3, 0x90, 0x28, 0xce, 0xae, + 0x70, 0x40, 0x1c, 0xdf, 0x93, 0x5f, 0x2e, 0x33, 0xff, 0x28, 0xc1, 0xd6, 0xa9, 0x43, 0xa8, 0xc5, + 0x37, 0x12, 0x0b, 0xff, 0x12, 0x62, 0x42, 0x51, 0x17, 0xaa, 0xae, 0xb3, 0x74, 0xa8, 0xae, 0xed, + 0x6b, 0xbd, 0xb2, 0xc5, 0x27, 0x68, 0x07, 0x6a, 0xfe, 0x62, 0x41, 0x30, 0xd5, 0x4b, 0xfb, 0x5a, + 0xaf, 0x69, 0x89, 0x19, 0xfa, 0x0a, 0xea, 0xc4, 0x0f, 0xe8, 0xf4, 0xfc, 0x5a, 0x2f, 0xef, 0x6b, + 0xbd, 0xf6, 0xe0, 0x83, 0x7e, 0x16, 0x4e, 0xfd, 0xc8, 0xd3, 0xc4, 0x0f, 0x68, 0x3f, 0xfa, 0x79, + 0x7e, 0x6d, 0xd5, 0x08, 0xfb, 0x46, 0x76, 0x17, 0x8e, 0x4b, 0x71, 0xa0, 0x57, 0xb8, 0x5d, 0x3e, + 0x43, 0x47, 0x00, 0xcc, 0xae, 0x1f, 0xcc, 0x71, 0xa0, 0x57, 0x99, 0xe9, 0x5e, 0x01, 0xd3, 0x2f, + 0x23, 0x7d, 0xab, 0x49, 0xe4, 0x10, 0x7d, 0x09, 0xeb, 0x1c, 0x92, 0xe9, 0xcc, 0x9f, 0x63, 0xa2, + 0xd7, 0xf6, 0xcb, 0xbd, 0xf6, 0x60, 0x8f, 0x9b, 0x92, 0xf0, 0x4f, 0x38, 0x68, 0x43, 0x7f, 0x8e, + 0xad, 0x16, 0x57, 0x8f, 0xc6, 0x04, 0x3d, 0x82, 0xa6, 0x67, 0x2f, 0x31, 0x59, 0xd9, 0x33, 0xac, + 0xd7, 0x59, 0x84, 0x37, 0x0b, 0xe6, 0x4f, 0xd0, 0x90, 0xce, 0xcd, 0x01, 0xd4, 0xf8, 0xd1, 0x50, + 0x0b, 0xea, 0x67, 0xe3, 0x6f, 0xc6, 0x2f, 0xbf, 0x1b, 0x77, 0xd6, 0x50, 0x03, 0x2a, 0xe3, 0xc3, + 0x6f, 0x47, 0x1d, 0x0d, 0x6d, 0xc2, 0xc6, 0xe9, 0xe1, 0xe4, 0xd5, 0xd4, 0x1a, 0x9d, 0x8e, 0x0e, + 0x27, 0xa3, 0x17, 0x9d, 0x92, 0xf9, 0x2e, 0x34, 0xe3, 0x98, 0x51, 0x1d, 0xca, 0x87, 0x93, 0x21, + 0xdf, 0xf2, 0x62, 0x34, 0x19, 0x76, 0x34, 0xf3, 0x77, 0x0d, 0xba, 0x2a, 0x45, 0x64, 0xe5, 0x7b, + 0x04, 0x47, 0x1c, 0xcd, 0xfc, 0xd0, 0x8b, 0x39, 0x62, 0x13, 0x84, 0xa0, 0xe2, 0xe1, 0xb7, 0x92, + 0x21, 0x36, 0x8e, 0x34, 0xa9, 0x4f, 0x6d, 0x97, 0xb1, 0x53, 0xb6, 0xf8, 0x04, 0x7d, 0x0a, 0x0d, + 0x71, 0x74, 0xa2, 0x57, 0xf6, 0xcb, 0xbd, 0xd6, 0x60, 0x5b, 0x05, 0x44, 0x78, 0xb4, 0x62, 0x35, + 0xf3, 0x08, 0x76, 0x8f, 0xb0, 0x8c, 0x84, 0xe3, 0x25, 0x33, 0x26, 0xf2, 0x6b, 0x2f, 0x31, 0x0b, + 0x26, 0xf2, 0x6b, 0x2f, 0x31, 0xd2, 0xa1, 0x2e, 0xd2, 0x8d, 0x85, 0x53, 0xb5, 0xe4, 0xd4, 0xa4, + 0xa0, 0xdf, 0x36, 0x24, 0xce, 0x95, 0x65, 0xe9, 0x43, 0xa8, 0x44, 0x37, 0x81, 0x99, 0x69, 0x0d, + 0x90, 0x1a, 0xe7, 0x89, 0xb7, 0xf0, 0x2d, 0x26, 0x57, 0xa9, 0x2a, 0xa7, 0xa9, 0x3a, 0x4e, 0x7a, + 0x1d, 0xfa, 0x1e, 0xc5, 0x1e, 0x7d, 0x58, 0xfc, 0xa7, 0xb0, 0x97, 0x61, 0x49, 0x1c, 0xe0, 0x00, + 0xea, 0x22, 0x34, 0x66, 0x2d, 0x17, 0x57, 0xa9, 0x65, 0xfe, 0x53, 0x82, 0xee, 0xd9, 0x6a, 0x6e, + 0x53, 0x2c, 0x45, 0x77, 0x04, 0xf5, 0x18, 0xaa, 0xac, 0xa2, 0x08, 0x2c, 0x36, 0xb9, 0x6d, 0x5e, + 0x76, 0x86, 0xd1, 0xaf, 0xc5, 0xe5, 0xe8, 0x29, 0xd4, 0xae, 0x6c, 0x37, 0xc4, 0x84, 0x01, 0x11, + 0xa3, 0x26, 0x34, 0x59, 0x39, 0xb2, 0x84, 0x06, 0xda, 0x85, 0xfa, 0x3c, 0xb8, 0x8e, 0xea, 0x09, + 0xbb, 0x82, 0x0d, 0xab, 0x36, 0x0f, 0xae, 0xad, 0xd0, 0x43, 0xef, 0xc3, 0xc6, 0xdc, 0x21, 0xf6, + 0xb9, 0x8b, 0xa7, 0x97, 0xbe, 0xff, 0x86, 0xb0, 0x5b, 0xd8, 0xb0, 0xd6, 0xc5, 0xe2, 0x71, 0xb4, + 0x86, 0x8c, 0x28, 0x93, 0x66, 0x01, 0xb6, 0x29, 0xd6, 0x6b, 0x4c, 0x1e, 0xcf, 0x23, 0x0c, 0xa9, + 0xb3, 0xc4, 0x7e, 0x48, 0xd9, 0xd5, 0x29, 0x5b, 0x72, 0x8a, 0xde, 0x83, 0xf5, 0x00, 0x13, 0x4c, + 0xa7, 0x22, 0xca, 0x06, 0xdb, 0xd9, 0x62, 0x6b, 0xaf, 0x79, 0x58, 0x08, 0x2a, 0xbf, 0xda, 0x0e, + 0xd5, 0x9b, 0x4c, 0xc4, 0xc6, 0x7c, 0x5b, 0x48, 0xb0, 0xdc, 0x06, 0x72, 0x5b, 0x48, 0xb0, 0xd8, + 0xd6, 0x85, 0xea, 0xc2, 0x0f, 0x66, 0x58, 0x6f, 0x31, 0x19, 0x9f, 0x44, 0x51, 0x92, 0xf0, 0x7c, + 0xec, 0x53, 0x4c, 0xf4, 0x75, 0x1e, 0xa5, 0x9c, 0x9b, 0xc7, 0xb0, 0x9d, 0x22, 0xe0, 0xa1, 0x5c, + 0xfe, 0xa5, 0xc1, 0x8e, 0xe5, 0xbb, 0xee, 0xb9, 0x3d, 0x7b, 0x53, 0x80, 0xcd, 0x04, 0xf0, 0xa5, + 0xbb, 0x81, 0x2f, 0x67, 0x00, 0x9f, 0x48, 0xd0, 0x8a, 0x92, 0xa0, 0x0a, 0x25, 0xd5, 0x7c, 0x4a, + 0x6a, 0x2a, 0x25, 0x12, 0xef, 0x7a, 0x02, 0xef, 0x18, 0xcc, 0x46, 0x02, 0x4c, 0xf3, 0x6b, 0xd8, + 0xbd, 0x75, 0xca, 0x87, 0x42, 0xf6, 0x77, 0x09, 0xb6, 0x4f, 0x3c, 0x42, 0x6d, 0xd7, 0x4d, 0x21, + 0x16, 0xe7, 0xba, 0x56, 0x38, 0xd7, 0x4b, 0xff, 0x25, 0xd7, 0xcb, 0x0a, 0xe4, 0x92, 0x9f, 0x4a, + 0x82, 0x9f, 0x42, 0xf9, 0xaf, 0x54, 0x9d, 0x5a, 0xaa, 0xea, 0xa0, 0x77, 0x00, 0x78, 0xc2, 0x32, + 0xe3, 0x1c, 0xda, 0x26, 0x5b, 0x19, 0x8b, 0x22, 0x23, 0xd9, 0x68, 0x64, 0xb3, 0x91, 0xcc, 0xfe, + 0x1e, 0x74, 0x64, 0x3c, 0xb3, 0x60, 0xce, 0x62, 0x12, 0x37, 0xa0, 0x2d, 0xd6, 0x87, 0xc1, 0x3c, + 0x8a, 0x4a, 0x49, 0xf7, 0x56, 0x2a, 0xdd, 0x4f, 0x60, 0x27, 0x0d, 0xf8, 0x43, 0xc9, 0xfb, 0x4d, + 0x83, 0xdd, 0x33, 0xcf, 0xc9, 0xa4, 0x2f, 0x2b, 0xe1, 0x6f, 0x01, 0x5a, 0xca, 0x00, 0xb4, 0x0b, + 0xd5, 0x55, 0x18, 0x5c, 0x60, 0x41, 0x10, 0x9f, 0x24, 0x91, 0xaa, 0x28, 0x48, 0x99, 0x53, 0xd0, + 0x6f, 0xc7, 0xf0, 0xc0, 0x13, 0x45, 0x51, 0xc7, 0x6f, 0x4d, 0x93, 0xbf, 0x2b, 0xe6, 0x16, 0x6c, + 0x1e, 0x61, 0xfa, 0x9a, 0x5f, 0x2e, 0x71, 0x3c, 0x73, 0x04, 0x28, 0xb9, 0x78, 0xe3, 0x4f, 0x2c, + 0xa9, 0xfe, 0x64, 0xe3, 0x25, 0xf5, 0xa5, 0x96, 0xf9, 0x05, 0xb3, 0x7d, 0xec, 0x10, 0xea, 0x07, + 0xd7, 0x77, 0x41, 0xd7, 0x81, 0xf2, 0xd2, 0x7e, 0x2b, 0x9e, 0xa2, 0x68, 0x68, 0x1e, 0xb1, 0x08, + 0xe2, 0xad, 0x22, 0x82, 0xe4, 0xc3, 0xae, 0x15, 0x7b, 0xd8, 0x7f, 0x00, 0xf4, 0x0a, 0xc7, 0x3d, + 0xc6, 0x3d, 0x6f, 0xa2, 0x24, 0xa1, 0xa4, 0xa6, 0xab, 0x0e, 0xf5, 0x99, 0x8b, 0x6d, 0x2f, 0x5c, + 0x09, 0xda, 0xe4, 0xd4, 0xfc, 0x11, 0xb6, 0x14, 0xeb, 0x22, 0xce, 0xe8, 0x3c, 0xe4, 0x42, 0x58, + 0x8f, 0x86, 0xe8, 0x73, 0xa8, 0xf1, 0xc6, 0x8b, 0xd9, 0x6e, 0x0f, 0x1e, 0xa9, 0x71, 0x33, 0x23, + 0xa1, 0x27, 0x3a, 0x35, 0x4b, 0xe8, 0x0e, 0xfe, 0x6c, 0x40, 0x5b, 0xb6, 0x12, 0xbc, 0x2d, 0x44, + 0x0e, 0xac, 0x27, 0x7b, 0x26, 0xf4, 0x24, 0xbf, 0x6b, 0x4c, 0xb5, 0xbe, 0xc6, 0xd3, 0x22, 0xaa, + 0xfc, 0x04, 0xe6, 0xda, 0x27, 0x1a, 0x22, 0xd0, 0x49, 0xb7, 0x32, 0xe8, 0x59, 0xb6, 0x8d, 0x9c, + 0xde, 0xc9, 0xe8, 0x17, 0x55, 0x97, 0x6e, 0xd1, 0x15, 0xcb, 0x19, 0xb5, 0xff, 0x40, 0xf7, 0x9a, + 0x51, 0x5b, 0x1e, 0xe3, 0xa0, 0xb0, 0x7e, 0xec, 0xf7, 0x67, 0xd8, 0x50, 0xde, 0x49, 0x94, 0x83, + 0x56, 0x56, 0x37, 0x63, 0x7c, 0x54, 0x48, 0x37, 0xf6, 0xb5, 0x84, 0xb6, 0x5a, 0xa4, 0x50, 0x8e, + 0x81, 0xcc, 0xb7, 0xc3, 0xf8, 0xb8, 0x98, 0x72, 0xec, 0x8e, 0x40, 0x27, 0x5d, 0x43, 0xf2, 0x78, + 0xcc, 0xa9, 0x77, 0x79, 0x3c, 0xe6, 0x95, 0x26, 0x73, 0x0d, 0xd9, 0x00, 0x37, 0x25, 0x04, 0x3d, + 0xce, 0x25, 0x44, 0xad, 0x3c, 0x46, 0xef, 0x7e, 0xc5, 0xd8, 0xc5, 0x0a, 0xfe, 0x97, 0x7a, 0xa9, + 0x51, 0x0e, 0x34, 0xd9, 0x6d, 0x8b, 0xf1, 0xac, 0xa0, 0x76, 0xea, 0x50, 0xa2, 0x2a, 0xdd, 0x71, + 0x28, 0xb5, 0xe4, 0xdd, 0x71, 0xa8, 0x54, 0x81, 0x33, 0xd7, 0x90, 0x03, 0x6d, 0x2b, 0xf4, 0x84, + 0xeb, 0xa8, 0x2c, 0xa0, 0x9c, 0xdd, 0xb7, 0xab, 0x9a, 0xf1, 0xa4, 0x80, 0xe6, 0xcd, 0xfd, 0x7e, + 0x0e, 0xdf, 0x37, 0xa4, 0xea, 0x79, 0x8d, 0xfd, 0x6b, 0xfe, 0xec, 0xdf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xbd, 0x2a, 0xa3, 0x1f, 0x23, 0x10, 0x00, 0x00, } diff --git a/pkg/tiller/release_install.go b/pkg/tiller/release_install.go index 0b8f4da5b37..d7781c0d975 100644 --- a/pkg/tiller/release_install.go +++ b/pkg/tiller/release_install.go @@ -84,7 +84,7 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re return nil, err } - hooks, manifestDoc, notesTxt, err := s.renderResources(req.Chart, valuesToRender, caps.APIVersions) + hooks, manifestDoc, notesTxt, err := s.renderResources(req.Chart, valuesToRender, req.SubNotes, caps.APIVersions) if err != nil { // Return a release with partial data so that client can show debugging // information. diff --git a/pkg/tiller/release_install_test.go b/pkg/tiller/release_install_test.go index 73976571eb2..1d1b08e9041 100644 --- a/pkg/tiller/release_install_test.go +++ b/pkg/tiller/release_install_test.go @@ -268,7 +268,7 @@ func TestInstallRelease_WrongTillerVersion(t *testing.T) { } } -func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) { +func TestInstallRelease_WithChartAndDependencyParentNotes(t *testing.T) { c := helm.NewContext() rs := rsFixture() @@ -291,6 +291,39 @@ func TestInstallRelease_WithChartAndDependencyNotes(t *testing.T) { t.Logf("rel: %v", rel) + if rel.Info.Status.Notes != notesText { + t.Fatalf("Expected '%s', got '%s'", notesText, rel.Info.Status.Notes) + } + + if rel.Info.Description != "Install complete" { + t.Errorf("unexpected description: %s", rel.Info.Description) + } +} + +func TestInstallRelease_WithChartAndDependencyAllNotes(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + + req := installRequest(withSubNotes(), + withChart( + withNotes(notesText), + withDependency(withNotes(notesText+" child")), + )) + res, err := rs.InstallRelease(c, req) + if err != nil { + t.Fatalf("Failed install: %s", err) + } + if res.Release.Name == "" { + t.Errorf("Expected release name.") + } + + rel, err := rs.env.Releases.Get(res.Release.Name, res.Release.Version) + if err != nil { + t.Errorf("Expected release for %s (%v).", res.Release.Name, rs.env.Releases) + } + + t.Logf("rel: %v", rel) + if !strings.Contains(rel.Info.Status.Notes, notesText) || !strings.Contains(rel.Info.Status.Notes, notesText+" child") { t.Fatalf("Expected '%s', got '%s'", notesText+"\n"+notesText+" child", rel.Info.Status.Notes) } diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index e223d9f3235..29379d374b7 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -20,6 +20,7 @@ import ( "bytes" "errors" "fmt" + "path" "regexp" "strings" @@ -259,7 +260,7 @@ func GetVersionSet(client discovery.ServerGroupsInterface) (chartutil.VersionSet return chartutil.NewVersionSet(versions...), nil } -func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values, vs chartutil.VersionSet) ([]*release.Hook, *bytes.Buffer, string, error) { +func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values, subNotes bool, vs chartutil.VersionSet) ([]*release.Hook, *bytes.Buffer, string, error) { // Guard to make sure Tiller is at the right version to handle this chart. sver := version.GetVersion() if ch.Metadata.TillerVersion != "" && @@ -291,14 +292,18 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values var notesBuffer bytes.Buffer for k, v := range files { if strings.HasSuffix(k, notesFileSuffix) { - // If buffer contains data, add newline before adding more - if notesBuffer.Len() > 0 { - notesBuffer.WriteString("\n") + if subNotes || (k == path.Join(ch.Metadata.Name, "templates", notesFileSuffix)) { + + // If buffer contains data, add newline before adding more + if notesBuffer.Len() > 0 { + notesBuffer.WriteString("\n") + } + notesBuffer.WriteString(v) } - notesBuffer.WriteString(v) delete(files, k) } } + notes := notesBuffer.String() // Sort hooks, manifests, and partials. Only hooks and manifests are returned, diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 96cb84a7551..78c16e67956 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -228,6 +228,12 @@ func withChart(chartOpts ...chartOption) installOption { } } +func withSubNotes() installOption { + return func(opts *installOptions) { + opts.SubNotes = true + } +} + func installRequest(opts ...installOption) *services.InstallReleaseRequest { reqOpts := &installOptions{ &services.InstallReleaseRequest{ diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index 6f5d3733122..c4e4820e7d7 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -113,7 +113,7 @@ func (s *ReleaseServer) prepareUpdate(req *services.UpdateReleaseRequest) (*rele return nil, nil, err } - hooks, manifestDoc, notesTxt, err := s.renderResources(req.Chart, valuesToRender, caps.APIVersions) + hooks, manifestDoc, notesTxt, err := s.renderResources(req.Chart, valuesToRender, req.SubNotes, caps.APIVersions) if err != nil { return nil, nil, err } diff --git a/pkg/urlutil/urlutil_test.go b/pkg/urlutil/urlutil_test.go index f0c82c0a929..b3a142392ec 100644 --- a/pkg/urlutil/urlutil_test.go +++ b/pkg/urlutil/urlutil_test.go @@ -65,8 +65,8 @@ func TestEqual(t *testing.T) { func TestExtractHostname(t *testing.T) { tests := map[string]string{ - "http://example.com": "example.com", - "https://example.com/foo": "example.com", + "http://example.com": "example.com", + "https://example.com/foo": "example.com", "https://example.com:31337/not/with/a/bang/but/a/whimper": "example.com", } for start, expect := range tests { From 66e79227b2ff666ba66f48db992fc1f9c1ff464c Mon Sep 17 00:00:00 2001 From: jgleonard Date: Thu, 1 Nov 2018 15:11:38 -0400 Subject: [PATCH 240/483] make docs Signed-off-by: jgleonard --- docs/helm/helm_install.md | 3 ++- docs/helm/helm_upgrade.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 05cdf1e4a41..5406126faa5 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -93,6 +93,7 @@ helm install [CHART] [flags] --no-crd-hook prevent CRD hooks from running, but run other hooks --no-hooks prevent hooks from running during install --password string chart repository password where to locate the requested chart + --render-subchart-notes render subchart notes along with the parent --replace re-use the given name, even if that name is already used. This is unsafe in production --repo string chart repository url where to locate the requested chart --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) @@ -128,4 +129,4 @@ helm install [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 1-Nov-2018 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index f18bcf6a718..df5bfe6ca9b 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -79,6 +79,7 @@ helm upgrade [RELEASE] [CHART] [flags] --no-hooks disable pre/post upgrade hooks --password string chart repository password where to locate the requested chart --recreate-pods performs pods restart for the resource if applicable + --render-subchart-notes render subchart notes along with parent --repo string chart repository url where to locate the requested chart --reset-values when upgrading, reset the values to the ones built into the chart --reuse-values when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored. @@ -115,4 +116,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 24-Aug-2018 +###### Auto generated by spf13/cobra on 1-Nov-2018 From 4a49abb81ef78a1e4c6c69fc2e29bd8b98d6ce40 Mon Sep 17 00:00:00 2001 From: Daniel M Barlow Date: Tue, 6 Nov 2018 17:51:14 +0100 Subject: [PATCH 241/483] Small typo fix (#4887) Signed-off-by: Daniel M Barlow --- docs/chart_template_guide/control_structures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 9ecd55142bd..511318731d9 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -269,7 +269,7 @@ It will produce an error because `Release.Name` is not inside of the restricted release: {{ .Release.Name }} ``` -After looking a `range`, we will take a look at template variables, which offer one solution to the scoping issue above. +After looking at `range`, we will take a look at template variables, which offers one solution to the scoping issue above. ## Looping with the `range` action From 6635bff38faab593ee2eb50a888e8d8d4c6c15d7 Mon Sep 17 00:00:00 2001 From: Sean Eagan Date: Tue, 6 Nov 2018 16:00:26 -0600 Subject: [PATCH 242/483] fix(engine): Fix template rendering thread safety issue (#4828) Remove the engine `currentTemplates` field which was shared state across threads and thus not thread safe, and instead just pass these reference templates as parameters down recursively. Closes #4819 Signed-off-by: Sean Eagan --- pkg/engine/engine.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index b6cffc56b85..9f212ba0902 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -38,8 +38,7 @@ type Engine struct { FuncMap template.FuncMap // If strict is enabled, template rendering will fail if a template references // a value that was not passed in. - Strict bool - CurrentTemplates map[string]renderable + Strict bool // In LintMode, some 'required' template values may be missing, so don't fail LintMode bool } @@ -122,7 +121,6 @@ func FuncMap() template.FuncMap { func (e *Engine) Render(chrt *chart.Chart, values chartutil.Values) (map[string]string, error) { // Render the charts tmap := allTemplates(chrt, values) - e.CurrentTemplates = tmap return e.render(tmap) } @@ -139,7 +137,7 @@ type renderable struct { // alterFuncMap takes the Engine's FuncMap and adds context-specific functions. // // The resulting FuncMap is only valid for the passed-in template. -func (e *Engine) alterFuncMap(t *template.Template) template.FuncMap { +func (e *Engine) alterFuncMap(t *template.Template, referenceTpls map[string]renderable) template.FuncMap { // Clone the func map because we are adding context-specific functions. var funcMap template.FuncMap = map[string]interface{}{} for k, v := range e.FuncMap { @@ -198,7 +196,7 @@ func (e *Engine) alterFuncMap(t *template.Template) template.FuncMap { templates[templateName.(string)] = r - result, err := e.render(templates) + result, err := e.renderWithReferences(templates, referenceTpls) if err != nil { return "", fmt.Errorf("Error during tpl function execution for %q: %s", tpl, err.Error()) } @@ -210,6 +208,12 @@ func (e *Engine) alterFuncMap(t *template.Template) template.FuncMap { // render takes a map of templates/values and renders them. func (e *Engine) render(tpls map[string]renderable) (rendered map[string]string, err error) { + return e.renderWithReferences(tpls, tpls) +} + +// renderWithReferences takes a map of templates/values to render, and a map of +// templates which can be referenced within them. +func (e *Engine) renderWithReferences(tpls map[string]renderable, referenceTpls map[string]renderable) (rendered map[string]string, err error) { // Basically, what we do here is start with an empty parent template and then // build up a list of templates -- one for each file. Once all of the templates // have been parsed, we loop through again and execute every template. @@ -231,7 +235,7 @@ func (e *Engine) render(tpls map[string]renderable) (rendered map[string]string, t.Option("missingkey=zero") } - funcMap := e.alterFuncMap(t) + funcMap := e.alterFuncMap(t, referenceTpls) // We want to parse the templates in a predictable order. The order favors // higher-level (in file system) templates over deeply nested templates. @@ -248,9 +252,9 @@ func (e *Engine) render(tpls map[string]renderable) (rendered map[string]string, files = append(files, fname) } - // Adding the engine's currentTemplates to the template context + // Adding the reference templates to the template context // so they can be referenced in the tpl function - for fname, r := range e.CurrentTemplates { + for fname, r := range referenceTpls { if t.Lookup(fname) == nil { t = t.New(fname).Funcs(funcMap) if _, err := t.Parse(r.tpl); err != nil { From f7377100ff15e613ee6cf9eeb6b609338862edf4 Mon Sep 17 00:00:00 2001 From: Dr Nic Williams Date: Wed, 7 Nov 2018 09:31:23 +1000 Subject: [PATCH 243/483] Full path to mysubchart file (#4882) Signed-off-by: Dr Nic Williams --- docs/chart_template_guide/subcharts_and_globals.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/chart_template_guide/subcharts_and_globals.md b/docs/chart_template_guide/subcharts_and_globals.md index a288556d82d..1954df39acf 100644 --- a/docs/chart_template_guide/subcharts_and_globals.md +++ b/docs/chart_template_guide/subcharts_and_globals.md @@ -124,7 +124,7 @@ global: salad: caesar ``` -Because of the way globals work, both `mychart/templates/configmap.yaml` and `mysubchart/templates/configmap.yaml` should be able to access that value as `{{ .Values.global.salad}}`. +Because of the way globals work, both `mychart/templates/configmap.yaml` and `mychart/charts/mysubchart/templates/configmap.yaml` should be able to access that value as `{{ .Values.global.salad}}`. `mychart/templates/configmap.yaml`: @@ -137,7 +137,7 @@ data: salad: {{ .Values.global.salad }} ``` -`mysubchart/templates/configmap.yaml`: +`mychart/charts/mysubchart/templates/configmap.yaml`: ```yaml apiVersion: v1 From 833ee712b254c618fe7afc2af20fc9e8094524a1 Mon Sep 17 00:00:00 2001 From: Mike Garuccio Date: Tue, 6 Nov 2018 18:32:38 -0500 Subject: [PATCH 244/483] fix snap install command (#4877) Added `--classic` to the snap install command. Signed-off-by: Mike Garuccio --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index e0e3db56d00..b47aea6f11d 100755 --- a/docs/install.md +++ b/docs/install.md @@ -30,7 +30,7 @@ The Snap package for Helm is maintained by [Snapcrafters](https://github.com/snapcrafters/helm). ``` -$ sudo snap install helm +$ sudo snap install helm --classic ``` ### From Homebrew (macOS) From ace30b8777b8cc16b88e485f9df9497969da5dcc Mon Sep 17 00:00:00 2001 From: Timothy Hobbs Date: Wed, 7 Nov 2018 00:50:38 +0100 Subject: [PATCH 245/483] Document the _proto directory (#4756) Signed-off-by: Timothy Hobbs --- _proto/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 _proto/README.md diff --git a/_proto/README.md b/_proto/README.md new file mode 100644 index 00000000000..fcc2c52f10d --- /dev/null +++ b/_proto/README.md @@ -0,0 +1,10 @@ +Protobuf3 type declarations for the Helm API +-------------------------------------------- + +Packages + + - `hapi.chart` Complete serialization of Heml charts + - `hapi.release` Information about installed charts (Releases) such as metadata about when they were installed, their status, and how they were configured. + - `hapi.services.rudder` Definition for the ReleaseModuleService used by Tiller to manipulate releases on a given node + - `hapi.services.tiller` Definition of the ReleaseService provoded by Tiller and used by Helm clients to manipulate releases cluster wide. + - `hapi.version` Version meta-data used by tiller to express it's version From 40ef9c0f70d3ffc5f2b0ff5b2f7bdef5e153d46c Mon Sep 17 00:00:00 2001 From: Rimas Mocevicius Date: Wed, 7 Nov 2018 00:04:18 +0000 Subject: [PATCH 246/483] make get script sudo optional (#4677) Signed-off-by: rimas --- scripts/get | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get b/scripts/get index 40fb2f69f36..bf13d25bc79 100755 --- a/scripts/get +++ b/scripts/get @@ -19,8 +19,8 @@ PROJECT_NAME="helm" TILLER_NAME="tiller" -USE_SUDO="true" +: ${USE_SUDO:="true"} : ${HELM_INSTALL_DIR:="/usr/local/bin"} # initArch discovers the architecture for this system. From 1801fa0074a0207f4d5724667858b53d52c486f8 Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Tue, 6 Nov 2018 19:08:24 -0500 Subject: [PATCH 247/483] fix(helm): fix incorrect yaml output format of get hooks command (#4684) Signed-off-by: Arash Deshmeh --- cmd/helm/get_hooks.go | 2 +- cmd/helm/get_hooks_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/helm/get_hooks.go b/cmd/helm/get_hooks.go index 310b2ec73ea..2706f381cad 100644 --- a/cmd/helm/get_hooks.go +++ b/cmd/helm/get_hooks.go @@ -75,7 +75,7 @@ func (g *getHooksCmd) run() error { } for _, hook := range res.Release.Hooks { - fmt.Fprintf(g.out, "---\n# %s\n%s", hook.Name, hook.Manifest) + fmt.Fprintf(g.out, "---\n# %s\n%s\n", hook.Name, hook.Manifest) } return nil } diff --git a/cmd/helm/get_hooks_test.go b/cmd/helm/get_hooks_test.go index fe9133feb21..94aace4dfab 100644 --- a/cmd/helm/get_hooks_test.go +++ b/cmd/helm/get_hooks_test.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "fmt" "io" "testing" @@ -31,7 +32,7 @@ func TestGetHooks(t *testing.T) { { name: "get hooks with release", args: []string{"aeneas"}, - expected: helm.MockHookTemplate, + expected: fmt.Sprintf("---\n# %s\n%s\n", "pre-install-hook", helm.MockHookTemplate), resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"}), rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"})}, }, From d41ca72e425c529896632e3cf4b98e2972e3dbd2 Mon Sep 17 00:00:00 2001 From: liaoj Date: Wed, 7 Nov 2018 12:50:05 +0800 Subject: [PATCH 248/483] fix:#4873, check release name (#4883) for command helm template and helm install when cusotmer input invalid release name, return a error Signed-off-by: jliao --- cmd/helm/install.go | 5 +++++ cmd/helm/install_test.go | 32 +++++++++++++++++++++++++++++--- cmd/helm/template.go | 7 ++++++- cmd/helm/template_test.go | 31 +++++++++++++++++++++++++++++-- docs/helm/helm_template.md | 2 +- 5 files changed, 70 insertions(+), 7 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index c5c6b9a49c2..05321f1f709 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -32,6 +32,7 @@ import ( "github.com/ghodss/yaml" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/util/validation" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/downloader" "k8s.io/helm/pkg/getter" @@ -248,6 +249,10 @@ func (i *installCmd) run() error { fmt.Printf("FINAL NAME: %s\n", i.name) } + if msgs := validation.IsDNS1123Label(i.name); i.name != "" && len(msgs) > 0 { + return fmt.Errorf("release name %s is not a valid DNS label: %s", i.name, strings.Join(msgs, ";")) + } + // Check chart requirements to make sure all dependencies are present in /charts chartRequested, err := chartutil.Load(i.chartPath) if err != nil { diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index 48d9fc8c1cc..168c53fed3f 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -111,9 +111,9 @@ func TestInstall(t *testing.T) { { name: "install with name-template", args: []string{"testdata/testcharts/alpine"}, - flags: []string{"--name-template", "{{upper \"foobar\"}}"}, - expected: "FOOBAR", - resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "FOOBAR"}), + flags: []string{"--name-template", "{{lower \"FOOBAR\"}}"}, + expected: "foobar", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "foobar"}), }, { name: "install with custom description", @@ -152,6 +152,32 @@ func TestInstall(t *testing.T) { args: []string{"testdata/testcharts/chart-bad-requirements"}, err: true, }, + // Install, using a bad release name + { + name: "install chart with release name using capitals", + args: []string{"testdata/testcharts/alpine"}, + flags: []string{"--name", "FOO"}, + err: true, + }, + { + name: "install chart with release name using periods", + args: []string{"testdata/testcharts/alpine"}, + flags: []string{"--name", "foo.bar"}, + err: true, + }, + { + name: "install chart with release name using underscores", + args: []string{"testdata/testcharts/alpine"}, + flags: []string{"--name", "foo_bar"}, + err: true, + }, + // Install, using a bad name-template + { + name: "install with name-template", + args: []string{"testdata/testcharts/alpine"}, + flags: []string{"--name-template", "{{UPPER \"foobar\"}}"}, + err: true, + }, } runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { diff --git a/cmd/helm/template.go b/cmd/helm/template.go index 63609c18c26..d776f298973 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -29,6 +29,7 @@ import ( "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/util/validation" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/manifest" "k8s.io/helm/pkg/proto/hapi/chart" @@ -92,7 +93,7 @@ func newTemplateCmd(out io.Writer) *cobra.Command { f := cmd.Flags() f.BoolVar(&t.showNotes, "notes", false, "show the computed NOTES.txt file as well") - f.StringVarP(&t.releaseName, "name", "n", "RELEASE-NAME", "release name") + f.StringVarP(&t.releaseName, "name", "n", "release-name", "release name") f.BoolVar(&t.releaseIsUpgrade, "is-upgrade", false, "set .Release.IsUpgrade instead of .Release.IsInstall") f.StringArrayVarP(&t.renderFiles, "execute", "x", []string{}, "only execute the given templates") f.VarP(&t.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") @@ -146,6 +147,10 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } } + if msgs := validation.IsDNS1123Label(t.releaseName); t.releaseName != "" && len(msgs) > 0 { + return fmt.Errorf("release name %s is not a valid DNS label: %s", t.releaseName, strings.Join(msgs, ";")) + } + // Check chart requirements to make sure all dependencies are present in /charts c, err := chartutil.Load(t.chartPath) if err != nil { diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 64924c2f206..ec989ea67e3 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -107,6 +107,27 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/templates/service.yaml", expectValue: "release-name: \"test\"", }, + { + name: "check_invalid_name_uppercase", + desc: "verify the release name using capitals is invalid", + args: []string{subchart1ChartPath, "--name", "FOO"}, + expectKey: "subchart1/templates/service.yaml", + expectError: "is not a valid DNS label", + }, + { + name: "check_invalid_name_uppercase", + desc: "verify the release name using periods is invalid", + args: []string{subchart1ChartPath, "--name", "foo.bar"}, + expectKey: "subchart1/templates/service.yaml", + expectError: "is not a valid DNS label", + }, + { + name: "check_invalid_name_uppercase", + desc: "verify the release name using underscores is invalid", + args: []string{subchart1ChartPath, "--name", "foo_bar"}, + expectKey: "subchart1/templates/service.yaml", + expectError: "is not a valid DNS label", + }, { name: "check_release_is_install", desc: "verify --is-upgrade toggles .Release.IsInstall", @@ -135,12 +156,18 @@ func TestTemplateCmd(t *testing.T) { expectKey: "subchart1/templates/service.yaml", expectValue: "name: apache", }, + { + name: "check_invalid_name_template", + desc: "verify the relase name generate by template is invalid", + args: []string{subchart1ChartPath, "--name-template", "foobar-{{ b64enc \"abc\" }}-baz"}, + expectError: "is not a valid DNS label", + }, { name: "check_name_template", desc: "verify --name-template result exists", - args: []string{subchart1ChartPath, "--name-template", "foobar-{{ b64enc \"abc\" }}-baz"}, + args: []string{subchart1ChartPath, "--name-template", "foobar-{{ lower \"ABC\" }}-baz"}, expectKey: "subchart1/templates/service.yaml", - expectValue: "release-name: \"foobar-YWJj-baz\"", + expectValue: "release-name: \"foobar-abc-baz\"", }, { name: "check_kube_version", diff --git a/docs/helm/helm_template.md b/docs/helm/helm_template.md index d7770fb7f59..805556096d2 100644 --- a/docs/helm/helm_template.md +++ b/docs/helm/helm_template.md @@ -28,7 +28,7 @@ helm template [flags] CHART -h, --help help for template --is-upgrade set .Release.IsUpgrade instead of .Release.IsInstall --kube-version string kubernetes version used as Capabilities.KubeVersion.Major/Minor (default "1.9") - -n, --name string release name (default "RELEASE-NAME") + -n, --name string release name (default "release-name") --name-template string specify template used to name the release --namespace string namespace to install the release into --notes show the computed NOTES.txt file as well From eb96576b8d20065efaa28fafe12468fbb12b7b9c Mon Sep 17 00:00:00 2001 From: Erik Sundell Date: Wed, 7 Nov 2018 06:03:44 +0100 Subject: [PATCH 249/483] Reform indentation practices using nindent (#4562) The essence of this commit is to help people get started with a better indentation practice than this: ```yaml spec: labels: {{ toYaml .Values.labels | indent 4 }} ``` The previous indentation practice is harder to read. Instead this commit introduces an indentation practice using `nindent` like this: ```yaml spec: labels: {{- toYaml .Values.labels | nindent 4 }} ``` Signed-off-by: Erik Sundell --- docs/examples/nginx/templates/deployment.yaml | 34 ++++++++++--------- docs/examples/nginx/templates/service.yaml | 22 ++++++------ pkg/chartutil/create.go | 18 +++++----- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml index 08850935a7b..5bb30f9af3d 100644 --- a/docs/examples/nginx/templates/deployment.yaml +++ b/docs/examples/nginx/templates/deployment.yaml @@ -6,12 +6,13 @@ metadata: # multiple times into the same namespace. name: {{ template "nginx.fullname" . }} labels: - # The "app.kubernetes.io/managed-by" label is used to track which tool deployed a given chart. - # It is useful for admins who want to see what releases a particular tool - # is responsible for. + # The "app.kubernetes.io/managed-by" label is used to track which tool + # deployed a given chart. It is useful for admins who want to see what + # releases a particular tool is responsible for. app.kubernetes.io/managed-by: {{ .Release.Service }} - # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the - # Kubernetes resources that were created as part of that release. + # The "app.kubernetes.io/instance" convention makes it easy to tie a release + # to all of the Kubernetes resources that were created as part of that + # release. app.kubernetes.io/instance: {{ .Release.Name }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} @@ -20,11 +21,11 @@ spec: replicas: {{ .Values.replicaCount }} template: metadata: -{{- if .Values.podAnnotations }} + {{- if .Values.podAnnotations }} # Allows custom annotations to be specified annotations: -{{ toYaml .Values.podAnnotations | indent 8 }} -{{- end }} + {{- toYaml .Values.podAnnotations | nindent 8 }} + {{- end }} labels: app.kubernetes.io/name: {{ template "nginx.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} @@ -42,15 +43,16 @@ spec: - mountPath: /usr/share/nginx/html name: wwwdata-volume resources: -# Allow chart users to specify resources. Usually, no default should be set, so this is left to be a conscious -# choice to the chart users and avoids that charts don't run out of the box on, e. g., Minikube when high resource -# requests are specified by default. -{{ toYaml .Values.resources | indent 12 }} - {{- if .Values.nodeSelector }} + # Allow chart users to specify resources. Usually, no default should + # be set, so this is left to be a conscious choice to the chart + # users and avoids that charts don't run out of the box on, e. g., + # Minikube when high resource requests are specified by default. + {{- toYaml .Values.resources | nindent 12 }} + {{- if .Values.nodeSelector }} nodeSelector: - # Node selectors can be important on mixed Windows/Linux clusters. -{{ toYaml .Values.nodeSelector | indent 8 }} - {{- end }} + # Node selectors can be important on mixed Windows/Linux clusters. + {{- toYaml .Values.nodeSelector | nindent 8 }} + {{- end }} volumes: - name: wwwdata-volume configMap: diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml index 03f7aa2c6fd..a12cb0982d4 100644 --- a/docs/examples/nginx/templates/service.yaml +++ b/docs/examples/nginx/templates/service.yaml @@ -1,10 +1,10 @@ apiVersion: v1 kind: Service metadata: -{{- if .Values.service.annotations }} + {{- if .Values.service.annotations }} annotations: -{{ toYaml .Values.service.annotations | indent 4 }} -{{- end }} + {{- toYaml .Values.service.annotations | nindent 4 }} + {{- end }} labels: app.kubernetes.io/name: {{ template "nginx.name" . }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} @@ -15,17 +15,17 @@ spec: # Provides options for the service so chart users have the full choice type: "{{ .Values.service.type }}" clusterIP: "{{ .Values.service.clusterIP }}" -{{- if .Values.service.externalIPs }} + {{- if .Values.service.externalIPs }} externalIPs: -{{ toYaml .Values.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.service.loadBalancerIP }} + {{- toYaml .Values.service.externalIPs | nindent 4 }} + {{- end }} + {{- if .Values.service.loadBalancerIP }} loadBalancerIP: "{{ .Values.service.loadBalancerIP }}" -{{- end }} -{{- if .Values.service.loadBalancerSourceRanges }} + {{- end }} + {{- if .Values.service.loadBalancerSourceRanges }} loadBalancerSourceRanges: -{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} -{{- end }} + {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} ports: - name: http port: {{ .Values.service.port }} diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 875083f7e9c..9063ed12a91 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -138,10 +138,10 @@ metadata: helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- with .Values.ingress.annotations }} + {{- with .Values.ingress.annotations }} annotations: -{{ toYaml . | indent 4 }} -{{- end }} + {{- toYaml . | nindent 4 }} + {{- end }} spec: {{- if .Values.ingress.tls }} tls: @@ -206,18 +206,18 @@ spec: path: / port: http resources: -{{ toYaml .Values.resources | indent 12 }} - {{- with .Values.nodeSelector }} + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} + {{- toYaml . | nindent 8 }} + {{- end }} {{- with .Values.affinity }} affinity: -{{ toYaml . | indent 8 }} + {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: -{{ toYaml . | indent 8 }} + {{- toYaml . | nindent 8 }} {{- end }} ` From 57d1c1fd29be7f6fc189e34be461919654737700 Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Wed, 7 Nov 2018 00:08:18 -0500 Subject: [PATCH 250/483] include the name of the missing object in release uninstall error (#4635) * fix(tiller) added mock kube client to return failure on delete Signed-off-by: Arash Deshmeh * fix(tiller) added object's name to delete release error message Signed-off-by: Arash Deshmeh --- pkg/tiller/release_modules.go | 7 +++++-- pkg/tiller/release_server_test.go | 14 ++++++++++++++ pkg/tiller/release_uninstall_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 9a8c66e96c4..85995480cc5 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -18,7 +18,6 @@ package tiller import ( "bytes" - "errors" "fmt" "log" "strings" @@ -174,7 +173,11 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env log.Printf("uninstall: Failed deletion of %q: %s", rel.Name, err) if err == kube.ErrNoObjectsVisited { // Rewrite the message from "no objects visited" - err = errors.New("object not found, skipping delete") + obj := "" + if file.Head != nil && file.Head.Metadata != nil { + obj = "[" + file.Head.Kind + "] " + file.Head.Metadata.Name + } + err = fmt.Errorf("release %q: object %q not found, skipping delete", rel.Name, obj) } errs = append(errs, err) } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 311f55b306e..d94ea2eebd5 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -498,6 +498,20 @@ func (h *hookFailingKubeClient) WatchUntilReady(ns string, r io.Reader, timeout return errors.New("Failed watch") } +func newDeleteFailingKubeClient() *deleteFailingKubeClient { + return &deleteFailingKubeClient{ + PrintingKubeClient: environment.PrintingKubeClient{Out: ioutil.Discard}, + } +} + +type deleteFailingKubeClient struct { + environment.PrintingKubeClient +} + +func (d *deleteFailingKubeClient) Delete(ns string, r io.Reader) error { + return kube.ErrNoObjectsVisited +} + type mockListServer struct { val *services.ListReleasesResponse } diff --git a/pkg/tiller/release_uninstall_test.go b/pkg/tiller/release_uninstall_test.go index d33e9c2a61a..cb59b6bf57c 100644 --- a/pkg/tiller/release_uninstall_test.go +++ b/pkg/tiller/release_uninstall_test.go @@ -197,3 +197,31 @@ func TestUninstallReleaseCustomDescription(t *testing.T) { t.Errorf("Expected description to be %q, got %q", customDescription, res.Release.Info.Description) } } + +func TestUninstallReleaseObjectNotFoundError(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + manifest := `kind: ConfigMap +metadata: + name: configmap-foo +data: + name: value +` + + rel.Manifest = manifest + rs.env.Releases.Create(rel) + rs.env.KubeClient = newDeleteFailingKubeClient() + + req := &services.UninstallReleaseRequest{ + Name: "angry-panda", + } + + _, err := rs.UninstallRelease(c, req) + if err == nil { + t.Fatalf("Expected failure to delete") + } + if !strings.Contains(err.Error(), "configmap-foo") { + t.Errorf("Expected delete error message to contain object name, got:" + err.Error()) + } +} From c911f6a85d70091c23e15eed46e484db1da7ac4a Mon Sep 17 00:00:00 2001 From: Maor Friedman Date: Wed, 7 Nov 2018 10:29:07 +0200 Subject: [PATCH 251/483] related docs - remove import, export, add backup and plugin-utils instead (#4867) * remove import, export, add backup instead Signed-off-by: Maor * add helm plugin utility functions Signed-off-by: Maor * move helm-plugin-utils into helm plugins section Signed-off-by: Maor --- docs/related.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/related.md b/docs/related.md index 11ecbf67277..520616e55d7 100644 --- a/docs/related.md +++ b/docs/related.md @@ -29,6 +29,7 @@ or [pull request](https://github.com/helm/helm/pulls). ## Helm Plugins - [App Registry](https://github.com/app-registry/helm-plugin) - Plugin to manage charts via the [App Registry specification](https://github.com/app-registry/spec) +- [helm-backup](https://github.com/maorfr/helm-backup) - Plugin which performs backup/restore of releases in a namespace to/from a file - [Helm Diff](https://github.com/databus23/helm-diff) - Preview `helm upgrade` as a coloured diff - [Helm Value Store](https://github.com/skuid/helm-value-store) - Plugin for working with Helm deployment values - [Technosophos's Helm Plugins](https://github.com/technosophos/helm-plugins) - Plugins for GitHub, Keybase, and GPG @@ -36,11 +37,9 @@ or [pull request](https://github.com/helm/helm/pulls). - [helm-cos](https://github.com/imroc/helm-cos) - Plugin to manage repositories on Tencent Cloud Object Storage - [helm-edit](https://github.com/mstrzele/helm-edit) - Plugin for editing release's values - [helm-env](https://github.com/adamreese/helm-env) - Plugin to show current environment -- [helm-export](https://github.com/maorfr/helm-export) - Plugin to export releases from namespace to a file (disaster recovery) - [helm-gcs](https://github.com/nouney/helm-gcs) - Plugin to manage repositories on Google Cloud Storage - [helm-github](https://github.com/sagansystems/helm-github) - Plugin to install Helm Charts from Github repositories - [helm-hashtag](https://github.com/balboah/helm-hashtag) - Plugin for tracking docker tag hash digests as values -- [helm-import](https://github.com/maorfr/helm-import) - Plugin for importing releases from (exported) file to a namespace (disaster recovery) - [helm-inject](https://github.com/maorfr/helm-inject) - Plugin for injecting additional configurations during release upgrade - [helm-k8comp](https://github.com/cststack/k8comp) - Plugin to create Helm Charts from hiera using k8comp - [helm-last](https://github.com/adamreese/helm-last) - Plugin to show the latest release @@ -48,7 +47,8 @@ or [pull request](https://github.com/helm/helm/pulls). - [helm-logs](https://github.com/maorfr/helm-logs) - Plugin to view changed releases over time - [helm-monitor](https://github.com/ContainerSolutions/helm-monitor) - Plugin to monitor a release and rollback based on Prometheus/ElasticSearch query - [helm-nuke](https://github.com/adamreese/helm-nuke) - Plugin to destroy all releases -- [helm-restore](https://github.com/maorfr/helm-restore) - Plugin to restore the last deployed release to its original state +- [helm-plugin-utils](https://github.com/maorfr/helm-plugin-utils) - Utility functions to be used within Helm plugins +- [helm-restore](https://github.com/maorfr/helm-restore) - Plugin to restore a deployed release to its original state - [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely - [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods - [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side From 00109db20a2a9eacfc3a9d52720db22cc8853536 Mon Sep 17 00:00:00 2001 From: Ryan Dawson Date: Wed, 7 Nov 2018 15:11:44 +0000 Subject: [PATCH 252/483] note on prefixing of resource names with release name (#4633) * note on naming of resources Signed-off-by: Ryan Dawson * put whitespace back in Signed-off-by: Ryan Dawson * put whitespace back Signed-off-by: Ryan Dawson * put whitespace back Signed-off-by: Ryan Dawson * clarify template fullname Signed-off-by: Ryan Dawson * fix formatting problem by escaping underscore Signed-off-by: ryandawsonuk * no need to change whitespace elsewhere in doc Signed-off-by: ryandawsonuk --- docs/chart_best_practices/templates.md | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/chart_best_practices/templates.md b/docs/chart_best_practices/templates.md index 7b21c5feac5..a3689a7dc34 100644 --- a/docs/chart_best_practices/templates.md +++ b/docs/chart_best_practices/templates.md @@ -132,6 +132,43 @@ metadata: ``` +## Resource Naming in Templates + +Hard-coding the `name:` into a resource is usually considered to be bad practice. +Names should be unique to a release. So we might want to generate a name field +by inserting the release name - for example: + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-myservice +``` + +Or if there is only one resource of this kind then we could use .Release.Name or the template fullname function defined in \_helpers.tpl (which uses release name): + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: {{ template "fullname" . }} +``` + +However, there may be cases where it is known that there won't be naming conflicts from a fixed name. +In these cases a fixed name might make it easier for an application to find a resource such as a Service. +If the option for fixed names is needed then one way to manage this might be to make the setting of the name explicit by using a service.name value from the values.yaml if provided: + +```yaml +apiVersion: v1 +kind: Service +metadata: + {{- if .Values.service.name }} + name: {{ .Values.service.name }} + {{- else }} + name: {{ template "fullname" . }} + {{- end }} +``` + ## Comments (YAML Comments vs. Template Comments) Both YAML and Helm Templates have comment markers. From 9dce1ac88b185bbe9028b7c1b3b35471e7a80e3a Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 7 Nov 2018 07:26:19 -0800 Subject: [PATCH 253/483] s,kubernetes/charts,helm/charts,g (#4889) Signed-off-by: Matthew Fisher --- docs/chart_repository.md | 6 +- docs/chart_template_guide/builtin_objects.md | 2 +- docs/chart_template_guide/wrapping_up.md | 2 +- docs/charts.md | 58 +++++++------- docs/charts_tips_and_tricks.md | 8 +- docs/provenance.md | 6 +- docs/release_checklist.md | 2 +- docs/using_helm.md | 18 ++--- .../cache/testing-basicauth-index.yaml | 2 +- .../repository/cache/testing-https-index.yaml | 2 +- .../repository/cache/testing-index.yaml | 2 +- .../cache/testing-relative-index.yaml | 4 +- ...testing-relative-trailing-slash-index.yaml | 4 +- .../repository/cache/stable-index.yaml | 76 +++++++++---------- 14 files changed, 96 insertions(+), 96 deletions(-) diff --git a/docs/chart_repository.md b/docs/chart_repository.md index 91ae3a3c4ab..5291f65e401 100644 --- a/docs/chart_repository.md +++ b/docs/chart_repository.md @@ -5,7 +5,7 @@ high level, a chart repository is a location where packaged charts can be stored and shared. The official chart repository is maintained by the -[Kubernetes Charts](https://github.com/kubernetes/charts), and we welcome +[Helm Charts](https://github.com/helm/charts), and we welcome participation. But Helm also makes it easy to create and run your own chart repository. This guide explains how to do so. @@ -99,7 +99,7 @@ entries: home: https://k8s.io/helm name: nginx sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://technosophos.github.io/tscharts/nginx-1.1.0.tgz version: 1.1.0 @@ -143,7 +143,7 @@ Congratulations, now you have an empty GCS bucket ready to serve charts! You may upload your chart repository using the Google Cloud Storage command line tool, or using the GCS web UI. This is the technique the official Kubernetes Charts repository hosts its charts, so you may want to take a -[peek at that project](https://github.com/kubernetes/charts) if you get stuck. +[peek at that project](https://github.com/helm/charts) if you get stuck. **Note:** A public GCS bucket can be accessed via simple HTTPS at this address `https://bucket-name.storage.googleapis.com/`. diff --git a/docs/chart_template_guide/builtin_objects.md b/docs/chart_template_guide/builtin_objects.md index 2108940ecca..f7b2857bc71 100644 --- a/docs/chart_template_guide/builtin_objects.md +++ b/docs/chart_template_guide/builtin_objects.md @@ -31,5 +31,5 @@ In the previous section, we use `{{.Release.Name}}` to insert the name of a rele The values are available to any top-level template. As we will see later, this does not necessarily mean that they will be available _everywhere_. -The built-in values always begin with a capital letter. This is in keeping with Go's naming convention. When you create your own names, you are free to use a convention that suits your team. Some teams, like the [Kubernetes Charts](https://github.com/kubernetes/charts) team, choose to use only initial lower case letters in order to distinguish local names from those built-in. In this guide, we follow that convention. +The built-in values always begin with a capital letter. This is in keeping with Go's naming convention. When you create your own names, you are free to use a convention that suits your team. Some teams, like the [Helm Charts](https://github.com/helm/charts) team, choose to use only initial lower case letters in order to distinguish local names from those built-in. In this guide, we follow that convention. diff --git a/docs/chart_template_guide/wrapping_up.md b/docs/chart_template_guide/wrapping_up.md index 6a96632bd62..ea5dc1183a3 100755 --- a/docs/chart_template_guide/wrapping_up.md +++ b/docs/chart_template_guide/wrapping_up.md @@ -4,7 +4,7 @@ This guide is intended to give you, the chart developer, a strong understanding But there are many things this guide has not covered when it comes to the practical day-to-day development of charts. Here are some useful pointers to other documentation that will help you as you create new charts: -- The [Kubernetes Charts project](https://github.com/kubernetes/charts) is an indispensable source of charts. That project is also sets the standard for best practices in chart development. +- The [Helm Charts project](https://github.com/helm/charts) is an indispensable source of charts. That project is also sets the standard for best practices in chart development. - The Kubernetes [User's Guide](http://kubernetes.io/docs/user-guide/) provides detailed examples of the various resource kinds that you can use, from ConfigMaps and Secrets to DaemonSets and Deployments. - The Helm [Charts Guide](../charts.md) explains the workflow of using charts. - The Helm [Chart Hooks Guide](../charts_hooks.md) explains how to create lifecycle hooks. diff --git a/docs/charts.md b/docs/charts.md index 669d90164c2..2f760535024 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -114,7 +114,7 @@ to mark a chart as deprecated. If the **latest** version of a chart in the repository is marked as deprecated, then the chart as a whole is considered to be deprecated. The chart name can later be reused by publishing a newer version that is not marked as deprecated. The workflow for deprecating charts, as -followed by the [kubernetes/charts](https://github.com/kubernetes/charts) +followed by the [helm/charts](https://github.com/helm/charts) project is: - Update chart's `Chart.yaml` to mark the chart as deprecated, bumping the version @@ -142,9 +142,9 @@ for greater detail. ## Chart Dependencies -In Helm, one chart may depend on any number of other charts. +In Helm, one chart may depend on any number of other charts. These dependencies can be dynamically linked through the `requirements.yaml` -file or brought in to the `charts/` directory and managed manually. +file or brought in to the `charts/` directory and managed manually. Although manually managing your dependencies has a few advantages some teams need, the preferred method of declaring dependencies is by using a @@ -291,11 +291,11 @@ tags: In the above example all charts with the tag `front-end` would be disabled but since the `subchart1.enabled` path evaluates to 'true' in the parent's values, the condition will override the -`front-end` tag and `subchart1` will be enabled. +`front-end` tag and `subchart1` will be enabled. Since `subchart2` is tagged with `back-end` and that tag evaluates to `true`, `subchart2` will be enabled. Also notes that although `subchart2` has a condition specified in `requirements.yaml`, there -is no corresponding path and value in the parent's values so that condition has no effect. +is no corresponding path and value in the parent's values so that condition has no effect. ##### Using the CLI with Tags and Conditions @@ -317,19 +317,19 @@ helm install --set tags.front-end=true --set subchart2.enabled=false #### Importing Child Values via requirements.yaml -In some cases it is desirable to allow a child chart's values to propagate to the parent chart and be -shared as common defaults. An additional benefit of using the `exports` format is that it will enable future +In some cases it is desirable to allow a child chart's values to propagate to the parent chart and be +shared as common defaults. An additional benefit of using the `exports` format is that it will enable future tooling to introspect user-settable values. -The keys containing the values to be imported can be specified in the parent chart's `requirements.yaml` file -using a YAML list. Each item in the list is a key which is imported from the child chart's `exports` field. +The keys containing the values to be imported can be specified in the parent chart's `requirements.yaml` file +using a YAML list. Each item in the list is a key which is imported from the child chart's `exports` field. To import values not contained in the `exports` key, use the [child-parent](#using-the-child-parent-format) format. Examples of both formats are described below. ##### Using the exports format -If a child chart's `values.yaml` file contains an `exports` field at the root, its contents may be imported +If a child chart's `values.yaml` file contains an `exports` field at the root, its contents may be imported directly into the parent's values by specifying the keys to import as in the example below: ```yaml @@ -346,8 +346,8 @@ exports: myint: 99 ``` -Since we are specifying the key `data` in our import list, Helm looks in the `exports` field of the child -chart for `data` key and imports its contents. +Since we are specifying the key `data` in our import list, Helm looks in the `exports` field of the child +chart for `data` key and imports its contents. The final parent values would contain our exported field: @@ -358,16 +358,16 @@ myint: 99 ``` -Please note the parent key `data` is not contained in the parent's final values. If you need to specify the -parent key, use the 'child-parent' format. +Please note the parent key `data` is not contained in the parent's final values. If you need to specify the +parent key, use the 'child-parent' format. ##### Using the child-parent format -To access values that are not contained in the `exports` key of the child chart's values, you will need to -specify the source key of the values to be imported (`child`) and the destination path in the parent chart's +To access values that are not contained in the `exports` key of the child chart's values, you will need to +specify the source key of the values to be imported (`child`) and the destination path in the parent chart's values (`parent`). -The `import-values` in the example below instructs Helm to take any values found at `child:` path and copy them +The `import-values` in the example below instructs Helm to take any values found at `child:` path and copy them to the parent's values at the path specified in `parent:` ```yaml @@ -382,7 +382,7 @@ dependencies: parent: myimports ``` In the above example, values found at `default.data` in the subchart1's values will be imported -to the `myimports` key in the parent chart's values as detailed below: +to the `myimports` key in the parent chart's values as detailed below: ```yaml # parent's values.yaml file @@ -391,7 +391,7 @@ myimports: myint: 0 mybool: false mystring: "helm rocks!" - + ``` ```yaml # subchart1's values.yaml file @@ -400,7 +400,7 @@ default: data: myint: 999 mybool: true - + ``` The parent chart's resulting values would be: @@ -468,7 +468,7 @@ Furthermore, A is dependent on chart B that creates objects - replicaset "B-ReplicaSet" - service "B-Service" -After installation/upgrade of chart A a single Helm release is created/modified. The release will +After installation/upgrade of chart A a single Helm release is created/modified. The release will create/update all of the above Kubernetes objects in the following order: - A-Namespace @@ -478,16 +478,16 @@ create/update all of the above Kubernetes objects in the following order: - A-Service - B-Service -This is because when Helm installs/upgrades charts, -the Kubernetes objects from the charts and all its dependencies are +This is because when Helm installs/upgrades charts, +the Kubernetes objects from the charts and all its dependencies are -- aggregrated into a single set; then -- sorted by type followed by name; and then -- created/updated in that order. +- aggregrated into a single set; then +- sorted by type followed by name; and then +- created/updated in that order. Hence a single release is created with all the objects for the chart and its dependencies. -The install order of Kubernetes types is given by the enumeration InstallOrder in kind_sorter.go +The install order of Kubernetes types is given by the enumeration InstallOrder in kind_sorter.go (see [the Helm source file](https://github.com/helm/helm/blob/master/pkg/tiller/kind_sorter.go#L26)). ## Templates and Values @@ -560,8 +560,8 @@ It can use the following four template values (usually defined in a All of these values are defined by the template author. Helm does not require or dictate parameters. -To see many working charts, check out the [Kubernetes Charts -project](https://github.com/kubernetes/charts) +To see many working charts, check out the [Helm Charts +project](https://github.com/helm/charts) ### Predefined Values diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index a83b44457f7..f1751b1b52a 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -109,7 +109,7 @@ to render and exit when .Values.foo is undefined. ## Using the 'tpl' Function The `tpl` function allows developers to evaluate strings as templates inside a template. -This is useful to pass a template string as a value to a chart or render external configuration files. +This is useful to pass a template string as a value to a chart or render external configuration files. Syntax: `{{ tpl TEMPLATE_STRING VALUES }}` Examples: @@ -152,7 +152,7 @@ imageCredentials: registry: quay.io username: someone password: sillyness -``` +``` We then define our helper template as follows: ``` @@ -182,7 +182,7 @@ deployment spec itself didn't change the application keeps running with the old configuration resulting in an inconsistent deployment. The `sha256sum` function can be used to ensure a deployment's -annotation section is updated if another file changes: +annotation section is updated if another file changes: ```yaml kind: Deployment @@ -232,7 +232,7 @@ by convention, helper templates and partials are placed in a ## Complex Charts with Many Dependencies -Many of the charts in the [official charts repository](https://github.com/kubernetes/charts) +Many of the charts in the [official charts repository](https://github.com/helm/charts) are "building blocks" for creating more advanced applications. But charts may be used to create instances of large-scale applications. In such cases, a single umbrella chart may have multiple subcharts, each of which functions as a piece diff --git a/docs/provenance.md b/docs/provenance.md index 3a19fcd0758..163e7284210 100644 --- a/docs/provenance.md +++ b/docs/provenance.md @@ -27,7 +27,7 @@ Prerequisites: **NOTE:** If your PGP private key has a passphrase, you will be prompted to enter that passphrase for any commands that support the `--sign` option. You can set the -HELM_KEY_PASSPHRASE environment variable to that passphrase in case you don't want +HELM_KEY_PASSPHRASE environment variable to that passphrase in case you don't want to be prompted to enter the passphrase. **NOTE:** The keyfile format for GnuPG changed in version 2.1. Prior to that release @@ -261,9 +261,9 @@ in using the provenance system: - Keybase also has fabulous documentation available - While we haven't tested it, Keybase's "secure website" feature could be used to serve Helm charts. -- The [official Kubernetes Charts project](https://github.com/kubernetes/charts) +- The [official Helm Charts project](https://github.com/helm/charts) is trying to solve this problem for the official chart repository. - - There is a long issue there [detailing the current thoughts](https://github.com/kubernetes/charts/issues/23). + - There is a long issue there [detailing the current thoughts](https://github.com/helm/charts/issues/23). - The basic idea is that an official "chart reviewer" signs charts with her or his key, and the resulting provenance file is then uploaded to the chart repository. diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 9213b4c1fb5..c69db9d21fd 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -224,7 +224,7 @@ The community keeps growing, and we'd love to see you there! - `#helm-users` for questions and just to hang out - `#helm-dev` for discussing PRs, code, and bugs - Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom.us/j/696660622) -- Test, debug, and contribute charts: [GitHub/kubernetes/charts](https://github.com/kubernetes/charts) +- Test, debug, and contribute charts: [GitHub/helm/charts](https://github.com/helm/charts) ## Installation and Upgrading diff --git a/docs/using_helm.md b/docs/using_helm.md index 4b18e2cf2c2..5716a1302bd 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -63,7 +63,7 @@ stable/mysql 0.1.0 Chart for MySQL stable/mariadb 0.5.1 Chart for MariaDB ``` -Now you will only see the results that match your filter. +Now you will only see the results that match your filter. Why is `mariadb` in the list? Because its package description relates it to @@ -231,7 +231,7 @@ There are two ways to pass configuration data during install: If both are used, `--set` values are merged into `--values` with higher precedence. Overrides specified with `--set` are persisted in a configmap. Values that have been -`--set` can be viewed for a given release with `helm get values `. +`--set` can be viewed for a given release with `helm get values `. Values that have been `--set` can be cleared by running `helm upgrade` with `--reset-values` specified. @@ -405,11 +405,11 @@ is not a full list of cli flags. To see a description of all flags, just run This defaults to 300 (5 minutes) - `--wait`: Waits until all Pods are in a ready state, PVCs are bound, Deployments have minimum (`Desired` minus `maxUnavailable`) Pods in ready state and - Services have an IP address (and Ingress if a `LoadBalancer`) before - marking the release as successful. It will wait for as long as the - `--timeout` value. If timeout is reached, the release will be marked as - `FAILED`. Note: In scenario where Deployment has `replicas` set to 1 and - `maxUnavailable` is not set to 0 as part of rolling update strategy, + Services have an IP address (and Ingress if a `LoadBalancer`) before + marking the release as successful. It will wait for as long as the + `--timeout` value. If timeout is reached, the release will be marked as + `FAILED`. Note: In scenario where Deployment has `replicas` set to 1 and + `maxUnavailable` is not set to 0 as part of rolling update strategy, `--wait` will return as ready as it has satisfied the minimum Pod in ready condition. - `--no-hooks`: This skips running hooks for the command - `--recreate-pods` (only available for `upgrade` and `rollback`): This flag @@ -518,8 +518,8 @@ $ helm install ./deis-workflow-0.1.0.tgz Charts that are archived can be loaded into chart repositories. See the documentation for your chart repository server to learn how to upload. -Note: The `stable` repository is managed on the [Kubernetes Charts -GitHub repository](https://github.com/kubernetes/charts). That project +Note: The `stable` repository is managed on the [Helm Charts +GitHub repository](https://github.com/helm/charts). That project accepts chart source code, and (after audit) packages those for you. ## Tiller, Namespaces and RBAC diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-basicauth-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-basicauth-index.yaml index 47bb1b77c87..b90c4e23280 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-basicauth-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-basicauth-index.yaml @@ -8,7 +8,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - http://username:password@example.com/foo-1.2.3.tgz version: 1.2.3 diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-https-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-https-index.yaml index 872478c3f9d..37a74c9c150 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-https-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-https-index.yaml @@ -8,7 +8,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://example.com/foo-1.2.3.tgz version: 1.2.3 diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml index 7543a59f547..75fcfdc6903 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-index.yaml @@ -36,7 +36,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - http://example.com/foo-1.2.3.tgz version: 1.2.3 diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml index 210f92e45fa..987e2861ad3 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-index.yaml @@ -8,7 +8,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - charts/foo-1.2.3.tgz version: 1.2.3 @@ -21,7 +21,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - bar-1.2.3.tgz version: 1.2.3 diff --git a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml index 210f92e45fa..987e2861ad3 100644 --- a/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml +++ b/pkg/downloader/testdata/helmhome/repository/cache/testing-relative-trailing-slash-index.yaml @@ -8,7 +8,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - charts/foo-1.2.3.tgz version: 1.2.3 @@ -21,7 +21,7 @@ entries: keywords: [] maintainers: [] sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - bar-1.2.3.tgz version: 1.2.3 diff --git a/pkg/getter/testdata/repository/cache/stable-index.yaml b/pkg/getter/testdata/repository/cache/stable-index.yaml index bf187e3df74..d4f883a25f0 100644 --- a/pkg/getter/testdata/repository/cache/stable-index.yaml +++ b/pkg/getter/testdata/repository/cache/stable-index.yaml @@ -214,7 +214,7 @@ entries: name: concourse sources: - https://github.com/concourse/bin - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://kubernetes-charts.storage.googleapis.com/concourse-0.1.3.tgz version: 0.1.3 @@ -234,7 +234,7 @@ entries: name: concourse sources: - https://github.com/concourse/bin - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://kubernetes-charts.storage.googleapis.com/concourse-0.1.2.tgz version: 0.1.2 @@ -254,7 +254,7 @@ entries: name: concourse sources: - https://github.com/concourse/bin - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://kubernetes-charts.storage.googleapis.com/concourse-0.1.1.tgz version: 0.1.1 @@ -273,7 +273,7 @@ entries: name: concourse sources: - https://github.com/concourse/bin - - https://github.com/kubernetes/charts + - https://github.com/helm/charts urls: - https://kubernetes-charts.storage.googleapis.com/concourse-0.1.0.tgz version: 0.1.0 @@ -3985,7 +3985,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.6.tgz @@ -4006,7 +4006,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.5.tgz @@ -4025,7 +4025,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.4.tgz @@ -4044,7 +4044,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.3.tgz @@ -4063,7 +4063,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.2.tgz @@ -4082,7 +4082,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.1.tgz @@ -4101,7 +4101,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.2.0.tgz @@ -4120,7 +4120,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.1.2.tgz @@ -4139,7 +4139,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.1.1.tgz @@ -4158,7 +4158,7 @@ entries: name: Vic Iglesias name: mysql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/mysql urls: - https://kubernetes-charts.storage.googleapis.com/mysql-0.1.0.tgz @@ -5034,7 +5034,7 @@ entries: name: Patrick Galbraith name: percona sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/percona urls: - https://kubernetes-charts.storage.googleapis.com/percona-0.1.0.tgz @@ -5404,7 +5404,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.6.0.tgz @@ -5426,7 +5426,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.5.1.tgz @@ -5448,7 +5448,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.5.0.tgz @@ -5470,7 +5470,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.4.0.tgz @@ -5492,7 +5492,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.3.4.tgz @@ -5512,7 +5512,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.3.3.tgz @@ -5532,7 +5532,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.3.2.tgz @@ -5552,7 +5552,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.3.1.tgz @@ -5572,7 +5572,7 @@ entries: - name: databus23 name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.3.0.tgz @@ -5591,7 +5591,7 @@ entries: - name: swordbeta name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.2.2.tgz @@ -5610,7 +5610,7 @@ entries: - name: swordbeta name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.2.1.tgz @@ -5629,7 +5629,7 @@ entries: - name: swordbeta name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.2.0.tgz @@ -5648,7 +5648,7 @@ entries: - name: swordbeta name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.1.1.tgz @@ -5667,7 +5667,7 @@ entries: - name: swordbeta name: postgresql sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/docker-library/postgres urls: - https://kubernetes-charts.storage.googleapis.com/postgresql-0.1.0.tgz @@ -6720,7 +6720,7 @@ entries: sources: - https://bitbucket.org/sapho/ops-docker-tomcat/src - https://hub.docker.com/r/sapho/ops-docker-tomcat - - https://github.com/kubernetes/charts/tree/master/stable/mysql + - https://github.com/helm/charts/tree/master/stable/mysql urls: - https://kubernetes-charts.storage.googleapis.com/sapho-0.1.5.tgz version: 0.1.5 @@ -6738,7 +6738,7 @@ entries: sources: - https://bitbucket.org/sapho/ops-docker-tomcat/src - https://hub.docker.com/r/sapho/ops-docker-tomcat - - https://github.com/kubernetes/charts/tree/master/stable/mysql + - https://github.com/helm/charts/tree/master/stable/mysql urls: - https://kubernetes-charts.storage.googleapis.com/sapho-0.1.4.tgz version: 0.1.4 @@ -6756,7 +6756,7 @@ entries: sources: - https://bitbucket.org/sapho/ops-docker-tomcat/src - https://hub.docker.com/r/sapho/ops-docker-tomcat - - https://github.com/kubernetes/charts/tree/master/stable/mysql + - https://github.com/helm/charts/tree/master/stable/mysql urls: - https://kubernetes-charts.storage.googleapis.com/sapho-0.1.3.tgz version: 0.1.3 @@ -6794,7 +6794,7 @@ entries: name: Shane Starcher name: sensu sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-sensu - https://github.com/sensu/sensu urls: @@ -6815,7 +6815,7 @@ entries: name: Shane Starcher name: sensu sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-sensu - https://github.com/sensu/sensu urls: @@ -6836,7 +6836,7 @@ entries: name: Shane Starcher name: sensu sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-sensu - https://github.com/sensu/sensu urls: @@ -7506,7 +7506,7 @@ entries: name: Shane Starcher name: uchiwa sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-uchiwa - https://github.com/sensu/uchiwa urls: @@ -7528,7 +7528,7 @@ entries: name: Shane Starcher name: uchiwa sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-uchiwa - https://github.com/sensu/uchiwa urls: @@ -7550,7 +7550,7 @@ entries: name: Shane Starcher name: uchiwa sources: - - https://github.com/kubernetes/charts + - https://github.com/helm/charts - https://github.com/sstarcher/docker-uchiwa - https://github.com/sensu/uchiwa urls: From 7b66bc7775086cac8fc7ee66ef5af8927e91facf Mon Sep 17 00:00:00 2001 From: jgleonard Date: Thu, 1 Nov 2018 15:12:14 -0400 Subject: [PATCH 254/483] gofmt -s Signed-off-by: jgleonard --- pkg/proto/hapi/services/tiller.pb.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 813f15c3352..e8eda87690b 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -633,7 +633,7 @@ type InstallReleaseRequest struct { DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook" json:"disable_crd_hook,omitempty"` // Description, if set, will set the description for the installed release Description string `protobuf:"bytes,11,opt,name=description" json:"description,omitempty"` - SubNotes bool `protobuf:"varint,12,opt,name=subNotes" json:"subNotes,omitempty"` + SubNotes bool `protobuf:"varint,12,opt,name=subNotes" json:"subNotes,omitempty"` } func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } @@ -711,7 +711,6 @@ func (m *InstallReleaseRequest) GetDisableCrdHook() bool { return false } - func (m *InstallReleaseRequest) GetSubNotes() bool { if m != nil { return m.SubNotes From b846560f4829ef725a425c43955e2c321755063a Mon Sep 17 00:00:00 2001 From: jgleonard Date: Wed, 7 Nov 2018 13:34:12 -0500 Subject: [PATCH 255/483] formatting Signed-off-by: jgleonard --- _proto/hapi/services/tiller.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index add468c734b..1edd86025b8 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -212,7 +212,7 @@ message UpdateReleaseRequest { bool force = 11; // Description, if set, will set the description for the updated release string description = 12; - // Render subchart notes if enabled + // Render subchart notes if enabled bool subNotes = 13; } @@ -284,7 +284,7 @@ message InstallReleaseRequest { // Description, if set, will set the description for the installed release string description = 11; - bool subNotes = 12; + bool subNotes = 12; } From 9030e7ba7513b44fcdffe060c6a89c11c0f54160 Mon Sep 17 00:00:00 2001 From: jgleonard Date: Wed, 7 Nov 2018 13:35:12 -0500 Subject: [PATCH 256/483] fold subNotes into updateReq and instReq Signed-off-by: jgleonard --- pkg/helm/client.go | 2 -- pkg/helm/option.go | 6 ++---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index fcd30c106ba..771c7f3d1d7 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -95,7 +95,6 @@ func (h *Client) InstallReleaseFromChart(chart *chart.Chart, ns string, opts ... req := &reqOpts.instReq req.Chart = chart req.Namespace = ns - req.SubNotes = reqOpts.subNotes req.DryRun = reqOpts.dryRun req.DisableHooks = reqOpts.disableHooks req.DisableCrdHook = reqOpts.disableCRDHook @@ -172,7 +171,6 @@ func (h *Client) UpdateReleaseFromChart(rlsName string, chart *chart.Chart, opts req.DryRun = reqOpts.dryRun req.Name = rlsName req.DisableHooks = reqOpts.disableHooks - req.SubNotes = reqOpts.subNotes req.Recreate = reqOpts.recreate req.Force = reqOpts.force req.ResetValues = reqOpts.resetValues diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 04d394254c8..a34c4b8ae08 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -54,8 +54,6 @@ type options struct { // if set, skip CRD hook only disableCRDHook bool // if set, render SubChart Notes - subNotes bool - // name of release releaseName string // tls.Config to use for rpc if tls enabled tlsConfig *tls.Config @@ -344,14 +342,14 @@ func InstallReuseName(reuse bool) InstallOption { // InstallSubNotes will (if true) instruct Tiller to render SubChart Notes func InstallSubNotes(enable bool) InstallOption { return func(opts *options) { - opts.subNotes = enable + opts.instReq.SubNotes = enable } } // UpgradeSubNotes will (if true) instruct Tiller to render SubChart Notes func UpgradeSubNotes(enable bool) UpdateOption { return func(opts *options) { - opts.subNotes = enable + opts.updateReq.SubNotes = enable } } From a276bd810871c2ebdb950f8a568d7887f307dee5 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 8 Nov 2018 14:22:09 -0800 Subject: [PATCH 257/483] add appveyor for testing on Windows (#4136) Signed-off-by: Matthew Fisher --- .appveyor.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 00000000000..d7ba1d9fd36 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,17 @@ +version: "{build}" +clone_folder: c:\go\src\k8s.io\helm +environment: + GOPATH: c:\go + PATH: c:\ProgramData\bin;$(PATH) +install: + - ps: iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/fishworks/gofish/master/scripts/install.ps1')) + - gofish init + - gofish install dep + - dep ensure -v +cache: + - vendor -> Gopkg.lock +build: "off" +deploy: "off" +test_script: + - go build .\cmd\... + - go test .\... From 82d01cb3124906e97caceb967a09f2941d6a392d Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Mon, 12 Nov 2018 03:32:21 -0800 Subject: [PATCH 258/483] fix(helm): Merge nested values correctly on upgrade (#4806) Upgrading a release and override existing values doesn't work as expected for nested values. Maps should be merged recursively, but currently maps are treated just like values and replaced at the top level. If the existing values are: ```yaml resources: requests: cpu: 400m something: else ``` and an update is done with ```--set=resources.requests.cpu=500m```, it currently ends up as ```yaml resources: requests: cpu: 500m ``` but it should have been ```yaml resources: requests: cpu: 500m something: else ``` This PR updates the way override values are merged into the existing set of values to merge rather than replace maps. Closes: #4792 Signed-off-by: Morten Torkildsen --- pkg/chartutil/values.go | 16 ++++++ pkg/chartutil/values_test.go | 82 +++++++++++++++++++++++++++++++ pkg/tiller/release_server.go | 27 +++++----- pkg/tiller/release_update_test.go | 67 +++++++++++++++++++++++++ 4 files changed, 178 insertions(+), 14 deletions(-) diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go index 1ea7edd8c0b..a47073b670b 100644 --- a/pkg/chartutil/values.go +++ b/pkg/chartutil/values.go @@ -94,6 +94,22 @@ func (v Values) Encode(w io.Writer) error { return err } +// MergeInto takes the properties in src and merges them into Values. Maps +// are merged while values and arrays are replaced. +func (v Values) MergeInto(src Values) { + for key, srcVal := range src { + destVal, found := v[key] + + if found && istable(srcVal) && istable(destVal) { + destMap := destVal.(map[string]interface{}) + srcMap := srcVal.(map[string]interface{}) + Values(destMap).MergeInto(Values(srcMap)) + } else { + v[key] = srcVal + } + } +} + func tableLookup(v Values, simple string) (Values, error) { v2, ok := v[simple] if !ok { diff --git a/pkg/chartutil/values_test.go b/pkg/chartutil/values_test.go index f54b25827d6..f38afaf95b8 100644 --- a/pkg/chartutil/values_test.go +++ b/pkg/chartutil/values_test.go @@ -20,6 +20,7 @@ import ( "bytes" "encoding/json" "fmt" + "reflect" "testing" "text/template" @@ -457,3 +458,84 @@ chapter: } } } + +func TestValuesMergeInto(t *testing.T) { + testCases := map[string]struct { + destination string + source string + result string + }{ + "maps are merged": { + ` +resources: + requests: + cpu: 400m + something: else +`, + ` +resources: + requests: + cpu: 500m +`, + ` +resources: + requests: + cpu: 500m + something: else +`, + }, + "values are replaced": { + ` +firstKey: firstValue +secondKey: secondValue +thirdKey: thirdValue +`, + ` +firstKey: newFirstValue +thirdKey: newThirdValue +`, + ` +firstKey: newFirstValue +secondKey: secondValue +thirdKey: newThirdValue +`, + }, + "new values are added": { + ` +existingKey: existingValue +`, + ` +newKey: newValue +anotherNewKey: + nestedNewKey: nestedNewValue +`, + ` +existingKey: existingValue +newKey: newValue +anotherNewKey: + nestedNewKey: nestedNewValue +`, + }, + } + + for name, tc := range testCases { + d, err := ReadValues([]byte(tc.destination)) + if err != nil { + t.Error(err) + } + s, err := ReadValues([]byte(tc.source)) + if err != nil { + t.Error(err) + } + expectedRes, err := ReadValues([]byte(tc.result)) + if err != nil { + t.Error(err) + } + + d.MergeInto(s) + + if !reflect.DeepEqual(expectedRes, d) { + t.Errorf("%s: Expected %v, but got %v", name, expectedRes, d) + } + } +} diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index f5e96ed0054..cf7748f44d8 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -25,7 +25,6 @@ import ( "strings" "github.com/technosophos/moniker" - "gopkg.in/yaml.v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/discovery" "k8s.io/client-go/kubernetes" @@ -136,28 +135,28 @@ func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current if err != nil { return err } + req.Chart.Values = &chart.Config{Raw: nv} + + reqValues, err := chartutil.ReadValues([]byte(req.Values.Raw)) + if err != nil { + return err + } - // merge new values with current + currentConfig := chartutil.Values{} if current.Config != nil && current.Config.Raw != "" && current.Config.Raw != "{}\n" { - if req.Values.Raw != "{}\n" { - req.Values.Raw = current.Config.Raw + "\n" + req.Values.Raw - } else { - req.Values.Raw = current.Config.Raw + "\n" + currentConfig, err = chartutil.ReadValues([]byte(current.Config.Raw)) + if err != nil { + return err } } - req.Chart.Values = &chart.Config{Raw: nv} - // yaml unmarshal and marshal to remove duplicate keys - y := map[string]interface{}{} - if err := yaml.Unmarshal([]byte(req.Values.Raw), &y); err != nil { - return err - } - data, err := yaml.Marshal(y) + currentConfig.MergeInto(reqValues) + data, err := currentConfig.YAML() if err != nil { return err } - req.Values.Raw = string(data) + req.Values.Raw = data return nil } diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 81fad0bc4e4..ea1c88f62ee 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -23,10 +23,12 @@ import ( "github.com/golang/protobuf/proto" + "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" + "reflect" ) func TestUpdateRelease(t *testing.T) { @@ -168,6 +170,71 @@ func TestUpdateRelease_ReuseValuesWithNoValues(t *testing.T) { } } +func TestUpdateRelease_NestedReuseValues(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + + installReq := &services.InstallReleaseRequest{ + Namespace: "spaced", + Chart: &chart.Chart{ + Metadata: &chart.Metadata{Name: "hello"}, + Templates: []*chart.Template{ + {Name: "templates/hello", Data: []byte("hello: world")}, + }, + Values: &chart.Config{Raw: "defaultFoo: defaultBar"}, + }, + Values: &chart.Config{Raw: ` +foo: bar +root: + nested: nestedValue + anotherNested: anotherNestedValue +`}, + } + + installResp, err := rs.InstallRelease(c, installReq) + if err != nil { + t.Fatal(err) + } + + rel := installResp.Release + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: &chart.Chart{ + Metadata: &chart.Metadata{Name: "hello"}, + Templates: []*chart.Template{ + {Name: "templates/hello", Data: []byte("hello: world")}, + }, + Values: &chart.Config{Raw: "defaultFoo: defaultBar"}, + }, + Values: &chart.Config{Raw: ` +root: + nested: newNestedValue +`}, + ReuseValues: true, + } + + res, err := rs.UpdateRelease(c, req) + if err != nil { + t.Fatalf("Failed updated: %s", err) + } + + expect, _ := chartutil.ReadValues([]byte(` +foo: bar +root: + nested: newNestedValue + anotherNested: anotherNestedValue +`)) + + requestConfig, err := chartutil.ReadValues([]byte(res.Release.Config.Raw)) + if err != nil { + t.Errorf("Request config could not be parsed: %v", err) + } + + if !reflect.DeepEqual(expect, requestConfig) { + t.Errorf("Expected request config to be %v, got %v", expect, requestConfig) + } +} + // This is a regression test for bug found in issue #3655 func TestUpdateRelease_ComplexReuseValues(t *testing.T) { c := helm.NewContext() From 9ae00bebadad9e29ca79ae9ae93486576497059b Mon Sep 17 00:00:00 2001 From: Brent Date: Mon, 12 Nov 2018 05:36:58 -0600 Subject: [PATCH 259/483] fix(tiller): rollback deleted release (#3722) (#4820) Solves #3722 by making the changes in #3539 more compatible with the previous behavior. This gives a recovery option for "oops I deleted my helm release" by allowing rollback, which is intended to be a working feature of helm. Note that purging releases removes the history required to rollback, so this doesn't work in that case. However, purging takes significantly more time, so it's harder to accidentally purge everything. Signed-off-by: Brent --- pkg/storage/storage.go | 8 ++-- pkg/tiller/release_rollback.go | 11 ++++- pkg/tiller/release_rollback_test.go | 68 ++++++++++++++++++++++++++++- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 40fc558a1c8..6d5f589b992 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -25,6 +25,8 @@ import ( "k8s.io/helm/pkg/storage/driver" ) +const NoReleasesErr = "has no deployed releases" + // Storage represents a storage engine for a Release. type Storage struct { driver.Driver @@ -124,13 +126,13 @@ func (s *Storage) Deployed(name string) (*rspb.Release, error) { ls, err := s.DeployedAll(name) if err != nil { if strings.Contains(err.Error(), "not found") { - return nil, fmt.Errorf("%q has no deployed releases", name) + return nil, fmt.Errorf("%q %s", name, NoReleasesErr) } return nil, err } if len(ls) == 0 { - return nil, fmt.Errorf("%q has no deployed releases", name) + return nil, fmt.Errorf("%q %s", name, NoReleasesErr) } return ls[0], err @@ -150,7 +152,7 @@ func (s *Storage) DeployedAll(name string) ([]*rspb.Release, error) { return ls, nil } if strings.Contains(err.Error(), "not found") { - return nil, fmt.Errorf("%q has no deployed releases", name) + return nil, fmt.Errorf("%q %s", name, NoReleasesErr) } return nil, err } diff --git a/pkg/tiller/release_rollback.go b/pkg/tiller/release_rollback.go index 75e282fb82b..1f72c32569f 100644 --- a/pkg/tiller/release_rollback.go +++ b/pkg/tiller/release_rollback.go @@ -18,6 +18,8 @@ package tiller import ( "fmt" + "k8s.io/helm/pkg/storage" + "strings" ctx "golang.org/x/net/context" @@ -151,11 +153,16 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R } } + // update the current release + s.Log("superseding previous deployment %d", currentRelease.Version) + currentRelease.Info.Status.Code = release.Status_SUPERSEDED + s.recordRelease(currentRelease, true) + + // Supersede all previous deployments, see issue #2941. deployed, err := s.env.Releases.DeployedAll(currentRelease.Name) - if err != nil { + if err != nil && !strings.Contains(err.Error(), storage.NoReleasesErr) { return nil, err } - // Supersede all previous deployments, see issue #2941. for _, r := range deployed { s.Log("superseding previous deployment %d", r.Version) r.Info.Status.Code = release.Status_SUPERSEDED diff --git a/pkg/tiller/release_rollback_test.go b/pkg/tiller/release_rollback_test.go index d7909ed8b05..6aa895a6323 100644 --- a/pkg/tiller/release_rollback_test.go +++ b/pkg/tiller/release_rollback_test.go @@ -169,7 +169,7 @@ func TestRollbackWithReleaseVersion(t *testing.T) { // check that v2 is now in a SUPERSEDED state oldRel, err := rs.env.Releases.Get(rel.Name, 2) if err != nil { - t.Fatalf("Failed to retrieve v1: %s", err) + t.Fatalf("Failed to retrieve v2: %s", err) } if oldRel.Info.Status.Code != release.Status_SUPERSEDED { t.Errorf("Expected v2 to be in a SUPERSEDED state, got %q", oldRel.Info.Status.Code) @@ -184,6 +184,72 @@ func TestRollbackWithReleaseVersion(t *testing.T) { } } +func TestRollbackDeleted(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rs.Log = t.Logf + rs.env.Releases.Log = t.Logf + rel2 := releaseStub() + rel2.Name = "other" + rs.env.Releases.Create(rel2) + rel := releaseStub() + rs.env.Releases.Create(rel) + v2 := upgradeReleaseVersion(rel) + rs.env.Releases.Update(rel) + rs.env.Releases.Create(v2) + v3 := upgradeReleaseVersion(v2) + // retain the original release as DEPLOYED while the update should fail + v2.Info.Status.Code = release.Status_DEPLOYED + v3.Info.Status.Code = release.Status_FAILED + rs.env.Releases.Update(v2) + rs.env.Releases.Create(v3) + + req1 := &services.UninstallReleaseRequest{ + Name: rel.Name, + DisableHooks: true, + } + + _, err := rs.UninstallRelease(c, req1) + if err != nil { + t.Fatalf("Failed uninstall: %s", err) + } + + oldRel, err := rs.env.Releases.Get(rel.Name, 3) + if err != nil { + t.Fatalf("Failed to retrieve v3: %s", err) + } + if oldRel.Info.Status.Code != release.Status_DELETED { + t.Errorf("Expected v3 to be in a DELETED state, got %q", oldRel.Info.Status.Code) + } + + req2 := &services.RollbackReleaseRequest{ + Name: rel.Name, + DisableHooks: true, + Version: 2, + } + + _, err = rs.RollbackRelease(c, req2) + if err != nil { + t.Fatalf("Failed rollback: %s", err) + } + // check that v3 is now in a SUPERSEDED state + oldRel, err = rs.env.Releases.Get(rel.Name, 3) + if err != nil { + t.Fatalf("Failed to retrieve v3: %s", err) + } + if oldRel.Info.Status.Code != release.Status_SUPERSEDED { + t.Errorf("Expected v3 to be in a SUPERSEDED state, got %q", oldRel.Info.Status.Code) + } + // make sure we didn't update some other deployments. + otherRel, err := rs.env.Releases.Get(rel2.Name, 1) + if err != nil { + t.Fatalf("Failed to retrieve other v1: %s", err) + } + if otherRel.Info.Status.Code != release.Status_DEPLOYED { + t.Errorf("Expected other deployed release to stay untouched, got %q", otherRel.Info.Status.Code) + } +} + func TestRollbackReleaseNoHooks(t *testing.T) { c := helm.NewContext() rs := rsFixture() From f6b1189aa201231b67133df4c75db0709465c84f Mon Sep 17 00:00:00 2001 From: Lev Aminov Date: Mon, 12 Nov 2018 16:37:43 +0500 Subject: [PATCH 260/483] fix(helm): Non-zero exit code on failed chart repository update (#4348) * Fail on failed chart repository update * Fix failed test * Add repo update strict flag --- cmd/helm/repo_update.go | 25 +++++++++++++++++++------ cmd/helm/repo_update_test.go | 5 +++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 291b21b72b2..52630034339 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -40,9 +40,10 @@ future releases. var errNoRepositories = errors.New("no repositories found. You must add one before updating") type repoUpdateCmd struct { - update func([]*repo.ChartRepository, io.Writer, helmpath.Home) + update func([]*repo.ChartRepository, io.Writer, helmpath.Home, bool) error home helmpath.Home out io.Writer + strict bool } func newRepoUpdateCmd(out io.Writer) *cobra.Command { @@ -60,6 +61,10 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command { return u.run() }, } + + f := cmd.Flags() + f.BoolVar(&u.strict, "strict", false, "fail on update warnings") + return cmd } @@ -80,14 +85,15 @@ func (u *repoUpdateCmd) run() error { } repos = append(repos, r) } - - u.update(repos, u.out, u.home) - return nil + return u.update(repos, u.out, u.home, u.strict) } -func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Home) { +func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Home, strict bool) error { fmt.Fprintln(out, "Hang tight while we grab the latest from your chart repositories...") - var wg sync.WaitGroup + var ( + errorCounter int + wg sync.WaitGroup + ) for _, re := range repos { wg.Add(1) go func(re *repo.ChartRepository) { @@ -98,6 +104,7 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho } err := re.DownloadIndexFile(home.Cache()) if err != nil { + errorCounter++ fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", re.Config.Name, re.Config.URL, err) } else { fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", re.Config.Name) @@ -105,5 +112,11 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho }(re) } wg.Wait() + + if errorCounter != 0 && strict { + return errors.New("Update Failed. Check log for details") + } + fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming!⎈ ") + return nil } diff --git a/cmd/helm/repo_update_test.go b/cmd/helm/repo_update_test.go index 71dc879660e..86af437c5f9 100644 --- a/cmd/helm/repo_update_test.go +++ b/cmd/helm/repo_update_test.go @@ -46,10 +46,11 @@ func TestUpdateCmd(t *testing.T) { out := bytes.NewBuffer(nil) // Instead of using the HTTP updater, we provide our own for this test. // The TestUpdateCharts test verifies the HTTP behavior independently. - updater := func(repos []*repo.ChartRepository, out io.Writer, hh helmpath.Home) { + updater := func(repos []*repo.ChartRepository, out io.Writer, hh helmpath.Home, strict bool) error { for _, re := range repos { fmt.Fprintln(out, re.Config.Name) } + return nil } uc := &repoUpdateCmd{ update: updater, @@ -94,7 +95,7 @@ func TestUpdateCharts(t *testing.T) { } b := bytes.NewBuffer(nil) - updateCharts([]*repo.ChartRepository{r}, b, hh) + updateCharts([]*repo.ChartRepository{r}, b, hh, false) got := b.String() if strings.Contains(got, "Unable to get an update") { From 46e66d47120617d51fe169290ca00a9a4c3f0dd5 Mon Sep 17 00:00:00 2001 From: Scott Rigby Date: Mon, 12 Nov 2018 12:15:43 -0500 Subject: [PATCH 261/483] Helm code of conduct (#4901) See https://github.com/helm/chart-testing/issues/48 Signed-by: Scott Rigby Signed-off-by: Scott Rigby --- code-of-conduct.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code-of-conduct.md b/code-of-conduct.md index 0d15c00cf32..91ccaf03533 100644 --- a/code-of-conduct.md +++ b/code-of-conduct.md @@ -1,3 +1,3 @@ -# Kubernetes Community Code of Conduct +# Community Code of Conduct -Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) +Helm follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). From 3a8a797eab0e1d02456c7944bf41631546ee2e47 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 15 Nov 2018 17:20:08 +0100 Subject: [PATCH 262/483] fix(docs): run `make docs` (#4924) Signed-off-by: Matthew Fisher --- docs/helm/helm_repo_update.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/helm/helm_repo_update.md b/docs/helm/helm_repo_update.md index 0d14f63edd5..381c12fb348 100644 --- a/docs/helm/helm_repo_update.md +++ b/docs/helm/helm_repo_update.md @@ -19,7 +19,8 @@ helm repo update [flags] ### Options ``` - -h, --help help for update + -h, --help help for update + --strict fail on update warnings ``` ### Options inherited from parent commands @@ -38,4 +39,4 @@ helm repo update [flags] * [helm repo](helm_repo.md) - add, list, remove, update, and index chart repositories -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 15-Nov-2018 From 5ac37fba9952e2df8a29c42500ee5746c3325c74 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 15 Nov 2018 11:58:07 -0800 Subject: [PATCH 263/483] fix(helm): Fix linebreaks when printing custom resources The output from helm status is not correct for custom resources. The HumanReadablePrinter from Kubernetes only outputs the column names when the type differs from the previous one. This makes the output inconsistent and also creates problems for putting in the correct line breaks. This PR sets up a new printer for each type, thereby making sure that all types are printed with the correct use of line breaks and with column names. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 0cc68b71b57..f86621b3f70 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -211,18 +211,15 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // an object type changes, so we can just rely on that. Problem is it doesn't seem to keep // track of tab widths. buf := new(bytes.Buffer) - p, _ := get.NewHumanPrintFlags().ToPrinter("") - index := 0 + printFlags := get.NewHumanPrintFlags() for t, ot := range objs { - kindHeader := fmt.Sprintf("==> %s", t) - if index == 0 { - kindHeader = kindHeader + "\n" - } + kindHeader := fmt.Sprintf("==> %s\n", t) if _, err = buf.WriteString(kindHeader); err != nil { return "", err } + typePrinter, _ := printFlags.ToPrinter("") for _, o := range ot { - if err := p.PrintObj(o, buf); err != nil { + if err := typePrinter.PrintObj(o, buf); err != nil { c.Log("failed to print object type %s, object: %q :\n %v", t, o, err) return "", err } @@ -230,7 +227,6 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { if _, err := buf.WriteString("\n"); err != nil { return "", err } - index += 1 } if len(missing) > 0 { buf.WriteString(MissingGetHeader) From e23793120b8ce3deeeede070813cd74689ed729c Mon Sep 17 00:00:00 2001 From: Dan Winter Date: Mon, 19 Nov 2018 09:58:25 -0700 Subject: [PATCH 264/483] fix(helm): --set for out of order list values (#4682) When a user specifies value overrides for list values out of order, strvals.listItem panics. Change strvals.listItem to handle this case by re-initializing nil values to a new map. Closes #4503 Co-authored-by: Cameron Childress Co-authored-by: Kevin Collette Co-authored-by: Connor McKelvey Co-authored-by: Dan Winter Signed-off-by: Dan Winter Signed-off-by: Cameron Childress Signed-off-by: Kevin Collette Signed-off-by: Connor McKelvey --- cmd/helm/install_test.go | 8 +++++++- pkg/strvals/parser.go | 8 +++++++- pkg/strvals/parser_test.go | 24 ++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index 168c53fed3f..4a2055640cc 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -61,7 +61,13 @@ func TestInstall(t *testing.T) { resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "virgil"}), expected: "virgil", }, - // Install, values from yaml + { + name: "install with multiple unordered list values", + args: []string{"testdata/testcharts/alpine"}, + flags: strings.Split("--name virgil --set foo[1].bar=baz,foo[0].baz=bar", " "), + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "virgil"}), + expected: "virgil", + }, { name: "install with values", args: []string{"testdata/testcharts/alpine"}, diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index 532a8c4acab..9d52f34c010 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -288,7 +288,13 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) { // We have a nested object. Send to t.key inner := map[string]interface{}{} if len(list) > i { - inner = list[i].(map[string]interface{}) + var ok bool + inner, ok = list[i].(map[string]interface{}) + if !ok { + // We have indices out of order. Initialize empty value. + list[i] = map[string]interface{}{} + inner = list[i].(map[string]interface{}) + } } // Recurse diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index e5d87814937..a096f16d2b0 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -294,6 +294,30 @@ func TestParseSet(t *testing.T) { str: "nested[1][1]=1", expect: map[string]interface{}{"nested": []interface{}{nil, []interface{}{nil, 1}}}, }, + { + str: "name1.name2[0].foo=bar,name1.name2[1].foo=bar", + expect: map[string]interface{}{ + "name1": map[string]interface{}{ + "name2": []map[string]interface{}{{"foo": "bar"}, {"foo": "bar"}}, + }, + }, + }, + { + str: "name1.name2[1].foo=bar,name1.name2[0].foo=bar", + expect: map[string]interface{}{ + "name1": map[string]interface{}{ + "name2": []map[string]interface{}{{"foo": "bar"}, {"foo": "bar"}}, + }, + }, + }, + { + str: "name1.name2[1].foo=bar", + expect: map[string]interface{}{ + "name1": map[string]interface{}{ + "name2": []map[string]interface{}{nil, {"foo": "bar"}}, + }, + }, + }, } for _, tt := range tests { From 5df2c584ce742d3eb7f52886878ebeabdb412d8d Mon Sep 17 00:00:00 2001 From: Joshua Olson Date: Mon, 19 Nov 2018 12:01:39 -0600 Subject: [PATCH 265/483] Securing tiller via running it locally. (#4869) * Securing tiller via running it locally. Signed-off-by: Joshua Olson * Clarify that TLS is the recommended way to secure Helm. Signed-off-by: Joshua Olson --- docs/securing_installation.md | 58 +++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index 454e0cc1267..d47a98bcc13 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -1,6 +1,6 @@ # Securing your Helm Installation -Helm is a powerful and flexible package-management and operations tool for Kubernetes. Installing it using the default installation command -- `helm init` -- quickly and easily installs **Tiller**, the server-side component with which Helm corresponds. +Helm is a powerful and flexible package-management and operations tool for Kubernetes. Installing it using the default installation command -- `helm init` -- quickly and easily installs **Tiller**, the server-side component with which Helm corresponds. This default installation applies **_no security configurations_**, however. It's completely appropriate to use this type of installation when you are working against a cluster with no or very few security concerns, such as local development with Minikube or with a cluster that is well-secured in a private network with no data-sharing or no other users or teams. If this is the case, then the default installation is fine, but remember: With great power comes great responsibility. Always use due diligence when deciding to use the default installation. @@ -12,14 +12,14 @@ For the following types of clusters we strongly recommend that you apply the pro - Clusters that are for many people to use -- _multitenant_ clusters -- as a shared environment - Clusters that have access to or use high-value data or networks of any type -Often, environments like these are referred to as _production grade_ or _production quality_ because the damage done to any company by misuse of the cluster can be profound for either customers, the company itself, or both. Once the risk of damage becomes high enough, you need to ensure the integrity of your cluster no matter what the actual risk. +Often, environments like these are referred to as _production grade_ or _production quality_ because the damage done to any company by misuse of the cluster can be profound for either customers, the company itself, or both. Once the risk of damage becomes high enough, you need to ensure the integrity of your cluster no matter what the actual risk. To configure your installation properly for your environment, you must: - Understand the security context of your cluster - Choose the Best Practices you should apply to your helm installation -The following assumes you have a Kubernetes configuration file (a _kubeconfig_ file) or one was given to you to access a cluster. +The following assumes you have a Kubernetes configuration file (a _kubeconfig_ file) or one was given to you to access a cluster. ## Understanding the Security Context of your Cluster @@ -36,29 +36,43 @@ There are four main areas to consider when securing a tiller installation: Recent versions of Kubernetes employ a [role-based access control (or RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control) system (as do modern operating systems) to help mitigate the damage that can be done if credentials are misused or bugs exist. Even where an identity is hijacked, the identity has only so many permissions to a controlled space. This effectively adds a layer of security to limit the scope of any attack with that identity. -Helm and Tiller are designed to install, remove, and modify logical applications that can contain many services interacting together. As a result, often its usefulness involves cluster-wide operations, which in a multitenant cluster means that great care must be taken with access to a cluster-wide Tiller installation to prevent improper activity. +Helm and Tiller are designed to install, remove, and modify logical applications that can contain many services interacting together. As a result, often its usefulness involves cluster-wide operations, which in a multitenant cluster means that great care must be taken with access to a cluster-wide Tiller installation to prevent improper activity. Specific users and teams -- developers, operators, system and network administrators -- will need their own portion of the cluster in which they can use Helm and Tiller without risking other portions of the cluster. This means using a Kubernetes cluster with RBAC enabled and Tiller configured to enforce them. For more information about using RBAC in Kubernetes, see [Using RBAC Authorization](rbac.md). #### Tiller and User Permissions -Tiller in its current form does not provide a way to map user credentials to specific permissions within Kubernetes. When Tiller is running inside of the cluster, it operates with the permissions of its service account. If no service account name is supplied to Tiller, it runs with the default service account for that namespace. This means that all Tiller operations on that server are executed using the Tiller pod's credentials and permissions. +Tiller in its current form does not provide a way to map user credentials to specific permissions within Kubernetes. When Tiller is running inside of the cluster, it operates with the permissions of its service account. If no service account name is supplied to Tiller, it runs with the default service account for that namespace. This means that all Tiller operations on that server are executed using the Tiller pod's credentials and permissions. -To properly limit what Tiller itself can do, the standard Kubernetes RBAC mechanisms must be attached to Tiller, including Roles and RoleBindings that place explicit limits on what things a Tiller instance can install, and where. +To properly limit what Tiller itself can do, the standard Kubernetes RBAC mechanisms must be attached to Tiller, including Roles and RoleBindings that place explicit limits on what things a Tiller instance can install, and where. -This situation may change in the future. While the community has several methods that might address this, at the moment performing actions using the rights of the client, instead of the rights of Tiller, is contingent upon the outcome of the Pod Identity Working Group, which has taken on the task of solving the problem in a general way. +This situation may change in the future. While the community has several methods that might address this, at the moment performing actions using the rights of the client, instead of the rights of Tiller, is contingent upon the outcome of the Pod Identity Working Group, which has taken on the task of solving the problem in a general way. - -### The Tiller gRPC Endpoint and TLS +### The Tiller gRPC Endpoint In the default installation the gRPC endpoint that Tiller offers is available inside the cluster (not external to the cluster) without authentication configuration applied. Without applying authentication, any process in the cluster can use the gRPC endpoint to perform operations inside the cluster. In a local or secured private cluster, this enables rapid usage and is normal. (When running outside the cluster, Helm authenticates through the Kubernetes API server to reach Tiller, leveraging existing Kubernetes authentication support.) -Shared and production clusters -- for the most part -- should use Helm 2.7.2 at a minimum and configure TLS for each Tiller gRPC endpoint to ensure that within the cluster usage of gRPC endpoints is only for the properly authenticated identity for that endpoint. Doing so enables any number of Tiller instances to be deployed in any number of namespaces and yet no unauthenticated usage of any gRPC endpoint is possible. Finally, use Helm `init` with the `--tiller-tls-verify` option to install Tiller with TLS enabled and to verify remote certificates, and all other Helm commands should use the `--tls` option. +The following two sub-sections describe options of how to setup Tiller so there isn't an unauthenticated endpoint (i.e. gRPC) in your cluster. + +#### Enabling TLS + +(Note that out of the two options, this is the recommended one for Helm 2.) + +Shared and production clusters -- for the most part -- should use Helm 2.7.2 at a minimum and configure TLS for each Tiller gRPC endpoint to ensure that within the cluster usage of gRPC endpoints is only for the properly authenticated identity for that endpoint (i.e. configure each endpoint to use a separate TLS certificate). Doing so enables any number of Tiller instances to be deployed in any number of namespaces and yet no unauthenticated usage of any gRPC endpoint is possible. Finally, use Helm `init` with the `--tiller-tls-verify` option to install Tiller with TLS enabled and to verify remote certificates, and all other Helm commands should use the `--tls` option. -For more information about the proper steps to configure Tiller and use Helm properly with TLS configured, see [Using SSL between Helm and Tiller](tiller_ssl.md). +For more information about the proper steps to configure Tiller and use Helm properly with TLS configured, see the [Best Practices](#best-practices-for-securing-helm-and-tiller) section below, and [Using SSL between Helm and Tiller](tiller_ssl.md). When Helm clients are connecting from outside of the cluster, the security between the Helm client and the API server is managed by Kubernetes itself. You may want to ensure that this link is secure. Note that if you are using the TLS configuration recommended above, not even the Kubernetes API server has access to the encrypted messages between the client and Tiller. +#### Running Tiller Locally + +Contrary to the previous [Enabling TLS](#enabling-tls) section, this section does not involve running a tiller server pod in your cluster (for what it's worth, that lines up with the current [helm v3 proposal](https://github.com/helm/community/blob/master/helm-v3/000-helm-v3.md)), thus there is no gRPC endpoint (and thus there's no need to create & manage TLS certificates to secure each gRPC endpoint). + +Steps: + * Fetch the latest helm release tarball from the [GitHub release page](https://github.com/helm/helm/releases), and extract and move `helm` and `tiller` somewhere on your `$PATH`. + * "Server": Run `tiller --storage=secret`. (Note that `tiller` has a default value of ":44134" for the `--listen` argument.) + * Client: In another terminal (and on the same host that the aforementioned `tiller` command was run for the previous bullet): Run `export HELM_HOST=:44134`, and then run `helm` commands as usual. + ### Tiller's Release Information For historical reasons, Tiller stores its release information in ConfigMaps. We suggest changing the default to Secrets. @@ -69,9 +83,9 @@ Enabling this feature currently requires setting the `--storage=secret` flag in ### Thinking about Charts -Because of the relative longevity of Helm, the Helm chart ecosystem evolved without the immediate concern for cluster-wide control, and especially in the developer space this makes complete sense. However, charts are a kind of package that not only installs containers you may or may not have validated yourself, but it may also install into more than one namespace. +Because of the relative longevity of Helm, the Helm chart ecosystem evolved without the immediate concern for cluster-wide control, and especially in the developer space this makes complete sense. However, charts are a kind of package that not only installs containers you may or may not have validated yourself, but it may also install into more than one namespace. -As with all shared software, in a controlled or shared environment you must validate all software you install yourself _before_ you install it. If you have secured Tiller with TLS and have installed it with permissions to only one or a subset of namespaces, some charts may fail to install -- but in these environments, that is exactly what you want. If you need to use the chart, you may have to work with the creator or modify it yourself in order to use it securely in a multitenant cluster with proper RBAC rules applied. The `helm template` command renders the chart locally and displays the output. +As with all shared software, in a controlled or shared environment you must validate all software you install yourself _before_ you install it. If you have secured Tiller with TLS and have installed it with permissions to only one or a subset of namespaces, some charts may fail to install -- but in these environments, that is exactly what you want. If you need to use the chart, you may have to work with the creator or modify it yourself in order to use it securely in a multitenant cluster with proper RBAC rules applied. The `helm template` command renders the chart locally and displays the output. Once vetted, you can use Helm's provenance tools to [ensure the provenance and integrity of charts](provenance.md) that you use. @@ -81,16 +95,15 @@ Many very useful tools use the gRPC interface directly, and having been built ag ## Best Practices for Securing Helm and Tiller -The following guidelines reiterate the Best Practices for securing Helm and Tiller and using them correctly. +The following guidelines reiterate the Best Practices for securing Helm and Tiller and using them correctly. 1. Create a cluster with RBAC enabled -2. Configure each Tiller gRPC endpoint to use a separate TLS certificate -3. Release information should be a Kubernetes Secret +2. Configure each Tiller gRPC endpoint to use a separate TLS certificate +3. Release information should be a Kubernetes Secret 4. Install one Tiller per user, team, or other organizational entity with the `--service-account` flag, Roles, and RoleBindings 5. Use the `--tiller-tls-verify` option with `helm init` and the `--tls` flag with other Helm commands to enforce verification -If these steps are followed, an example `helm init` command might look something like this: - +If these steps are followed, an example `helm init` command might look something like this: ```bash $ helm init \ --override 'spec.template.spec.containers[0].command'='{/tiller,--storage=secret}' \ @@ -102,11 +115,4 @@ $ helm init \ --service-account=accountname ``` -This command will start Tiller with strong authentication over gRPC, release information stored in a Kubernetes Secret, and a service account to which RBAC policies have been applied. - - - - - - - +This command will start Tiller with strong authentication over gRPC, release information stored in a Kubernetes Secret, and a service account to which RBAC policies have been applied. From 560b84d53c05885ba84384574520fdcf626937a3 Mon Sep 17 00:00:00 2001 From: Geoff Baskwill Date: Mon, 19 Nov 2018 15:24:20 -0500 Subject: [PATCH 266/483] docs: use nindent in documentation examples (#4905) * docs: markdown prettyprinting Signed-off-by: Geoff Baskwill * docs: use nindent in documentation examples Fixes #4890. Signed-off-by: Geoff Baskwill --- docs/chart_template_guide/accessing_files.md | 15 +++---- docs/chart_template_guide/named_templates.md | 14 +++--- docs/charts_tips_and_tricks.md | 45 ++++++++++++-------- 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/docs/chart_template_guide/accessing_files.md b/docs/chart_template_guide/accessing_files.md index c959002b72f..206ad0cec44 100644 --- a/docs/chart_template_guide/accessing_files.md +++ b/docs/chart_template_guide/accessing_files.md @@ -6,8 +6,8 @@ Helm provides access to files through the `.Files` object. Before we get going w - It is okay to add extra files to your Helm chart. These files will be bundled and sent to Tiller. Be careful, though. Charts must be smaller than 1M because of the storage limitations of Kubernetes objects. - Some files cannot be accessed through the `.Files` object, usually for security reasons. - - Files in `templates/` cannot be accessed. - - Files excluded using `.helmignore` cannot be accessed. + - Files in `templates/` cannot be accessed. + - Files excluded using `.helmignore` cannot be accessed. - Charts do not preserve UNIX mode information, so file-level permissions will have no impact on the availability of a file when it comes to the `.Files` object. @@ -90,6 +90,7 @@ use. They are all accessible with the same names as in the Go package, but with a lowercase first letter. For example, `Base` becomes `base`, etc. The imported functions are: + - Base - Dir - Ext @@ -107,8 +108,8 @@ the returned object. For example, imagine the directory structure: -``` -foo/: +```txt +foo/: foo.txt foo.yaml bar/: @@ -117,7 +118,6 @@ bar/: You have multiple options with Globs: - ```yaml {{ $root := . }} {{ range $path, $bytes := .Files.Glob "**.yaml" }} @@ -153,7 +153,7 @@ kind: ConfigMap metadata: name: conf data: -{{ (.Files.Glob "foo/*").AsConfig | indent 2 }} + {{- (.Files.Glob "foo/*").AsConfig | nindent 2 }} --- apiVersion: v1 kind: Secret @@ -161,7 +161,7 @@ metadata: name: very-secret type: Opaque data: -{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }} + {{- (.Files.Glob "bar/*").AsSecrets | nindent 2 }} ``` ## Encoding @@ -207,4 +207,3 @@ data: Currently, there is no way to pass files external to the chart during `helm install`. So if you are asking users to supply data, it must be loaded using `helm install -f` or `helm install --set`. This discussion wraps up our dive into the tools and techniques for writing Helm templates. In the next section we will see how you can use one special file, `templates/NOTES.txt`, to send post-installation instructions to the users of your chart. - diff --git a/docs/chart_template_guide/named_templates.md b/docs/chart_template_guide/named_templates.md index 33425d102bc..08e41d58d65 100644 --- a/docs/chart_template_guide/named_templates.md +++ b/docs/chart_template_guide/named_templates.md @@ -14,9 +14,9 @@ So far, we've used one file, and that one file has contained a single template. Before we get to the nuts-and-bolts of writing those templates, there is file naming convention that deserves mention: -* Most files in `templates/` are treated as if they contain Kubernetes manifests -* The `NOTES.txt` is one exception -* But files whose name begins with an underscore (`_`) are assumed to _not_ have a manifest inside. These files are not rendered to Kubernetes object definitions, but are available everywhere within other chart templates for use. +- Most files in `templates/` are treated as if they contain Kubernetes manifests +- The `NOTES.txt` is one exception +- But files whose name begins with an underscore (`_`) are assumed to _not_ have a manifest inside. These files are not rendered to Kubernetes object definitions, but are available everywhere within other chart templates for use. These files are used to store partials and helpers. In fact, when we first created `mychart`, we saw a file called `_helpers.tpl`. That file is the default location for template partials. @@ -139,7 +139,7 @@ metadata: What happened to the name and version? They weren't in the scope for our defined template. When a named template (created with `define`) is rendered, it will receive the scope passed in by the `template` call. In our example, we included the template like this: -```yaml +```gotpl {{- template "mychart.labels" }} ``` @@ -223,7 +223,7 @@ Note that the indentation on `app_version` is wrong in both places. Why? Because To work around this case, Helm provides an alternative to `template` that will import the contents of a template into the present pipeline where it can be passed along to other functions in the pipeline. -Here's the example above, corrected to use `indent` to indent the `mychart_app` template correctly: +Here's the example above, corrected to use `nindent` to indent the `mychart_app` template correctly: ```yaml apiVersion: v1 @@ -231,13 +231,13 @@ kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: -{{ include "mychart.app" . | indent 4 }} + {{- include "mychart.app" . | nindent 4 }} data: myvalue: "Hello World" {{- range $key, $val := .Values.favorite }} {{ $key }}: {{ $val | quote }} {{- end }} -{{ include "mychart.app" . | indent 2 }} + {{- include "mychart.app" . | nindent 2 }} ``` Now the produced YAML is correctly indented for each section: diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index f1751b1b52a..e948d3bcfb8 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -22,18 +22,18 @@ For example, this template snippet includes a template called `mytpl`, then lowercases the result, then wraps that in double quotes. ```yaml -value: {{include "mytpl" . | lower | quote}} +value: {{ include "mytpl" . | lower | quote }} ``` The `required` function allows you to declare a particular -values entry as required for template rendering. If the value is empty, the template +values entry as required for template rendering. If the value is empty, the template rendering will fail with a user submitted error message. The following example of the `required` function declares an entry for .Values.who is required, and will print an error message when that entry is missing: ```yaml -value: {{required "A valid .Values.who entry required!" .Values.who }} +value: {{ required "A valid .Values.who entry required!" .Values.who }} ``` ## Quote Strings, Don't Quote Integers @@ -41,20 +41,20 @@ value: {{required "A valid .Values.who entry required!" .Values.who }} When you are working with string data, you are always safer quoting the strings than leaving them as bare words: -``` -name: {{.Values.MyName | quote }} +```yaml +name: {{ .Values.MyName | quote }} ``` But when working with integers _do not quote the values._ That can, in many cases, cause parsing errors inside of Kubernetes. -``` +```yaml port: {{ .Values.Port }} ``` This remark does not apply to env variables values which are expected to be string, even if they represent integers: -``` +```yaml env: -name: HOST value: "http://host" @@ -71,12 +71,16 @@ Go template pipelines. To make it possible to include a template, and then perform an operation on that template's output, Helm has a special `include` function: -``` -{{ include "toYaml" $value | indent 2 }} +```gotpl +{{- include "toYaml" $value | nindent 2 }} ``` The above includes a template called `toYaml`, passes it `$value`, and -then passes the output of that template to the `indent` function. +then passes the output of that template to the `nindent` function. Using +the `{{- ... | nindent _n_ }}` pattern makes it easier to read the `include` +in context, because it chomps the whitespace to the left (including the +previous newline), then the `nindent` re-adds the newline and indents +the included content by the requested amount. Because YAML ascribes significance to indentation levels and whitespace, this is one great way to include snippets of code, but handle @@ -99,7 +103,7 @@ developer. For example: -``` +```gotpl {{ required "A valid foo is required!" .Values.foo }} ``` @@ -113,7 +117,8 @@ This is useful to pass a template string as a value to a chart or render externa Syntax: `{{ tpl TEMPLATE_STRING VALUES }}` Examples: -``` + +```yaml # values template: "{{ .Values.name }}" name: "Tom" @@ -126,7 +131,8 @@ Tom ``` Rendering a external configuration file: -``` + +```yaml # external configuration file conf/app.conf firstName={{ .Values.firstName }} lastName={{ .Values.lastName }} @@ -144,10 +150,12 @@ lastName=Parker ``` ## Creating Image Pull Secrets -Image pull secrets are essentially a combination of _registry_, _username_, and _password_. You may need them in an application you are deploying, but to create them requires running _base64_ a couple of times. We can write a helper template to compose the Docker configuration file for use as the Secret's payload. Here is an example: + +Image pull secrets are essentially a combination of _registry_, _username_, and _password_. You may need them in an application you are deploying, but to create them requires running _base64_ a couple of times. We can write a helper template to compose the Docker configuration file for use as the Secret's payload. Here is an example: First, assume that the credentials are defined in the `values.yaml` file like so: -``` + +```yaml imageCredentials: registry: quay.io username: someone @@ -155,14 +163,16 @@ imageCredentials: ``` We then define our helper template as follows: -``` + +```gotpl {{- define "imagePullSecret" }} {{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.imageCredentials.registry (printf "%s:%s" .Values.imageCredentials.username .Values.imageCredentials.password | b64enc) | b64enc }} {{- end }} ``` Finally, we use the helper template in a larger template to create the Secret manifest: -``` + +```yaml apiVersion: v1 kind: Secret metadata: @@ -282,6 +292,7 @@ update of that resource. ## Upgrade a release idempotently In order to use the same command when installing and upgrading a release, use the following command: + ```shell helm upgrade --install --values ``` From 403af2c3895e4fa0e04713d94135bf3438d9ce9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Filip?= Date: Tue, 20 Nov 2018 13:55:48 +0100 Subject: [PATCH 267/483] Update control_structures.md (#4948) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update position of `and` operator Signed-off-by: René Filip --- docs/chart_template_guide/control_structures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 511318731d9..61d9ef9e2df 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -53,7 +53,7 @@ data: myvalue: "Hello World" drink: {{ .Values.favorite.drink | default "tea" | quote }} food: {{ .Values.favorite.food | upper | quote }} - {{ if (.Values.favorite.drink) and eq .Values.favorite.drink "coffee" }}mug: true{{ end }} + {{ if and (.Values.favorite.drink) (eq .Values.favorite.drink "coffee") }}mug: true{{ end }} ``` Note that `.Values.favorite.drink` must be defined or else it will throw an error when comparing it to "coffee". Since we commented out `drink: coffee` in our last example, the output should not include a `mug: true` flag. But if we add that line back into our `values.yaml` file, the output should look like this: From d3357fad37ad0654e8b080bef1a064fa2723b0aa Mon Sep 17 00:00:00 2001 From: Geoff Baskwill Date: Tue, 20 Nov 2018 11:54:32 -0500 Subject: [PATCH 268/483] chore(deps): update cobra to latest (#4913) Signed-off-by: Geoff Baskwill --- glide.lock | 6 +++--- glide.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/glide.lock b/glide.lock index c25f439bd42..16ea64ff586 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 30b1d3f31b7bd310a9434e081bae3d5dc18c0a79b3674c0adffccc8d602e9227 -updated: 2018-10-04T17:11:58.043264Z +hash: fcbba2207c6511df365dfe355dfe601a862d340bbf15db47938a404fd0ec58d0 +updated: 2018-11-11T19:26:29.631232-05:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -249,7 +249,7 @@ imports: - name: github.com/sirupsen/logrus version: 89742aefa4b206dcf400792f3bd35b542998eb3b - name: github.com/spf13/cobra - version: c439c4fa093711d42e1b01acb1235b52004753c1 + version: fe5e611709b0c57fa4a89136deaa8e1d4004d053 subpackages: - doc - name: github.com/spf13/pflag diff --git a/glide.yaml b/glide.yaml index 37c3f857e01..f0028b57922 100644 --- a/glide.yaml +++ b/glide.yaml @@ -4,7 +4,7 @@ import: subpackages: - context - package: github.com/spf13/cobra - version: c439c4fa093711d42e1b01acb1235b52004753c1 + version: fe5e611709b0c57fa4a89136deaa8e1d4004d053 - package: github.com/spf13/pflag version: ~1.0.1 - package: github.com/Masterminds/vcs From 97465abda0b6a9e9934092c6245070fd91088023 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 28 Nov 2018 09:59:32 -0800 Subject: [PATCH 269/483] fix(windows): fix unit tests on Windows (#4897) Signed-off-by: Matthew Fisher --- .appveyor.yml | 6 +++--- cmd/helm/helm_test.go | 5 +++-- cmd/helm/package_test.go | 11 ++++++++++- cmd/helm/template_test.go | 2 +- cmd/helm/verify_test.go | 2 +- pkg/chartutil/load.go | 1 + pkg/chartutil/requirements_test.go | 9 ++++++++- pkg/chartutil/testdata/joonix/charts/.gitkeep | 0 pkg/chartutil/testdata/joonix/charts/frobnitz | 1 - pkg/getter/plugingetter_test.go | 5 +++++ pkg/repo/index.go | 7 +++++-- pkg/repo/index_test.go | 2 +- 12 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 pkg/chartutil/testdata/joonix/charts/.gitkeep delete mode 120000 pkg/chartutil/testdata/joonix/charts/frobnitz diff --git a/.appveyor.yml b/.appveyor.yml index d7ba1d9fd36..40d02927dfe 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -6,10 +6,10 @@ environment: install: - ps: iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/fishworks/gofish/master/scripts/install.ps1')) - gofish init - - gofish install dep - - dep ensure -v + - gofish install glide + - glide install --strip-vendor cache: - - vendor -> Gopkg.lock + - vendor -> glide.lock build: "off" deploy: "off" test_script: diff --git a/cmd/helm/helm_test.go b/cmd/helm/helm_test.go index 3551eb5349f..6e915fa7b31 100644 --- a/cmd/helm/helm_test.go +++ b/cmd/helm/helm_test.go @@ -29,6 +29,7 @@ import ( "github.com/spf13/cobra" + "k8s.io/client-go/util/homedir" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm/environment" "k8s.io/helm/pkg/helm/helmpath" @@ -167,7 +168,7 @@ func TestRootCmd(t *testing.T) { { name: "defaults", args: []string{"home"}, - home: filepath.Join(os.Getenv("HOME"), "/.helm"), + home: filepath.Join(homedir.HomeDir(), ".helm"), }, { name: "with --home set", @@ -236,7 +237,7 @@ func TestTLSFlags(t *testing.T) { homePath := os.Getenv("HELM_HOME") if homePath == "" { - homePath = filepath.Join(os.Getenv("HOME"), ".helm") + homePath = filepath.Join(homedir.HomeDir(), ".helm") } home := helmpath.Home(homePath) diff --git a/cmd/helm/package_test.go b/cmd/helm/package_test.go index 7ed9829a5c5..d3bd25af7b5 100644 --- a/cmd/helm/package_test.go +++ b/cmd/helm/package_test.go @@ -17,10 +17,12 @@ package main import ( "bytes" + "fmt" "io/ioutil" "os" "path/filepath" "regexp" + "runtime" "testing" "github.com/spf13/cobra" @@ -53,6 +55,13 @@ func TestSetVersion(t *testing.T) { func TestPackage(t *testing.T) { + statExe := "stat" + statFileMsg := "no such file or directory" + if runtime.GOOS == "windows" { + statExe = "FindFirstFile" + statFileMsg = "The system cannot find the file specified." + } + tests := []struct { name string flags map[string]string @@ -106,7 +115,7 @@ func TestPackage(t *testing.T) { name: "package --destination does-not-exist", args: []string{"testdata/testcharts/alpine"}, flags: map[string]string{"destination": "does-not-exist"}, - expect: "stat does-not-exist: no such file or directory", + expect: fmt.Sprintf("Failed to save: %s does-not-exist: %s", statExe, statFileMsg), err: true, }, { diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index ec989ea67e3..98044eff0ec 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -75,7 +75,7 @@ func TestTemplateCmd(t *testing.T) { { name: "check_execute_absolute", desc: "verify --execute single template", - args: []string{subchart1ChartPath, "-x", subchart1AbsChartPath + "/" + "templates/service.yaml", "--set", "service.name=apache"}, + args: []string{subchart1ChartPath, "-x", filepath.Join(subchart1AbsChartPath, "templates", "service.yaml"), "--set", "service.name=apache"}, expectKey: "subchart1/templates/service.yaml", expectValue: "protocol: TCP\n name: apache", }, diff --git a/cmd/helm/verify_test.go b/cmd/helm/verify_test.go index 4d683df7578..d4a580c23ea 100644 --- a/cmd/helm/verify_test.go +++ b/cmd/helm/verify_test.go @@ -28,7 +28,7 @@ func TestVerifyCmd(t *testing.T) { statPathMsg := "no such file or directory" statFileMsg := statPathMsg if runtime.GOOS == "windows" { - statExe = "GetFileAttributesEx" + statExe = "FindFirstFile" statPathMsg = "The system cannot find the path specified." statFileMsg = "The system cannot find the file specified." } diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go index b3daefac736..9f1c80c85a9 100644 --- a/pkg/chartutil/load.go +++ b/pkg/chartutil/load.go @@ -43,6 +43,7 @@ import ( // If a .helmignore file is present, the directory loader will skip loading any files // matching it. But .helmignore is not evaluated when reading out of an archive. func Load(name string) (*chart.Chart, error) { + name = filepath.FromSlash(name) fi, err := os.Stat(name) if err != nil { return nil, err diff --git a/pkg/chartutil/requirements_test.go b/pkg/chartutil/requirements_test.go index 0afde17e16a..e433f92eadf 100644 --- a/pkg/chartutil/requirements_test.go +++ b/pkg/chartutil/requirements_test.go @@ -15,6 +15,8 @@ limitations under the License. package chartutil import ( + "os" + "path/filepath" "sort" "testing" @@ -426,7 +428,12 @@ func TestDependentChartWithSubChartsHelmignore(t *testing.T) { } func TestDependentChartsWithSubChartsSymlink(t *testing.T) { - c, err := Load("testdata/joonix") + joonix := "testdata/joonix" + if err := os.Symlink(filepath.Join("..", "..", "frobnitz"), filepath.Join(joonix, "charts", "frobnitz")); err != nil { + t.Fatal(err) + } + defer os.RemoveAll(filepath.Join(joonix, "charts", "frobnitz")) + c, err := Load(joonix) if err != nil { t.Fatalf("Failed to load testdata: %s", err) } diff --git a/pkg/chartutil/testdata/joonix/charts/.gitkeep b/pkg/chartutil/testdata/joonix/charts/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/pkg/chartutil/testdata/joonix/charts/frobnitz b/pkg/chartutil/testdata/joonix/charts/frobnitz deleted file mode 120000 index fde1b78ac5f..00000000000 --- a/pkg/chartutil/testdata/joonix/charts/frobnitz +++ /dev/null @@ -1 +0,0 @@ -../../frobnitz \ No newline at end of file diff --git a/pkg/getter/plugingetter_test.go b/pkg/getter/plugingetter_test.go index 9bfe6144df1..7c0bd6c1e1f 100644 --- a/pkg/getter/plugingetter_test.go +++ b/pkg/getter/plugingetter_test.go @@ -18,6 +18,7 @@ package getter import ( "os" "path/filepath" + "runtime" "strings" "testing" @@ -67,6 +68,10 @@ func TestCollectPlugins(t *testing.T) { } func TestPluginGetter(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("TODO: refactor this test to work on windows") + } + oldhh := os.Getenv("HELM_HOME") defer os.Setenv("HELM_HOME", oldhh) os.Setenv("HELM_HOME", "") diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 01bf4a8ca2a..9031463f320 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -22,6 +22,7 @@ import ( "fmt" "io/ioutil" "os" + "path" "path/filepath" "sort" "strings" @@ -110,7 +111,7 @@ func (i IndexFile) Add(md *chart.Metadata, filename, baseURL, digest string) { _, file := filepath.Split(filename) u, err = urlutil.URLJoin(baseURL, file) if err != nil { - u = filepath.Join(baseURL, file) + u = path.Join(baseURL, file) } } cr := &ChartVersion{ @@ -246,9 +247,11 @@ func IndexDirectory(dir, baseURL string) (*IndexFile, error) { var parentDir string parentDir, fname = filepath.Split(fname) + // filepath.Split appends an extra slash to the end of parentDir. We want to strip that out. + parentDir = strings.TrimSuffix(parentDir, string(os.PathSeparator)) parentURL, err := urlutil.URLJoin(baseURL, parentDir) if err != nil { - parentURL = filepath.Join(baseURL, parentDir) + parentURL = path.Join(baseURL, parentDir) } c, err := chartutil.Load(arch) diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index 2ce817ce3a9..7c9239b7a91 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -272,7 +272,7 @@ func verifyLocalIndex(t *testing.T, i *IndexFile) { } func TestIndexDirectory(t *testing.T) { - dir := "testdata/repository" + dir := filepath.Join("testdata", "repository") index, err := IndexDirectory(dir, "http://localhost:8080") if err != nil { t.Fatal(err) From c18d7726ac36e538c85a222f9833cb62f2275b17 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Wed, 28 Nov 2018 10:01:22 -0800 Subject: [PATCH 270/483] Adding link labels to doc links for more conspicuity (#4904) Signed-off-by: tariqibrahim --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7958a9adb17..aba3388a698 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -178,7 +178,7 @@ contributing to Helm. All issue types follow the same general lifecycle. Differe 1. Submit a pull request. Coding conventions and standards are explained in the official developer docs: -https://github.com/helm/helm/blob/master/docs/developers.md +[Developers Guide](docs/developers.md) The next section contains more information on the workflow followed for PRs From 8fcefd7d959ce10448507944b2418f29da532f5d Mon Sep 17 00:00:00 2001 From: Jintao Zhang Date: Thu, 29 Nov 2018 02:05:33 +0800 Subject: [PATCH 271/483] Fix doc charts indent (#4940) Signed-off-by: Jintao Zhang --- docs/charts.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/charts.md b/docs/charts.md index 2f760535024..64fc6893418 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -259,27 +259,27 @@ Tags - The tags field is a YAML list of labels to associate with this chart. In the top parent's values, all charts with tags can be enabled or disabled by specifying the tag and a boolean value. -```` +```yaml # parentchart/requirements.yaml dependencies: - - name: subchart1 - repository: http://localhost:10191 - version: 0.1.0 - condition: subchart1.enabled,global.subchart1.enabled - tags: - - front-end - - subchart1 - - - name: subchart2 - repository: http://localhost:10191 - version: 0.1.0 - condition: subchart2.enabled,global.subchart2.enabled - tags: - - back-end + - name: subchart1 + repository: http://localhost:10191 + version: 0.1.0 + condition: subchart1.enabled,global.subchart1.enabled + tags: + - front-end + - subchart1 + + - name: subchart2 + repository: http://localhost:10191 + version: 0.1.0 + condition: subchart2.enabled,global.subchart2.enabled + tags: + - back-end - subchart2 -```` -```` +``` +```yaml # parentchart/values.yaml subchart1: From 865c1d3c7757a12271e0d9dca805f8d54b5f6456 Mon Sep 17 00:00:00 2001 From: Abu Hanifa Date: Thu, 29 Nov 2018 00:06:04 +0600 Subject: [PATCH 272/483] Error message if anyone try to create multiple helm chart at a time (#4952) * error message for creating multiple helm chart at a time Signed-off-by: hanif * Update cmd/helm/create.go Co-Authored-By: a8uhnf Signed-off-by: hanif --- cmd/helm/create.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/helm/create.go b/cmd/helm/create.go index 7f0f99af8db..0d278c8b516 100644 --- a/cmd/helm/create.go +++ b/cmd/helm/create.go @@ -75,6 +75,9 @@ func newCreateCmd(out io.Writer) *cobra.Command { if len(args) == 0 { return errors.New("the name of the new chart is required") } + if len(args) > 1 { + return errors.New("command 'create' doesn't support multiple arguments") + } cc.name = args[0] return cc.run() }, From ea158a6aad9d741791e0f77cb34a541fdd9bde64 Mon Sep 17 00:00:00 2001 From: Ishaan Malhi <12560808+OrthoDex@users.noreply.github.com> Date: Wed, 28 Nov 2018 23:42:41 +0530 Subject: [PATCH 273/483] docs: add documentation for the helmignore file (#4966) * docs: add documentation for the helmignore file Signed-off-by: Ishaan Malhi * docs: rearrange helmignore docs under chart template developer's guide Signed-off-by: Ishaan Malhi --- docs/README.md | 1 + docs/chart_template_guide/helm_ignore_file.md | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 docs/chart_template_guide/helm_ignore_file.md diff --git a/docs/README.md b/docs/README.md index 4ca93bd1f34..ed13cc22a23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,6 +24,7 @@ - [Variables](chart_template_guide/variables.md) - [Named Templates (Partials)](chart_template_guide/named_templates.md) - [Accessing Files Inside Templates](chart_template_guide/accessing_files.md) + - [Ignoring unwanted files and folders](chart_template_guide/helm_ignore_file.md) - [Creating a NOTES.txt File](chart_template_guide/notes_files.md) - [Subcharts and Global Values](chart_template_guide/subcharts_and_globals.md) - [Debugging Templates](chart_template_guide/debugging.md) diff --git a/docs/chart_template_guide/helm_ignore_file.md b/docs/chart_template_guide/helm_ignore_file.md new file mode 100644 index 00000000000..6793bdfeccc --- /dev/null +++ b/docs/chart_template_guide/helm_ignore_file.md @@ -0,0 +1,23 @@ +# The .helmignore file + +The `.helmignore` file is used to specify files you don't want to include in your helm chart. + +If this file exists, the `helm package` command will ignore all the files that match the pattern specified in the `.helmignore` file while packaging your application. + +This can help in avoiding unncessary or sensitive files or directories from being added in your helm chart. + +The `.helmignore` file supports Unix shell glob matching, relative path matching, and negation (prefixed with !). Only one pattern per line is considered. + +Here is an example `.helmignore` file: + +``` +# comment +.git +*/temp* +*/*/temp* +temp? +``` + +**We'd love your help** making this document better. To add, correct, or remove +information, [file an issue](https://github.com/helm/helm/issues) or +send us a pull request. From 5584e5c5d815143aada08438cf6e936f7f79e6b3 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Wed, 28 Nov 2018 18:22:39 +0000 Subject: [PATCH 274/483] Update chart doc with details about the license file (#4977) Signed-off-by: Martin Hickey --- docs/charts.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/charts.md b/docs/charts.md index 64fc6893418..5a895fd494a 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -124,7 +124,14 @@ project is: ## Chart LICENSE, README and NOTES Charts can also contain files that describe the installation, configuration, usage and license of a -chart. A README for a chart should be formatted in Markdown (README.md), and should generally +chart. + +A LICENSE is a plain text file containing the [license](https://en.wikipedia.org/wiki/Software_license) +for the chart. The chart can contain a license as it may have programming logic in the templates and +would therefore not be configuration only. There can also be separate license(s) for the application +installed by the chart, if required. + +A README for a chart should be formatted in Markdown (README.md), and should generally contain: - A description of the application or service the chart provides From ede43a313dde2611ea63e89546af46854b4121d4 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 15 Nov 2018 13:41:25 -0800 Subject: [PATCH 275/483] fix(helm): Print details for pod resource Due to a regression from a previous change, details about pod resources does not show up in the status output. This makes sure that the pod type from core are passed in to the printer so the details are shown in the output. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 0cc68b71b57..6a7877d6b78 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -48,6 +48,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" watchtools "k8s.io/client-go/tools/watch" "k8s.io/kubernetes/pkg/api/legacyscheme" + "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/kubectl/cmd/get" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/validation" @@ -202,7 +203,9 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { //here, we will add the objPods to the objs for key, podItems := range objPods { for i := range podItems { - objs[key+"(related)"] = append(objs[key+"(related)"], &podItems[i]) + pod := &core.Pod{} + legacyscheme.Scheme.Convert(&podItems[i], pod, nil) + objs[key+"(related)"] = append(objs[key+"(related)"], pod) } } From 75b4afaa33a02ff01f041cf58a01535bca770cd6 Mon Sep 17 00:00:00 2001 From: Luke Hoban Date: Wed, 28 Nov 2018 11:15:49 -0800 Subject: [PATCH 276/483] Allow missing trailing '/' in --repo url (#4956) Apply the same procedure to allow missing trailing slash in repo base URLs used in `repo/chart` inputs to `--repo` inputs. Fixes #4954. Signed-off-by: Luke Hoban --- pkg/repo/chartrepo.go | 4 +++- pkg/repo/chartrepo_test.go | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index cd9d6c54728..c512c5b7e25 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -270,10 +270,12 @@ func ResolveReferenceURL(baseURL, refURL string) (string, error) { return "", fmt.Errorf("failed to parse %s as URL: %v", refURL, err) } + // We need a trailing slash for ResolveReference to work, but make sure there isn't already one + parsedBaseURL.Path = strings.TrimSuffix(parsedBaseURL.Path, "/") + "/" + resolvedURL := parsedBaseURL.ResolveReference(parsedRefURL) // if the base URL contains query string parameters, // propagate them to the child URL but only if the // refURL is relative to baseURL - resolvedURL := parsedBaseURL.ResolveReference(parsedRefURL) if (resolvedURL.Hostname() == parsedBaseURL.Hostname()) && (resolvedURL.Port() == parsedBaseURL.Port()) { resolvedURL.RawQuery = parsedBaseURL.RawQuery } diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 19071872d9f..a2f1daeb807 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -287,6 +287,14 @@ func TestResolveReferenceURL(t *testing.T) { t.Errorf("%s", chartURL) } + chartURL, err = ResolveReferenceURL("http://localhost:8123/charts", "nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "http://localhost:8123/charts/nginx-0.2.0.tgz" { + t.Errorf("%s", chartURL) + } + chartURL, err = ResolveReferenceURL("http://localhost:8123/charts/?st=2018-08-06T22%3A59%3A04Z&se=2018-08-07T22%3A59%3A04Z&sp=rl&sv=2018-03-28&sr=c&sig=cyqM4%2F5G7HNk%2F3faaHSDMaWxFxefCglvZlYSnmQBwiY%3D", "nginx-0.2.0.tgz") if err != nil { t.Errorf("%s", err) From 5bf38a2d7d572c4317e18c4ecbe7023403b979bb Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Wed, 28 Nov 2018 11:30:35 -0700 Subject: [PATCH 277/483] fix(storage): when pruning release versions, never delete the last deployed revision Signed-off-by: Matt Tucker --- pkg/storage/storage.go | 40 ++++++++++++++++++++++++----- pkg/storage/storage_test.go | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 6d5f589b992..e0e39ac0ceb 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -181,21 +181,37 @@ func (s *Storage) removeLeastRecent(name string, max int) error { if len(h) <= max { return nil } - overage := len(h) - max // We want oldest to newest relutil.SortByRevision(h) + lastDeployed, err := s.Deployed(name) + if err != nil { + return err + } + + var toDelete []*rspb.Release + for _, rel := range h { + // once we have enough releases to delete to reach the max, stop + if len(h)-len(toDelete) == max { + break + } + if lastDeployed != nil { + if rel.GetVersion() != lastDeployed.GetVersion() { + toDelete = append(toDelete, rel) + } + } else { + toDelete = append(toDelete, rel) + } + } + // Delete as many as possible. In the case of API throughput limitations, // multiple invocations of this function will eventually delete them all. - toDelete := h[0:overage] errors := []error{} for _, rel := range toDelete { - key := makeKey(name, rel.Version) - _, innerErr := s.Delete(name, rel.Version) - if innerErr != nil { - s.Log("error pruning %s from release history: %s", key, innerErr) - errors = append(errors, innerErr) + err = s.deleteReleaseVersion(name, rel.GetVersion()) + if err != nil { + errors = append(errors, err) } } @@ -210,6 +226,16 @@ func (s *Storage) removeLeastRecent(name string, max int) error { } } +func (s *Storage) deleteReleaseVersion(name string, version int32) error { + key := makeKey(name, version) + _, err := s.Delete(name, version) + if err != nil { + s.Log("error pruning %s from release history: %s", key, err) + return err + } + return nil +} + // Last fetches the last revision of the named release. func (s *Storage) Last(name string) (*rspb.Release, error) { s.Log("getting last revision of %q", name) diff --git a/pkg/storage/storage_test.go b/pkg/storage/storage_test.go index 19d786ad953..f7f3a86c7f4 100644 --- a/pkg/storage/storage_test.go +++ b/pkg/storage/storage_test.go @@ -293,6 +293,57 @@ func TestStorageRemoveLeastRecent(t *testing.T) { } } +func TestStorageDontDeleteDeployed(t *testing.T) { + storage := Init(driver.NewMemory()) + storage.Log = t.Logf + storage.MaxHistory = 3 + + const name = "angry-bird" + + // setup storage with test releases + setup := func() { + // release records + rls0 := ReleaseTestData{Name: name, Version: 1, Status: rspb.Status_SUPERSEDED}.ToRelease() + rls1 := ReleaseTestData{Name: name, Version: 2, Status: rspb.Status_DEPLOYED}.ToRelease() + rls2 := ReleaseTestData{Name: name, Version: 3, Status: rspb.Status_FAILED}.ToRelease() + rls3 := ReleaseTestData{Name: name, Version: 4, Status: rspb.Status_FAILED}.ToRelease() + + // create the release records in the storage + assertErrNil(t.Fatal, storage.Create(rls0), "Storing release 'angry-bird' (v1)") + assertErrNil(t.Fatal, storage.Create(rls1), "Storing release 'angry-bird' (v2)") + assertErrNil(t.Fatal, storage.Create(rls2), "Storing release 'angry-bird' (v3)") + assertErrNil(t.Fatal, storage.Create(rls3), "Storing release 'angry-bird' (v4)") + } + setup() + + rls5 := ReleaseTestData{Name: name, Version: 5, Status: rspb.Status_FAILED}.ToRelease() + assertErrNil(t.Fatal, storage.Create(rls5), "Storing release 'angry-bird' (v5)") + + // On inserting the 5th record, we expect a total of 3 releases, but we expect version 2 + // (the only deployed release), to still exist + hist, err := storage.History(name) + if err != nil { + t.Fatal(err) + } else if len(hist) != storage.MaxHistory { + for _, item := range hist { + t.Logf("%s %v", item.Name, item.Version) + } + t.Fatalf("expected %d items in history, got %d", storage.MaxHistory, len(hist)) + } + + expectedVersions := map[int32]bool{ + 2: true, + 4: true, + 5: true, + } + + for _, item := range hist { + if !expectedVersions[item.GetVersion()] { + t.Errorf("Release version %d, found when not expected", item.GetVersion()) + } + } +} + func TestStorageLast(t *testing.T) { storage := Init(driver.NewMemory()) From c095b9232dfd6631f0ce02ba1cb5ff35909153d8 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Wed, 28 Nov 2018 15:19:26 -0800 Subject: [PATCH 278/483] avoid kubernetes import for slice contains logic (#4963) * avoid kubernetes import for slice contains logic Signed-off-by: tariqibrahim * fix review comments Signed-off-by: tariqibrahim --- cmd/helm/inspect.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/helm/inspect.go b/cmd/helm/inspect.go index c1861f7c5cd..844116bc596 100644 --- a/cmd/helm/inspect.go +++ b/cmd/helm/inspect.go @@ -18,15 +18,13 @@ package main import ( "fmt" - "io" - "strings" - "github.com/ghodss/yaml" "github.com/golang/protobuf/ptypes/any" "github.com/spf13/cobra" + "io" + "strings" "k8s.io/helm/pkg/chartutil" - "k8s.io/kubernetes/pkg/util/slice" ) const inspectDesc = ` @@ -256,9 +254,23 @@ func (i *inspectCmd) run() error { func findReadme(files []*any.Any) (file *any.Any) { for _, file := range files { - if slice.ContainsString(readmeFileNames, strings.ToLower(file.TypeUrl), nil) { + if containsString(readmeFileNames, strings.ToLower(file.TypeUrl), nil) { return file } } return nil } + +// containsString checks if a given slice of strings contains the provided string. +// If a modifier func is provided, it is called with the slice item before the comparison. +func containsString(slice []string, s string, modifier func(s string) string) bool { + for _, item := range slice { + if item == s { + return true + } + if modifier != nil && modifier(item) == s { + return true + } + } + return false +} From e2a0e7fa545585a29c1e9602e6320479788eb9a6 Mon Sep 17 00:00:00 2001 From: Michael Merrill Date: Thu, 29 Nov 2018 13:09:10 -0500 Subject: [PATCH 279/483] Fix for existing CRDs are deleted when crd-install hook is introduced (#4709) Signed-off-by: mmerrill3 --- pkg/tiller/hooks.go | 7 +++++++ pkg/tiller/hooks_test.go | 33 ++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index 0fb7c92f809..4723010222f 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -174,6 +174,13 @@ func (file *manifestFile) sort(result *result) error { isUnknownHook = true break } + if e == release.Hook_CRD_INSTALL { + result.generic = append(result.generic, Manifest{ + Name: file.path, + Content: m, + Head: &entry, + }) + } h.Events = append(h.Events, e) } diff --git a/pkg/tiller/hooks_test.go b/pkg/tiller/hooks_test.go index 8bd92850026..86c89b8f3db 100644 --- a/pkg/tiller/hooks_test.go +++ b/pkg/tiller/hooks_test.go @@ -131,6 +131,21 @@ metadata: name: example-test annotations: "helm.sh/hook": test-success +`, + }, + { + name: []string{"ninth"}, + path: "nine", + kind: []string{"CustomResourceDefinition"}, + hooks: map[string][]release.Hook_Event{"ninth": {release.Hook_CRD_INSTALL}}, + manifest: `apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: ninth + labels: + doesnot: matter + annotations: + "helm.sh/hook": crd-install `, }, } @@ -146,22 +161,22 @@ metadata: } // This test will fail if 'six' or 'seven' was added. - if len(generic) != 2 { - t.Errorf("Expected 2 generic manifests, got %d", len(generic)) + // changed to account for CustomResourceDefinition with crd-install hook being added to generic list of manifests + if len(generic) != 3 { + t.Errorf("Expected 3 generic manifests, got %d", len(generic)) } - if len(hs) != 4 { - t.Errorf("Expected 4 hooks, got %d", len(hs)) + // changed to account for 5 hooks now that there is a crd-install hook added as member 9 of the data list. It was 4 before. + if len(hs) != 5 { + t.Errorf("Expected 5 hooks, got %d", len(hs)) } for _, out := range hs { + t.Logf("Checking name %s path %s and kind %s", out.Name, out.Path, out.Kind) found := false for _, expect := range data { if out.Path == expect.path { found = true - if out.Path != expect.path { - t.Errorf("Expected path %s, got %s", expect.path, out.Path) - } nameFound := false for _, expectedName := range expect.name { if out.Name == expectedName { @@ -209,8 +224,8 @@ metadata: name := sh.Metadata.Name - //only keep track of non-hook manifests - if err == nil && s.hooks[name] == nil { + //only keep track of non-hook manifests, that are not CustomResourceDefinitions with crd-install + if err == nil && (s.hooks[name] == nil || s.hooks[name][0] == release.Hook_CRD_INSTALL) { another := Manifest{ Content: m, Name: name, From 55a338579a5b3150f3b9466b4fe471a6f0118f70 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 29 Nov 2018 15:50:23 -0800 Subject: [PATCH 280/483] fix(helm): Allow custom resources in hooks (#4986) Currently the code that handles hooks uses a builder that creates the versioned types rather than unstructured. This results in an error whenever a custom resource is used in the hook as the type will not be registered in the scheme used in Helm. This changes this to use a builder that created unstructured resources and only converts to the versioned type when needed. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 0cc68b71b57..5535364fe91 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -179,7 +179,11 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { vk := gvk.Version + "/" + gvk.Kind internalObj, err := asInternal(info) if err != nil { - c.Log("Warning: conversion to internal type failed: %v", err) + // If the problem is just that the resource is not registered, don't print any + // error. This is normal for custom resources. + if !runtime.IsNotRegisteredError(err) { + c.Log("Warning: conversion to internal type failed: %v", err) + } // Add the unstructured object in this situation. It will still get listed, just // with less information. objs[vk] = append(objs[vk], info.Object) @@ -358,7 +362,7 @@ func (c *Client) watchTimeout(t time.Duration) ResourceActorFunc { // // Handling for other kinds will be added as necessary. func (c *Client) WatchUntilReady(namespace string, reader io.Reader, timeout int64, shouldWait bool) error { - infos, err := c.Build(namespace, reader) + infos, err := c.BuildUnstructured(namespace, reader) if err != nil { return err } @@ -605,12 +609,13 @@ func (c *Client) watchUntilReady(timeout time.Duration, info *resource.Info) err // // This operates on an event returned from a watcher. func (c *Client) waitForJob(e watch.Event, name string) (bool, error) { - o, ok := e.Object.(*batch.Job) - if !ok { - return true, fmt.Errorf("Expected %s to be a *batch.Job, got %T", name, e.Object) + job := &batch.Job{} + err := legacyscheme.Scheme.Convert(e.Object, job, nil) + if err != nil { + return true, err } - for _, c := range o.Status.Conditions { + for _, c := range job.Status.Conditions { if c.Type == batch.JobComplete && c.Status == v1.ConditionTrue { return true, nil } else if c.Type == batch.JobFailed && c.Status == v1.ConditionTrue { @@ -618,7 +623,7 @@ func (c *Client) waitForJob(e watch.Event, name string) (bool, error) { } } - c.Log("%s: Jobs active: %d, jobs failed: %d, jobs succeeded: %d", name, o.Status.Active, o.Status.Failed, o.Status.Succeeded) + c.Log("%s: Jobs active: %d, jobs failed: %d, jobs succeeded: %d", name, job.Status.Active, job.Status.Failed, job.Status.Succeeded) return false, nil } From 58be8e461c9ab8e86ea2ad519601e1a288f21e8c Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 30 Nov 2018 18:04:37 +0000 Subject: [PATCH 281/483] Update messaging in value parsing to improve traceability (#4974) Closes #4736 Signed-off-by: Martin Hickey --- pkg/chartutil/requirements.go | 6 +++--- pkg/chartutil/values.go | 28 ++++++++++++++-------------- pkg/chartutil/values_test.go | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 56612312227..0f11283052d 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -428,7 +428,7 @@ func processImportValues(c *chart.Chart) error { } // create value map from child to be merged into parent vm := pathToMap(nm["parent"], vv.AsMap()) - b = coalesceTables(cvals, vm) + b = coalesceTables(cvals, vm, c.Metadata.Name) case string: nm := map[string]string{ "child": "exports." + iv, @@ -441,14 +441,14 @@ func processImportValues(c *chart.Chart) error { log.Printf("Warning: ImportValues missing table: %v", err) continue } - b = coalesceTables(b, vm.AsMap()) + b = coalesceTables(b, vm.AsMap(), c.Metadata.Name) } } // set our formatted import values r.ImportValues = outiv } } - b = coalesceTables(b, cvals) + b = coalesceTables(b, cvals, c.Metadata.Name) y, err := yaml.Marshal(b) if err != nil { return err diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go index a47073b670b..352524c1340 100644 --- a/pkg/chartutil/values.go +++ b/pkg/chartutil/values.go @@ -203,7 +203,7 @@ func coalesceDeps(chrt *chart.Chart, dest map[string]interface{}) (map[string]in dvmap := dv.(map[string]interface{}) // Get globals out of dest and merge them into dvmap. - coalesceGlobals(dvmap, dest) + coalesceGlobals(dvmap, dest, chrt.Metadata.Name) var err error // Now coalesce the rest of the values. @@ -219,20 +219,20 @@ func coalesceDeps(chrt *chart.Chart, dest map[string]interface{}) (map[string]in // coalesceGlobals copies the globals out of src and merges them into dest. // // For convenience, returns dest. -func coalesceGlobals(dest, src map[string]interface{}) map[string]interface{} { +func coalesceGlobals(dest, src map[string]interface{}, chartName string) map[string]interface{} { var dg, sg map[string]interface{} if destglob, ok := dest[GlobalKey]; !ok { dg = map[string]interface{}{} } else if dg, ok = destglob.(map[string]interface{}); !ok { - log.Printf("warning: skipping globals because destination %s is not a table.", GlobalKey) + log.Printf("Warning: Skipping globals for chart '%s' because destination '%s' is not a table.", chartName, GlobalKey) return dg } if srcglob, ok := src[GlobalKey]; !ok { sg = map[string]interface{}{} } else if sg, ok = srcglob.(map[string]interface{}); !ok { - log.Printf("warning: skipping globals because source %s is not a table.", GlobalKey) + log.Printf("Warning: skipping globals for chart '%s' because source '%s' is not a table.", chartName, GlobalKey) return dg } @@ -247,11 +247,11 @@ func coalesceGlobals(dest, src map[string]interface{}) map[string]interface{} { if destvmap, ok := destv.(map[string]interface{}); ok { // Basically, we reverse order of coalesce here to merge // top-down. - coalesceTables(vv, destvmap) + coalesceTables(vv, destvmap, chartName) dg[key] = vv continue } else { - log.Printf("Conflict: cannot merge map onto non-map for %q. Skipping.", key) + log.Printf("Warning: For chart '%s', cannot merge map onto non-map for key '%q'. Skipping.", chartName, key) } } else { // Here there is no merge. We're just adding. @@ -259,7 +259,7 @@ func coalesceGlobals(dest, src map[string]interface{}) map[string]interface{} { } } else if dv, ok := dg[key]; ok && istable(dv) { // It's not clear if this condition can actually ever trigger. - log.Printf("key %s is table. Skipping", key) + log.Printf("Warning: For chart '%s', key '%s' is a table. Skipping.", chartName, key) continue } // TODO: Do we need to do any additional checking on the value? @@ -291,7 +291,7 @@ func coalesceValues(c *chart.Chart, v map[string]interface{}) (map[string]interf // On error, we return just the overridden values. // FIXME: We should log this error. It indicates that the YAML data // did not parse. - return v, fmt.Errorf("error reading default values (%s): %s", c.Values.Raw, err) + return v, fmt.Errorf("Error: Reading chart '%s' default values (%s): %s", c.Metadata.Name, c.Values.Raw, err) } for key, val := range nv { @@ -305,12 +305,12 @@ func coalesceValues(c *chart.Chart, v map[string]interface{}) (map[string]interf // if v[key] is a table, merge nv's val table into v[key]. src, ok := val.(map[string]interface{}) if !ok { - log.Printf("warning: skipped value for %s: Not a table.", key) + log.Printf("Warning: Building values map for chart '%s'. Skipped value (%+v) for '%s', as it is not a table.", c.Metadata.Name, src, key) continue } // Because v has higher precedence than nv, dest values override src // values. - coalesceTables(dest, src) + coalesceTables(dest, src, c.Metadata.Name) } } else { // If the key is not in v, copy it from nv. @@ -323,7 +323,7 @@ func coalesceValues(c *chart.Chart, v map[string]interface{}) (map[string]interf // coalesceTables merges a source map into a destination map. // // dest is considered authoritative. -func coalesceTables(dst, src map[string]interface{}) map[string]interface{} { +func coalesceTables(dst, src map[string]interface{}, chartName string) map[string]interface{} { // Because dest has higher precedence than src, dest values override src // values. for key, val := range src { @@ -331,13 +331,13 @@ func coalesceTables(dst, src map[string]interface{}) map[string]interface{} { if innerdst, ok := dst[key]; !ok { dst[key] = val } else if istable(innerdst) { - coalesceTables(innerdst.(map[string]interface{}), val.(map[string]interface{})) + coalesceTables(innerdst.(map[string]interface{}), val.(map[string]interface{}), chartName) } else { - log.Printf("warning: cannot overwrite table with non table for %s (%v)", key, val) + log.Printf("Warning: Merging destination map for chart '%s'. Cannot overwrite table item '%s', with non table value: %v", chartName, key, val) } continue } else if dv, ok := dst[key]; ok && istable(dv) { - log.Printf("warning: destination for %s is a table. Ignoring non-table value %v", key, val) + log.Printf("Warning: Merging destination map for chart '%s'. The destination item '%s' is a table and ignoring the source '%s' as it has a non-table value of: %v", chartName, key, key, val) continue } else if !ok { // <- ok is still in scope from preceding conditional. dst[key] = val diff --git a/pkg/chartutil/values_test.go b/pkg/chartutil/values_test.go index f38afaf95b8..3fea14c3a17 100644 --- a/pkg/chartutil/values_test.go +++ b/pkg/chartutil/values_test.go @@ -386,7 +386,7 @@ func TestCoalesceTables(t *testing.T) { // What we expect is that anything in dst overrides anything in src, but that // otherwise the values are coalesced. - coalesceTables(dst, src) + coalesceTables(dst, src, "") if dst["name"] != "Ishmael" { t.Errorf("Unexpected name: %s", dst["name"]) From 99199c975236430fdf7599c69a956c6eb73b44e9 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Tue, 4 Dec 2018 08:25:38 -0800 Subject: [PATCH 282/483] add unit tests for portforwarder (#4979) Signed-off-by: tariqibrahim --- pkg/helm/portforwarder/portforwarder_test.go | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/pkg/helm/portforwarder/portforwarder_test.go b/pkg/helm/portforwarder/portforwarder_test.go index f5efe34431c..2809bcbff04 100644 --- a/pkg/helm/portforwarder/portforwarder_test.go +++ b/pkg/helm/portforwarder/portforwarder_test.go @@ -85,3 +85,54 @@ func TestGetFirstPod(t *testing.T) { } } } + +func TestGetTillerPodImage(t *testing.T) { + tests := []struct { + name string + podSpec v1.PodSpec + expected string + err bool + }{ + { + name: "pod with tiller container image", + podSpec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "tiller", + Image: "gcr.io/kubernetes-helm/tiller:v2.0.0", + }, + }, + }, + expected: "gcr.io/kubernetes-helm/tiller:v2.0.0", + err: false, + }, + { + name: "pod without tiller container image", + podSpec: v1.PodSpec{ + Containers: []v1.Container{ + { + Name: "not_tiller", + Image: "gcr.io/kubernetes-helm/not_tiller:v1.0.0", + }, + }, + }, + expected: "", + err: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockPod := mockTillerPod() + mockPod.Spec = tt.podSpec + client := fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{mockPod}}) + imageName, err := GetTillerPodImage(client.CoreV1(), v1.NamespaceDefault) + if (err != nil) != tt.err { + t.Errorf("%q. expected error: %v, got %v", tt.name, tt.err, err) + } + if imageName != tt.expected { + t.Errorf("%q. expected %q, got %q", tt.name, tt.expected, imageName) + } + }) + } +} From 73e985286f567bc5aa34399ca0e215840bee6c5e Mon Sep 17 00:00:00 2001 From: Florent Monbillard Date: Tue, 4 Dec 2018 13:48:12 -0500 Subject: [PATCH 283/483] Charts docs clean-up - Address #4998, #5000, #5001 and #5002 - Fix Markdown syntax for code blocks Signed-off-by: Florent Monbillard --- docs/charts.md | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/docs/charts.md b/docs/charts.md index 5a895fd494a..7bc4f002013 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -116,10 +116,10 @@ be deprecated. The chart name can later be reused by publishing a newer version that is not marked as deprecated. The workflow for deprecating charts, as followed by the [helm/charts](https://github.com/helm/charts) project is: - - Update chart's `Chart.yaml` to mark the chart as deprecated, bumping the - version - - Release the new chart version in the Chart Repository - - Remove the chart from the source repository (e.g. git) + +- Update chart's `Chart.yaml` to mark the chart as deprecated, bumping the version +- Release the new chart version in the Chart Repository +- Remove the chart from the source repository (e.g. git) ## Chart LICENSE, README and NOTES @@ -160,7 +160,6 @@ the preferred method of declaring dependencies is by using a **Note:** The `dependencies:` section of the `Chart.yaml` from Helm Classic has been completely removed. - ### Managing Dependencies with `requirements.yaml` A `requirements.yaml` file is a simple file for listing your @@ -240,6 +239,7 @@ dependencies: ``` In the above example we will get 3 dependencies in all for `parentchart` + ``` subchart new-subchart-1 @@ -283,9 +283,10 @@ dependencies: condition: subchart2.enabled,global.subchart2.enabled tags: - back-end - - subchart2 + - subchart2 ``` + ```yaml # parentchart/values.yaml @@ -294,7 +295,7 @@ subchart1: tags: front-end: false back-end: true -```` +``` In the above example all charts with the tag `front-end` would be disabled but since the `subchart1.enabled` path evaluates to 'true' in the parent's values, the condition will override the @@ -314,12 +315,11 @@ helm install --set tags.front-end=true --set subchart2.enabled=false ##### Tags and Condition Resolution - - * **Conditions (when set in values) always override tags.** The first condition - path that exists wins and subsequent ones for that chart are ignored. - * Tags are evaluated as 'if any of the chart's tags are true then enable the chart'. - * Tags and conditions values must be set in the top parent's values. - * The `tags:` key in values must be a top level key. Globals and nested `tags:` tables +- **Conditions (when set in values) always override tags.** +- The first condition path that exists wins and subsequent ones for that chart are ignored. +- Tags are evaluated as 'if any of the chart's tags are true then enable the chart'. +- Tags and conditions values must be set in the top parent's values. +- The `tags:` key in values must be a top level key. Globals and nested `tags:` tables are not currently supported. #### Importing Child Values via requirements.yaml @@ -345,6 +345,7 @@ directly into the parent's values by specifying the keys to import as in the exa import-values: - data ``` + ```yaml # child's values.yaml file ... @@ -388,6 +389,7 @@ dependencies: - child: default.data parent: myimports ``` + In the above example, values found at `default.data` in the subchart1's values will be imported to the `myimports` key in the parent chart's values as detailed below: @@ -400,6 +402,7 @@ myimports: mystring: "helm rocks!" ``` + ```yaml # subchart1's values.yaml file @@ -409,6 +412,7 @@ default: mybool: true ``` + The parent chart's resulting values would be: ```yaml @@ -511,10 +515,10 @@ through the template engine. Values for the templates are supplied two ways: - - Chart developers may supply a file called `values.yaml` inside of a - chart. This file can contain default values. - - Chart users may supply a YAML file that contains values. This can be - provided on the command line with `helm install`. +- Chart developers may supply a file called `values.yaml` inside of a + chart. This file can contain default values. +- Chart users may supply a YAML file that contains values. This can be + provided on the command line with `helm install`. When a user supplies custom values, these values will override the values in the chart's `values.yaml` file. From 03718ee93d3dd290471554d6f4703c2e1539e1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=AFo=D0=BD=D0=B8=D0=B8=CE=B3=20=C4=AFo=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8=CE=B3?= Date: Wed, 5 Dec 2018 10:08:06 -0800 Subject: [PATCH 284/483] Added extra padding to resources template (#4981) This is probably a silly PR. However, each time I create a new chart via `helm create`, the instructions to uncomment the resource limits require adding a couple extra spaces back to the YAML. This PR simply brings the spacing in-line with the rest of the generated template. Signed-off-by: John Dewey --- pkg/chartutil/create.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 9063ed12a91..82d307ded4e 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -89,11 +89,11 @@ resources: {} # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: - # cpu: 100m - # memory: 128Mi + # cpu: 100m + # memory: 128Mi # requests: - # cpu: 100m - # memory: 128Mi + # cpu: 100m + # memory: 128Mi nodeSelector: {} From 6d3809a416e722bd6212d637ad9da25d0d954f7f Mon Sep 17 00:00:00 2001 From: Taylor Thomas Date: Wed, 5 Dec 2018 10:45:49 -0800 Subject: [PATCH 285/483] ref(kube): Gets rid of superfluous Sprintf call Signed-off-by: Taylor Thomas --- pkg/kube/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index b60b0cfc23a..4a387d524de 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -220,8 +220,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { buf := new(bytes.Buffer) printFlags := get.NewHumanPrintFlags() for t, ot := range objs { - kindHeader := fmt.Sprintf("==> %s\n", t) - if _, err = buf.WriteString(kindHeader); err != nil { + if _, err = fmt.Fprintf(buf, "==> %s\n", t); err != nil { return "", err } typePrinter, _ := printFlags.ToPrinter("") From c80f7ddaebdb5789f3fb75012b07ad64a098af92 Mon Sep 17 00:00:00 2001 From: Henry Nash Date: Wed, 5 Dec 2018 19:41:52 +0000 Subject: [PATCH 286/483] docs(helm): Mention commit signing in the Developer Guide (#5018) This change adds a mention to the reqruiement for commit signing to the Git Convention outline in the Developer Guide, while leaving the existing detail on signing in the Contributing doc. Closes #5016 Signed-off-by: Henry Nash --- docs/developers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers.md b/docs/developers.md index 4f1da2d9694..4edc4bea17e 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -167,7 +167,7 @@ workflow for doing this is as follows: 3. Add your repository as a remote for `$GOPATH/src/k8s.io/helm` 4. Create a new working branch (`git checkout -b feat/my-feature`) and do your work on that branch. -5. When you are ready for us to review, push your branch to GitHub, and +5. When you are ready for us to review, sign your commit, push your branch to GitHub, and then open a new pull request with us. For Git commit messages, we follow the [Semantic Commit Messages](http://karma-runner.github.io/0.13/dev/git-commit-msg.html): From dc186e12c3bd7f0c6442d8501d2439071197836e Mon Sep 17 00:00:00 2001 From: tariqibrahim Date: Tue, 4 Dec 2018 23:57:41 -0800 Subject: [PATCH 287/483] remove for k8s.io/kubernetes deps for simple pod and svc util methods Signed-off-by: tariqibrahim --- pkg/kube/wait.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 960409df993..105d79b93fd 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -29,8 +29,6 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/apis/core/v1/helper" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" ) @@ -203,7 +201,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { func (c *Client) podsReady(pods []v1.Pod) bool { for _, pod := range pods { - if !podutil.IsPodReady(&pod) { + if !isPodReady(&pod) { c.Log("Pod is not ready: %s/%s", pod.GetNamespace(), pod.GetName()) return false } @@ -219,7 +217,7 @@ func (c *Client) servicesReady(svc []v1.Service) bool { } // Make sure the service is not explicitly set to "None" before checking the IP - if s.Spec.ClusterIP != v1.ClusterIPNone && !helper.IsServiceIPSet(&s) { + if s.Spec.ClusterIP != v1.ClusterIPNone && s.Spec.ClusterIP == "" { c.Log("Service is not ready: %s/%s", s.GetNamespace(), s.GetName()) return false } @@ -259,3 +257,15 @@ func getPods(client kubernetes.Interface, namespace string, selector map[string] }) return list.Items, err } + +func isPodReady(pod *v1.Pod) bool { + if &pod.Status != nil && len(pod.Status.Conditions) > 0 { + for _, condition := range pod.Status.Conditions { + if condition.Type == v1.PodReady && + condition.Status == v1.ConditionTrue { + return true + } + } + } + return false +} From adce632c830b28ca5bf56e5a9df583a06cacef82 Mon Sep 17 00:00:00 2001 From: Henry Nash Date: Wed, 5 Dec 2018 21:06:46 +0000 Subject: [PATCH 288/483] fix(helm): get rid of lint warning in pkg/storage (#5021) Provide comment for constant to avoid golint warning. Closes #5020 Signed-off-by: Henry Nash --- pkg/storage/storage.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index e0e39ac0ceb..9520db08bc3 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -25,6 +25,7 @@ import ( "k8s.io/helm/pkg/storage/driver" ) +// NoReleasesErr indicates that a given release cannot be found const NoReleasesErr = "has no deployed releases" // Storage represents a storage engine for a Release. From 146c61af3765417c4b0d95bbb1a4ad73d3c228c9 Mon Sep 17 00:00:00 2001 From: Henry Nash Date: Wed, 5 Dec 2018 21:08:51 +0000 Subject: [PATCH 289/483] fix(helm): Correct and improve resilence of template check in unit test (#5010) Make the current check for the number of templates on create more resilient by using a varible to store the expected number of templates. In addition, fix the error message so that it displays the correct number expected of templates. Closes #5009 Signed-off-by: Henry Nash --- cmd/helm/create_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/helm/create_test.go b/cmd/helm/create_test.go index 3cdf5ebf89f..c9459b477bf 100644 --- a/cmd/helm/create_test.go +++ b/cmd/helm/create_test.go @@ -143,8 +143,9 @@ func TestCreateStarterCmd(t *testing.T) { t.Errorf("Wrong API version: %q", c.Metadata.ApiVersion) } - if l := len(c.Templates); l != 7 { - t.Errorf("Expected 6 templates, got %d", l) + expectedTemplateCount := 7 + if l := len(c.Templates); l != expectedTemplateCount { + t.Errorf("Expected %d templates, got %d", expectedTemplateCount, l) } found := false From 15703cb19942bba7b2f5f8355dee2947e542fdda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helgi=20=C3=9Eormar=20=C3=9Eorbj=C3=B6rnsson?= <70530+helgi@users.noreply.github.com> Date: Wed, 5 Dec 2018 13:30:42 -0800 Subject: [PATCH 290/483] Return empty string instead of nil when linting on required (#4748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Return empty string instead of nil when linting on required This allows lint to work in scenarios when required is used in secrets or it's output is passed to another function. Due to lint mode no longer failing on missing value in required it is passing nil through which not all functions can accept. Fixes #4747 Signed-off-by: Helgi Þorbjörnsson * Apply suggestions from code review Co-Authored-By: helgi <70530+helgi@users.noreply.github.com> Signed-off-by: Helgi Þorbjörnsson * Add tests Signed-off-by: Helgi Þorbjörnsson --- pkg/engine/engine.go | 5 +++-- pkg/engine/engine_test.go | 27 ++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index 9f212ba0902..f3dd869c901 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -159,9 +159,10 @@ func (e *Engine) alterFuncMap(t *template.Template, referenceTpls map[string]ren if e.LintMode { // Don't fail on missing required values when linting log.Printf("[INFO] Missing required value: %s", warn) - return val, nil + return "", nil } - return val, fmt.Errorf(warn) + // Convert nil to "" in case required is piped into other functions + return "", fmt.Errorf(warn) } else if _, ok := val.(string); ok { if val == "" { if e.LintMode { diff --git a/pkg/engine/engine_test.go b/pkg/engine/engine_test.go index 91a3fd79559..712b3b3df6c 100644 --- a/pkg/engine/engine_test.go +++ b/pkg/engine/engine_test.go @@ -466,7 +466,6 @@ func TestAlterFuncMap(t *testing.T) { if err != nil { t.Fatal(err) } - expectStr := "All your base are belong to us" if gotStr := outReq["conan/templates/quote"]; gotStr != expectStr { t.Errorf("Expected %q, got %q (%v)", expectStr, gotStr, outReq) @@ -476,6 +475,32 @@ func TestAlterFuncMap(t *testing.T) { t.Errorf("Expected %q, got %q (%v)", expectNum, gotNum, outReq) } + // test required without passing in needed values with lint mode on + // verifies lint replaces required with an empty string (should not fail) + lintValues := chartutil.Values{ + "Values": chartutil.Values{ + "who": "us", + }, + "Chart": reqChart.Metadata, + "Release": chartutil.Values{ + "Name": "That 90s meme", + }, + } + e := New() + e.LintMode = true + outReq, err = e.Render(reqChart, lintValues) + if err != nil { + t.Fatal(err) + } + expectStr = "All your base are belong to us" + if gotStr := outReq["conan/templates/quote"]; gotStr != expectStr { + t.Errorf("Expected %q, got %q (%v)", expectStr, gotStr, outReq) + } + expectNum = "All of them!" + if gotNum := outReq["conan/templates/bases"]; gotNum != expectNum { + t.Errorf("Expected %q, got %q (%v)", expectNum, gotNum, outReq) + } + tplChart := &chart.Chart{ Metadata: &chart.Metadata{Name: "TplFunction"}, Templates: []*chart.Template{ From 158d6dbb746f525bad9a0aacb698af7d370ac3f5 Mon Sep 17 00:00:00 2001 From: Frank Hamand Date: Wed, 5 Dec 2018 22:04:48 +0000 Subject: [PATCH 291/483] Add --parallel flag to helm test (#4144) * Refactor test run to separate method This will allow us to parallelise it more easily Signed-off-by: Frank Hamand * Add --parallel flag to helm test (No functionality in this commit) Signed-off-by: Frank Hamand * Run helm tests in parallel with --parallel flag Signed-off-by: Frank Hamand * Add a mutex to helm test message streams This is to protect against data races when running tests in parallel. Signed-off-by: Frank Hamand * Add tests for --parallel flag Signed-off-by: Frank Hamand * Add concurrency limit for parallel helm tests Signed-off-by: Frank Hamand * Add test for concurrency limit Signed-off-by: Frank Hamand * Fix rebase introduced errors Signed-off-by: Frank Hamand --- _proto/hapi/services/tiller.proto | 2 + cmd/helm/release_testing.go | 13 +- docs/helm/helm_test.md | 3 +- glide.lock | 8 +- glide.yaml | 4 +- pkg/helm/option.go | 7 + pkg/proto/hapi/services/tiller.pb.go | 172 +++++++++++++------------ pkg/releasetesting/environment.go | 14 +- pkg/releasetesting/environment_test.go | 9 +- pkg/releasetesting/test_suite.go | 92 +++++++++---- pkg/releasetesting/test_suite_test.go | 121 +++++++++++++++++ pkg/tiller/release_testing.go | 12 +- 12 files changed, 329 insertions(+), 128 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 6c44ce6e052..8eba963e411 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -339,6 +339,8 @@ message TestReleaseRequest { int64 timeout = 2; // cleanup specifies whether or not to attempt pod deletion after test completes bool cleanup = 3; + // parallel specifies whether or not to run test pods in parallel + bool parallel = 4; } // TestReleaseResponse represents a message from executing a test diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index f39d9b81f32..91c0d71892c 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -34,11 +34,12 @@ The tests to be run are defined in the chart that was installed. ` type releaseTestCmd struct { - name string - out io.Writer - client helm.Interface - timeout int64 - cleanup bool + name string + out io.Writer + client helm.Interface + timeout int64 + cleanup bool + parallel bool } func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { @@ -67,6 +68,7 @@ func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { settings.AddFlagsTLS(f) f.Int64Var(&rlsTest.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&rlsTest.cleanup, "cleanup", false, "delete test pods upon completion") + f.BoolVar(&rlsTest.parallel, "parallel", false, "run test pods in parallel") // set defaults from environment settings.InitTLS(f) @@ -79,6 +81,7 @@ func (t *releaseTestCmd) run() (err error) { t.name, helm.ReleaseTestTimeout(t.timeout), helm.ReleaseTestCleanup(t.cleanup), + helm.ReleaseTestParallel(t.parallel), ) testErr := &testErr{} diff --git a/docs/helm/helm_test.md b/docs/helm/helm_test.md index e55c5df6860..e8ddfbc9bda 100644 --- a/docs/helm/helm_test.md +++ b/docs/helm/helm_test.md @@ -20,6 +20,7 @@ helm test [RELEASE] [flags] ``` --cleanup delete test pods upon completion -h, --help help for test + --parallel run test pods in parallel --timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") @@ -45,4 +46,4 @@ helm test [RELEASE] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 9-Nov-2018 diff --git a/glide.lock b/glide.lock index 16ea64ff586..c6bec006d5a 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: fcbba2207c6511df365dfe355dfe601a862d340bbf15db47938a404fd0ec58d0 -updated: 2018-11-11T19:26:29.631232-05:00 +hash: 813d803db5fc2cb46f8050190d2a307f247da5b7b3a4b00eb4d3e766882ad4f9 +updated: 2018-11-30T10:55:17.417707Z imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -290,6 +290,10 @@ imports: - internal - jws - jwt +- name: golang.org/x/sync + version: 1d60e4601c6fd243af51cc01ddf169918a5407ca + subpackages: + - semaphore - name: golang.org/x/sys version: 95c6576299259db960f6c5b9b69ea52422860fce subpackages: diff --git a/glide.yaml b/glide.yaml index f0028b57922..52cee814228 100644 --- a/glide.yaml +++ b/glide.yaml @@ -3,6 +3,9 @@ import: - package: golang.org/x/net subpackages: - context + - package: golang.org/x/sync + subpackages: + - semaphore - package: github.com/spf13/cobra version: fe5e611709b0c57fa4a89136deaa8e1d4004d053 - package: github.com/spf13/pflag @@ -41,7 +44,6 @@ import: - package: github.com/prometheus/client_golang version: 0.8.0 - package: github.com/grpc-ecosystem/go-grpc-prometheus - - package: k8s.io/kubernetes version: release-1.12 - package: k8s.io/client-go diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 5579ae76d9a..f41d9c6aeda 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -227,6 +227,13 @@ func ReleaseTestCleanup(cleanup bool) ReleaseTestOption { } } +// ReleaseTestParallel is a boolean value representing whether to run test pods in parallel +func ReleaseTestParallel(parallel bool) ReleaseTestOption { + return func(opts *options) { + opts.testReq.Parallel = parallel + } +} + // RollbackTimeout specifies the number of seconds before kubernetes calls timeout func RollbackTimeout(timeout int64) RollbackOption { return func(opts *options) { diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 044d54e9194..f57ad85827a 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -883,6 +883,8 @@ type TestReleaseRequest struct { Timeout int64 `protobuf:"varint,2,opt,name=timeout" json:"timeout,omitempty"` // cleanup specifies whether or not to attempt pod deletion after test completes Cleanup bool `protobuf:"varint,3,opt,name=cleanup" json:"cleanup,omitempty"` + // parallel specifies whether or not to run test pods in parallel + Parallel bool `protobuf:"varint,4,opt,name=parallel" json:"parallel,omitempty"` } func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} } @@ -911,6 +913,13 @@ func (m *TestReleaseRequest) GetCleanup() bool { return false } +func (m *TestReleaseRequest) GetParallel() bool { + if m != nil { + return m.Parallel + } + return false +} + // TestReleaseResponse represents a message from executing a test type TestReleaseResponse struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` @@ -1415,85 +1424,86 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1276 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0x44, - 0x14, 0x6e, 0xe2, 0xfc, 0x9e, 0x74, 0x43, 0x76, 0x36, 0xdb, 0x7a, 0xcd, 0x82, 0x82, 0x11, 0x6c, - 0x76, 0x61, 0x53, 0x08, 0xdc, 0x20, 0x21, 0xa4, 0x6e, 0x36, 0x6a, 0x0b, 0xa5, 0x2b, 0x39, 0xed, - 0x22, 0x21, 0x50, 0xe4, 0x26, 0x93, 0xd6, 0xac, 0x63, 0x07, 0xcf, 0xb8, 0x6c, 0x1f, 0x00, 0x24, - 0xde, 0x83, 0x07, 0xe1, 0x3d, 0x78, 0x0e, 0xee, 0x91, 0xe7, 0xc7, 0xf5, 0x38, 0x76, 0x6a, 0x7a, - 0xd3, 0x78, 0xe6, 0x9c, 0x39, 0x3f, 0xdf, 0x37, 0xe7, 0xcc, 0x29, 0x18, 0x97, 0xf6, 0xca, 0xd9, - 0x23, 0x38, 0xb8, 0x72, 0x66, 0x98, 0xec, 0x51, 0xc7, 0x75, 0x71, 0x30, 0x58, 0x05, 0x3e, 0xf5, - 0x51, 0x37, 0x92, 0x0d, 0xa4, 0x6c, 0xc0, 0x65, 0xc6, 0x0e, 0x3b, 0x31, 0xbb, 0xb4, 0x03, 0xca, - 0xff, 0x72, 0x6d, 0x63, 0x37, 0xb9, 0xef, 0x7b, 0x0b, 0xe7, 0x42, 0x08, 0xb8, 0x8b, 0x00, 0xbb, - 0xd8, 0x26, 0x58, 0xfe, 0x2a, 0x87, 0xa4, 0xcc, 0xf1, 0x16, 0xbe, 0x10, 0xbc, 0xab, 0x08, 0x28, - 0x26, 0x74, 0x1a, 0x84, 0x9e, 0x10, 0x3e, 0x52, 0x84, 0x84, 0xda, 0x34, 0x24, 0x8a, 0xb3, 0x2b, - 0x1c, 0x10, 0xc7, 0xf7, 0xe4, 0x2f, 0x97, 0x99, 0x7f, 0x97, 0xe1, 0xc1, 0xb1, 0x43, 0xa8, 0xc5, - 0x0f, 0x12, 0x0b, 0xff, 0x1a, 0x62, 0x42, 0x51, 0x17, 0xaa, 0xae, 0xb3, 0x74, 0xa8, 0x5e, 0xea, - 0x95, 0xfa, 0x9a, 0xc5, 0x17, 0x68, 0x07, 0x6a, 0xfe, 0x62, 0x41, 0x30, 0xd5, 0xcb, 0xbd, 0x52, - 0xbf, 0x69, 0x89, 0x15, 0xfa, 0x06, 0xea, 0xc4, 0x0f, 0xe8, 0xf4, 0xfc, 0x5a, 0xd7, 0x7a, 0xa5, - 0x7e, 0x7b, 0xf8, 0xd1, 0x20, 0x0b, 0xa7, 0x41, 0xe4, 0x69, 0xe2, 0x07, 0x74, 0x10, 0xfd, 0x79, - 0x71, 0x6d, 0xd5, 0x08, 0xfb, 0x8d, 0xec, 0x2e, 0x1c, 0x97, 0xe2, 0x40, 0xaf, 0x70, 0xbb, 0x7c, - 0x85, 0x0e, 0x00, 0x98, 0x5d, 0x3f, 0x98, 0xe3, 0x40, 0xaf, 0x32, 0xd3, 0xfd, 0x02, 0xa6, 0x5f, - 0x45, 0xfa, 0x56, 0x93, 0xc8, 0x4f, 0xf4, 0x35, 0x6c, 0x73, 0x48, 0xa6, 0x33, 0x7f, 0x8e, 0x89, - 0x5e, 0xeb, 0x69, 0xfd, 0xf6, 0xf0, 0x11, 0x37, 0x25, 0xe1, 0x9f, 0x70, 0xd0, 0x46, 0xfe, 0x1c, - 0x5b, 0x2d, 0xae, 0x1e, 0x7d, 0x13, 0xf4, 0x18, 0x9a, 0x9e, 0xbd, 0xc4, 0x64, 0x65, 0xcf, 0xb0, - 0x5e, 0x67, 0x11, 0xde, 0x6c, 0x98, 0x1e, 0x34, 0xa4, 0x73, 0xf3, 0x05, 0xd4, 0x78, 0x6a, 0xa8, - 0x05, 0xf5, 0xb3, 0x93, 0xef, 0x4e, 0x5e, 0xfd, 0x70, 0xd2, 0xd9, 0x42, 0x0d, 0xa8, 0x9c, 0xec, - 0x7f, 0x3f, 0xee, 0x94, 0xd0, 0x7d, 0xb8, 0x77, 0xbc, 0x3f, 0x39, 0x9d, 0x5a, 0xe3, 0xe3, 0xf1, - 0xfe, 0x64, 0xfc, 0xb2, 0x53, 0x46, 0x6d, 0x80, 0xd1, 0xe1, 0xbe, 0x75, 0x3a, 0x65, 0x2a, 0x9a, - 0xf9, 0x3e, 0x34, 0xe3, 0x1c, 0x50, 0x1d, 0xb4, 0xfd, 0xc9, 0x88, 0x9b, 0x78, 0x39, 0x9e, 0x8c, - 0x3a, 0x25, 0xf3, 0xcf, 0x12, 0x74, 0x55, 0xca, 0xc8, 0xca, 0xf7, 0x08, 0x8e, 0x38, 0x9b, 0xf9, - 0xa1, 0x17, 0x73, 0xc6, 0x16, 0x08, 0x41, 0xc5, 0xc3, 0x6f, 0x25, 0x63, 0xec, 0x3b, 0xd2, 0xa4, - 0x3e, 0xb5, 0x5d, 0xc6, 0x96, 0x66, 0xf1, 0x05, 0xfa, 0x1c, 0x1a, 0x02, 0x0a, 0xa2, 0x57, 0x7a, - 0x5a, 0xbf, 0x35, 0x7c, 0xa8, 0x02, 0x24, 0x3c, 0x5a, 0xb1, 0x9a, 0x79, 0x00, 0xbb, 0x07, 0x58, - 0x46, 0xc2, 0xf1, 0x93, 0x37, 0x28, 0xf2, 0x6b, 0x2f, 0x31, 0x0b, 0x26, 0xf2, 0x6b, 0x2f, 0x31, - 0xd2, 0xa1, 0x2e, 0xae, 0x1f, 0x0b, 0xa7, 0x6a, 0xc9, 0xa5, 0x49, 0x41, 0x5f, 0x37, 0x24, 0xf2, - 0xca, 0xb2, 0xf4, 0x31, 0x54, 0xa2, 0xca, 0x60, 0x66, 0x5a, 0x43, 0xa4, 0xc6, 0x79, 0xe4, 0x2d, - 0x7c, 0x8b, 0xc9, 0x55, 0xea, 0xb4, 0x34, 0x75, 0x87, 0x49, 0xaf, 0x23, 0xdf, 0xa3, 0xd8, 0xa3, - 0x77, 0x8b, 0xff, 0x18, 0x1e, 0x65, 0x58, 0x12, 0x09, 0xec, 0x41, 0x5d, 0x84, 0xc6, 0xac, 0xe5, - 0xe2, 0x2a, 0xb5, 0xcc, 0xdf, 0x35, 0xe8, 0x9e, 0xad, 0xe6, 0x36, 0xc5, 0x52, 0xb4, 0x21, 0xa8, - 0x27, 0x50, 0x65, 0x1d, 0x46, 0x60, 0x71, 0x9f, 0xdb, 0xe6, 0x6d, 0x68, 0x14, 0xfd, 0xb5, 0xb8, - 0x1c, 0x3d, 0x83, 0xda, 0x95, 0xed, 0x86, 0x98, 0x30, 0x20, 0x62, 0xd4, 0x84, 0x26, 0x6b, 0x4f, - 0x96, 0xd0, 0x40, 0xbb, 0x50, 0x9f, 0x07, 0xd7, 0x51, 0x7f, 0x61, 0x25, 0xd9, 0xb0, 0x6a, 0xf3, - 0xe0, 0xda, 0x0a, 0x3d, 0xf4, 0x21, 0xdc, 0x9b, 0x3b, 0xc4, 0x3e, 0x77, 0xf1, 0xf4, 0xd2, 0xf7, - 0xdf, 0x10, 0x56, 0x95, 0x0d, 0x6b, 0x5b, 0x6c, 0x1e, 0x46, 0x7b, 0xc8, 0x88, 0x6e, 0xd2, 0x2c, - 0xc0, 0x36, 0xc5, 0x7a, 0x8d, 0xc9, 0xe3, 0x75, 0x84, 0x21, 0x75, 0x96, 0xd8, 0x0f, 0x29, 0x2b, - 0x25, 0xcd, 0x92, 0x4b, 0xf4, 0x01, 0x6c, 0x07, 0x98, 0x60, 0x3a, 0x15, 0x51, 0x36, 0xd8, 0xc9, - 0x16, 0xdb, 0x7b, 0xcd, 0xc3, 0x42, 0x50, 0xf9, 0xcd, 0x76, 0xa8, 0xde, 0x64, 0x22, 0xf6, 0xcd, - 0x8f, 0x85, 0x04, 0xcb, 0x63, 0x20, 0x8f, 0x85, 0x04, 0x8b, 0x63, 0x5d, 0xa8, 0x2e, 0xfc, 0x60, - 0x86, 0xf5, 0x16, 0x93, 0xf1, 0x05, 0xea, 0x41, 0x6b, 0x8e, 0xc9, 0x2c, 0x70, 0x56, 0x34, 0x62, - 0x74, 0x9b, 0x61, 0x9a, 0xdc, 0x32, 0x0f, 0xe1, 0x61, 0x8a, 0x86, 0xbb, 0x32, 0xfa, 0x47, 0x19, - 0x76, 0x2c, 0xdf, 0x75, 0xcf, 0xed, 0xd9, 0x9b, 0x02, 0x9c, 0x26, 0xe0, 0x2f, 0x6f, 0x86, 0x5f, - 0xcb, 0x80, 0x3f, 0x71, 0x4d, 0x2b, 0xca, 0x35, 0x55, 0x88, 0xa9, 0xe6, 0x13, 0x53, 0x53, 0x89, - 0x91, 0xa8, 0xd7, 0x13, 0xa8, 0xc7, 0x90, 0x36, 0x36, 0x40, 0xda, 0x5c, 0x87, 0xf4, 0x5b, 0xd8, - 0x5d, 0xc3, 0xe1, 0xae, 0xa0, 0xfe, 0x5b, 0x86, 0x87, 0x47, 0x1e, 0xa1, 0xb6, 0xeb, 0xa6, 0x30, - 0x8d, 0x6b, 0xa2, 0x54, 0xb8, 0x26, 0xca, 0xff, 0xa7, 0x26, 0x34, 0x85, 0x14, 0xc9, 0x60, 0x25, - 0xc1, 0x60, 0xa1, 0x3a, 0x51, 0xba, 0x53, 0x2d, 0xd5, 0x9d, 0xd0, 0x7b, 0x00, 0xfc, 0x62, 0x33, - 0xe3, 0x1c, 0xfc, 0x26, 0xdb, 0x39, 0x11, 0xcd, 0x48, 0xf2, 0xd5, 0xc8, 0xe6, 0x2b, 0x59, 0x25, - 0x7d, 0xe8, 0xc8, 0x78, 0x66, 0xc1, 0x9c, 0xc5, 0x24, 0x2a, 0xa5, 0x2d, 0xf6, 0x47, 0xc1, 0x3c, - 0x8a, 0x2a, 0xcd, 0x61, 0x6b, 0x9d, 0xc3, 0x23, 0xd8, 0x49, 0xc3, 0x7e, 0x57, 0x0a, 0xff, 0x2a, - 0xc1, 0xee, 0x99, 0xe7, 0x64, 0x92, 0x98, 0x55, 0x18, 0x6b, 0xb0, 0x96, 0x33, 0x60, 0xed, 0x42, - 0x75, 0x15, 0x06, 0x17, 0x58, 0xd0, 0xc4, 0x17, 0x49, 0xbc, 0x2a, 0x2a, 0x5e, 0xa9, 0x8c, 0xab, - 0xeb, 0x19, 0x4f, 0x41, 0x5f, 0x8f, 0xf2, 0x8e, 0x39, 0x47, 0x79, 0xc5, 0x6f, 0x57, 0x93, 0xbf, - 0x53, 0xe6, 0x03, 0xb8, 0x7f, 0x80, 0xe9, 0x6b, 0x5e, 0xa6, 0x02, 0x00, 0x73, 0x0c, 0x28, 0xb9, - 0x79, 0xe3, 0x4f, 0x6c, 0xa9, 0xfe, 0xe4, 0x60, 0x27, 0xf5, 0xa5, 0x96, 0xf9, 0x15, 0xb3, 0x7d, - 0xe8, 0x10, 0xea, 0x07, 0xd7, 0x9b, 0xc0, 0xed, 0x80, 0xb6, 0xb4, 0xdf, 0x8a, 0xa7, 0x2d, 0xfa, - 0x34, 0x0f, 0x58, 0x04, 0xf1, 0x51, 0x11, 0x41, 0x72, 0x50, 0x28, 0x15, 0x1b, 0x14, 0x7e, 0x02, - 0x74, 0x8a, 0xe3, 0x99, 0xe5, 0x96, 0x37, 0x56, 0xd2, 0x54, 0x56, 0x69, 0xd2, 0xa1, 0x3e, 0x73, - 0xb1, 0xed, 0x85, 0x2b, 0x41, 0xac, 0x5c, 0x9a, 0x3f, 0xc3, 0x03, 0xc5, 0xba, 0x88, 0x33, 0xca, - 0x87, 0x5c, 0x08, 0xeb, 0xd1, 0x27, 0xfa, 0x12, 0x6a, 0x7c, 0xb0, 0x63, 0xb6, 0xdb, 0xc3, 0xc7, - 0x6a, 0xdc, 0xcc, 0x48, 0xe8, 0x89, 0x49, 0xd0, 0x12, 0xba, 0xc3, 0x7f, 0x1a, 0xd0, 0x96, 0xa3, - 0x09, 0x1f, 0x3b, 0x91, 0x03, 0xdb, 0xc9, 0x19, 0x0c, 0x3d, 0xcd, 0x9f, 0x4a, 0x53, 0xa3, 0xb5, - 0xf1, 0xac, 0x88, 0x2a, 0xcf, 0xc0, 0xdc, 0xfa, 0xac, 0x84, 0x08, 0x74, 0xd2, 0xa3, 0x11, 0x7a, - 0x9e, 0x6d, 0x23, 0x67, 0x16, 0x33, 0x06, 0x45, 0xd5, 0xa5, 0x5b, 0x74, 0xc5, 0xee, 0x8c, 0x3a, - 0xcf, 0xa0, 0x5b, 0xcd, 0xa8, 0x23, 0x94, 0xb1, 0x57, 0x58, 0x3f, 0xf6, 0xfb, 0x0b, 0xdc, 0x53, - 0x5e, 0x5c, 0x94, 0x83, 0x56, 0xd6, 0x74, 0x64, 0x7c, 0x52, 0x48, 0x37, 0xf6, 0xb5, 0x84, 0xb6, - 0xda, 0xc6, 0x50, 0x8e, 0x81, 0xcc, 0x37, 0xc6, 0xf8, 0xb4, 0x98, 0x72, 0xec, 0x8e, 0x40, 0x27, - 0xdd, 0x43, 0xf2, 0x78, 0xcc, 0xe9, 0x88, 0x79, 0x3c, 0xe6, 0xb5, 0x26, 0x73, 0x0b, 0xd9, 0x00, - 0x37, 0x2d, 0x04, 0x3d, 0xc9, 0x25, 0x44, 0xed, 0x3c, 0x46, 0xff, 0x76, 0xc5, 0xd8, 0xc5, 0x0a, - 0xde, 0x49, 0xbd, 0xe8, 0x28, 0x07, 0x9a, 0xec, 0x01, 0xc8, 0x78, 0x5e, 0x50, 0x3b, 0x95, 0x94, - 0xe8, 0x4a, 0x1b, 0x92, 0x52, 0x5b, 0xde, 0x86, 0xa4, 0x52, 0x0d, 0xce, 0xdc, 0x42, 0x0e, 0xb4, - 0xad, 0xd0, 0x13, 0xae, 0xa3, 0xb6, 0x80, 0x72, 0x4e, 0xaf, 0x77, 0x35, 0xe3, 0x69, 0x01, 0xcd, - 0x9b, 0xfa, 0x7e, 0x01, 0x3f, 0x36, 0xa4, 0xea, 0x79, 0x8d, 0xfd, 0x57, 0xfe, 0xc5, 0x7f, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x38, 0x07, 0x4c, 0x12, 0x83, 0x10, 0x00, 0x00, + // 1289 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x72, 0xdb, 0x44, + 0x17, 0x8e, 0x2d, 0x7f, 0x1e, 0xa7, 0x7e, 0xdd, 0x6d, 0x9a, 0xa8, 0x7a, 0x0b, 0x63, 0xc4, 0x40, + 0xdd, 0x42, 0x1d, 0x30, 0xfc, 0x61, 0x86, 0x61, 0x26, 0x75, 0x3d, 0x49, 0x21, 0xa4, 0x33, 0x72, + 0x5b, 0x66, 0x98, 0x61, 0x3c, 0x8a, 0xbd, 0x6e, 0x45, 0x65, 0xc9, 0x68, 0x57, 0xa1, 0xb9, 0x00, + 0x98, 0xe1, 0x3e, 0xb8, 0x10, 0xee, 0x83, 0xeb, 0xe0, 0x3f, 0xb3, 0x5f, 0x8a, 0x56, 0x96, 0x1c, + 0x91, 0x3f, 0xb1, 0x76, 0xcf, 0xd9, 0xf3, 0xf1, 0x3c, 0x7b, 0xce, 0x9e, 0x80, 0xf5, 0xc6, 0x5d, + 0x7b, 0x87, 0x04, 0x47, 0x17, 0xde, 0x1c, 0x93, 0x43, 0xea, 0xf9, 0x3e, 0x8e, 0x86, 0xeb, 0x28, + 0xa4, 0x21, 0xda, 0x63, 0xb2, 0xa1, 0x92, 0x0d, 0x85, 0xcc, 0xda, 0xe7, 0x27, 0xe6, 0x6f, 0xdc, + 0x88, 0x8a, 0xbf, 0x42, 0xdb, 0x3a, 0x48, 0xef, 0x87, 0xc1, 0xd2, 0x7b, 0x2d, 0x05, 0xc2, 0x45, + 0x84, 0x7d, 0xec, 0x12, 0xac, 0x7e, 0xb5, 0x43, 0x4a, 0xe6, 0x05, 0xcb, 0x50, 0x0a, 0xfe, 0xaf, + 0x09, 0x28, 0x26, 0x74, 0x16, 0xc5, 0x81, 0x14, 0xde, 0xd3, 0x84, 0x84, 0xba, 0x34, 0x26, 0x9a, + 0xb3, 0x0b, 0x1c, 0x11, 0x2f, 0x0c, 0xd4, 0xaf, 0x90, 0xd9, 0x7f, 0x55, 0xe1, 0xce, 0xa9, 0x47, + 0xa8, 0x23, 0x0e, 0x12, 0x07, 0xff, 0x12, 0x63, 0x42, 0xd1, 0x1e, 0xd4, 0x7d, 0x6f, 0xe5, 0x51, + 0xb3, 0xd2, 0xaf, 0x0c, 0x0c, 0x47, 0x2c, 0xd0, 0x3e, 0x34, 0xc2, 0xe5, 0x92, 0x60, 0x6a, 0x56, + 0xfb, 0x95, 0x41, 0xdb, 0x91, 0x2b, 0xf4, 0x0d, 0x34, 0x49, 0x18, 0xd1, 0xd9, 0xf9, 0xa5, 0x69, + 0xf4, 0x2b, 0x83, 0xee, 0xe8, 0xa3, 0x61, 0x1e, 0x4e, 0x43, 0xe6, 0x69, 0x1a, 0x46, 0x74, 0xc8, + 0xfe, 0x3c, 0xb9, 0x74, 0x1a, 0x84, 0xff, 0x32, 0xbb, 0x4b, 0xcf, 0xa7, 0x38, 0x32, 0x6b, 0xc2, + 0xae, 0x58, 0xa1, 0x63, 0x00, 0x6e, 0x37, 0x8c, 0x16, 0x38, 0x32, 0xeb, 0xdc, 0xf4, 0xa0, 0x84, + 0xe9, 0xe7, 0x4c, 0xdf, 0x69, 0x13, 0xf5, 0x89, 0xbe, 0x86, 0x5d, 0x01, 0xc9, 0x6c, 0x1e, 0x2e, + 0x30, 0x31, 0x1b, 0x7d, 0x63, 0xd0, 0x1d, 0xdd, 0x13, 0xa6, 0x14, 0xfc, 0x53, 0x01, 0xda, 0x38, + 0x5c, 0x60, 0xa7, 0x23, 0xd4, 0xd9, 0x37, 0x41, 0xf7, 0xa1, 0x1d, 0xb8, 0x2b, 0x4c, 0xd6, 0xee, + 0x1c, 0x9b, 0x4d, 0x1e, 0xe1, 0xd5, 0x86, 0x1d, 0x40, 0x4b, 0x39, 0xb7, 0x9f, 0x40, 0x43, 0xa4, + 0x86, 0x3a, 0xd0, 0x7c, 0x79, 0xf6, 0xdd, 0xd9, 0xf3, 0x1f, 0xce, 0x7a, 0x3b, 0xa8, 0x05, 0xb5, + 0xb3, 0xa3, 0xef, 0x27, 0xbd, 0x0a, 0xba, 0x0d, 0xb7, 0x4e, 0x8f, 0xa6, 0x2f, 0x66, 0xce, 0xe4, + 0x74, 0x72, 0x34, 0x9d, 0x3c, 0xed, 0x55, 0x51, 0x17, 0x60, 0x7c, 0x72, 0xe4, 0xbc, 0x98, 0x71, + 0x15, 0xc3, 0x7e, 0x1f, 0xda, 0x49, 0x0e, 0xa8, 0x09, 0xc6, 0xd1, 0x74, 0x2c, 0x4c, 0x3c, 0x9d, + 0x4c, 0xc7, 0xbd, 0x8a, 0xfd, 0x47, 0x05, 0xf6, 0x74, 0xca, 0xc8, 0x3a, 0x0c, 0x08, 0x66, 0x9c, + 0xcd, 0xc3, 0x38, 0x48, 0x38, 0xe3, 0x0b, 0x84, 0xa0, 0x16, 0xe0, 0x77, 0x8a, 0x31, 0xfe, 0xcd, + 0x34, 0x69, 0x48, 0x5d, 0x9f, 0xb3, 0x65, 0x38, 0x62, 0x81, 0x3e, 0x87, 0x96, 0x84, 0x82, 0x98, + 0xb5, 0xbe, 0x31, 0xe8, 0x8c, 0xee, 0xea, 0x00, 0x49, 0x8f, 0x4e, 0xa2, 0x66, 0x1f, 0xc3, 0xc1, + 0x31, 0x56, 0x91, 0x08, 0xfc, 0xd4, 0x0d, 0x62, 0x7e, 0xdd, 0x15, 0xe6, 0xc1, 0x30, 0xbf, 0xee, + 0x0a, 0x23, 0x13, 0x9a, 0xf2, 0xfa, 0xf1, 0x70, 0xea, 0x8e, 0x5a, 0xda, 0x14, 0xcc, 0x4d, 0x43, + 0x32, 0xaf, 0x3c, 0x4b, 0x1f, 0x43, 0x8d, 0x55, 0x06, 0x37, 0xd3, 0x19, 0x21, 0x3d, 0xce, 0x67, + 0xc1, 0x32, 0x74, 0xb8, 0x5c, 0xa7, 0xce, 0xc8, 0x52, 0x77, 0x92, 0xf6, 0x3a, 0x0e, 0x03, 0x8a, + 0x03, 0x7a, 0xb3, 0xf8, 0x4f, 0xe1, 0x5e, 0x8e, 0x25, 0x99, 0xc0, 0x21, 0x34, 0x65, 0x68, 0xdc, + 0x5a, 0x21, 0xae, 0x4a, 0xcb, 0xfe, 0xcd, 0x80, 0xbd, 0x97, 0xeb, 0x85, 0x4b, 0xb1, 0x12, 0x6d, + 0x09, 0xea, 0x01, 0xd4, 0x79, 0x87, 0x91, 0x58, 0xdc, 0x16, 0xb6, 0x45, 0x1b, 0x1a, 0xb3, 0xbf, + 0x8e, 0x90, 0xa3, 0x47, 0xd0, 0xb8, 0x70, 0xfd, 0x18, 0x13, 0x0e, 0x44, 0x82, 0x9a, 0xd4, 0xe4, + 0xed, 0xc9, 0x91, 0x1a, 0xe8, 0x00, 0x9a, 0x8b, 0xe8, 0x92, 0xf5, 0x17, 0x5e, 0x92, 0x2d, 0xa7, + 0xb1, 0x88, 0x2e, 0x9d, 0x38, 0x40, 0x1f, 0xc2, 0xad, 0x85, 0x47, 0xdc, 0x73, 0x1f, 0xcf, 0xde, + 0x84, 0xe1, 0x5b, 0xc2, 0xab, 0xb2, 0xe5, 0xec, 0xca, 0xcd, 0x13, 0xb6, 0x87, 0x2c, 0x76, 0x93, + 0xe6, 0x11, 0x76, 0x29, 0x36, 0x1b, 0x5c, 0x9e, 0xac, 0x19, 0x86, 0xd4, 0x5b, 0xe1, 0x30, 0xa6, + 0xbc, 0x94, 0x0c, 0x47, 0x2d, 0xd1, 0x07, 0xb0, 0x1b, 0x61, 0x82, 0xe9, 0x4c, 0x46, 0xd9, 0xe2, + 0x27, 0x3b, 0x7c, 0xef, 0x95, 0x08, 0x0b, 0x41, 0xed, 0x57, 0xd7, 0xa3, 0x66, 0x9b, 0x8b, 0xf8, + 0xb7, 0x38, 0x16, 0x13, 0xac, 0x8e, 0x81, 0x3a, 0x16, 0x13, 0x2c, 0x8f, 0xed, 0x41, 0x7d, 0x19, + 0x46, 0x73, 0x6c, 0x76, 0xb8, 0x4c, 0x2c, 0x50, 0x1f, 0x3a, 0x0b, 0x4c, 0xe6, 0x91, 0xb7, 0xa6, + 0x8c, 0xd1, 0x5d, 0x8e, 0x69, 0x7a, 0xcb, 0x3e, 0x81, 0xbb, 0x19, 0x1a, 0x6e, 0xca, 0xe8, 0xef, + 0x55, 0xd8, 0x77, 0x42, 0xdf, 0x3f, 0x77, 0xe7, 0x6f, 0x4b, 0x70, 0x9a, 0x82, 0xbf, 0xba, 0x1d, + 0x7e, 0x23, 0x07, 0xfe, 0xd4, 0x35, 0xad, 0x69, 0xd7, 0x54, 0x23, 0xa6, 0x5e, 0x4c, 0x4c, 0x43, + 0x27, 0x46, 0xa1, 0xde, 0x4c, 0xa1, 0x9e, 0x40, 0xda, 0xda, 0x02, 0x69, 0x7b, 0x13, 0xd2, 0x6f, + 0xe1, 0x60, 0x03, 0x87, 0x9b, 0x82, 0xfa, 0x4f, 0x15, 0xee, 0x3e, 0x0b, 0x08, 0x75, 0x7d, 0x3f, + 0x83, 0x69, 0x52, 0x13, 0x95, 0xd2, 0x35, 0x51, 0xfd, 0x2f, 0x35, 0x61, 0x68, 0xa4, 0x28, 0x06, + 0x6b, 0x29, 0x06, 0x4b, 0xd5, 0x89, 0xd6, 0x9d, 0x1a, 0x99, 0xee, 0x84, 0xde, 0x03, 0x10, 0x17, + 0x9b, 0x1b, 0x17, 0xe0, 0xb7, 0xf9, 0xce, 0x99, 0x6c, 0x46, 0x8a, 0xaf, 0x56, 0x3e, 0x5f, 0xe9, + 0x2a, 0x19, 0x40, 0x4f, 0xc5, 0x33, 0x8f, 0x16, 0x3c, 0x26, 0x59, 0x29, 0x5d, 0xb9, 0x3f, 0x8e, + 0x16, 0x2c, 0xaa, 0x2c, 0x87, 0x9d, 0x4d, 0x0e, 0x9f, 0xc1, 0x7e, 0x16, 0xf6, 0x9b, 0x52, 0xf8, + 0x67, 0x05, 0x0e, 0x5e, 0x06, 0x5e, 0x2e, 0x89, 0x79, 0x85, 0xb1, 0x01, 0x6b, 0x35, 0x07, 0xd6, + 0x3d, 0xa8, 0xaf, 0xe3, 0xe8, 0x35, 0x96, 0x34, 0x89, 0x45, 0x1a, 0xaf, 0x9a, 0x8e, 0x57, 0x26, + 0xe3, 0xfa, 0x66, 0xc6, 0x33, 0x30, 0x37, 0xa3, 0xbc, 0x61, 0xce, 0x2c, 0xaf, 0xe4, 0xed, 0x6a, + 0x8b, 0x77, 0xca, 0xbe, 0x03, 0xb7, 0x8f, 0x31, 0x7d, 0x25, 0xca, 0x54, 0x02, 0x60, 0x4f, 0x00, + 0xa5, 0x37, 0xaf, 0xfc, 0xc9, 0x2d, 0xdd, 0x9f, 0x1a, 0xec, 0x94, 0xbe, 0xd2, 0xb2, 0xbf, 0xe2, + 0xb6, 0x4f, 0x3c, 0x42, 0xc3, 0xe8, 0x72, 0x1b, 0xb8, 0x3d, 0x30, 0x56, 0xee, 0x3b, 0xf9, 0xb4, + 0xb1, 0x4f, 0xfb, 0x98, 0x47, 0x90, 0x1c, 0x95, 0x11, 0xa4, 0x07, 0x85, 0x4a, 0xb9, 0x41, 0xe1, + 0x1d, 0xa0, 0x17, 0x38, 0x99, 0x59, 0xae, 0x79, 0x63, 0x15, 0x4d, 0x55, 0x9d, 0x26, 0x13, 0x9a, + 0x73, 0x1f, 0xbb, 0x41, 0xbc, 0x96, 0xc4, 0xaa, 0x25, 0x6b, 0x6b, 0x6b, 0x37, 0x72, 0x7d, 0x1f, + 0xfb, 0xf2, 0xb9, 0x4a, 0xd6, 0xf6, 0x4f, 0x70, 0x47, 0xf3, 0x2c, 0x73, 0x60, 0xb9, 0x92, 0xd7, + 0xd2, 0x33, 0xfb, 0x44, 0x5f, 0x42, 0x43, 0x0c, 0x7d, 0xdc, 0x6f, 0x77, 0x74, 0x5f, 0xcf, 0x89, + 0x1b, 0x89, 0x03, 0x39, 0x25, 0x3a, 0x52, 0x77, 0xf4, 0x77, 0x0b, 0xba, 0x6a, 0x6c, 0x11, 0x23, + 0x29, 0xf2, 0x60, 0x37, 0x3d, 0x9f, 0xa1, 0x87, 0xc5, 0x13, 0x6b, 0x66, 0xec, 0xb6, 0x1e, 0x95, + 0x51, 0x15, 0x19, 0xd8, 0x3b, 0x9f, 0x55, 0x10, 0x81, 0x5e, 0x76, 0x6c, 0x42, 0x8f, 0xf3, 0x6d, + 0x14, 0xcc, 0x69, 0xd6, 0xb0, 0xac, 0xba, 0x72, 0x8b, 0x2e, 0xf8, 0x7d, 0xd2, 0x67, 0x1d, 0x74, + 0xad, 0x19, 0x7d, 0xbc, 0xb2, 0x0e, 0x4b, 0xeb, 0x27, 0x7e, 0x7f, 0x86, 0x5b, 0xda, 0x6b, 0x8c, + 0x0a, 0xd0, 0xca, 0x9b, 0x9c, 0xac, 0x4f, 0x4a, 0xe9, 0x26, 0xbe, 0x56, 0xd0, 0xd5, 0x5b, 0x1c, + 0x2a, 0x30, 0x90, 0xfb, 0xfe, 0x58, 0x9f, 0x96, 0x53, 0x4e, 0xdc, 0x11, 0xe8, 0x65, 0xfb, 0x4b, + 0x11, 0x8f, 0x05, 0xdd, 0xb2, 0x88, 0xc7, 0xa2, 0xb6, 0x65, 0xef, 0x20, 0x17, 0xe0, 0xaa, 0xbd, + 0xa0, 0x07, 0x85, 0x84, 0xe8, 0x5d, 0xc9, 0x1a, 0x5c, 0xaf, 0x98, 0xb8, 0x58, 0xc3, 0xff, 0x32, + 0xaf, 0x3d, 0x2a, 0x80, 0x26, 0x7f, 0x38, 0xb2, 0x1e, 0x97, 0xd4, 0xce, 0x24, 0x25, 0x3b, 0xd6, + 0x96, 0xa4, 0xf4, 0x76, 0xb8, 0x25, 0xa9, 0x4c, 0xf3, 0xb3, 0x77, 0x90, 0x07, 0x5d, 0x27, 0x0e, + 0xa4, 0x6b, 0xd6, 0x16, 0x50, 0xc1, 0xe9, 0xcd, 0x8e, 0x67, 0x3d, 0x2c, 0xa1, 0x79, 0x55, 0xdf, + 0x4f, 0xe0, 0xc7, 0x96, 0x52, 0x3d, 0x6f, 0xf0, 0xff, 0xd8, 0xbf, 0xf8, 0x37, 0x00, 0x00, 0xff, + 0xff, 0xb6, 0x48, 0x98, 0x76, 0x9f, 0x10, 0x00, 0x00, } diff --git a/pkg/releasetesting/environment.go b/pkg/releasetesting/environment.go index ee078e18260..e4184b5f4c8 100644 --- a/pkg/releasetesting/environment.go +++ b/pkg/releasetesting/environment.go @@ -20,6 +20,7 @@ import ( "bytes" "fmt" "log" + "sync" "time" "k8s.io/api/core/v1" @@ -31,10 +32,13 @@ import ( // Environment encapsulates information about where test suite executes and returns results type Environment struct { - Namespace string - KubeClient environment.KubeClient - Stream services.ReleaseService_RunReleaseTestServer - Timeout int64 + Namespace string + KubeClient environment.KubeClient + Stream services.ReleaseService_RunReleaseTestServer + Timeout int64 + Parallel bool + Parallelism uint32 + streamLock sync.Mutex } func (env *Environment) createTestPod(test *test) error { @@ -108,6 +112,8 @@ func (env *Environment) streamUnknown(name, info string) error { func (env *Environment) streamMessage(msg string, status release.TestRun_Status) error { resp := &services.TestReleaseResponse{Msg: msg, Status: status} + env.streamLock.Lock() + defer env.streamLock.Unlock() return env.Stream.Send(resp) } diff --git a/pkg/releasetesting/environment_test.go b/pkg/releasetesting/environment_test.go index 4403ab6a98c..d9377b0f3da 100644 --- a/pkg/releasetesting/environment_test.go +++ b/pkg/releasetesting/environment_test.go @@ -121,10 +121,11 @@ func newMockTestingEnvironment() *MockTestingEnvironment { return &MockTestingEnvironment{ Environment: &Environment{ - Namespace: "default", - KubeClient: tEnv.KubeClient, - Timeout: 5, - Stream: &mockStream{}, + Namespace: "default", + KubeClient: tEnv.KubeClient, + Timeout: 5, + Stream: &mockStream{}, + Parallelism: 20, }, } } diff --git a/pkg/releasetesting/test_suite.go b/pkg/releasetesting/test_suite.go index 8ba83fdb2ca..4fa5de52662 100644 --- a/pkg/releasetesting/test_suite.go +++ b/pkg/releasetesting/test_suite.go @@ -17,7 +17,9 @@ limitations under the License. package releasetesting import ( + "context" "fmt" + "golang.org/x/sync/semaphore" "strings" "github.com/ghodss/yaml" @@ -69,53 +71,91 @@ func (ts *TestSuite) Run(env *Environment) error { env.streamMessage("No Tests Found", release.TestRun_UNKNOWN) } + var tests []*test + for _, testManifest := range ts.TestManifests { test, err := newTest(testManifest) if err != nil { return err } - test.result.StartedAt = timeconv.Now() - if err := env.streamRunning(test.result.Name); err != nil { - return err + tests = append(tests, test) + } + + if env.Parallel { + c := make(chan error, len(tests)) + // Use a semaphore to restrict the number of tests running in parallel. + sem := semaphore.NewWeighted(int64(env.Parallelism)) + ctx := context.Background() + for _, t := range tests { + sem.Acquire(ctx, 1) + go func(t *test, sem *semaphore.Weighted) { + defer sem.Release(1) + c <- t.run(env) + }(t, sem) } - test.result.Status = release.TestRun_RUNNING - resourceCreated := true - if err := env.createTestPod(test); err != nil { - resourceCreated = false - if streamErr := env.streamError(test.result.Info); streamErr != nil { + for range tests { + if err := <-c; err != nil { return err } } - resourceCleanExit := true - status := v1.PodUnknown - if resourceCreated { - status, err = env.getTestPodStatus(test) - if err != nil { - resourceCleanExit = false - if streamErr := env.streamError(test.result.Info); streamErr != nil { - return streamErr - } + } else { + for _, t := range tests { + if err := t.run(env); err != nil { + return err } } + } - if resourceCreated && resourceCleanExit { - if err := test.assignTestResult(status); err != nil { - return err - } + for _, t := range tests { + ts.Results = append(ts.Results, t.result) + } - if err := env.streamResult(test.result); err != nil { - return err + ts.CompletedAt = timeconv.Now() + return nil +} + +func (t *test) run(env *Environment) error { + t.result.StartedAt = timeconv.Now() + if err := env.streamRunning(t.result.Name); err != nil { + return err + } + t.result.Status = release.TestRun_RUNNING + + resourceCreated := true + if err := env.createTestPod(t); err != nil { + resourceCreated = false + if streamErr := env.streamError(t.result.Info); streamErr != nil { + return err + } + } + + resourceCleanExit := true + status := v1.PodUnknown + if resourceCreated { + var err error + status, err = env.getTestPodStatus(t) + if err != nil { + resourceCleanExit = false + if streamErr := env.streamError(t.result.Info); streamErr != nil { + return streamErr } } + } + + if resourceCreated && resourceCleanExit { + if err := t.assignTestResult(status); err != nil { + return err + } - test.result.CompletedAt = timeconv.Now() - ts.Results = append(ts.Results, test.result) + if err := env.streamResult(t.result); err != nil { + return err + } } - ts.CompletedAt = timeconv.Now() + t.result.CompletedAt = timeconv.Now() return nil } diff --git a/pkg/releasetesting/test_suite_test.go b/pkg/releasetesting/test_suite_test.go index bf85e42075e..59f12295307 100644 --- a/pkg/releasetesting/test_suite_test.go +++ b/pkg/releasetesting/test_suite_test.go @@ -220,6 +220,107 @@ func TestExtractTestManifestsFromHooks(t *testing.T) { } } +func TestParallelTestRun(t *testing.T) { + ts := testSuiteFixture([]string{manifestWithTestSuccessHook, manifestWithTestSuccessHook}) + env := testEnvFixture() + env.Parallel = true + env.KubeClient = newSleepOnWaitKubeClient() + if err := ts.Run(env); err != nil { + t.Errorf("%s", err) + } + + if len(ts.Results) != 2 { + t.Errorf("Expected 2 test result. Got %v", len(ts.Results)) + } + + stream := env.Stream.(*mockStream) + if len(stream.messages) != 4 { + t.Errorf("Expected four messages, Got: %v", len(stream.messages)) + } + + if stream.messages[0].Status != release.TestRun_RUNNING { + t.Errorf("Expected first message status to be RUNNING, Got: %v", stream.messages[0].Status) + } + if stream.messages[1].Status != release.TestRun_RUNNING { + t.Errorf("Expected second message status to be RUNNING, Got: %v", stream.messages[1].Status) + } + if stream.messages[2].Status != release.TestRun_SUCCESS { + t.Errorf("Expected third message status to be SUCCESS, Got: %v", stream.messages[2].Status) + } + if stream.messages[3].Status != release.TestRun_SUCCESS { + t.Errorf("Expected fourth message status to be SUCCESS, Got: %v", stream.messages[3].Status) + } +} + +func TestParallelTestRunFailure(t *testing.T) { + ts := testSuiteFixture([]string{manifestWithTestSuccessHook, manifestWithTestFailureHook}) + env := testEnvFixture() + env.Parallel = true + env.KubeClient = newSleepOnWaitKubeClient() + if err := ts.Run(env); err != nil { + t.Errorf("%s", err) + } + + if len(ts.Results) != 2 { + t.Errorf("Expected 2 test result. Got %v", len(ts.Results)) + } + + stream := env.Stream.(*mockStream) + if len(stream.messages) != 4 { + t.Errorf("Expected four messages, Got: %v", len(stream.messages)) + } + + if stream.messages[0].Status != release.TestRun_RUNNING { + t.Errorf("Expected first message status to be RUNNING, Got: %v", stream.messages[0].Status) + } + if stream.messages[1].Status != release.TestRun_RUNNING { + t.Errorf("Expected second message status to be RUNNING, Got: %v", stream.messages[1].Status) + } + + if ts.Results[0].Status != release.TestRun_SUCCESS { + t.Errorf("Expected first test result to be successful, got: %v", ts.Results[0].Status) + } + + if ts.Results[1].Status != release.TestRun_FAILURE { + t.Errorf("Expected second test result to be failure, got: %v", ts.Results[1].Status) + } +} + +func TestParallelism(t *testing.T) { + ts := testSuiteFixture([]string{manifestWithTestSuccessHook, manifestWithTestSuccessHook, manifestWithTestFailureHook}) + env := testEnvFixture() + env.Parallel = true + env.Parallelism = 2 + env.KubeClient = newSleepOnWaitKubeClient() + if err := ts.Run(env); err != nil { + t.Errorf("%s", err) + } + + stream := env.Stream.(*mockStream) + + if stream.messages[0].Status != release.TestRun_RUNNING { + t.Errorf("Expected first message status to be RUNNING, Got: %v", stream.messages[0].Status) + } + if stream.messages[1].Status != release.TestRun_RUNNING { + t.Errorf("Expected second message status to be RUNNING, Got: %v", stream.messages[1].Status) + } + if stream.messages[2].Status == release.TestRun_RUNNING { + t.Errorf("Expected third message status to be not be RUNNING") + } + + if ts.Results[0].Status != release.TestRun_SUCCESS { + t.Errorf("Expected first test result to be successful, got: %v", ts.Results[0].Status) + } + + if ts.Results[1].Status != release.TestRun_SUCCESS { + t.Errorf("Expected second test result to be successful, got: %v", ts.Results[1].Status) + } + + if ts.Results[2].Status != release.TestRun_FAILURE { + t.Errorf("Expected third test result to be failure, got: %v", ts.Results[2].Status) + } +} + func chartStub() *chart.Chart { return &chart.Chart{ Metadata: &chart.Metadata{ @@ -328,6 +429,26 @@ func (p *podSucceededKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Rea return v1.PodSucceeded, nil } +// For testing parallelism, this kube client +// will sleep for 1ms before returning completed pod +// phase. +type sleepOnWaitKubeClient struct { + tillerEnv.PrintingKubeClient + firstWait bool +} + +func newSleepOnWaitKubeClient() *sleepOnWaitKubeClient { + return &sleepOnWaitKubeClient{ + PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, + } +} + +func (p *sleepOnWaitKubeClient) WaitAndGetCompletedPodPhase(ns string, r io.Reader, timeout time.Duration) (v1.PodPhase, error) { + time.Sleep(1 * time.Millisecond) + + return v1.PodSucceeded, nil +} + type podFailedKubeClient struct { tillerEnv.PrintingKubeClient } diff --git a/pkg/tiller/release_testing.go b/pkg/tiller/release_testing.go index 06d41e323d1..e6b6a7f6f70 100644 --- a/pkg/tiller/release_testing.go +++ b/pkg/tiller/release_testing.go @@ -22,6 +22,8 @@ import ( reltesting "k8s.io/helm/pkg/releasetesting" ) +const maxParallelism = 20 + // RunReleaseTest runs pre-defined tests stored as hooks on a given release func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream services.ReleaseService_RunReleaseTestServer) error { @@ -37,10 +39,12 @@ func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream } testEnv := &reltesting.Environment{ - Namespace: rel.Namespace, - KubeClient: s.env.KubeClient, - Timeout: req.Timeout, - Stream: stream, + Namespace: rel.Namespace, + KubeClient: s.env.KubeClient, + Timeout: req.Timeout, + Stream: stream, + Parallel: req.Parallel, + Parallelism: maxParallelism, } s.Log("running tests for release %s", rel.Name) tSuite, err := reltesting.NewTestSuite(rel) From ff35ab8626ffa5caf0a0a92477476d070e822131 Mon Sep 17 00:00:00 2001 From: tariqibrahim Date: Wed, 5 Dec 2018 14:21:02 -0800 Subject: [PATCH 292/483] Renaming Issue Templates correctly and adding a pull request template Signed-off-by: tariqibrahim --- .github/{issue_template.md => ISSUE_TEMPLATE.md} | 0 .github/PULL_REQUEST_TEMPLATE.md | 12 ++++++++++++ 2 files changed, 12 insertions(+) rename .github/{issue_template.md => ISSUE_TEMPLATE.md} (100%) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/issue_template.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from .github/issue_template.md rename to .github/ISSUE_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000000..595b5021855 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,12 @@ + + +**What this PR does / why we need it**: + +**Special notes for your reviewer**: + +**If applicable**: +- [ ] this PR contains documentation +- [ ] this PR contains unit tests +- [ ] this PR has been tested for backwards compatibility From 129ed826791a13f5b9135e482abdeaf108ef66da Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Fri, 7 Dec 2018 17:26:10 -0800 Subject: [PATCH 293/483] ref(*): kubernetes v1.13 support Signed-off-by: Adam Reese --- glide.lock | 125 ++++++++++++++++++----------------------------------- glide.yaml | 14 +++--- 2 files changed, 49 insertions(+), 90 deletions(-) diff --git a/glide.lock b/glide.lock index c6bec006d5a..8e63136e74e 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 813d803db5fc2cb46f8050190d2a307f247da5b7b3a4b00eb4d3e766882ad4f9 -updated: 2018-11-30T10:55:17.417707Z +hash: c54977baef0c54fe52cd8b2df120454018de82a1c8967a34b804e9a1fa0ae9cc +updated: 2018-12-08T01:25:26.033266Z imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -15,12 +15,13 @@ imports: subpackages: - winterm - name: github.com/Azure/go-autorest - version: bca49d5b51a50dc5bb17bbf6204c711c6dbded06 + version: ea233b6412b0421a65dc6160e16c893364664a95 subpackages: - autorest - autorest/adal - autorest/azure - autorest/date + - logger - version - name: github.com/beorn7/perks version: 3ac7bf7a47d159a033b107610db8a1b6575507a4 @@ -81,14 +82,6 @@ imports: - pkg/sysinfo - pkg/term - pkg/term/windows -- name: github.com/docker/go-connections - version: 3ede32e2033de7505e6500d6c868c2b9ed9f169d - subpackages: - - nat - - sockets - - tlsconfig -- name: github.com/docker/go-units - version: 9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1 - name: github.com/docker/spdystream version: 449fdfce4d962303d702fec724ef0ad181c92528 subpackages: @@ -102,13 +95,13 @@ imports: - name: github.com/ghodss/yaml version: 73d445a93680fa1a78ae23a5839bad48f32ba1ee - name: github.com/go-openapi/jsonpointer - version: 46af16f9f7b149af66e5d1bd010e3574dc06de98 + version: ef5f0afec364d3b9396b7b77b43dbe26bf1f8004 - name: github.com/go-openapi/jsonreference - version: 13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272 + version: 8483a886a90412cd6858df4ea3483dce9c8e35a3 - name: github.com/go-openapi/spec - version: 1de3e0542de65ad8d75452a595886fdd0befb363 + version: 5bae59e25b21498baea7f9d46e9c147ec106a42e - name: github.com/go-openapi/swag - version: f3f9494671f93fcff853e3c6e9e948b3eb71e590 + version: 5899d5c5e619fda5fa86e14795a835f473ca284c - name: github.com/gobwas/glob version: 5ccd90ef52e1e632236f7326478d4faa74f99438 subpackages: @@ -120,12 +113,10 @@ imports: - util/runes - util/strings - name: github.com/gogo/protobuf - version: c0656edd0d9eab7c66d1eb0c568f9039345796f7 + version: 342cbe0a04158f6dcb03ca0079991a51a4248c02 subpackages: - proto - sortkeys -- name: github.com/golang/glog - version: 44145f04b68cf362d9c4df2182967c2275eaefed - name: github.com/golang/groupcache version: 02826c3e79038b59d737d3b1c0a1d937f71a4433 subpackages: @@ -181,7 +172,7 @@ imports: - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 - name: github.com/json-iterator/go - version: f2b4162afba35581b6d4a50d3b8f34e33c144682 + version: ab8a2e0c74be9d3be70b3184d9acc634935ded82 - name: github.com/mailru/easyjson version: 2f5df55504ebc322e4d52d34df6a1f5b503bf26d subpackages: @@ -207,14 +198,9 @@ imports: - name: github.com/modern-go/concurrent version: bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94 - name: github.com/modern-go/reflect2 - version: 05fbef0ca5da472bbf96c9322b84a53edc03c9fd + version: 94122c33edd36123c84d5368cfb2b69df93a0ec8 - 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/peterbourgon/diskv version: 5f041e8faa004a95c88a202771f4cc3e991971e6 - name: github.com/pkg/errors @@ -273,7 +259,7 @@ imports: - scrypt - ssh/terminal - name: golang.org/x/net - version: 1c05540f6879653db88113bc4a2b70aec4bd491f + version: 0ed95abb35c445290478a5348a7b38bb154135fd subpackages: - context - context/ctxhttp @@ -370,7 +356,7 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: fd83cbc87e7632ccd8bbab63d2b673d4e0c631cc + version: 89a74a8d264df0e993299876a8cde88379b940ee subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -378,6 +364,7 @@ imports: - apps/v1 - apps/v1beta1 - apps/v1beta2 + - auditregistration/v1alpha1 - authentication/v1 - authentication/v1beta1 - authorization/v1 @@ -406,11 +393,11 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: 05e89e265cc594459a3d33a63e779d94e6614c63 + version: 20c909e7c8c3fec1a0e345b1d4e57f1c1623c368 subpackages: - pkg/features - name: k8s.io/apimachinery - version: 6dd46049f39503a1fc8d65de4bd566829e95faff + version: 2b1284ed4c93a43499e781493253e2ac5959c4fd subpackages: - pkg/api/equality - pkg/api/errors @@ -418,7 +405,6 @@ imports: - pkg/api/meta/testrestmapper - pkg/api/resource - pkg/api/validation - - pkg/api/validation/path - pkg/apis/meta/internalversion - pkg/apis/meta/v1 - pkg/apis/meta/v1/unstructured @@ -467,23 +453,21 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: e85ad7b666fef0476185731329f4cff1536efff8 + version: 9caa0299108fbdf51d3d9b8e8956834ae84dac75 subpackages: - - pkg/apis/audit - pkg/authentication/authenticator - pkg/authentication/serviceaccount - pkg/authentication/user - - pkg/endpoints/request - pkg/features - pkg/util/feature - name: k8s.io/cli-runtime - version: 79bf4e0b64544d8c490247abae089bea572ddae6 + version: a04da5c88c0796c1dc5ff976a9c91999779ac0e4 subpackages: - pkg/genericclioptions - pkg/genericclioptions/printers - pkg/genericclioptions/resource - name: k8s.io/client-go - version: 1638f8970cefaa404ff3a62950f88b08292b2696 + version: e64494209f554a6723674bd494d69445fb76a1d4 subpackages: - discovery - discovery/fake @@ -502,6 +486,8 @@ imports: - kubernetes/typed/apps/v1beta1/fake - kubernetes/typed/apps/v1beta2 - kubernetes/typed/apps/v1beta2/fake + - kubernetes/typed/auditregistration/v1alpha1 + - kubernetes/typed/auditregistration/v1alpha1/fake - kubernetes/typed/authentication/v1 - kubernetes/typed/authentication/v1/fake - kubernetes/typed/authentication/v1beta1 @@ -602,30 +588,20 @@ imports: - util/integer - util/jsonpath - util/retry +- name: k8s.io/klog + version: 8139d8cb77af419532b33dfa7dd09fbc5f1d344f - name: k8s.io/kube-openapi - version: 0cf8f7e6ed1d2e3d47d02e3b6e559369af24d803 + version: c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d subpackages: - pkg/util/proto - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 54a352dda957bce0f88e49b65a6ee8bba8c0ba74 + version: f2c8f1cadf1808ec28476682e49a3cce2b09efbf subpackages: - - pkg/api/events - pkg/api/legacyscheme - - pkg/api/pod - - pkg/api/ref - - pkg/api/resource - pkg/api/service - - pkg/api/testapi - pkg/api/v1/pod - - pkg/apis/admission - - pkg/apis/admission/install - - pkg/apis/admission/v1beta1 - - pkg/apis/admissionregistration - - pkg/apis/admissionregistration/install - - pkg/apis/admissionregistration/v1alpha1 - - pkg/apis/admissionregistration/v1beta1 - pkg/apis/apps - pkg/apis/apps/install - pkg/apis/apps/v1 @@ -657,7 +633,6 @@ imports: - pkg/apis/coordination/v1beta1 - pkg/apis/core - pkg/apis/core/helper - - pkg/apis/core/helper/qos - pkg/apis/core/install - pkg/apis/core/pods - pkg/apis/core/v1 @@ -669,12 +644,7 @@ imports: - pkg/apis/extensions - pkg/apis/extensions/install - pkg/apis/extensions/v1beta1 - - pkg/apis/imagepolicy - - pkg/apis/imagepolicy/install - - pkg/apis/imagepolicy/v1alpha1 - pkg/apis/networking - - pkg/apis/networking/install - - pkg/apis/networking/v1 - pkg/apis/policy - pkg/apis/policy/install - pkg/apis/policy/v1beta1 @@ -697,45 +667,36 @@ imports: - pkg/apis/storage/v1alpha1 - pkg/apis/storage/v1beta1 - pkg/capabilities - - pkg/client/clientset_generated/internalclientset - - pkg/client/clientset_generated/internalclientset/scheme - - pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion - - pkg/client/clientset_generated/internalclientset/typed/apps/internalversion - - pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion - - pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion - - pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion - - pkg/client/clientset_generated/internalclientset/typed/batch/internalversion - - pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion - - pkg/client/clientset_generated/internalclientset/typed/coordination/internalversion - - pkg/client/clientset_generated/internalclientset/typed/core/internalversion - - pkg/client/clientset_generated/internalclientset/typed/events/internalversion - - pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion - - pkg/client/clientset_generated/internalclientset/typed/networking/internalversion - - pkg/client/clientset_generated/internalclientset/typed/policy/internalversion - - pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion - - pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion - - pkg/client/clientset_generated/internalclientset/typed/settings/internalversion - - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion - pkg/controller - pkg/controller/deployment/util - - pkg/credentialprovider - pkg/features - pkg/fieldpath - - pkg/generated - pkg/kubectl - pkg/kubectl/apps - pkg/kubectl/cmd/get - - pkg/kubectl/cmd/templates - pkg/kubectl/cmd/testing - pkg/kubectl/cmd/util - pkg/kubectl/cmd/util/openapi - pkg/kubectl/cmd/util/openapi/testing - pkg/kubectl/cmd/util/openapi/validation + - pkg/kubectl/describe + - pkg/kubectl/describe/versioned + - pkg/kubectl/generated - pkg/kubectl/scheme - pkg/kubectl/util - - pkg/kubectl/util/hash + - pkg/kubectl/util/certificate + - pkg/kubectl/util/deployment + - pkg/kubectl/util/event + - pkg/kubectl/util/fieldpath - pkg/kubectl/util/i18n + - pkg/kubectl/util/podutils + - pkg/kubectl/util/printers + - pkg/kubectl/util/qos + - pkg/kubectl/util/rbac + - pkg/kubectl/util/resource - pkg/kubectl/util/slice + - pkg/kubectl/util/storage + - pkg/kubectl/util/templates - pkg/kubectl/util/term - pkg/kubectl/validation - pkg/kubelet/apis @@ -743,12 +704,7 @@ imports: - pkg/master/ports - pkg/printers - pkg/printers/internalversion - - pkg/registry/rbac/validation - - pkg/scheduler/algorithm - - pkg/scheduler/algorithm/priorities/util - pkg/scheduler/api - - pkg/scheduler/cache - - pkg/scheduler/util - pkg/security/apparmor - pkg/serviceaccount - pkg/util/file @@ -758,7 +714,6 @@ imports: - pkg/util/net/sets - pkg/util/node - pkg/util/parsers - - pkg/util/slice - pkg/util/taints - pkg/version - name: k8s.io/utils @@ -768,6 +723,8 @@ imports: - exec - exec/testing - pointer +- name: sigs.k8s.io/yaml + version: fd68e9863619f6ec2fdd8625fe1f02e7c877e480 - name: vbom.ml/util version: db5cfe13f5cc80a4990d98e2e1b0707a4d1a5394 subpackages: diff --git a/glide.yaml b/glide.yaml index 52cee814228..1abfacc0eb0 100644 --- a/glide.yaml +++ b/glide.yaml @@ -45,17 +45,19 @@ import: version: 0.8.0 - package: github.com/grpc-ecosystem/go-grpc-prometheus - package: k8s.io/kubernetes - version: release-1.12 + version: release-1.13 - package: k8s.io/client-go - version: kubernetes-1.12.0 + version: kubernetes-1.13.0 - package: k8s.io/api - version: kubernetes-1.12.0 + version: kubernetes-1.13.0 - package: k8s.io/apimachinery - version: kubernetes-1.12.0 + version: kubernetes-1.13.0 - package: k8s.io/apiserver - version: kubernetes-1.12.0 + version: kubernetes-1.13.0 - package: k8s.io/cli-runtime - version: kubernetes-1.12.0 + version: kubernetes-1.13.0 + - package: k8s.io/apiextensions-apiserver + version: kubernetes-1.13.0 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 From c7009a155c5c591018cf25e85cf94f6148513780 Mon Sep 17 00:00:00 2001 From: Ben Tyler Date: Wed, 12 Dec 2018 12:53:59 -0800 Subject: [PATCH 294/483] docs: add Shipper to the list of additional tools (#5051) Signed-off-by: Ben Tyler --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index 520616e55d7..c6735e0eafd 100644 --- a/docs/related.md +++ b/docs/related.md @@ -81,6 +81,7 @@ Tools layered on top of Helm or Tiller. - [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client - [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API - [Schelm](https://github.com/databus23/schelm) - Render a Helm manifest to a directory +- [Shipper](https://github.com/bookingcom/shipper) - Multi-cluster canary or blue-green rollouts using Helm - [VIM-Kubernetes](https://github.com/andrewstuart/vim-kubernetes) - VIM plugin for Kubernetes and Helm ## Helm Included From 9aa773042d56f3f4efeed41e281381c94682d86a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Fri, 14 Dec 2018 18:14:14 +0100 Subject: [PATCH 295/483] create: include the namespace in NOTES.txt for LoadBalancer status (#5055) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kévin Dunglas --- pkg/chartutil/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 82d307ded4e..36b07adb562 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -255,7 +255,7 @@ const defaultNotes = `1. Get the application URL by running these commands: echo http://$NODE_IP:$NODE_PORT {{- else if contains "LoadBalancer" .Values.service.type }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc -w {{ include ".fullname" . }}' + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include ".fullname" . }}' export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include ".fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.service.port }} {{- else if contains "ClusterIP" .Values.service.type }} From e9a5465c661a7543d5a968f0020fc4729f95874f Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Sat, 15 Dec 2018 01:19:23 +0800 Subject: [PATCH 296/483] Fix some spelling error (#5032) Signed-off-by: JoeWrightss --- _proto/README.md | 2 +- pkg/chartutil/doc.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_proto/README.md b/_proto/README.md index fcc2c52f10d..0ebd6b6a42a 100644 --- a/_proto/README.md +++ b/_proto/README.md @@ -6,5 +6,5 @@ Packages - `hapi.chart` Complete serialization of Heml charts - `hapi.release` Information about installed charts (Releases) such as metadata about when they were installed, their status, and how they were configured. - `hapi.services.rudder` Definition for the ReleaseModuleService used by Tiller to manipulate releases on a given node - - `hapi.services.tiller` Definition of the ReleaseService provoded by Tiller and used by Helm clients to manipulate releases cluster wide. + - `hapi.services.tiller` Definition of the ReleaseService provided by Tiller and used by Helm clients to manipulate releases cluster wide. - `hapi.version` Version meta-data used by tiller to express it's version diff --git a/pkg/chartutil/doc.go b/pkg/chartutil/doc.go index cb3f5d1f1a0..a4f6d451584 100644 --- a/pkg/chartutil/doc.go +++ b/pkg/chartutil/doc.go @@ -25,7 +25,7 @@ A chart can be represented on the file system in one of two ways: - As a tarred gzipped file containing a directory that then contains a Chart.yaml file. -This package provides utilitites for working with those file formats. +This package provides utilities for working with those file formats. The preferred way of loading a chart is using 'chartutil.Load`: From 9174f5b9e5f8e9ab9fa2bce95247e4e8a9d21aa7 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Fri, 14 Dec 2018 13:48:54 -0800 Subject: [PATCH 297/483] chore(deps): bump kubernetes to v1.13.1 Signed-off-by: Adam Reese --- glide.lock | 14 +++++++------- glide.yaml | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/glide.lock b/glide.lock index 8e63136e74e..105dada1f40 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: c54977baef0c54fe52cd8b2df120454018de82a1c8967a34b804e9a1fa0ae9cc -updated: 2018-12-08T01:25:26.033266Z +hash: 2af9a5c4f891a0f44109a929a494b5aeaaffa3a87cd1f3881f25f79845703d5b +updated: 2018-12-14T21:39:31.112097Z imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -356,7 +356,7 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: 89a74a8d264df0e993299876a8cde88379b940ee + version: 05914d821849570fba9eacfb29466f2d8d3cd229 subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -393,7 +393,7 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: 20c909e7c8c3fec1a0e345b1d4e57f1c1623c368 + version: 0fe22c71c47604641d9aa352c785b7912c200562 subpackages: - pkg/features - name: k8s.io/apimachinery @@ -453,7 +453,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 9caa0299108fbdf51d3d9b8e8956834ae84dac75 + version: 3ccfe8365421eb08e334b195786a2973460741d8 subpackages: - pkg/authentication/authenticator - pkg/authentication/serviceaccount @@ -461,13 +461,13 @@ imports: - pkg/features - pkg/util/feature - name: k8s.io/cli-runtime - version: a04da5c88c0796c1dc5ff976a9c91999779ac0e4 + version: 835b10687cb6556f6b113099ef925146a56d5981 subpackages: - pkg/genericclioptions - pkg/genericclioptions/printers - pkg/genericclioptions/resource - name: k8s.io/client-go - version: e64494209f554a6723674bd494d69445fb76a1d4 + version: 8d9ed539ba3134352c586810e749e58df4e94e4f subpackages: - discovery - discovery/fake diff --git a/glide.yaml b/glide.yaml index 1abfacc0eb0..bf81b22ee60 100644 --- a/glide.yaml +++ b/glide.yaml @@ -47,17 +47,17 @@ import: - package: k8s.io/kubernetes version: release-1.13 - package: k8s.io/client-go - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: k8s.io/api - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: k8s.io/apimachinery - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: k8s.io/apiserver - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: k8s.io/cli-runtime - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: k8s.io/apiextensions-apiserver - version: kubernetes-1.13.0 + version: kubernetes-1.13.1 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 From 89467a8bf154aa19ad41c6775dc4a4f7ce6dfc04 Mon Sep 17 00:00:00 2001 From: Alex Humphreys Date: Tue, 18 Dec 2018 15:24:33 +0100 Subject: [PATCH 298/483] Fix(helm): Use spaces in ingress template The rest of the ingress template was using spaces, just these two lines were tabs. Signed-off-by: Alex Humphreys --- pkg/chartutil/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 36b07adb562..8f713fcd18f 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -158,12 +158,12 @@ spec: - host: {{ . | quote }} http: paths: - {{- range $ingressPaths }} + {{- range $ingressPaths }} - path: {{ . }} backend: serviceName: {{ $fullName }} servicePort: http - {{- end }} + {{- end }} {{- end }} {{- end }} ` From 29ab7a0a775ec7182be88a1b6daa9e65a472b46b Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 19 Dec 2018 12:24:00 -0800 Subject: [PATCH 299/483] Revert "Fix for existing CRDs are deleted when crd-install hook is introduced (#4709)" (#5067) This reverts commit e2a0e7fa545585a29c1e9602e6320479788eb9a6. Signed-off-by: Matthew Fisher --- pkg/tiller/hooks.go | 7 ------- pkg/tiller/hooks_test.go | 33 +++++++++------------------------ 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/pkg/tiller/hooks.go b/pkg/tiller/hooks.go index 4723010222f..0fb7c92f809 100644 --- a/pkg/tiller/hooks.go +++ b/pkg/tiller/hooks.go @@ -174,13 +174,6 @@ func (file *manifestFile) sort(result *result) error { isUnknownHook = true break } - if e == release.Hook_CRD_INSTALL { - result.generic = append(result.generic, Manifest{ - Name: file.path, - Content: m, - Head: &entry, - }) - } h.Events = append(h.Events, e) } diff --git a/pkg/tiller/hooks_test.go b/pkg/tiller/hooks_test.go index 86c89b8f3db..8bd92850026 100644 --- a/pkg/tiller/hooks_test.go +++ b/pkg/tiller/hooks_test.go @@ -131,21 +131,6 @@ metadata: name: example-test annotations: "helm.sh/hook": test-success -`, - }, - { - name: []string{"ninth"}, - path: "nine", - kind: []string{"CustomResourceDefinition"}, - hooks: map[string][]release.Hook_Event{"ninth": {release.Hook_CRD_INSTALL}}, - manifest: `apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: ninth - labels: - doesnot: matter - annotations: - "helm.sh/hook": crd-install `, }, } @@ -161,22 +146,22 @@ metadata: } // This test will fail if 'six' or 'seven' was added. - // changed to account for CustomResourceDefinition with crd-install hook being added to generic list of manifests - if len(generic) != 3 { - t.Errorf("Expected 3 generic manifests, got %d", len(generic)) + if len(generic) != 2 { + t.Errorf("Expected 2 generic manifests, got %d", len(generic)) } - // changed to account for 5 hooks now that there is a crd-install hook added as member 9 of the data list. It was 4 before. - if len(hs) != 5 { - t.Errorf("Expected 5 hooks, got %d", len(hs)) + if len(hs) != 4 { + t.Errorf("Expected 4 hooks, got %d", len(hs)) } for _, out := range hs { - t.Logf("Checking name %s path %s and kind %s", out.Name, out.Path, out.Kind) found := false for _, expect := range data { if out.Path == expect.path { found = true + if out.Path != expect.path { + t.Errorf("Expected path %s, got %s", expect.path, out.Path) + } nameFound := false for _, expectedName := range expect.name { if out.Name == expectedName { @@ -224,8 +209,8 @@ metadata: name := sh.Metadata.Name - //only keep track of non-hook manifests, that are not CustomResourceDefinitions with crd-install - if err == nil && (s.hooks[name] == nil || s.hooks[name][0] == release.Hook_CRD_INSTALL) { + //only keep track of non-hook manifests + if err == nil && s.hooks[name] == nil { another := Manifest{ Content: m, Name: name, From 266b3415f0a0dd9e70b1658d1fc2c17668b85960 Mon Sep 17 00:00:00 2001 From: ejether Date: Fri, 21 Dec 2018 15:16:21 -0800 Subject: [PATCH 300/483] Ejether/rename autohelm in docs (#5095) * autohelm we renamed to reckoner for copyright concerns. This commit renames autohelm in the documentation Signed-off-by: EJ Etherington * moving to be in alphabetical order Signed-off-by: EJ Etherington --- docs/related.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/related.md b/docs/related.md index c6735e0eafd..6122101dcfe 100644 --- a/docs/related.md +++ b/docs/related.md @@ -65,7 +65,6 @@ Tools layered on top of Helm or Tiller. - [AppsCode Swift](https://github.com/appscode/swift) - Ajax friendly Helm Tiller Proxy using [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway) - [Armada](https://github.com/att-comdev/armada) - Manage prefixed releases throughout various Kubernetes namespaces, and removes completed jobs for complex deployments. Used by the [Openstack-Helm](https://github.com/openstack/openstack-helm) team. -- [Autohelm](https://github.com/reactiveops/autohelm) - Autohelm is _another_ simple declarative spec for deploying helm charts. Written in python and supports git urls as a source for helm charts. - [ChartMuseum](https://github.com/chartmuseum/chartmuseum) - Helm Chart Repository with support for Amazon S3 and Google Cloud Storage - [Chartify](https://github.com/appscode/chartify) - Generate Helm charts from existing Kubernetes resources. - [Codefresh](https://codefresh.io) - Kubernetes native CI/CD and management platform with UI dashboards for managing Helm charts and releases @@ -79,6 +78,7 @@ Tools layered on top of Helm or Tiller. - [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories - [Orca](https://github.com/maorfr/orca) - Advanced CI\CD tool for Kubernetes and Helm made simple. - [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client +- [Reckoner](https://github.com/reactiveops/reckoner) - Reckoner (formerly Autohelm) is a tool for declarative management of helm releases. Written in python and supports git urls as a source for helm charts. - [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API - [Schelm](https://github.com/databus23/schelm) - Render a Helm manifest to a directory - [Shipper](https://github.com/bookingcom/shipper) - Multi-cluster canary or blue-green rollouts using Helm From c82c0b6046b852f449dcaae768ba57331116dc87 Mon Sep 17 00:00:00 2001 From: Maor Friedman Date: Sun, 23 Dec 2018 15:45:43 +0200 Subject: [PATCH 301/483] [docs/related] update orca link to official repo (#5097) Signed-off-by: Maor --- docs/related.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/related.md b/docs/related.md index 6122101dcfe..5c027cc3659 100644 --- a/docs/related.md +++ b/docs/related.md @@ -76,7 +76,7 @@ Tools layered on top of Helm or Tiller. - [Helmsman](https://github.com/Praqma/helmsman) - Helmsman is a helm-charts-as-code tool which enables installing/upgrading/protecting/moving/deleting releases from version controlled desired state files (described in a simple TOML format). - [Landscaper](https://github.com/Eneco/landscaper/) - "Landscaper takes a set of Helm Chart references with values (a desired state), and realizes this in a Kubernetes cluster." - [Monocular](https://github.com/helm/monocular) - Web UI for Helm Chart repositories -- [Orca](https://github.com/maorfr/orca) - Advanced CI\CD tool for Kubernetes and Helm made simple. +- [Orca](https://github.com/nuvo/orca) - Advanced CI\CD tool for Kubernetes and Helm made simple. - [Quay App Registry](https://coreos.com/blog/quay-application-registry-for-kubernetes.html) - Open Kubernetes application registry, including a Helm access client - [Reckoner](https://github.com/reactiveops/reckoner) - Reckoner (formerly Autohelm) is a tool for declarative management of helm releases. Written in python and supports git urls as a source for helm charts. - [Rudder](https://github.com/AcalephStorage/rudder) - RESTful (JSON) proxy for Tiller's API From e3c6385959bca1d632ee59d1fccbcb1c612a53c5 Mon Sep 17 00:00:00 2001 From: Taylor Thomas Date: Thu, 3 Jan 2019 10:16:53 -0800 Subject: [PATCH 302/483] doc(release_checklist): Adds steps for categorizing changelogs Closes #5119 Also includes some formatting fixes to wrap lines at 80 chars Signed-off-by: Taylor Thomas --- docs/release_checklist.md | 156 ++++++++++++++++++++++++++++---------- 1 file changed, 117 insertions(+), 39 deletions(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index c69db9d21fd..4011b6675d4 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -3,8 +3,8 @@ **IMPORTANT**: If your experience deviates from this document, please document the changes to keep it up-to-date. ## Release Meetings -As part of the release process, two of the weekly developer calls will be co-opted -as "release meetings." +As part of the release process, two of the weekly developer calls will be +co-opted as "release meetings." ### Start of the Release Cycle The first developer call after a release will be used as the release meeting to @@ -17,17 +17,19 @@ identified: - Any other important details for the community All of this information should be added to the GitHub milestone for the given -release. This should give the community and maintainers a clear set of guidelines -to follow when choosing whether or not to add issues and PRs to a given release. +release. This should give the community and maintainers a clear set of +guidelines to follow when choosing whether or not to add issues and PRs to a +given release. ### End (almost) of the Release Cycle The developer call closest to two weeks before the scheduled release date will be used to review any remaining PRs that should be pulled into the release. This -is the place to debate whether or not we should wait before cutting a release and -any other concerns. At the end of this meeting, if the release date has not been -pushed out, the first RC should be cut. Subsequent developer calls in between this -meeting and the release date should have some time set aside to see if any bugs -were found. Once the release date is reached, the final release can be cut +is the place to debate whether or not we should wait before cutting a release +and any other concerns. At the end of this meeting, if the release date has not +been pushed out, the first RC should be cut. Subsequent developer calls in +between this meeting and the release date should have some time set aside to see +if any bugs were found. Once the release date is reached, the final release can +be cut ## A Maintainer's Guide to Releasing Helm @@ -37,17 +39,28 @@ So you're in charge of a new release for Helm? Cool. Here's what to do... Just kidding! :trollface: -All releases will be of the form vX.Y.Z where X is the major version number, Y is the minor version number and Z is the patch release number. This project strictly follows [semantic versioning](http://semver.org/) so following this step is critical. +All releases will be of the form vX.Y.Z where X is the major version number, Y +is the minor version number and Z is the patch release number. This project +strictly follows [semantic versioning](http://semver.org/) so following this +step is critical. -It is important to note that this document assumes that the git remote in your repository that corresponds to "https://github.com/helm/helm" is named "upstream". If yours is not (for example, if you've chosen to name it "origin" or something similar instead), be sure to adjust the listed snippets for your local environment accordingly. If you are not sure what your upstream remote is named, use a command like `git remote -v` to find out. +It is important to note that this document assumes that the git remote in your +repository that corresponds to "https://github.com/helm/helm" is named +"upstream". If yours is not (for example, if you've chosen to name it "origin" +or something similar instead), be sure to adjust the listed snippets for your +local environment accordingly. If you are not sure what your upstream remote is +named, use a command like `git remote -v` to find out. -If you don't have an upstream remote, you can add one easily using something like: +If you don't have an upstream remote, you can add one easily using something +like: ```shell git remote add upstream git@github.com:helm/helm.git ``` -In this doc, we are going to reference a few environment variables as well, which you may want to set for convenience. For major/minor releases, use the following: +In this doc, we are going to reference a few environment variables as well, +which you may want to set for convenience. For major/minor releases, use the +following: ```shell export RELEASE_NAME=vX.Y.0 @@ -68,7 +81,10 @@ export RELEASE_CANDIDATE_NAME="$RELEASE_NAME-rc.1" ### Major/Minor Releases -Major releases are for new feature additions and behavioral changes *that break backwards compatibility*. Minor releases are for new feature additions that do not break backwards compatibility. To create a major or minor release, start by creating a `release-vX.Y.0` branch from master. +Major releases are for new feature additions and behavioral changes *that break +backwards compatibility*. Minor releases are for new feature additions that do +not break backwards compatibility. To create a major or minor release, start by +creating a `release-vX.Y.0` branch from master. ```shell git fetch upstream @@ -76,11 +92,13 @@ git checkout upstream/master git checkout -b $RELEASE_BRANCH_NAME ``` -This new branch is going to be the base for the release, which we are going to iterate upon later. +This new branch is going to be the base for the release, which we are going to +iterate upon later. ### Patch releases -Patch releases are a few critical cherry-picked fixes to existing releases. Start by creating a `release-vX.Y.Z` branch from the latest patch release. +Patch releases are a few critical cherry-picked fixes to existing releases. +Start by creating a `release-vX.Y.Z` branch from the latest patch release. ```shell git fetch upstream --tags @@ -88,7 +106,8 @@ git checkout $PREVIOUS_PATCH_RELEASE git checkout -b $RELEASE_BRANCH_NAME ``` -From here, we can cherry-pick the commits we want to bring into the patch release: +From here, we can cherry-pick the commits we want to bring into the patch +release: ```shell # get the commits ids we want to cherry-pick @@ -98,11 +117,13 @@ git cherry-pick -x git cherry-pick -x ``` -This new branch is going to be the base for the release, which we are going to iterate upon later. +This new branch is going to be the base for the release, which we are going to +iterate upon later. ## 2. Change the Version Number in Git -When doing a minor release, make sure to update pkg/version/version.go with the new release version. +When doing a minor release, make sure to update pkg/version/version.go with the +new release version. ```shell $ git diff pkg/version/version.go @@ -128,28 +149,36 @@ git commit -m "bump version to $RELEASE_CANDIDATE_NAME" ## 3. Commit and Push the Release Branch -In order for others to start testing, we can now push the release branch upstream and start the test process. +In order for others to start testing, we can now push the release branch +upstream and start the test process. ```shell git push upstream $RELEASE_BRANCH_NAME ``` -Make sure to check [helm on CircleCI](https://circleci.com/gh/helm/helm) and make sure the release passed CI before proceeding. +Make sure to check [helm on CircleCI](https://circleci.com/gh/helm/helm) and +make sure the release passed CI before proceeding. -If anyone is available, let others peer-review the branch before continuing to ensure that all the proper changes have been made and all of the commits for the release are there. +If anyone is available, let others peer-review the branch before continuing to +ensure that all the proper changes have been made and all of the commits for the +release are there. ## 4. Create a Release Candidate -Now that the release branch is out and ready, it is time to start creating and iterating on release candidates. +Now that the release branch is out and ready, it is time to start creating and +iterating on release candidates. ```shell git tag --sign --annotate "${RELEASE_CANDIDATE_NAME}" --message "Helm release ${RELEASE_CANDIDATE_NAME}" git push upstream $RELEASE_CANDIDATE_NAME ``` -CircleCI will automatically create a tagged release image and client binary to test with. +CircleCI will automatically create a tagged release image and client binary to +test with. -For testers, the process to start testing after CircleCI finishes building the artifacts involves the following steps to grab the client from Google Cloud Storage: +For testers, the process to start testing after CircleCI finishes building the +artifacts involves the following steps to grab the client from Google Cloud +Storage: linux/amd64, using /bin/bash: @@ -169,21 +198,35 @@ windows/amd64, using PowerShell: PS C:\> Invoke-WebRequest -Uri "https://kubernetes-helm.storage.googleapis.com/helm-$RELEASE_CANDIDATE_NAME-windows-amd64.zip" -OutFile "helm-$ReleaseCandidateName-windows-amd64.zip" ``` -Then, unpack and move the binary to somewhere on your $PATH, or move it somewhere and add it to your $PATH (e.g. /usr/local/bin/helm for linux/macOS, C:\Program Files\helm\helm.exe for Windows). +Then, unpack and move the binary to somewhere on your $PATH, or move it +somewhere and add it to your $PATH (e.g. /usr/local/bin/helm for linux/macOS, +C:\Program Files\helm\helm.exe for Windows). ## 5. Iterate on Successive Release Candidates -Spend several days explicitly investing time and resources to try and break helm in every possible way, documenting any findings pertinent to the release. This time should be spent testing and finding ways in which the release might have caused various features or upgrade environments to have issues, not coding. During this time, the release is in code freeze, and any additional code changes will be pushed out to the next release. +Spend several days explicitly investing time and resources to try and break helm +in every possible way, documenting any findings pertinent to the release. This +time should be spent testing and finding ways in which the release might have +caused various features or upgrade environments to have issues, not coding. +During this time, the release is in code freeze, and any additional code changes +will be pushed out to the next release. -During this phase, the $RELEASE_BRANCH_NAME branch will keep evolving as you will produce new release candidates. The frequency of new candidates is up to the release manager: use your best judgement taking into account the severity of reported issues, testers' availability, and the release deadline date. Generally speaking, it is better to let a release roll over the deadline than to ship a broken release. +During this phase, the $RELEASE_BRANCH_NAME branch will keep evolving as you +will produce new release candidates. The frequency of new candidates is up to +the release manager: use your best judgement taking into account the severity of +reported issues, testers' availability, and the release deadline date. Generally +speaking, it is better to let a release roll over the deadline than to ship a +broken release. -Each time you'll want to produce a new release candidate, you will start by adding commits to the branch by cherry-picking from master: +Each time you'll want to produce a new release candidate, you will start by +adding commits to the branch by cherry-picking from master: ```shell git cherry-pick -x ``` -You will also want to update the release version number and the CHANGELOG as we did in steps 2 and 3 as separate commits. +You will also want to update the release version number and the CHANGELOG as we +did in steps 2 and 3 as separate commits. After that, tag it and notify users of the new release candidate: @@ -197,7 +240,9 @@ From here on just repeat this process, continuously testing until you're happy w ## 6. Finalize the Release -When you're finally happy with the quality of a release candidate, you can move on and create the real thing. Double-check one last time to make sure everything is in order, then finally push the release tag. +When you're finally happy with the quality of a release candidate, you can move +on and create the real thing. Double-check one last time to make sure everything +is in order, then finally push the release tag. ```shell git checkout $RELEASE_BRANCH_NAME @@ -207,9 +252,13 @@ git push upstream $RELEASE_NAME ## 7. Write the Release Notes -We will auto-generate a changelog based on the commits that occurred during a release cycle, but it is usually more beneficial to the end-user if the release notes are hand-written by a human being/marketing team/dog. +We will auto-generate a changelog based on the commits that occurred during a +release cycle, but it is usually more beneficial to the end-user if the release +notes are hand-written by a human being/marketing team/dog. -If you're releasing a major/minor release, listing notable user-facing features is usually sufficient. For patch releases, do the same, but make note of the symptoms and who is affected. +If you're releasing a major/minor release, listing notable user-facing features +is usually sufficient. For patch releases, do the same, but make note of the +symptoms and who is affected. An example release note for a minor release would look like this: @@ -226,6 +275,13 @@ The community keeps growing, and we'd love to see you there! - Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom.us/j/696660622) - Test, debug, and contribute charts: [GitHub/helm/charts](https://github.com/helm/charts) +## Features and Changes + +- Major +- features +- list +- here + ## Installation and Upgrading Download Helm X.Y. The common platform binaries are here: @@ -250,23 +306,45 @@ The [Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart-guide) will g ## Changelog -- chore(*): bump version to v2.7.0 08c1144f5eb3e3b636d9775617287cc26e53dba4 (Adam Reese) +### Features +- ref(*): kubernetes v1.11 support efadbd88035654b2951f3958167afed014c46bc6 (Adam Reese) +- feat(helm): add $HELM_KEY_PASSPHRASE environment variable for signing helm charts (#4778) 1e26b5300b5166fabb90002535aacd2f9cc7d787 + +### Bug fixes - fix circle not building tags f4f932fabd197f7e6d608c8672b33a483b4b76fa (Matthew Fisher) + +### Code cleanup +- ref(kube): Gets rid of superfluous Sprintf call 3071a16f5eb3a2b646d9795617287cc26e53dba4 (Taylor Thomas) +- chore(*): bump version to v2.7.0 08c1144f5eb3e3b636d9775617287cc26e53dba4 (Adam Reese) + +### Documentation Changes +- docs(release_checklist): fix changelog generation command (#4694) 8442851a5c566a01d9b4c69b368d64daa04f6a7f (Matthew Fisher) ``` -The changelog at the bottom of the release notes can be generated with this command: +The changelog at the bottom of the release notes can be generated with this +command: ```shell PREVIOUS_RELEASE=vX.Y.Z git log --no-merges --pretty=format:'- %s %H (%aN)' $PREVIOUS_RELEASE..$RELEASE_NAME ``` -Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. +After generating the changelog, you will need to categorize the changes as shown +in the example above. + +Once finished, go into GitHub and edit the release notes for the tagged release +with the notes written here. ## 8. Evangelize -Congratulations! You're done. Go grab yourself a $DRINK_OF_CHOICE. You've earned it. +Congratulations! You're done. Go grab yourself a $DRINK_OF_CHOICE. You've earned +it. -After enjoying a nice $DRINK_OF_CHOICE, go forth and announce the glad tidings of the new release in Slack and on Twitter. You should also notify any key partners in the helm community such as the homebrew formula maintainers, the owners of incubator projects (e.g. ChartMuseum) and any other interested parties. +After enjoying a nice $DRINK_OF_CHOICE, go forth and announce the glad tidings +of the new release in Slack and on Twitter. You should also notify any key +partners in the helm community such as the homebrew formula maintainers, the +owners of incubator projects (e.g. ChartMuseum) and any other interested +parties. -Optionally, write a blog post about the new release and showcase some of the new features on there! +Optionally, write a blog post about the new release and showcase some of the new +features on there! From 4634f5f2faa0caa7de390c95c7d27be22d56a156 Mon Sep 17 00:00:00 2001 From: Eric Thiebaut-George Date: Tue, 8 Jan 2019 16:14:43 +0000 Subject: [PATCH 303/483] Recommend using crd-install instead of pre-install (#5139) * 5138 Recommended using crd-install instead of pre-install Signed-off-by: Eric Thiebaut-George * 5138 Updated section title Signed-off-by: Eric Thiebaut-George --- docs/chart_best_practices/custom_resource_definitions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/chart_best_practices/custom_resource_definitions.md b/docs/chart_best_practices/custom_resource_definitions.md index 96690dc9b79..ee6fcf47033 100644 --- a/docs/chart_best_practices/custom_resource_definitions.md +++ b/docs/chart_best_practices/custom_resource_definitions.md @@ -28,10 +28,10 @@ resources that use that CRD in _another_ chart. In this method, each chart must be installed separately. -### Method 2: Pre-install Hooks +### Method 2: Crd-install Hooks -To package the two together, add a `pre-install` hook to the CRD definition so +To package the two together, add a `crd-install` hook to the CRD definition so that it is fully installed before the rest of the chart is executed. -Note that if you create the CRD with a `pre-install` hook, that CRD definition +Note that if you create the CRD with a `crd-install` hook, that CRD definition will not be deleted when `helm delete` is run. From 7c55fdcf024e83d78b47102dd27315728400c860 Mon Sep 17 00:00:00 2001 From: Elad Iwanir Date: Tue, 8 Jan 2019 20:00:49 +0200 Subject: [PATCH 304/483] Sort resources output by 'helm status' Signed-off-by: Elad Iwanir --- pkg/kube/client.go | 81 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 4a387d524de..513f7400dd0 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -24,6 +24,7 @@ import ( "fmt" "io" "log" + "sort" "strings" "time" @@ -151,13 +152,41 @@ func (c *Client) Build(namespace string, reader io.Reader) (Result, error) { return result, scrubValidationError(err) } +// Return the resource info as internal +func resourceInfoToObject(info *resource.Info) runtime.Object { + internalObj, err := asInternal(info) + if err != nil { + // If the problem is just that the resource is not registered, don't print any + // error. This is normal for custom resources. + if !runtime.IsNotRegisteredError(err) { + c.Log("Warning: conversion to internal type failed: %v", err) + } + // Add the unstructured object in this situation. It will still get listed, just + // with less information. + return info.Object + } + + return internalObj +} + +func sortByKey(objs map[string](map[string]runtime.Object)) []string { + var keys []string + // Create a simple slice, so we can sort it + for key := range objs { + keys = append(keys, key) + } + // Sort alphabetically by version/kind keys + sort.Strings(keys) + return keys +} + // Get gets Kubernetes resources as pretty-printed string. // // Namespace will set the namespace. func (c *Client) Get(namespace string, reader io.Reader) (string, error) { - // Since we don't know what order the objects come in, let's group them by the types, so + // Since we don't know what order the objects come in, let's group them by the types and then sort them, so // that when we print them, they come out looking good (headers apply to subgroups, etc.). - objs := make(map[string][]runtime.Object) + objs := make(map[string](map[string]runtime.Object)) infos, err := c.BuildUnstructured(namespace, reader) if err != nil { return "", err @@ -178,19 +207,15 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // versions per cluster, but this certainly won't hurt anything, so let's be safe. gvk := info.ResourceMapping().GroupVersionKind vk := gvk.Version + "/" + gvk.Kind - internalObj, err := asInternal(info) - if err != nil { - // If the problem is just that the resource is not registered, don't print any - // error. This is normal for custom resources. - if !runtime.IsNotRegisteredError(err) { - c.Log("Warning: conversion to internal type failed: %v", err) - } - // Add the unstructured object in this situation. It will still get listed, just - // with less information. - objs[vk] = append(objs[vk], info.Object) - } else { - objs[vk] = append(objs[vk], internalObj) + + // Initialize map. The main map groups resources based on version/kind + // The second level is a simple 'Name' to 'Object', that will help sort + // the individual resource later + if objs[vk] == nil { + objs[vk] = make(map[string]runtime.Object) } + // Map between the resource name to the underlying info object + objs[vk][info.Name] = resourceInfoToObject(info) //Get the relation pods objPods, err = c.getSelectRelationPod(info, objPods) @@ -208,8 +233,12 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { for key, podItems := range objPods { for i := range podItems { pod := &core.Pod{} + legacyscheme.Scheme.Convert(&podItems[i], pod, nil) - objs[key+"(related)"] = append(objs[key+"(related)"], pod) + if objs[key+"(related)"] == nil { + objs[key+"(related)"] = make(map[string]runtime.Object) + } + objs[key+"(related)"][pod.ObjectMeta.Name] = runtime.Object(pod) } } @@ -219,14 +248,28 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // track of tab widths. buf := new(bytes.Buffer) printFlags := get.NewHumanPrintFlags() - for t, ot := range objs { + + // Sort alphabetically by version/kind keys + vkKeys := sortByKey(objs) + // Iterate on sorted version/kind types + for _, t := range vkKeys { if _, err = fmt.Fprintf(buf, "==> %s\n", t); err != nil { return "", err } typePrinter, _ := printFlags.ToPrinter("") - for _, o := range ot { - if err := typePrinter.PrintObj(o, buf); err != nil { - c.Log("failed to print object type %s, object: %q :\n %v", t, o, err) + + var sortedResources []string + for resource := range objs[t] { + sortedResources = append(sortedResources, resource) + } + sort.Strings(sortedResources) + + // Now that each individual resource within the specific version/kind + // is sorted, we print each resource using the k8s printer + for _, resourceName := range sortedResources { + vk := objs[t] + if err := typePrinter.PrintObj(vk[resourceName], buf); err != nil { + c.Log("failed to print object type %s, object: %q :\n %v", t, resourceName, err) return "", err } } From cbf9ad11be1153d72cade3212d708112af97eefe Mon Sep 17 00:00:00 2001 From: Elad Iwanir Date: Tue, 8 Jan 2019 20:14:39 +0200 Subject: [PATCH 305/483] fix minor build issue Signed-off-by: Elad Iwanir --- pkg/kube/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 513f7400dd0..9aa821b5a58 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -153,7 +153,7 @@ func (c *Client) Build(namespace string, reader io.Reader) (Result, error) { } // Return the resource info as internal -func resourceInfoToObject(info *resource.Info) runtime.Object { +func resourceInfoToObject(info *resource.Info, c *Client) runtime.Object { internalObj, err := asInternal(info) if err != nil { // If the problem is just that the resource is not registered, don't print any @@ -215,7 +215,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { objs[vk] = make(map[string]runtime.Object) } // Map between the resource name to the underlying info object - objs[vk][info.Name] = resourceInfoToObject(info) + objs[vk][info.Name] = resourceInfoToObject(info, c) //Get the relation pods objPods, err = c.getSelectRelationPod(info, objPods) From e70bea6adb6825e4f0cce1917121e6e000bf9049 Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Thu, 10 Jan 2019 05:09:50 +0800 Subject: [PATCH 306/483] Fix some spelling errors (#5114) Signed-off-by: JoeWrightss --- _proto/hapi/services/tiller.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 8eba963e411..e00c50caf4a 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -76,7 +76,7 @@ service ReleaseService { rpc RollbackRelease(RollbackReleaseRequest) returns (RollbackReleaseResponse) { } - // ReleaseHistory retrieves a releasse's history. + // ReleaseHistory retrieves a release's history. rpc GetHistory(GetHistoryRequest) returns (GetHistoryResponse) { } @@ -298,7 +298,7 @@ message UninstallReleaseRequest { bool purge = 3; // timeout specifies the max amount of time any kubernetes client command can run. int64 timeout = 4; - // Description, if set, will set the description for the uninnstalled release + // Description, if set, will set the description for the uninstalled release string description = 5; } From 8015fc35707050ae4578000cfe89fcba66112f07 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 10 Jan 2019 08:09:55 -0800 Subject: [PATCH 307/483] bump version to v2.12 (#4991) (cherry picked from commit 657557947c62efca6c9b8f81a62540e27901717b) Signed-off-by: Matthew Fisher --- pkg/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/version/version.go b/pkg/version/version.go index dae739500fd..692167b83b1 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -26,7 +26,7 @@ var ( // Increment major number for new feature additions and behavioral changes. // Increment minor number for bug fixes and performance enhancements. // Increment patch number for critical fixes to existing releases. - Version = "v2.11" + Version = "v2.12" // BuildMetadata is extra build time data BuildMetadata = "unreleased" From 893c3b61f6594232a57f232034afc418d2466878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20K=C3=B6hler?= <9337156+axdotl@users.noreply.github.com> Date: Thu, 10 Jan 2019 18:05:44 +0100 Subject: [PATCH 308/483] Add chart name check to lint (#3773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Axel Köhler --- .gitignore | 1 + pkg/lint/rules/chartfile.go | 12 ++++++++++-- pkg/lint/rules/chartfile_test.go | 16 +++++++++++++--- pkg/lint/rules/testdata/badnamechart/Chart.yaml | 4 ++++ pkg/lint/rules/testdata/badnamechart/values.yaml | 1 + 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 pkg/lint/rules/testdata/badnamechart/Chart.yaml create mode 100644 pkg/lint/rules/testdata/badnamechart/values.yaml diff --git a/.gitignore b/.gitignore index 7fdfdcf2a70..2414f7f2bf5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ rootfs/rudder vendor/ *.exe .idea/ +*.iml \ No newline at end of file diff --git a/pkg/lint/rules/chartfile.go b/pkg/lint/rules/chartfile.go index 12f028af147..95ee38f0b14 100644 --- a/pkg/lint/rules/chartfile.go +++ b/pkg/lint/rules/chartfile.go @@ -46,7 +46,8 @@ func Chartfile(linter *support.Linter) { return } - linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartName(chartFile)) + linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartNamePresence(chartFile)) + linter.RunLinterRule(support.WarningSev, chartFileName, validateChartNameFormat(chartFile)) linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartNameDirMatch(linter.ChartDir, chartFile)) // Chart metadata @@ -74,13 +75,20 @@ func validateChartYamlFormat(chartFileError error) error { return nil } -func validateChartName(cf *chart.Metadata) error { +func validateChartNamePresence(cf *chart.Metadata) error { if cf.Name == "" { return errors.New("name is required") } return nil } +func validateChartNameFormat(cf *chart.Metadata) error { + if strings.Contains(cf.Name, ".") { + return errors.New("name should be lower case letters and numbers. Words may be separated with dashes") + } + return nil +} + func validateChartNameDirMatch(chartDir string, cf *chart.Metadata) error { if cf.Name != filepath.Base(chartDir) { return fmt.Errorf("directory name (%s) and chart name (%s) must be the same", filepath.Base(chartDir), cf.Name) diff --git a/pkg/lint/rules/chartfile_test.go b/pkg/lint/rules/chartfile_test.go index 235e5fc4c90..2422a2d1057 100644 --- a/pkg/lint/rules/chartfile_test.go +++ b/pkg/lint/rules/chartfile_test.go @@ -29,17 +29,20 @@ import ( ) const ( - badChartDir = "testdata/badchartfile" - goodChartDir = "testdata/goodone" + badChartDir = "testdata/badchartfile" + badNameChartDir = "testdata/badnamechart" + goodChartDir = "testdata/goodone" ) var ( badChartFilePath = filepath.Join(badChartDir, "Chart.yaml") + badNameChartFilePath = filepath.Join(badNameChartDir, "Chart.yaml") goodChartFilePath = filepath.Join(goodChartDir, "Chart.yaml") nonExistingChartFilePath = filepath.Join(os.TempDir(), "Chart.yaml") ) var badChart, chatLoadRrr = chartutil.LoadChartfile(badChartFilePath) +var badNameChart, _ = chartutil.LoadChartfile(badNameChartFilePath) var goodChart, _ = chartutil.LoadChartfile(goodChartFilePath) // Validation functions Test @@ -66,12 +69,19 @@ func TestValidateChartYamlFormat(t *testing.T) { } func TestValidateChartName(t *testing.T) { - err := validateChartName(badChart) + err := validateChartNamePresence(badChart) if err == nil { t.Errorf("validateChartName to return a linter error, got no error") } } +func TestValidateChartNameFormat(t *testing.T) { + err := validateChartNameFormat(badNameChart) + if err == nil { + t.Errorf("validateChartNameFormat to return a linter error, got no error") + } +} + func TestValidateChartNameDirMatch(t *testing.T) { err := validateChartNameDirMatch(goodChartDir, goodChart) if err != nil { diff --git a/pkg/lint/rules/testdata/badnamechart/Chart.yaml b/pkg/lint/rules/testdata/badnamechart/Chart.yaml new file mode 100644 index 00000000000..6ac6cfa4269 --- /dev/null +++ b/pkg/lint/rules/testdata/badnamechart/Chart.yaml @@ -0,0 +1,4 @@ +name: bad.chart.name +description: A Helm chart for Kubernetes +version: 0.1.0 +icon: http://riverrun.io diff --git a/pkg/lint/rules/testdata/badnamechart/values.yaml b/pkg/lint/rules/testdata/badnamechart/values.yaml new file mode 100644 index 00000000000..54deecf74c6 --- /dev/null +++ b/pkg/lint/rules/testdata/badnamechart/values.yaml @@ -0,0 +1 @@ +# Default values for badchartname. From 5603fe8d3e6ca9347ea0c2a94b2b33a55f5134cd Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Mon, 14 Jan 2019 10:03:35 -0700 Subject: [PATCH 309/483] fix: perform extra validation on paths in tar archives (#5165) * fix: perform extra validation on paths in tar archives Signed-off-by: Matt Butcher * fix: Cover a few Windows cases and also remove a duplicate tar reader Signed-off-by: Matt Butcher * fix: removed debug output Signed-off-by: Matt Butcher * fix: Expand again preserves the files verbatim Also added tests for Expand Signed-off-by: Matt Butcher * fix: add license block and remove println Signed-off-by: Matt Butcher --- pkg/chartutil/expand.go | 64 +++++++++--------- pkg/chartutil/expand_test.go | 121 +++++++++++++++++++++++++++++++++++ pkg/chartutil/load.go | 43 +++++++++++-- pkg/chartutil/load_test.go | 97 ++++++++++++++++++++++++++++ 4 files changed, 289 insertions(+), 36 deletions(-) create mode 100644 pkg/chartutil/expand_test.go diff --git a/pkg/chartutil/expand.go b/pkg/chartutil/expand.go index 1d49b159f69..9ed021d9cf3 100644 --- a/pkg/chartutil/expand.go +++ b/pkg/chartutil/expand.go @@ -17,58 +17,60 @@ limitations under the License. package chartutil import ( - "archive/tar" - "compress/gzip" + "errors" "io" + "io/ioutil" "os" "path/filepath" + + securejoin "github.com/cyphar/filepath-securejoin" ) // Expand uncompresses and extracts a chart into the specified directory. func Expand(dir string, r io.Reader) error { - gr, err := gzip.NewReader(r) + files, err := loadArchiveFiles(r) if err != nil { return err } - defer gr.Close() - tr := tar.NewReader(gr) - for { - header, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - return err - } - //split header name and create missing directories - d, _ := filepath.Split(header.Name) - fullDir := filepath.Join(dir, d) - _, err = os.Stat(fullDir) - if err != nil && d != "" { - if err := os.MkdirAll(fullDir, 0700); err != nil { + // Get the name of the chart + var chartName string + for _, file := range files { + if file.Name == "Chart.yaml" { + ch, err := UnmarshalChartfile(file.Data) + if err != nil { return err } + chartName = ch.GetName() } + } + if chartName == "" { + return errors.New("chart name not specified") + } - path := filepath.Clean(filepath.Join(dir, header.Name)) - info := header.FileInfo() - if info.IsDir() { - if err = os.MkdirAll(path, info.Mode()); err != nil { - return err - } - continue - } + // Find the base directory + chartdir, err := securejoin.SecureJoin(dir, chartName) + if err != nil { + return err + } - file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) + // Copy all files verbatim. We don't parse these files because parsing can remove + // comments. + for _, file := range files { + outpath, err := securejoin.SecureJoin(chartdir, file.Name) if err != nil { return err } - _, err = io.Copy(file, tr) - if err != nil { - file.Close() + + // Make sure the necessary subdirs get created. + basedir := filepath.Dir(outpath) + if err := os.MkdirAll(basedir, 0755); err != nil { + return err + } + + if err := ioutil.WriteFile(outpath, file.Data, 0644); err != nil { return err } - file.Close() } return nil } diff --git a/pkg/chartutil/expand_test.go b/pkg/chartutil/expand_test.go new file mode 100644 index 00000000000..80fd4416b71 --- /dev/null +++ b/pkg/chartutil/expand_test.go @@ -0,0 +1,121 @@ +/* +Copyright The Helm Authors. + +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 chartutil + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" +) + +func TestExpand(t *testing.T) { + dest, err := ioutil.TempDir("", "helm-testing-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dest) + + reader, err := os.Open("testdata/frobnitz-1.2.3.tgz") + if err != nil { + t.Fatal(err) + } + + if err := Expand(dest, reader); err != nil { + t.Fatal(err) + } + + expectedChartPath := filepath.Join(dest, "frobnitz") + fi, err := os.Stat(expectedChartPath) + if err != nil { + t.Fatal(err) + } + if !fi.IsDir() { + t.Fatalf("expected a chart directory at %s", expectedChartPath) + } + + dir, err := os.Open(expectedChartPath) + if err != nil { + t.Fatal(err) + } + + fis, err := dir.Readdir(0) + if err != nil { + t.Fatal(err) + } + + expectLen := 12 + if len(fis) != expectLen { + t.Errorf("Expected %d files, but got %d", expectLen, len(fis)) + } + + for _, fi := range fis { + expect, err := os.Stat(filepath.Join("testdata", "frobnitz", fi.Name())) + if err != nil { + t.Fatal(err) + } + if fi.Size() != expect.Size() { + t.Errorf("Expected %s to have size %d, got %d", fi.Name(), expect.Size(), fi.Size()) + } + } +} + +func TestExpandFile(t *testing.T) { + dest, err := ioutil.TempDir("", "helm-testing-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dest) + + if err := ExpandFile(dest, "testdata/frobnitz-1.2.3.tgz"); err != nil { + t.Fatal(err) + } + + expectedChartPath := filepath.Join(dest, "frobnitz") + fi, err := os.Stat(expectedChartPath) + if err != nil { + t.Fatal(err) + } + if !fi.IsDir() { + t.Fatalf("expected a chart directory at %s", expectedChartPath) + } + + dir, err := os.Open(expectedChartPath) + if err != nil { + t.Fatal(err) + } + + fis, err := dir.Readdir(0) + if err != nil { + t.Fatal(err) + } + + expectLen := 12 + if len(fis) != expectLen { + t.Errorf("Expected %d files, but got %d", expectLen, len(fis)) + } + + for _, fi := range fis { + expect, err := os.Stat(filepath.Join("testdata", "frobnitz", fi.Name())) + if err != nil { + t.Fatal(err) + } + if fi.Size() != expect.Size() { + t.Errorf("Expected %s to have size %d, got %d", fi.Name(), expect.Size(), fi.Size()) + } + } +} diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go index 9f1c80c85a9..f4741516e23 100644 --- a/pkg/chartutil/load.go +++ b/pkg/chartutil/load.go @@ -25,7 +25,9 @@ import ( "io" "io/ioutil" "os" + "path" "path/filepath" + "regexp" "strings" "github.com/golang/protobuf/ptypes/any" @@ -63,11 +65,13 @@ type BufferedFile struct { Data []byte } -// LoadArchive loads from a reader containing a compressed tar archive. -func LoadArchive(in io.Reader) (*chart.Chart, error) { +var drivePathPattern = regexp.MustCompile(`^[a-zA-Z]:/`) + +// loadArchiveFiles loads files out of an archive +func loadArchiveFiles(in io.Reader) ([]*BufferedFile, error) { unzipped, err := gzip.NewReader(in) if err != nil { - return &chart.Chart{}, err + return nil, err } defer unzipped.Close() @@ -80,7 +84,7 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) { break } if err != nil { - return &chart.Chart{}, err + return nil, err } if hd.FileInfo().IsDir() { @@ -101,12 +105,33 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) { // Normalize the path to the / delimiter n = strings.Replace(n, delimiter, "/", -1) + if path.IsAbs(n) { + return nil, errors.New("chart illegally contains absolute paths") + } + + n = path.Clean(n) + if n == "." { + // In this case, the original path was relative when it should have been absolute. + return nil, errors.New("chart illegally contains empty path") + } + if strings.HasPrefix(n, "..") { + return nil, errors.New("chart illegally references parent directory") + } + + // In some particularly arcane acts of path creativity, it is possible to intermix + // UNIX and Windows style paths in such a way that you produce a result of the form + // c:/foo even after all the built-in absolute path checks. So we explicitly check + // for this condition. + if drivePathPattern.MatchString(n) { + return nil, errors.New("chart contains illegally named files") + } + if parts[0] == "Chart.yaml" { return nil, errors.New("chart yaml not in base directory") } if _, err := io.Copy(b, tr); err != nil { - return &chart.Chart{}, err + return files, err } files = append(files, &BufferedFile{Name: n, Data: b.Bytes()}) @@ -116,7 +141,15 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) { if len(files) == 0 { return nil, errors.New("no files in chart archive") } + return files, nil +} +// LoadArchive loads from a reader containing a compressed tar archive. +func LoadArchive(in io.Reader) (*chart.Chart, error) { + files, err := loadArchiveFiles(in) + if err != nil { + return nil, err + } return LoadFiles(files) } diff --git a/pkg/chartutil/load_test.go b/pkg/chartutil/load_test.go index 5cb15fbdcc6..c031a6a9693 100644 --- a/pkg/chartutil/load_test.go +++ b/pkg/chartutil/load_test.go @@ -17,8 +17,14 @@ limitations under the License. package chartutil import ( + "archive/tar" + "compress/gzip" + "io/ioutil" + "os" "path" + "path/filepath" "testing" + "time" "k8s.io/helm/pkg/proto/hapi/chart" ) @@ -43,6 +49,97 @@ func TestLoadFile(t *testing.T) { verifyRequirements(t, c) } +func TestLoadArchive_InvalidArchive(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "helm-test-") + if err != nil { + t.Fatal(err) + } + defer os.Remove(tmpdir) + + writeTar := func(filename, internalPath string, body []byte) { + dest, err := os.Create(filename) + if err != nil { + t.Fatal(err) + } + zipper := gzip.NewWriter(dest) + tw := tar.NewWriter(zipper) + + h := &tar.Header{ + Name: internalPath, + Mode: 0755, + Size: int64(len(body)), + ModTime: time.Now(), + } + if err := tw.WriteHeader(h); err != nil { + t.Fatal(err) + } + if _, err := tw.Write(body); err != nil { + t.Fatal(err) + } + tw.Close() + zipper.Close() + dest.Close() + } + + for _, tt := range []struct { + chartname string + internal string + expectError string + }{ + {"illegal-dots.tgz", "../../malformed-helm-test", "chart illegally references parent directory"}, + {"illegal-dots2.tgz", "/foo/../../malformed-helm-test", "chart illegally references parent directory"}, + {"illegal-dots3.tgz", "/../../malformed-helm-test", "chart illegally references parent directory"}, + {"illegal-dots4.tgz", "./../../malformed-helm-test", "chart illegally references parent directory"}, + {"illegal-name.tgz", "./.", "chart illegally contains empty path"}, + {"illegal-name2.tgz", "/./.", "chart illegally contains empty path"}, + {"illegal-name3.tgz", "missing-leading-slash", "chart illegally contains empty path"}, + {"illegal-name4.tgz", "/missing-leading-slash", "chart metadata (Chart.yaml) missing"}, + {"illegal-abspath.tgz", "//foo", "chart illegally contains absolute paths"}, + {"illegal-abspath2.tgz", "///foo", "chart illegally contains absolute paths"}, + {"illegal-abspath3.tgz", "\\\\foo", "chart illegally contains absolute paths"}, + {"illegal-abspath3.tgz", "\\..\\..\\foo", "chart illegally references parent directory"}, + + // Under special circumstances, this can get normalized to things that look like absolute Windows paths + {"illegal-abspath4.tgz", "\\.\\c:\\\\foo", "chart contains illegally named files"}, + {"illegal-abspath5.tgz", "/./c://foo", "chart contains illegally named files"}, + {"illegal-abspath6.tgz", "\\\\?\\Some\\windows\\magic", "chart illegally contains absolute paths"}, + } { + illegalChart := filepath.Join(tmpdir, tt.chartname) + writeTar(illegalChart, tt.internal, []byte("hello: world")) + _, err = Load(illegalChart) + if err == nil { + t.Fatal("expected error when unpacking illegal files") + } + if err.Error() != tt.expectError { + t.Errorf("Expected %q, got %q for %s", tt.expectError, err.Error(), tt.chartname) + } + } + + // Make sure that absolute path gets interpreted as relative + illegalChart := filepath.Join(tmpdir, "abs-path.tgz") + writeTar(illegalChart, "/Chart.yaml", []byte("hello: world")) + _, err = Load(illegalChart) + if err.Error() != "invalid chart (Chart.yaml): name must not be empty" { + t.Error(err) + } + + // And just to validate that the above was not spurious + illegalChart = filepath.Join(tmpdir, "abs-path2.tgz") + writeTar(illegalChart, "files/whatever.yaml", []byte("hello: world")) + _, err = Load(illegalChart) + if err.Error() != "chart metadata (Chart.yaml) missing" { + t.Error(err) + } + + // Finally, test that drive letter gets stripped off on Windows + illegalChart = filepath.Join(tmpdir, "abs-winpath.tgz") + writeTar(illegalChart, "c:\\Chart.yaml", []byte("hello: world")) + _, err = Load(illegalChart) + if err.Error() != "invalid chart (Chart.yaml): name must not be empty" { + t.Error(err) + } +} + func TestLoadFiles(t *testing.T) { goodFiles := []*BufferedFile{ { From 315ed81116235882967f4021b739eafa44ebec5e Mon Sep 17 00:00:00 2001 From: Jon Leonard Date: Wed, 16 Jan 2019 11:32:54 -0500 Subject: [PATCH 310/483] Restore comment text Signed-off-by: Jon Leonard --- pkg/helm/option.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/helm/option.go b/pkg/helm/option.go index a34c4b8ae08..3919130944d 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -53,7 +53,7 @@ type options struct { disableHooks bool // if set, skip CRD hook only disableCRDHook bool - // if set, render SubChart Notes + // name of release releaseName string // tls.Config to use for rpc if tls enabled tlsConfig *tls.Config From a4bc9fd7330fc3886caba52d1a33f0c8a907e4d4 Mon Sep 17 00:00:00 2001 From: Deepak Sattiraju Date: Thu, 17 Jan 2019 22:04:32 +0530 Subject: [PATCH 311/483] Fixing helm search display format #5148 (#5162) Signed-off-by: ds-ms --- cmd/helm/search.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/search.go b/cmd/helm/search.go index 84f328d415f..2e7611609c9 100644 --- a/cmd/helm/search.go +++ b/cmd/helm/search.go @@ -154,7 +154,7 @@ func (s *searchCmd) buildIndex() (*search.Index, error) { f := s.helmhome.CacheIndex(n) ind, err := repo.LoadIndexFile(f) if err != nil { - fmt.Fprintf(s.out, "WARNING: Repo %q is corrupt or missing. Try 'helm repo update'.", n) + fmt.Fprintf(s.out, "WARNING: Repo %q is corrupt or missing. Try 'helm repo update'.\n", n) continue } From 6453dbe575eeea92c5d40a9898a24a22b517b780 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Mon, 21 Jan 2019 11:49:43 +0000 Subject: [PATCH 312/483] Add content on how community members can help review PRs Updated text to better elaborate on he process and also some small other nits/updates. Signed-off-by: Martin Hickey --- CONTRIBUTING.md | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aba3388a698..7736cbd6b28 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -84,12 +84,12 @@ your PR will be rejected by the automated DCO check. Whether you are a user or contributor, official support channels include: -- GitHub [issues](https://github.com/helm/helm/issues/new) -- Slack [Kubernetes Slack](http://slack.kubernetes.io/): - - User: #helm-users - - Contributor: #helm-dev +- [Issues](https://github.com/helm/helm/issues) +- Slack: + - User: [#helm-users](https://kubernetes.slack.com/messages/C0NH30761/details/) + - Contributor: [#helm-dev](https://kubernetes.slack.com/messages/C51E88VDG/) -Before opening a new issue or submitting a new pull request, it's helpful to search the project - it's likely that another user has already reported the issue you're facing, or it's a known issue that we're already aware of. +Before opening a new issue or submitting a new pull request, it's helpful to search the project - it's likely that another user has already reported the issue you're facing, or it's a known issue that we're already aware of. It is also worth asking on the Slack channels. ## Milestones @@ -180,33 +180,33 @@ contributing to Helm. All issue types follow the same general lifecycle. Differe Coding conventions and standards are explained in the official developer docs: [Developers Guide](docs/developers.md) -The next section contains more information on the workflow followed for PRs +The next section contains more information on the workflow followed for Pull Requests. ## Pull Requests -Like any good open source project, we use Pull Requests to track code changes +Like any good open source project, we use Pull Requests (PRs) to track code changes. ### PR Lifecycle 1. PR creation + - PRs are usually created to fix or else be a subset of other PRs that fix a particular issue. - We more than welcome PRs that are currently in progress. They are a great way to keep track of important work that is in-flight, but useful for others to see. If a PR is a work in progress, it **must** be prefaced with "WIP: [title]". Once the PR is ready for review, remove "WIP" from the title. - - It is preferred, but not required, to have a PR tied to a specific issue. + - It is preferred, but not required, to have a PR tied to a specific issue. There can be + circumstances where if it is a quick fix then an issue might be overkill. The details provided + in the PR description would suffice in this case. 2. Triage - The maintainer in charge of triaging will apply the proper labels for the issue. This should include at least a size label, `bug` or `feature`, and `awaiting review` once all labels are applied. - See the [Labels section](#labels) for full details on the definitions of labels + See the [Labels section](#labels) for full details on the definitions of labels. - Add the PR to the correct milestone. This should be the same as the issue the PR closes. 3. Assigning reviews - Once a review has the `awaiting review` label, maintainers will review them as schedule permits. The maintainer who takes the issue should self-request a review. - - Reviews from others in the community, especially those who have encountered a bug or have - requested a feature, are highly encouraged, but not required. Maintainer reviews **are** required - before any merge - Any PR with the `size/large` label requires 2 review approvals from maintainers before it can be - merged. Those with `size/medium` are per the judgement of the maintainers + merged. Those with `size/medium` or `size/small` are per the judgement of the maintainers. 4. Reviewing/Discussion - Once a maintainer begins reviewing a PR, they will remove the `awaiting review` label and add the `in progress` label so the person submitting knows that it is being worked on. This is @@ -214,17 +214,24 @@ Like any good open source project, we use Pull Requests to track code changes - All reviews will be completed using Github review tool. - A "Comment" review should be used when there are questions about the code that should be answered, but that don't involve code changes. This type of review does not count as approval. - - A "Changes Requested" review indicates that changes to the code need to be made before they will be merged. - - Reviewers should update labels as needed (such as `needs rebase`) -5. Address comments by answering questions or changing code + - A "Changes Requested" review indicates that changes to the code need to be made before they will be + merged. + - Reviewers (maintainers) should update labels as needed (such as `needs rebase`). + - Reviews are also welcome from others in the community, especially those who have encountered a bug or + have requested a feature. In the code review, a message can be added, as well as `LGTM` if the PR is + good to merge. It’s also possible to add comments to specific lines in a file, for giving context + to the comment. +5. PR owner should try to be responsive to comments by answering questions or changing code. If the + owner is unsure of any comment, reach out to the person who added the comment in + [#helm-dev](https://kubernetes.slack.com/messages/C51E88VDG/). Once all comments have been addressed, + the PR is ready to be merged. 6. Merge or close - PRs should stay open until merged or if they have not been active for more than 30 days. This will help keep the PR queue to a manageable size and reduce noise. Should the PR need to stay open (like in the case of a WIP), the `keep open` label can be added. - - If the owner of the PR is listed in `OWNERS`, that user **must** merge their own PRs - or explicitly request another OWNER do that for them. - - If the owner of a PR is _not_ listed in `OWNERS`, any core committer may - merge the PR once it is approved. + - If the owner of the PR is listed in `OWNERS`, that user **must** merge their own PRs or explicitly + request another OWNER do that for them. + - If the owner of a PR is _not_ listed in `OWNERS`, any maintainer may merge the PR once it is approved. #### Documentation PRs From 812b74aca5f14ea67b531a41687abfee8a6399a6 Mon Sep 17 00:00:00 2001 From: Koichi Shiraishi Date: Tue, 22 Jan 2019 08:58:07 +0900 Subject: [PATCH 313/483] Fix delete.go file permission (#5194) The 'cmd/helm/delete.go' file permission is 755, change to same as another file. Signed-off-by: Koichi Shiraishi --- cmd/helm/delete.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 cmd/helm/delete.go diff --git a/cmd/helm/delete.go b/cmd/helm/delete.go old mode 100755 new mode 100644 From 581e6cdbb8e42753556ae48ccba8cef84c40f736 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Mon, 21 Jan 2019 15:58:57 -0800 Subject: [PATCH 314/483] fix: use RFC 1123 subdomains for name verification (#5132) As noted in Slack by a community member, release names with periods are considered usable. Switching to RFC 1123 subdomain verification continues to block bad release names like BAD_NAME, but allows names like good.name to continue working. Signed-off-by: Matthew Fisher --- cmd/helm/install.go | 4 ++-- cmd/helm/install_test.go | 1 - cmd/helm/template.go | 4 ++-- cmd/helm/template_test.go | 8 ++++---- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index f33747ac40b..5ddb3105406 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -251,8 +251,8 @@ func (i *installCmd) run() error { fmt.Printf("FINAL NAME: %s\n", i.name) } - if msgs := validation.IsDNS1123Label(i.name); i.name != "" && len(msgs) > 0 { - return fmt.Errorf("release name %s is not a valid DNS label: %s", i.name, strings.Join(msgs, ";")) + if msgs := validation.IsDNS1123Subdomain(i.name); i.name != "" && len(msgs) > 0 { + return fmt.Errorf("release name %s is invalid: %s", i.name, strings.Join(msgs, ";")) } // Check chart requirements to make sure all dependencies are present in /charts diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index 4a2055640cc..5f7ffdb500c 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -169,7 +169,6 @@ func TestInstall(t *testing.T) { name: "install chart with release name using periods", args: []string{"testdata/testcharts/alpine"}, flags: []string{"--name", "foo.bar"}, - err: true, }, { name: "install chart with release name using underscores", diff --git a/cmd/helm/template.go b/cmd/helm/template.go index d776f298973..1838bb75822 100644 --- a/cmd/helm/template.go +++ b/cmd/helm/template.go @@ -147,8 +147,8 @@ func (t *templateCmd) run(cmd *cobra.Command, args []string) error { } } - if msgs := validation.IsDNS1123Label(t.releaseName); t.releaseName != "" && len(msgs) > 0 { - return fmt.Errorf("release name %s is not a valid DNS label: %s", t.releaseName, strings.Join(msgs, ";")) + if msgs := validation.IsDNS1123Subdomain(t.releaseName); t.releaseName != "" && len(msgs) > 0 { + return fmt.Errorf("release name %s is invalid: %s", t.releaseName, strings.Join(msgs, ";")) } // Check chart requirements to make sure all dependencies are present in /charts diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go index 98044eff0ec..3c5026b08d9 100644 --- a/cmd/helm/template_test.go +++ b/cmd/helm/template_test.go @@ -112,21 +112,21 @@ func TestTemplateCmd(t *testing.T) { desc: "verify the release name using capitals is invalid", args: []string{subchart1ChartPath, "--name", "FOO"}, expectKey: "subchart1/templates/service.yaml", - expectError: "is not a valid DNS label", + expectError: "is invalid", }, { name: "check_invalid_name_uppercase", desc: "verify the release name using periods is invalid", args: []string{subchart1ChartPath, "--name", "foo.bar"}, expectKey: "subchart1/templates/service.yaml", - expectError: "is not a valid DNS label", + expectValue: "release-name: \"foo.bar\"", }, { name: "check_invalid_name_uppercase", desc: "verify the release name using underscores is invalid", args: []string{subchart1ChartPath, "--name", "foo_bar"}, expectKey: "subchart1/templates/service.yaml", - expectError: "is not a valid DNS label", + expectError: "is invalid", }, { name: "check_release_is_install", @@ -160,7 +160,7 @@ func TestTemplateCmd(t *testing.T) { name: "check_invalid_name_template", desc: "verify the relase name generate by template is invalid", args: []string{subchart1ChartPath, "--name-template", "foobar-{{ b64enc \"abc\" }}-baz"}, - expectError: "is not a valid DNS label", + expectError: "is invalid", }, { name: "check_name_template", From af4c14b593f03190b08863da65e04ff5aa593020 Mon Sep 17 00:00:00 2001 From: Patrick Lang Date: Mon, 21 Jan 2019 21:33:57 -0800 Subject: [PATCH 315/483] Update docs/examples to use multi-arch tagged images (#5099) * update nginx example to work multi-arch Signed-off-by: Patrick Lang * Fix alpine to use a multiarch tag Signed-off-by: Patrick Lang --- docs/examples/alpine/values.yaml | 2 +- docs/examples/nginx/templates/post-install-job.yaml | 2 +- docs/examples/nginx/values.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/alpine/values.yaml b/docs/examples/alpine/values.yaml index afe8cc6c0f6..225e0472a28 100644 --- a/docs/examples/alpine/values.yaml +++ b/docs/examples/alpine/values.yaml @@ -1,6 +1,6 @@ image: repository: alpine - tag: 3.3 + tag: latest pullPolicy: IfNotPresent restartPolicy: Never diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml index 6e32086ab3b..3562e6cf5bc 100644 --- a/docs/examples/nginx/templates/post-install-job.yaml +++ b/docs/examples/nginx/templates/post-install-job.yaml @@ -32,6 +32,6 @@ spec: restartPolicy: {{ .Values.restartPolicy }} containers: - name: post-install-job - image: "alpine:3.3" + image: "alpine:latest" # All we're going to do is sleep for a while, then exit. command: ["/bin/sleep", "{{ .Values.sleepyTime }}"] diff --git a/docs/examples/nginx/values.yaml b/docs/examples/nginx/values.yaml index b40208ccec0..36f2505af65 100644 --- a/docs/examples/nginx/values.yaml +++ b/docs/examples/nginx/values.yaml @@ -14,7 +14,7 @@ index: >- image: repository: nginx - tag: 1.11.0 + tag: alpine pullPolicy: IfNotPresent service: From 05a365358f43a452e523d3f76b1107b6f4ff2aa7 Mon Sep 17 00:00:00 2001 From: Geoff Baskwill Date: Tue, 22 Jan 2019 10:03:01 -0500 Subject: [PATCH 316/483] fix: ignore pax header "file"s in chart validation Signed-off-by: Geoff Baskwill --- pkg/chartutil/load.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go index f4741516e23..b0927a5cfaa 100644 --- a/pkg/chartutil/load.go +++ b/pkg/chartutil/load.go @@ -93,6 +93,12 @@ func loadArchiveFiles(in io.Reader) ([]*BufferedFile, error) { continue } + switch hd.Typeflag { + // We don't want to process these extension header files. + case tar.TypeXGlobalHeader, tar.TypeXHeader: + continue + } + // Archive could contain \ if generated on Windows delimiter := "/" if strings.ContainsRune(hd.Name, '\\') { From 197e68ec1f5cde7a78fc5053a798f939378f4158 Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Sat, 26 Jan 2019 02:46:24 +0800 Subject: [PATCH 317/483] Fix some typos in comment (#5215) Signed-off-by: zhoulin xie --- pkg/helm/client.go | 2 +- pkg/helm/fake.go | 2 +- pkg/helm/option.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 771c7f3d1d7..0d4d1603907 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -302,7 +302,7 @@ func (h *Client) RunReleaseTest(rlsName string, opts ...ReleaseTestOption) (<-ch return h.test(ctx, req) } -// PingTiller pings the Tiller pod and ensure's that it is up and running +// PingTiller pings the Tiller pod and ensures that it is up and running func (h *Client) PingTiller() error { ctx := NewContext() return h.ping(ctx) diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 46be7d39875..c8ce91f4418 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -257,7 +257,7 @@ func (c *FakeClient) RunReleaseTest(rlsName string, opts ...ReleaseTestOption) ( return results, errc } -// PingTiller pings the Tiller pod and ensure's that it is up and running +// PingTiller pings the Tiller pod and ensures that it is up and running func (c *FakeClient) PingTiller() error { return nil } diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 121f71c834e..1f5cf6904c5 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -474,7 +474,7 @@ type VersionOption func(*options) // the defaults used when running the `helm upgrade` command. type UpdateOption func(*options) -// RollbackOption allows specififying various settings configurable +// RollbackOption allows specifying various settings configurable // by the helm client user for overriding the defaults used when // running the `helm rollback` command. type RollbackOption func(*options) From 0dfe2b865a9b4900ef41fc141fc88c11bd728c57 Mon Sep 17 00:00:00 2001 From: shibataka000 Date: Sun, 27 Jan 2019 02:54:12 +0900 Subject: [PATCH 318/483] Itemize text in docs/securing_installation.md (#5217) Signed-off-by: Takao Shibata --- docs/securing_installation.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/securing_installation.md b/docs/securing_installation.md index d47a98bcc13..56ebad62c49 100644 --- a/docs/securing_installation.md +++ b/docs/securing_installation.md @@ -69,9 +69,10 @@ When Helm clients are connecting from outside of the cluster, the security betwe Contrary to the previous [Enabling TLS](#enabling-tls) section, this section does not involve running a tiller server pod in your cluster (for what it's worth, that lines up with the current [helm v3 proposal](https://github.com/helm/community/blob/master/helm-v3/000-helm-v3.md)), thus there is no gRPC endpoint (and thus there's no need to create & manage TLS certificates to secure each gRPC endpoint). Steps: - * Fetch the latest helm release tarball from the [GitHub release page](https://github.com/helm/helm/releases), and extract and move `helm` and `tiller` somewhere on your `$PATH`. - * "Server": Run `tiller --storage=secret`. (Note that `tiller` has a default value of ":44134" for the `--listen` argument.) - * Client: In another terminal (and on the same host that the aforementioned `tiller` command was run for the previous bullet): Run `export HELM_HOST=:44134`, and then run `helm` commands as usual. + +- Fetch the latest helm release tarball from the [GitHub release page](https://github.com/helm/helm/releases), and extract and move `helm` and `tiller` somewhere on your `$PATH`. +- "Server": Run `tiller --storage=secret`. (Note that `tiller` has a default value of ":44134" for the `--listen` argument.) +- Client: In another terminal (and on the same host that the aforementioned `tiller` command was run for the previous bullet): Run `export HELM_HOST=:44134`, and then run `helm` commands as usual. ### Tiller's Release Information From 8a5c7f157106d9ba0fe1e0ab01498d454c47bb0e Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Wed, 9 Jan 2019 12:33:37 +0200 Subject: [PATCH 319/483] Implement "atomic" upgrade/install Add possibility to put "--safe" argument to install and upgrade command that restores the state of cluster in case of failed install/upgrade attempt Signed-off-by: Alexander Nesterenko --- cmd/helm/install.go | 18 ++++++++++++++++++ cmd/helm/upgrade.go | 26 ++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 5ddb3105406..9e0b19487b4 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -131,6 +131,7 @@ type installCmd struct { version string timeout int64 wait bool + safe bool repoURL string username string password string @@ -190,6 +191,8 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { } inst.chartPath = cp inst.client = ensureHelmClient(inst.client) + inst.wait = inst.wait || inst.safe + return inst.run() }, } @@ -212,6 +215,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.version, "version", "", "specify the exact chart version to install. If this is not specified, the latest version is installed") f.Int64Var(&inst.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&inst.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") + f.BoolVar(&inst.safe, "safe", false, "if set, upgrade process rolls back changes made in case of failed upgrade") f.StringVar(&inst.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&inst.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&inst.password, "password", "", "chart repository password where to locate the requested chart") @@ -307,6 +311,20 @@ func (i *installCmd) run() error { helm.InstallWait(i.wait), helm.InstallDescription(i.description)) if err != nil { + if i.safe { + fmt.Fprintf(os.Stdout, "INSTALL FAILED\nPURGING CHART\nError: %v", prettyError(err)) + deleteSideEffects := &deleteCmd{ + name: i.name, + disableHooks: i.disableHooks, + purge: true, + timeout: i.timeout, + description: "", + dryRun: i.dryRun, + out: i.out, + client: i.client, + } + if err := deleteSideEffects.run(); err != nil { return err } + } return prettyError(err) } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index d6c915c3ade..a20a1003a25 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -105,6 +105,7 @@ type upgradeCmd struct { resetValues bool reuseValues bool wait bool + safe bool repoURL string username string password string @@ -142,6 +143,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { upgrade.release = args[0] upgrade.chart = args[1] upgrade.client = ensureHelmClient(upgrade.client) + upgrade.wait = upgrade.wait || upgrade.safe return upgrade.run() }, @@ -167,6 +169,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&upgrade.resetValues, "reset-values", false, "when upgrading, reset the values to the ones built into the chart") f.BoolVar(&upgrade.reuseValues, "reuse-values", false, "when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored.") f.BoolVar(&upgrade.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") + f.BoolVar(&upgrade.safe, "safe", false, "if set, upgrade process rolls back changes made in case of failed upgrade") f.StringVar(&upgrade.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&upgrade.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&upgrade.password, "password", "", "chart repository password where to locate the requested chart") @@ -191,6 +194,8 @@ func (u *upgradeCmd) run() error { return err } + releaseHistory, err := u.client.ReleaseHistory(u.release, helm.WithMaxHistory(1)) + if u.install { // If a release does not exist, install it. If another error occurs during // the check, ignore the error and continue with the upgrade. @@ -198,7 +203,6 @@ func (u *upgradeCmd) run() error { // The returned error is a grpc.rpcError that wraps the message from the original error. // So we're stuck doing string matching against the wrapped error, which is nested somewhere // inside of the grpc.rpcError message. - releaseHistory, err := u.client.ReleaseHistory(u.release, helm.WithMaxHistory(1)) if err == nil { if u.namespace == "" { @@ -232,6 +236,7 @@ func (u *upgradeCmd) run() error { timeout: u.timeout, wait: u.wait, description: u.description, + safe: u.safe, } return ic.run() } @@ -270,7 +275,24 @@ func (u *upgradeCmd) run() error { helm.UpgradeWait(u.wait), helm.UpgradeDescription(u.description)) if err != nil { - return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) + fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v", prettyError(err)) + if u.safe { + rollback := &rollbackCmd { + out: u.out, + client: u.client, + name: u.release, + dryRun: u.dryRun, + recreate: u.recreate, + force: u.force, + timeout: u.timeout, + wait: u.wait, + description: "", + revision: releaseHistory.Releases[0].Version, + disableHooks: u.disableHooks, + } + if err := rollback.run(); err != nil { return err } + } + return fmt.Errorf("UPGRADE FAILED: %v\n", prettyError(err)) } if settings.Debug { From 869efd59be7a960466055bc30966ebd572a4ee09 Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Wed, 9 Jan 2019 13:39:09 +0200 Subject: [PATCH 320/483] Fix codestyle and update docs Signed-off-by: Alexander Nesterenko --- cmd/helm/install.go | 4 +++- cmd/helm/upgrade.go | 10 ++++++---- docs/helm/helm_install.md | 3 ++- docs/helm/helm_upgrade.md | 5 +++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 9e0b19487b4..0316b14bf9e 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -323,7 +323,9 @@ func (i *installCmd) run() error { out: i.out, client: i.client, } - if err := deleteSideEffects.run(); err != nil { return err } + if err := deleteSideEffects.run(); err != nil { + return err + } } return prettyError(err) } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index a20a1003a25..527867e4747 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -275,9 +275,9 @@ func (u *upgradeCmd) run() error { helm.UpgradeWait(u.wait), helm.UpgradeDescription(u.description)) if err != nil { - fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v", prettyError(err)) + fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v\n", prettyError(err)) if u.safe { - rollback := &rollbackCmd { + rollback := &rollbackCmd{ out: u.out, client: u.client, name: u.release, @@ -290,9 +290,11 @@ func (u *upgradeCmd) run() error { revision: releaseHistory.Releases[0].Version, disableHooks: u.disableHooks, } - if err := rollback.run(); err != nil { return err } + if err := rollback.run(); err != nil { + return err + } } - return fmt.Errorf("UPGRADE FAILED: %v\n", prettyError(err)) + return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) } if settings.Debug { diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 5406126faa5..499e3222d4c 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -96,6 +96,7 @@ helm install [CHART] [flags] --render-subchart-notes render subchart notes along with the parent --replace re-use the given name, even if that name is already used. This is unsafe in production --repo string chart repository url where to locate the requested chart + --safe if set, upgrade process rolls back changes made in case of failed upgrade --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) @@ -129,4 +130,4 @@ helm install [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Nov-2018 +###### Auto generated by spf13/cobra on 9-Jan-2019 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index df5bfe6ca9b..08112327847 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -19,7 +19,7 @@ To customize the chart values, use any of - '--set-string' to provide key=val forcing val to be stored as a string, - '--set-file' to provide key=path to read a single large value from a file at path. -To edit or append to the existing customized values, add the +To edit or append to the existing customized values, add the '--reuse-values' flag, otherwise any existing customized values are ignored. If no chart value arguments are provided on the command line, any existing customized values are carried @@ -83,6 +83,7 @@ helm upgrade [RELEASE] [CHART] [flags] --repo string chart repository url where to locate the requested chart --reset-values when upgrading, reset the values to the ones built into the chart --reuse-values when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored. + --safe if set, upgrade process rolls back changes made in case of failed upgrade --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) @@ -116,4 +117,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Nov-2018 +###### Auto generated by spf13/cobra on 9-Jan-2019 From e137c55a3ae58a4ef6770259d7cc2249fbf0c0a4 Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Wed, 23 Jan 2019 17:24:51 +0200 Subject: [PATCH 321/483] [#3338] Rename "safe" to "atomic" which gives more clear understanding, what it does Signed-off-by: Alexander Nesterenko --- cmd/helm/install.go | 11 ++++++----- cmd/helm/upgrade.go | 12 ++++++------ docs/helm/helm_install.md | 4 ++-- docs/helm/helm_upgrade.md | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 0316b14bf9e..a6d6b08124d 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -131,7 +131,7 @@ type installCmd struct { version string timeout int64 wait bool - safe bool + atomic bool repoURL string username string password string @@ -191,7 +191,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { } inst.chartPath = cp inst.client = ensureHelmClient(inst.client) - inst.wait = inst.wait || inst.safe + inst.wait = inst.wait || inst.atomic return inst.run() }, @@ -215,7 +215,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.version, "version", "", "specify the exact chart version to install. If this is not specified, the latest version is installed") f.Int64Var(&inst.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&inst.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") - f.BoolVar(&inst.safe, "safe", false, "if set, upgrade process rolls back changes made in case of failed upgrade") + f.BoolVar(&inst.atomic, "atomic", false, "if set, installation process purges chart on fail") f.StringVar(&inst.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&inst.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&inst.password, "password", "", "chart repository password where to locate the requested chart") @@ -311,8 +311,8 @@ func (i *installCmd) run() error { helm.InstallWait(i.wait), helm.InstallDescription(i.description)) if err != nil { - if i.safe { - fmt.Fprintf(os.Stdout, "INSTALL FAILED\nPURGING CHART\nError: %v", prettyError(err)) + if i.atomic { + fmt.Fprintf(os.Stdout, "INSTALL FAILED\nPURGING CHART\nError: %v\n", prettyError(err)) deleteSideEffects := &deleteCmd{ name: i.name, disableHooks: i.disableHooks, @@ -326,6 +326,7 @@ func (i *installCmd) run() error { if err := deleteSideEffects.run(); err != nil { return err } + fmt.Fprintf(os.Stdout, "Successfully purged a chart!\n") } return prettyError(err) } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 527867e4747..5184a97ffd3 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -44,7 +44,7 @@ To customize the chart values, use any of - '--set-string' to provide key=val forcing val to be stored as a string, - '--set-file' to provide key=path to read a single large value from a file at path. -To edit or append to the existing customized values, add the +To edit or append to the existing customized values, add the '--reuse-values' flag, otherwise any existing customized values are ignored. If no chart value arguments are provided on the command line, any existing customized values are carried @@ -105,7 +105,7 @@ type upgradeCmd struct { resetValues bool reuseValues bool wait bool - safe bool + atomic bool repoURL string username string password string @@ -143,7 +143,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { upgrade.release = args[0] upgrade.chart = args[1] upgrade.client = ensureHelmClient(upgrade.client) - upgrade.wait = upgrade.wait || upgrade.safe + upgrade.wait = upgrade.wait || upgrade.atomic return upgrade.run() }, @@ -169,7 +169,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&upgrade.resetValues, "reset-values", false, "when upgrading, reset the values to the ones built into the chart") f.BoolVar(&upgrade.reuseValues, "reuse-values", false, "when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored.") f.BoolVar(&upgrade.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") - f.BoolVar(&upgrade.safe, "safe", false, "if set, upgrade process rolls back changes made in case of failed upgrade") + f.BoolVar(&upgrade.atomic, "atomic", false, "if set, upgrade process rolls back changes made in case of failed upgrade") f.StringVar(&upgrade.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&upgrade.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&upgrade.password, "password", "", "chart repository password where to locate the requested chart") @@ -236,7 +236,7 @@ func (u *upgradeCmd) run() error { timeout: u.timeout, wait: u.wait, description: u.description, - safe: u.safe, + atomic: u.atomic, } return ic.run() } @@ -276,7 +276,7 @@ func (u *upgradeCmd) run() error { helm.UpgradeDescription(u.description)) if err != nil { fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v\n", prettyError(err)) - if u.safe { + if u.atomic { rollback := &rollbackCmd{ out: u.out, client: u.client, diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 499e3222d4c..5d013028667 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -78,6 +78,7 @@ helm install [CHART] [flags] ### Options ``` + --atomic if set, upgrade process rolls back changes made in case of failed upgrade --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --dep-up run helm dependency update before installing the chart @@ -96,7 +97,6 @@ helm install [CHART] [flags] --render-subchart-notes render subchart notes along with the parent --replace re-use the given name, even if that name is already used. This is unsafe in production --repo string chart repository url where to locate the requested chart - --safe if set, upgrade process rolls back changes made in case of failed upgrade --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) @@ -130,4 +130,4 @@ helm install [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 9-Jan-2019 +###### Auto generated by spf13/cobra on 23-Jan-2019 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index 08112327847..ac2ab316a1b 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -65,6 +65,7 @@ helm upgrade [RELEASE] [CHART] [flags] ### Options ``` + --atomic if set, upgrade process rolls back changes made in case of failed upgrade --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --description string specify the description to use for the upgrade, rather than the default @@ -83,7 +84,6 @@ helm upgrade [RELEASE] [CHART] [flags] --repo string chart repository url where to locate the requested chart --reset-values when upgrading, reset the values to the ones built into the chart --reuse-values when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored. - --safe if set, upgrade process rolls back changes made in case of failed upgrade --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) --set-file stringArray set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2) --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) @@ -117,4 +117,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 9-Jan-2019 +###### Auto generated by spf13/cobra on 23-Jan-2019 From 599bce8b13e5b11e931f8a0f106d4b9232be203c Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Sun, 27 Jan 2019 11:22:36 +0200 Subject: [PATCH 322/483] Upgrade installation docs Signed-off-by: Alexander Nesterenko --- docs/helm/helm_install.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 5d013028667..75a3c0502f7 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -78,7 +78,7 @@ helm install [CHART] [flags] ### Options ``` - --atomic if set, upgrade process rolls back changes made in case of failed upgrade + --atomic if set, installation process purges chart on fail --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --dep-up run helm dependency update before installing the chart @@ -130,4 +130,4 @@ helm install [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 23-Jan-2019 +###### Auto generated by spf13/cobra on 27-Jan-2019 From 5744af51e8abc402927c2196ea2a16833353037b Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Sun, 27 Jan 2019 12:49:01 +0200 Subject: [PATCH 323/483] Add smoke tests Signed-off-by: Alexander Nesterenko --- cmd/helm/install_test.go | 8 ++++++++ cmd/helm/upgrade_test.go | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/cmd/helm/install_test.go b/cmd/helm/install_test.go index 5f7ffdb500c..24a5abe684f 100644 --- a/cmd/helm/install_test.go +++ b/cmd/helm/install_test.go @@ -113,6 +113,14 @@ func TestInstall(t *testing.T) { expected: "apollo", resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "apollo"}), }, + // Install, with atomic + { + name: "install with a atomic", + args: []string{"testdata/testcharts/alpine"}, + flags: strings.Split("--name apollo", " "), + expected: "apollo", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "apollo"}), + }, // Install, using the name-template { name: "install with name-template", diff --git a/cmd/helm/upgrade_test.go b/cmd/helm/upgrade_test.go index 60b529f6391..c2b1b4ea6ed 100644 --- a/cmd/helm/upgrade_test.go +++ b/cmd/helm/upgrade_test.go @@ -123,6 +123,14 @@ func TestUpgradeCmd(t *testing.T) { expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 5, Chart: ch2})}, }, + { + name: "install a release with 'upgrade --atomic'", + args: []string{"funny-bunny", chartPath}, + flags: []string{"--atomic"}, + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 6, Chart: ch}), + expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 6, Chart: ch})}, + }, { name: "install a release with 'upgrade --install'", args: []string{"zany-bunny", chartPath}, From 2332b480c9cb70a0d8a85247992d6155fbe82416 Mon Sep 17 00:00:00 2001 From: Alexander Nesterenko Date: Mon, 28 Jan 2019 20:06:31 +0200 Subject: [PATCH 324/483] Update docs to include information about setting `--wait flag` Signed-off-by: Alexander Nesterenko --- cmd/helm/install.go | 2 +- cmd/helm/upgrade.go | 2 +- docs/helm/helm_install.md | 4 ++-- docs/helm/helm_upgrade.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/helm/install.go b/cmd/helm/install.go index a6d6b08124d..4602ea9fd6d 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -215,7 +215,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command { f.StringVar(&inst.version, "version", "", "specify the exact chart version to install. If this is not specified, the latest version is installed") f.Int64Var(&inst.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&inst.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") - f.BoolVar(&inst.atomic, "atomic", false, "if set, installation process purges chart on fail") + f.BoolVar(&inst.atomic, "atomic", false, "if set, installation process purges chart on fail, also sets --wait flag") f.StringVar(&inst.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&inst.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&inst.password, "password", "", "chart repository password where to locate the requested chart") diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 5184a97ffd3..044ec045d45 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -169,7 +169,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&upgrade.resetValues, "reset-values", false, "when upgrading, reset the values to the ones built into the chart") f.BoolVar(&upgrade.reuseValues, "reuse-values", false, "when upgrading, reuse the last release's values and merge in any overrides from the command line via --set and -f. If '--reset-values' is specified, this is ignored.") f.BoolVar(&upgrade.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") - f.BoolVar(&upgrade.atomic, "atomic", false, "if set, upgrade process rolls back changes made in case of failed upgrade") + f.BoolVar(&upgrade.atomic, "atomic", false, "if set, upgrade process rolls back changes made in case of failed upgrade, also sets --wait flag") f.StringVar(&upgrade.repoURL, "repo", "", "chart repository url where to locate the requested chart") f.StringVar(&upgrade.username, "username", "", "chart repository username where to locate the requested chart") f.StringVar(&upgrade.password, "password", "", "chart repository password where to locate the requested chart") diff --git a/docs/helm/helm_install.md b/docs/helm/helm_install.md index 75a3c0502f7..12ae81b78b3 100644 --- a/docs/helm/helm_install.md +++ b/docs/helm/helm_install.md @@ -78,7 +78,7 @@ helm install [CHART] [flags] ### Options ``` - --atomic if set, installation process purges chart on fail + --atomic if set, installation process purges chart on fail, also sets --wait flag --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --dep-up run helm dependency update before installing the chart @@ -130,4 +130,4 @@ helm install [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 27-Jan-2019 +###### Auto generated by spf13/cobra on 28-Jan-2019 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index ac2ab316a1b..676c2659542 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -65,7 +65,7 @@ helm upgrade [RELEASE] [CHART] [flags] ### Options ``` - --atomic if set, upgrade process rolls back changes made in case of failed upgrade + --atomic if set, upgrade process rolls back changes made in case of failed upgrade, also sets --wait flag --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file --description string specify the description to use for the upgrade, rather than the default @@ -117,4 +117,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 23-Jan-2019 +###### Auto generated by spf13/cobra on 28-Jan-2019 From 074dbcde4f51473eab19dea5a0d843981bb2f72a Mon Sep 17 00:00:00 2001 From: Bort Verwilst Date: Tue, 29 Jan 2019 19:41:34 +0100 Subject: [PATCH 325/483] Switch to numeric user id (#5203) Signed-off-by: Bart Verwilst --- rootfs/Dockerfile | 2 +- rootfs/Dockerfile.experimental | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 82dfa0d4c75..f918c4d5198 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -22,6 +22,6 @@ COPY helm /helm COPY tiller /tiller EXPOSE 44134 -USER nobody +USER 65534 ENTRYPOINT ["/tiller"] diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index ca0c87f3057..61e49ab675b 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -21,6 +21,6 @@ ENV HOME /tmp COPY tiller /tiller EXPOSE 44134 -USER nobody +USER 65534 ENTRYPOINT ["/tiller", "--experimental-release"] From 7871ea9f736d4ec02db6512b779089219c9f0e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20K=C5=82opotek?= Date: Tue, 29 Jan 2019 19:43:38 +0100 Subject: [PATCH 326/483] Update documentation with option to install helm on Windows via scoop (#5207) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Kłopotek --- docs/install.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index b47aea6f11d..b9626a43a60 100755 --- a/docs/install.md +++ b/docs/install.md @@ -45,7 +45,7 @@ brew install kubernetes-helm (Note: There is also a formula for emacs-helm, which is a different project.) -### From Chocolatey (Windows) +### From Chocolatey or scoop (Windows) Members of the Kubernetes community have contributed a [Helm package](https://chocolatey.org/packages/kubernetes-helm) build to [Chocolatey](https://chocolatey.org/). This package is generally up to date. @@ -54,6 +54,12 @@ Members of the Kubernetes community have contributed a [Helm package](https://ch choco install kubernetes-helm ``` +The binary can also be installed via [`scoop`](https://scoop.sh) command-line installer. + +``` +scoop install helm +``` + ## From Script Helm now has an installer script that will automatically grab the latest version From a47a35814973bbaa7d37eec9fa5e30ac8c863daf Mon Sep 17 00:00:00 2001 From: Maor Friedman Date: Tue, 29 Jan 2019 10:44:25 -0800 Subject: [PATCH 327/483] [docs/related] add helm tiller-info plugin, related to #5111 (#5154) Signed-off-by: Maor --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index 5c027cc3659..4fc4d9737b7 100644 --- a/docs/related.md +++ b/docs/related.md @@ -53,6 +53,7 @@ or [pull request](https://github.com/helm/helm/pulls). - [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods - [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side - [helm-tiller](https://github.com/adamreese/helm-tiller) - Additional commands to work with Tiller +- [helm-tiller-info](https://github.com/maorfr/helm-tiller-info) - Plugin which prints information about Tiller - [helm-unittest](https://github.com/lrills/helm-unittest) - Plugin for unit testing chart locally with YAML - [Tillerless Helm v2](https://github.com/rimusz/helm-tiller) - Helm plugin for using Tiller locally and in CI/CD pipelines From f8ae371388df01aa770a4f6e9511fe92d0f1d770 Mon Sep 17 00:00:00 2001 From: Christian Hildebrando Hercules Date: Tue, 29 Jan 2019 10:54:02 -0800 Subject: [PATCH 328/483] Updating SAP example of gathering charts in one place (#5125) Signed-off-by: Christian H Hercules --- docs/charts_tips_and_tricks.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index e948d3bcfb8..9f9cc84a615 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -255,9 +255,9 @@ embed each of the components. Two strong design patterns are illustrated by these projects: -**SAP's [OpenStack chart](https://github.com/sapcc/openstack-helm):** This chart -installs a full OpenStack IaaS on Kubernetes. All of the charts are collected -together in one GitHub repository. +**SAP's [Converged charts](https://github.com/sapcc/helm-charts):** These charts +install SAP Converged Cloud a full OpenStack IaaS on Kubernetes. All of the charts are collected +together in one GitHub repository, except for a few submodules. **Deis's [Workflow](https://github.com/deis/workflow/tree/master/charts/workflow):** This chart exposes the entire Deis PaaS system with one chart. But it's different From 4c1edcf0492f7e6a315dbeced3c008e96a40bc47 Mon Sep 17 00:00:00 2001 From: Peter Stalman Date: Tue, 29 Jan 2019 10:54:51 -0800 Subject: [PATCH 329/483] Fixes #5046, zsh completion (#5072) Signed-off-by: Peter Stalman --- cmd/helm/completion.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index 2181e723c75..d0249b2ea99 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -212,6 +212,7 @@ __helm_convert_bash_to_zsh() { -e "s/${LWORD}compopt${RWORD}/__helm_compopt/g" \ -e "s/${LWORD}declare${RWORD}/__helm_declare/g" \ -e "s/\\\$(type${RWORD}/\$(__helm_type/g" \ + -e 's/aliashash\["\(\w\+\)"\]/aliashash[\1]/g' \ <<'BASH_COMPLETION_EOF' ` out.Write([]byte(zshInitialization)) From 6ceaef446f70ac125b9a6d02b1a7a46956b104af Mon Sep 17 00:00:00 2001 From: Laski Date: Tue, 29 Jan 2019 16:15:38 -0300 Subject: [PATCH 330/483] Clarify section title (#5226) As stated by @schollii in https://github.com/helm/helm/issues/4505#issuecomment-415886732 "Overriding Values from a Parent Chart" is unclear. This changes that text to "Overriding Values of a Child Chart". See @scholli's comment for justification. Signed-off-by: Nahuel Lascano --- docs/chart_template_guide/subcharts_and_globals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/subcharts_and_globals.md b/docs/chart_template_guide/subcharts_and_globals.md index 1954df39acf..b37a82bca4f 100644 --- a/docs/chart_template_guide/subcharts_and_globals.md +++ b/docs/chart_template_guide/subcharts_and_globals.md @@ -63,7 +63,7 @@ data: dessert: cake ``` -## Overriding Values from a Parent Chart +## Overriding Values of a Child Chart Our original chart, `mychart` is now the _parent_ chart of `mysubchart`. This relationship is based entirely on the fact that `mysubchart` is within `mychart/charts`. From 5cf932c140fd5b3557d1c345aaa5168e58fd82b1 Mon Sep 17 00:00:00 2001 From: Amim Knabben Date: Tue, 29 Jan 2019 18:00:51 -0200 Subject: [PATCH 331/483] Changing deprecated library reference and setting delete propagation background policy (#5161) Signed-off-by: Amim Knabben --- cmd/helm/installer/uninstall.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/helm/installer/uninstall.go b/cmd/helm/installer/uninstall.go index db824ca0b20..87fbd40501a 100644 --- a/cmd/helm/installer/uninstall.go +++ b/cmd/helm/installer/uninstall.go @@ -47,10 +47,11 @@ func deleteService(client corev1.ServicesGetter, namespace string) error { } // deleteDeployment deletes the Tiller Deployment resource -// We need to use the reaper instead of the kube API because GC for deployment dependents -// is not yet supported at the k8s server level (<= 1.5) func deleteDeployment(client kubernetes.Interface, namespace string) error { - err := client.Extensions().Deployments(namespace).Delete(deploymentName, &metav1.DeleteOptions{}) + policy := metav1.DeletePropagationBackground + err := client.AppsV1().Deployments(namespace).Delete(deploymentName, &metav1.DeleteOptions{ + PropagationPolicy: &policy, + }) return ingoreNotFound(err) } From ab0ba3aa630f64e0fd46cdd6726645a7e3520db9 Mon Sep 17 00:00:00 2001 From: James Ravn Date: Tue, 29 Jan 2019 20:04:17 +0000 Subject: [PATCH 332/483] fix(tiller): respect resource policy on upgrade (#5225) Don't delete a resource on upgrade if it is annotated with helm.io/resource-policy=keep. This can cause data loss for users if the annotation is ignored (e.g. for a PVC). Closes #3673 Signed-off-by: James Ravn --- pkg/kube/client.go | 18 +++++++++++++++++- pkg/kube/client_test.go | 15 +++++++++++++++ pkg/kube/resource_policy.go | 26 ++++++++++++++++++++++++++ pkg/tiller/resource_policy.go | 13 ++----------- 4 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 pkg/kube/resource_policy.go diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 4a387d524de..e897aced649 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -23,11 +23,12 @@ import ( goerrors "errors" "fmt" "io" + "k8s.io/apimachinery/pkg/api/meta" "log" "strings" "time" - jsonpatch "github.com/evanphx/json-patch" + "github.com/evanphx/json-patch" appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta2 "k8s.io/api/apps/v1beta2" @@ -60,6 +61,8 @@ const MissingGetHeader = "==> MISSING\nKIND\t\tNAME\n" // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found. var ErrNoObjectsVisited = goerrors.New("no objects visited") +var metadataAccessor = meta.NewAccessor() + // Client represents a client capable of communicating with the Kubernetes API. type Client struct { cmdutil.Factory @@ -308,6 +311,19 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader for _, info := range original.Difference(target) { c.Log("Deleting %q in %s...", info.Name, info.Namespace) + + if err := info.Get(); err != nil { + c.Log("Unable to get obj %q, err: %s", info.Name, err) + } + annotations, err := metadataAccessor.Annotations(info.Object) + if err != nil { + c.Log("Unable to get annotations on %q, err: %s", info.Name, err) + } + if annotations != nil && annotations[ResourcePolicyAnno] == KeepPolicy { + c.Log("Skipping delete of %q due to annotation [%s=%s]", info.Name, ResourcePolicyAnno, KeepPolicy) + continue + } + if err := deleteResource(info); err != nil { c.Log("Failed to delete %q, err: %s", info.Name, err) } diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index de33881c8ec..aa21b937c52 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -151,6 +151,8 @@ func TestUpdate(t *testing.T) { return newResponse(200, &listB.Items[1]) case p == "/namespaces/default/pods/squid" && m == "DELETE": return newResponse(200, &listB.Items[1]) + case p == "/namespaces/default/pods/squid" && m == "GET": + return newResponse(200, &listA.Items[2]) default: t.Fatalf("unexpected request: %s %s", req.Method, req.URL.Path) return nil, nil @@ -183,6 +185,7 @@ func TestUpdate(t *testing.T) { "/namespaces/default/pods/otter:GET", "/namespaces/default/pods/dolphin:GET", "/namespaces/default/pods:POST", + "/namespaces/default/pods/squid:GET", "/namespaces/default/pods/squid:DELETE", } if len(expectedActions) != len(actions) { @@ -194,6 +197,18 @@ func TestUpdate(t *testing.T) { t.Errorf("expected %s request got %s", v, actions[k]) } } + + // Test resource policy is respected + actions = nil + listA.Items[2].ObjectMeta.Annotations = map[string]string{ResourcePolicyAnno: KeepPolicy} + if err := c.Update(v1.NamespaceDefault, objBody(&listA), objBody(&listB), false, false, 0, false); err != nil { + t.Fatal(err) + } + for _, v := range actions { + if v == "/namespaces/default/pods/squid:DELETE" { + t.Errorf("should not have deleted squid - it has helm.sh/resource-policy=keep") + } + } } func TestBuild(t *testing.T) { diff --git a/pkg/kube/resource_policy.go b/pkg/kube/resource_policy.go new file mode 100644 index 00000000000..45cebcba8f0 --- /dev/null +++ b/pkg/kube/resource_policy.go @@ -0,0 +1,26 @@ +/* +Copyright The Helm Authors. + +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 kube + +// ResourcePolicyAnno is the annotation name for a resource policy +const ResourcePolicyAnno = "helm.sh/resource-policy" + +// KeepPolicy is the resource policy type for keep +// +// This resource policy type allows resources to skip being deleted +// during an uninstallRelease action. +const KeepPolicy = "keep" diff --git a/pkg/tiller/resource_policy.go b/pkg/tiller/resource_policy.go index cca2391d85c..aa9c5d2bd01 100644 --- a/pkg/tiller/resource_policy.go +++ b/pkg/tiller/resource_policy.go @@ -24,15 +24,6 @@ import ( "k8s.io/helm/pkg/tiller/environment" ) -// resourcePolicyAnno is the annotation name for a resource policy -const resourcePolicyAnno = "helm.sh/resource-policy" - -// keepPolicy is the resource policy type for keep -// -// This resource policy type allows resources to skip being deleted -// during an uninstallRelease action. -const keepPolicy = "keep" - func filterManifestsToKeep(manifests []Manifest) ([]Manifest, []Manifest) { remaining := []Manifest{} keep := []Manifest{} @@ -43,14 +34,14 @@ func filterManifestsToKeep(manifests []Manifest) ([]Manifest, []Manifest) { continue } - resourcePolicyType, ok := m.Head.Metadata.Annotations[resourcePolicyAnno] + resourcePolicyType, ok := m.Head.Metadata.Annotations[kube.ResourcePolicyAnno] if !ok { remaining = append(remaining, m) continue } resourcePolicyType = strings.ToLower(strings.TrimSpace(resourcePolicyType)) - if resourcePolicyType == keepPolicy { + if resourcePolicyType == kube.KeepPolicy { keep = append(keep, m) } From 51a7a4487b28a359738ac6b3135f6fbe7a0d95d6 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 29 Jan 2019 12:34:33 -0800 Subject: [PATCH 333/483] docs: add note on rolling back to the previous release (#5228) While deving at a Microsoft Open Hack my group discovered this useful piece of information in this issue comment: https://github.com/helm/helm/issues/1796#issuecomment-311385728 We found it very useful for our Blue Green CD pipeline and thought others might find it useful as well. Signed-off-by: Ethan Arrowood Signed-off-by: Matthew Fisher --- cmd/helm/rollback.go | 3 ++- docs/helm/helm_rollback.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 0c46fa81883..78d79659d1e 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -31,7 +31,8 @@ This command rolls back a release to a previous revision. The first argument of the rollback command is the name of a release, and the second is a revision (version) number. To see revision numbers, run -'helm history RELEASE'. +'helm history RELEASE'. If you'd like to rollback to the previous release use +'helm rollback [RELEASE] 0'. ` type rollbackCmd struct { diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index 5862b180aae..80fc83a839c 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -9,7 +9,8 @@ This command rolls back a release to a previous revision. The first argument of the rollback command is the name of a release, and the second is a revision (version) number. To see revision numbers, run -'helm history RELEASE'. +'helm history RELEASE'. If you'd like to rollback to the previous release use +'helm rollback [RELEASE] 0'. ``` @@ -51,4 +52,4 @@ helm rollback [flags] [RELEASE] [REVISION] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 10-Aug-2018 +###### Auto generated by spf13/cobra on 29-Jan-2019 From 9596dc768ad4b44aa3f6772a64912f8d04c4ea44 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 29 Jan 2019 12:35:44 -0800 Subject: [PATCH 334/483] add missing "and" (#5227) Signed-off-by: Matthew Fisher --- docs/chart_template_guide/variables.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/chart_template_guide/variables.md b/docs/chart_template_guide/variables.md index d924fe2cf32..dda92559b05 100644 --- a/docs/chart_template_guide/variables.md +++ b/docs/chart_template_guide/variables.md @@ -98,10 +98,7 @@ data: Variables are normally not "global". They are scoped to the block in which they are declared. Earlier, we assigned `$relname` in the top level of the template. That variable will be in scope for the entire template. But in our last example, `$key` and `$val` will only be in scope inside of the `{{range...}}{{end}}` block. -However, there is one variable that is always global - `$` - this -variable will always point to the root context. This can be very -useful when you are looping in a range need to know the chart's release -name. +However, there is one variable that is always global - `$` - this variable will always point to the root context. This can be very useful when you are looping in a range and need to know the chart's release name. An example illustrating this: ```yaml @@ -111,8 +108,8 @@ kind: Secret metadata: name: {{ .name }} labels: - # Many helm templates would use `.` below, but that will not work, - # however `$` will work here + # Many helm templates would use `.` below, but that will not work, + # however `$` will work here app.kubernetes.io/name: {{ template "fullname" $ }} # I cannot reference .Chart.Name, but I can do $.Chart.Name helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}" From 36d2c716b3194cceb4b22f32259990a04014b5f5 Mon Sep 17 00:00:00 2001 From: Patrick Stegmann Date: Wed, 30 Jan 2019 00:21:47 +0100 Subject: [PATCH 335/483] Adds the tip that you can pass custom objects (#3916) --- docs/charts_tips_and_tricks.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index 9f9cc84a615..e2c73b14ff9 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -36,6 +36,12 @@ is required, and will print an error message when that entry is missing: value: {{ required "A valid .Values.who entry required!" .Values.who }} ``` +When using the `include` function, you can pass it a custom object tree built from the current context by using the `dict` function: + +```yaml +{{- include "mytpl" (dict "key1" .Values.originalKey1 "key2" .Values.originalKey2) }} +``` + ## Quote Strings, Don't Quote Integers When you are working with string data, you are always safer quoting the From abd3659b649d6a463c5cd6c6aefd265590a138e2 Mon Sep 17 00:00:00 2001 From: "Pablo M. Canseco" Date: Tue, 29 Jan 2019 22:03:30 -0700 Subject: [PATCH 336/483] Update using_helm.md (#4690) * Update using_helm.md In docs/using_helm.md, it says on line 214 that you can pass in a YAML formatted file, but the example commands following that sentence create JSON code but names the file with a .yml extension. For clarity, I propose saying that it will accept JSON or YAML but clarify in the code that for the example we're making a JSON file. Signed-off-by: Pablo Canseco * update using_helm.md to accurately say that helm install -f only takes a yaml-formatted file. Signed-off-by: Pablo Canseco * updated wording to reflect the fact that -f / --values only accepts YAML Signed-off-by: Pablo Canseco --- docs/using_helm.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/using_helm.md b/docs/using_helm.md index 5716a1302bd..db723d993d6 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -1,4 +1,4 @@ -# Using Helm +# Using Helm This guide explains the basics of using Helm (and Tiller) to manage packages on your Kubernetes cluster. It assumes that you have already @@ -215,7 +215,10 @@ You can then override any of these settings in a YAML formatted file, and then pass that file during installation. ```console -$ echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml +$ cat << EOF > config.yaml +mariadbUser: user0 +mariadbDatabase: user0db +EOF $ helm install -f config.yaml stable/mariadb ``` From 048b220205c581378b393155896ca5e862ee0480 Mon Sep 17 00:00:00 2001 From: Jacob Silva Date: Wed, 30 Jan 2019 01:11:07 -0500 Subject: [PATCH 337/483] Removed link for Cabin mobile app (#5231) Signed-off-by: Jacob Silva --- docs/related.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/related.md b/docs/related.md index 4fc4d9737b7..ba1b0dfbf48 100644 --- a/docs/related.md +++ b/docs/related.md @@ -89,7 +89,6 @@ Tools layered on top of Helm or Tiller. Platforms, distributions, and services that include Helm support. -- [Cabin](http://www.skippbox.com/cabin/) - Mobile App for Managing Kubernetes - [Fabric8](https://fabric8.io) - Integrated development platform for Kubernetes - [Jenkins X](http://jenkins-x.io/) - open source automated CI/CD for Kubernetes which uses Helm for [promoting](http://jenkins-x.io/about/features/#promotion) applications through [environments via GitOps](http://jenkins-x.io/about/features/#environments) - [Kubernetic](https://kubernetic.com/) - Kubernetes Desktop Client From a2b1afc66bfc2b3d0a876ef7a2a25f38f12c1415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20K=C5=82opotek?= Date: Wed, 30 Jan 2019 16:06:24 +0100 Subject: [PATCH 338/483] Update README with scoop install option (#5234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Kłopotek --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7e68df5c3f7..1889e818ed3 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ If you want to use a package manager: - [Homebrew](https://brew.sh/) users can use `brew install kubernetes-helm`. - [Chocolatey](https://chocolatey.org/) users can use `choco install kubernetes-helm`. +- [Scoop](https://scoop.sh/) users can use `scoop install helm`. - [GoFish](https://gofi.sh/) users can use `gofish install helm`. To rapidly get Helm up and running, start with the [Quick Start Guide](https://docs.helm.sh/using_helm/#quickstart-guide). From 7161095f79e2c9a35350d301ad820e57e56182ec Mon Sep 17 00:00:00 2001 From: lIuDuI <1693291525@qq.com> Date: Thu, 31 Jan 2019 12:10:26 +0800 Subject: [PATCH 339/483] Update func name (#5241) Signed-off-by: xichengliudui <1693291525@qq.com> --- cmd/helm/installer/install.go | 2 +- cmd/helm/installer/options.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 6027fdba814..d6d24eec476 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -183,7 +183,7 @@ func generateLabels(labels map[string]string) map[string]string { return labels } -// parseNodeSelectors parses a comma delimited list of key=values pairs into a map. +// parseNodeSelectorsInto parses a comma delimited list of key=values pairs into a map. func parseNodeSelectorsInto(labels string, m map[string]string) error { kv := strings.Split(labels, ",") for _, v := range kv { diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 196ad8de499..dbcb376c5da 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -50,7 +50,7 @@ type Options struct { // AutoMountServiceAccountToken determines whether or not the service account should be added to Tiller. AutoMountServiceAccountToken bool - // Force allows to force upgrading tiller if deployed version is greater than current version + // ForceUpgrade allows to force upgrading tiller if deployed version is greater than current version ForceUpgrade bool // ImageSpec identifies the image Tiller will use when deployed. From 251a6a2b580158b5dfb34e8b08b10071e6353c1a Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Fri, 1 Feb 2019 05:32:40 +0000 Subject: [PATCH 340/483] Fix code syntax highlighting in docs (#5245) * Added yaml to undelcared code blocks * Changed YAML->yaml for consistency * Added console syntax highlighting Signed-off-by: Dean Coakley --- docs/chart_template_guide/control_structures.md | 6 +++--- docs/chart_template_guide/debugging.md | 4 ++-- docs/chart_template_guide/functions_and_pipelines.md | 4 ++-- docs/chart_template_guide/values_files.md | 4 ++-- docs/chart_template_guide/yaml_techniques.md | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 61d9ef9e2df..68820dfa70f 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -20,7 +20,7 @@ The first control structure we'll look at is for conditionally including blocks The basic structure for a conditional looks like this: -``` +```yaml {{ if PIPELINE }} # Do something {{ else if OTHER PIPELINE }} @@ -115,7 +115,7 @@ data: `mug` is incorrectly indented. Let's simply out-dent that one line, and re-run: -``` +```yaml apiVersion: v1 kind: ConfigMap metadata: @@ -224,7 +224,7 @@ The next control structure to look at is the `with` action. This controls variab The syntax for `with` is similar to a simple `if` statement: -``` +```yaml {{ with PIPELINE }} # restricted scope {{ end }} diff --git a/docs/chart_template_guide/debugging.md b/docs/chart_template_guide/debugging.md index fac788cc48c..23a6ae70b1c 100644 --- a/docs/chart_template_guide/debugging.md +++ b/docs/chart_template_guide/debugging.md @@ -12,7 +12,7 @@ When your YAML is failing to parse, but you want to see what is generated, one easy way to retrieve the YAML is to comment out the problem section in the template, and then re-run `helm install --dry-run --debug`: -```YAML +```yaml apiVersion: v1 # some: problem section # {{ .Values.foo | quote }} @@ -20,7 +20,7 @@ apiVersion: v1 The above will be rendered and returned with the comments intact: -```YAML +```yaml apiVersion: v1 # some: problem section # "bar" diff --git a/docs/chart_template_guide/functions_and_pipelines.md b/docs/chart_template_guide/functions_and_pipelines.md index 66176fc59a5..fe9c92d6e80 100644 --- a/docs/chart_template_guide/functions_and_pipelines.md +++ b/docs/chart_template_guide/functions_and_pipelines.md @@ -4,7 +4,7 @@ So far, we've seen how to place information into a template. But that informatio Let's start with a best practice: When injecting strings from the `.Values` object into the template, we ought to quote these strings. We can do that by calling the `quote` function in the template directive: -``` +```yaml apiVersion: v1 kind: ConfigMap metadata: @@ -104,7 +104,7 @@ drink: {{ .Values.favorite.drink | default "tea" | quote }} If we run this as normal, we'll get our `coffee`: -``` +```yaml # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap diff --git a/docs/chart_template_guide/values_files.md b/docs/chart_template_guide/values_files.md index a15047667b8..218da19dc77 100644 --- a/docs/chart_template_guide/values_files.md +++ b/docs/chart_template_guide/values_files.md @@ -54,7 +54,7 @@ data: Because `favoriteDrink` is set in the default `values.yaml` file to `coffee`, that's the value displayed in the template. We can easily override that by adding a `--set` flag in our call to `helm install`: -``` +```console helm install --dry-run --debug --set favoriteDrink=slurm ./mychart SERVER: "localhost:44134" CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/_scratch/mychart @@ -85,7 +85,7 @@ favorite: Now we would have to modify the template slightly: -``` +```yaml apiVersion: v1 kind: ConfigMap metadata: diff --git a/docs/chart_template_guide/yaml_techniques.md b/docs/chart_template_guide/yaml_techniques.md index 44c41f903a3..00b33b67458 100644 --- a/docs/chart_template_guide/yaml_techniques.md +++ b/docs/chart_template_guide/yaml_techniques.md @@ -177,7 +177,7 @@ Now the value of `coffee` will be `Latte\nCappuccino\nEspresso\n\n\n`. Indentation inside of a text block is preserved, and results in the preservation of line breaks, too: -``` +```yaml coffee: |- Latte 12 oz @@ -336,7 +336,7 @@ reference is expanded and then discarded. So if we were to decode and then re-encode the example above, the resulting YAML would be: -```YAML +```yaml coffee: yes, please favorite: Cappucino coffees: From 9e18364fea6cc8a2cd97a2fa1b40650583b1eeff Mon Sep 17 00:00:00 2001 From: JoeWrightss <42261994+JoeWrightss@users.noreply.github.com> Date: Fri, 1 Feb 2019 13:33:04 +0800 Subject: [PATCH 341/483] Fix some spelling errors in comment (#5246) Signed-off-by: zhoulin xie --- pkg/repo/repotest/server.go | 2 +- pkg/storage/driver/secrets.go | 2 +- pkg/tiller/release_list.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/repo/repotest/server.go b/pkg/repo/repotest/server.go index 36ab10d7066..394294bcd51 100644 --- a/pkg/repo/repotest/server.go +++ b/pkg/repo/repotest/server.go @@ -148,7 +148,7 @@ func (s *Server) URL() string { return s.srv.URL } -// LinkIndices links the index created with CreateIndex and makes a symboic link to the repositories/cache directory. +// LinkIndices links the index created with CreateIndex and makes a symbolic link to the repositories/cache directory. // // This makes it possible to simulate a local cache of a repository. func (s *Server) LinkIndices() error { diff --git a/pkg/storage/driver/secrets.go b/pkg/storage/driver/secrets.go index b79a8427237..606d7960b45 100644 --- a/pkg/storage/driver/secrets.go +++ b/pkg/storage/driver/secrets.go @@ -45,7 +45,7 @@ type Secrets struct { Log func(string, ...interface{}) } -// NewSecrets initializes a new Secrets wrapping an implmenetation of +// NewSecrets initializes a new Secrets wrapping an implementation of // the kubernetes SecretsInterface. func NewSecrets(impl corev1.SecretInterface) *Secrets { return &Secrets{ diff --git a/pkg/tiller/release_list.go b/pkg/tiller/release_list.go index 3299d3ef270..6d62c7bc41b 100644 --- a/pkg/tiller/release_list.go +++ b/pkg/tiller/release_list.go @@ -140,7 +140,7 @@ func (s *ReleaseServer) partition(rels []*release.Release, cap int) <-chan []*re // Over-cap, push chunk onto channel to send over gRPC stream s.Log("partitioned at %d with %d releases (cap=%d)", fill, len(chunk), cap) chunks <- chunk - // reset paritioning state + // reset partitioning state chunk = nil fill = 0 } From 147dc225e2a0cc7f5e08a46ea9b59a1d78217f1c Mon Sep 17 00:00:00 2001 From: lIuDuI <1693291525@qq.com> Date: Fri, 1 Feb 2019 22:33:59 +0800 Subject: [PATCH 342/483] Update func name (#5250) * Update func name Signed-off-by: xichengliudui <1693291525@qq.com> * update pull request Signed-off-by: xichengliudui <1693291525@qq.com> --- pkg/tiller/environment/environment.go | 2 +- pkg/tiller/release_server.go | 2 +- pkg/urlutil/urlutil.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 86d077b89ed..290337d7b33 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -119,7 +119,7 @@ type KubeClient interface { // by "\n---\n"). Delete(namespace string, reader io.Reader) error - // Watch the resource in reader until it is "ready". + // WatchUntilReady watch the resource in reader until it is "ready". // // For Jobs, "ready" means the job ran to completion (excited without error). // For all other kinds, it means the kind was created or modified without diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 680c39dac03..b85118cd27d 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -456,7 +456,7 @@ func (s *ReleaseServer) deleteHookByPolicy(h *release.Hook, policy string, name, return nil } -// hookShouldBeDeleted determines whether the defined hook deletion policy matches the hook deletion polices +// hookHasDeletePolicy determines whether the defined hook deletion policy matches the hook deletion polices // supported by helm. If so, mark the hook as one should be deleted. func hookHasDeletePolicy(h *release.Hook, policy string) bool { if dp, ok := deletePolices[policy]; ok { diff --git a/pkg/urlutil/urlutil.go b/pkg/urlutil/urlutil.go index 272907de0c7..96b691c9246 100644 --- a/pkg/urlutil/urlutil.go +++ b/pkg/urlutil/urlutil.go @@ -73,7 +73,7 @@ func ExtractHostname(addr string) (string, error) { return stripPort(u.Host), nil } -// Backported from Go 1.8 because Circle is still on 1.7 +// stripPort from Go 1.8 because Circle is still on 1.7 func stripPort(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { From d3373f568c63e48c3af3b181bca81ca61967e289 Mon Sep 17 00:00:00 2001 From: ahmadali shafiee Date: Fri, 1 Feb 2019 19:38:28 +0330 Subject: [PATCH 343/483] making ingress path configurations more customizable (#5175) * making ingress path configurations more customizable Signed-off-by: Ahmadali Shafiee * update notes ingress reference Signed-off-by: Ahmadali Shafiee --- pkg/chartutil/create.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 8f713fcd18f..9af4b8f4582 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -75,9 +75,10 @@ ingress: annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" - paths: [] hosts: - - chart-example.local + - host: chart-example.local + paths: [] + tls: [] # - secretName: chart-example-tls # hosts: @@ -128,7 +129,6 @@ const defaultIgnore = `# Patterns to ignore when building packages. const defaultIngress = `{{- if .Values.ingress.enabled -}} {{- $fullName := include ".fullname" . -}} -{{- $ingressPaths := .Values.ingress.paths -}} apiVersion: extensions/v1beta1 kind: Ingress metadata: @@ -155,10 +155,10 @@ spec: {{- end }} rules: {{- range .Values.ingress.hosts }} - - host: {{ . | quote }} + - host: {{ .host | quote }} http: paths: - {{- range $ingressPaths }} + {{- range .paths }} - path: {{ . }} backend: serviceName: {{ $fullName }} @@ -245,8 +245,8 @@ spec: const defaultNotes = `1. Get the application URL by running these commands: {{- if .Values.ingress.enabled }} {{- range $host := .Values.ingress.hosts }} - {{- range $.Values.ingress.paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host }}{{ . }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} {{- end }} {{- end }} {{- else if contains "NodePort" .Values.service.type }} From 69c7ba320e041894c073f7f62a98075b72c6bfd8 Mon Sep 17 00:00:00 2001 From: Flavian Date: Fri, 1 Feb 2019 17:12:46 +0100 Subject: [PATCH 344/483] Fix: type conversion for zero values (#5151) * added test for zero values Signed-off-by: Flavian * implemented case for zero values Signed-off-by: Flavian --- pkg/strvals/parser.go | 4 ++++ pkg/strvals/parser_test.go | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/pkg/strvals/parser.go b/pkg/strvals/parser.go index 9d52f34c010..d0a647c6772 100644 --- a/pkg/strvals/parser.go +++ b/pkg/strvals/parser.go @@ -393,6 +393,10 @@ func typedVal(v []rune, st bool) interface{} { return nil } + if strings.EqualFold(val, "0") { + return int64(0) + } + // If this value does not start with zero, try parsing it to an int if len(val) != 0 && val[0] != '0' { if iv, err := strconv.ParseInt(val, 10, 64); err == nil { diff --git a/pkg/strvals/parser_test.go b/pkg/strvals/parser_test.go index a096f16d2b0..5d77aed18d8 100644 --- a/pkg/strvals/parser_test.go +++ b/pkg/strvals/parser_test.go @@ -85,6 +85,11 @@ func TestParseSet(t *testing.T) { expect: map[string]interface{}{"is_null": "null"}, err: false, }, + { + str: "zero=0", + expect: map[string]interface{}{"zero": "0"}, + err: false, + }, } tests := []struct { str string @@ -123,6 +128,10 @@ func TestParseSet(t *testing.T) { str: "leading_zeros=00009", expect: map[string]interface{}{"leading_zeros": "00009"}, }, + { + str: "zero_int=0", + expect: map[string]interface{}{"zero_int": 0}, + }, { str: "long_int=1234567890", expect: map[string]interface{}{"long_int": 1234567890}, From 7a70459ca1913fcffeb374eca4446c5f97427da9 Mon Sep 17 00:00:00 2001 From: Alex Speaks Date: Fri, 1 Feb 2019 08:18:10 -0800 Subject: [PATCH 345/483] Fix incorrect flow example and improve operator documentation (#4919) * Fix incorrect flow example and improve operator documentation Signed-off-by: Alex * Use golang comment format Signed-off-by: Alex --- docs/chart_template_guide/control_structures.md | 2 +- .../functions_and_pipelines.md | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index 68820dfa70f..e2f9ca89d89 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -53,7 +53,7 @@ data: myvalue: "Hello World" drink: {{ .Values.favorite.drink | default "tea" | quote }} food: {{ .Values.favorite.food | upper | quote }} - {{ if and (.Values.favorite.drink) (eq .Values.favorite.drink "coffee") }}mug: true{{ end }} + {{ if and .Values.favorite.drink (eq .Values.favorite.drink "coffee") }}mug: true{{ end }} ``` Note that `.Values.favorite.drink` must be defined or else it will throw an error when comparing it to "coffee". Since we commented out `drink: coffee` in our last example, the output should not include a `mug: true` flag. But if we add that line back into our `values.yaml` file, the output should look like this: diff --git a/docs/chart_template_guide/functions_and_pipelines.md b/docs/chart_template_guide/functions_and_pipelines.md index fe9c92d6e80..fe5a3c2b289 100644 --- a/docs/chart_template_guide/functions_and_pipelines.md +++ b/docs/chart_template_guide/functions_and_pipelines.md @@ -150,6 +150,19 @@ Template functions and pipelines are a powerful way to transform information and ## Operators are functions -For templates, the operators (`eq`, `ne`, `lt`, `gt`, `and`, `or` and so on) are all implemented as functions. In pipelines, operations can be grouped with parentheses (`(`, and `)`). +Operators are implemented as functions that return a boolean value. To use `eq`, `ne`, `lt`, `gt`, `and`, `or`, `not` etcetera place the operator at the front of the statement followed by its parameters just as you would a function. To chain multiple operations together, separate individual functions by surrounding them with paranthesis. + +```yaml +{{/* include the body of this if statement when the variable .Values.fooString exists and is set to "foo" */}} +{{ if and .Values.fooString (eq .Values.fooString "foo") }} + {{ ... }} +{{ end }} + + +{{/* do not include the body of this if statement because unset variables evaluate to false and .Values.setVariable was negated with the not function. */}} +{{ if or .Values.anUnsetVariable (not .Values.aSetVariable) }} + {{ ... }} +{{ end }} +``` Now we can turn from functions and pipelines to flow control with conditions, loops, and scope modifiers. From c9dfd2507129fa392e9c8b57ade7e2dbb33b063c Mon Sep 17 00:00:00 2001 From: Ryan Hartje Date: Fri, 1 Feb 2019 10:45:54 -0600 Subject: [PATCH 346/483] added warning and set default image for unreleased versions of helm for #3770 (#3781) * added warning and set default image for unreleased versions of helm * changed to BuildMetadata * changed to BuildMetadata * added check for clientOnly flag --- cmd/helm/init.go | 9 +++++++++ cmd/helm/installer/install_test.go | 4 ++++ cmd/helm/installer/options.go | 3 +++ 3 files changed, 16 insertions(+) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index b628dc00874..db35ef037d7 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -36,6 +36,7 @@ import ( "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/helm/portforwarder" "k8s.io/helm/pkg/repo" + "k8s.io/helm/pkg/version" ) const initDesc = ` @@ -315,6 +316,14 @@ func (i *initCmd) run() error { fmt.Fprintln(i.out, "Not installing Tiller due to 'client-only' flag having been set") } + needsDefaultImage := !i.clientOnly && !i.opts.UseCanary && len(i.opts.ImageSpec) == 0 && version.BuildMetadata == "unreleased" + if needsDefaultImage { + fmt.Fprintf(i.out, "\nWarning: You appear to be using an unreleased version of Helm. Please either use the\n"+ + "--canary-image flag, or specify your desired tiller version with --tiller-image.\n\n"+ + "Ex:\n"+ + "$ helm init --tiller-image gcr.io/kubernetes-helm/tiller:v2.8.2\n\n") + } + fmt.Fprintln(i.out, "Happy Helming!") return nil } diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go index 561b3ed6d29..50cc8b1d8a6 100644 --- a/cmd/helm/installer/install_test.go +++ b/cmd/helm/installer/install_test.go @@ -53,6 +53,10 @@ func TestDeployment(t *testing.T) { t.Fatalf("%s: error %q", tt.name, err) } + // Unreleased versions of helm don't have a release image. See issue 3370 + if tt.name == "default" && version.BuildMetadata == "unreleased" { + tt.expect = "gcr.io/kubernetes-helm/tiller:canary" + } if got := dep.Spec.Template.Spec.Containers[0].Image; got != tt.expect { t.Errorf("%s: expected image %q, got %q", tt.name, tt.expect, got) } diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index dbcb376c5da..186286ec229 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -105,6 +105,9 @@ func (opts *Options) SelectImage() string { case opts.UseCanary: return defaultImage + ":canary" case opts.ImageSpec == "": + if version.BuildMetadata == "unreleased" { + return defaultImage + ":canary" + } return fmt.Sprintf("%s:%s", defaultImage, version.Version) default: return opts.ImageSpec From f5df47b1c855e02c66f57756af224bc9b1055b09 Mon Sep 17 00:00:00 2001 From: Alexander Matyushentsev Date: Fri, 1 Feb 2019 09:02:06 -0800 Subject: [PATCH 347/483] Fix: kind sorter incorrectly compares unknown and namespace (#5186) Signed-off-by: Alexander Matyushentsev --- pkg/tiller/kind_sorter.go | 17 ++++++++++++----- pkg/tiller/kind_sorter_test.go | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/pkg/tiller/kind_sorter.go b/pkg/tiller/kind_sorter.go index 8aff4e6c11a..ceeb0f92804 100644 --- a/pkg/tiller/kind_sorter.go +++ b/pkg/tiller/kind_sorter.go @@ -124,14 +124,16 @@ func (k *kindSorter) Less(i, j int) bool { b := k.manifests[j] first, aok := k.ordering[a.Head.Kind] second, bok := k.ordering[b.Head.Kind] - // if same kind (including unknown) sub sort alphanumeric - if first == second { - // if both are unknown and of different kind sort by kind alphabetically - if !aok && !bok && a.Head.Kind != b.Head.Kind { + + if !aok && !bok { + // if both are unknown then sort alphabetically by kind and name + if a.Head.Kind != b.Head.Kind { return a.Head.Kind < b.Head.Kind + } else { + return a.Name < b.Name } - return a.Name < b.Name } + // unknown kind is last if !aok { return false @@ -139,6 +141,11 @@ func (k *kindSorter) Less(i, j int) bool { if !bok { return true } + + // if same kind sub sort alphanumeric + if first == second { + return a.Name < b.Name + } // sort different kinds return first < second } diff --git a/pkg/tiller/kind_sorter_test.go b/pkg/tiller/kind_sorter_test.go index 1c187e90d5f..56822f995b9 100644 --- a/pkg/tiller/kind_sorter_test.go +++ b/pkg/tiller/kind_sorter_test.go @@ -223,3 +223,24 @@ func TestKindSorterSubSort(t *testing.T) { }) } } + +func TestKindSorterNamespaceAgainstUnknown(t *testing.T) { + unknown := Manifest{ + Name: "a", + Head: &util.SimpleHead{Kind: "Unknown"}, + } + namespace := Manifest{ + Name: "b", + Head: &util.SimpleHead{Kind: "Namespace"}, + } + + manifests := []Manifest{unknown, namespace} + sortByKind(manifests, InstallOrder) + + expectedOrder := []Manifest{namespace, unknown} + for i, manifest := range manifests { + if expectedOrder[i].Name != manifest.Name { + t.Errorf("Expected %s, got %s", expectedOrder[i].Name, manifest.Name) + } + } +} From 3953f0e884afd85a68ab4d8b4488cec735e2bc58 Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Fri, 1 Feb 2019 12:12:03 -0500 Subject: [PATCH 348/483] fix(helm): add test for repo update strict flag (#5183) While adding the test, noticed a race in the repo update code, due to multiple go routines potentially incrementing the error counter. Included the required mutex in the repo update code in the same commit, since the new test uncovered the race condition. Signed-off-by: Arash Deshmeh --- cmd/helm/repo_update.go | 7 +++++++ cmd/helm/repo_update_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 52630034339..1a239b40753 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -93,21 +93,28 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho var ( errorCounter int wg sync.WaitGroup + mu sync.Mutex ) for _, re := range repos { wg.Add(1) go func(re *repo.ChartRepository) { defer wg.Done() if re.Config.Name == localRepository { + mu.Lock() fmt.Fprintf(out, "...Skip %s chart repository\n", re.Config.Name) + mu.Unlock() return } err := re.DownloadIndexFile(home.Cache()) if err != nil { + mu.Lock() errorCounter++ fmt.Fprintf(out, "...Unable to get an update from the %q chart repository (%s):\n\t%s\n", re.Config.Name, re.Config.URL, err) + mu.Unlock() } else { + mu.Lock() fmt.Fprintf(out, "...Successfully got an update from the %q chart repository\n", re.Config.Name) + mu.Unlock() } }(re) } diff --git a/cmd/helm/repo_update_test.go b/cmd/helm/repo_update_test.go index 86af437c5f9..5b105800855 100644 --- a/cmd/helm/repo_update_test.go +++ b/cmd/helm/repo_update_test.go @@ -105,3 +105,30 @@ func TestUpdateCharts(t *testing.T) { t.Error("Update was not successful") } } + +func TestUpdateCmdStrictFlag(t *testing.T) { + thome, err := tempHelmHome(t) + if err != nil { + t.Fatal(err) + } + + cleanup := resetEnv() + defer func() { + os.RemoveAll(thome.String()) + cleanup() + }() + + settings.Home = thome + + out := bytes.NewBuffer(nil) + cmd := newRepoUpdateCmd(out) + cmd.ParseFlags([]string{"--strict"}) + + if err := cmd.RunE(cmd, []string{}); err == nil { + t.Fatal("expected error due to strict flag") + } + + if got := out.String(); !strings.Contains(got, "Unable to get an update") { + t.Errorf("Expected 'Unable to get an update', got %q", got) + } +} From c2e8720c7258dbfbee7cd2ed73114160a937e8fd Mon Sep 17 00:00:00 2001 From: Jecho Date: Fri, 1 Feb 2019 15:15:16 -0800 Subject: [PATCH 349/483] fixed minor typo in doc (#5249) Signed-off-by: Jecho Ricafrente --- docs/chart_tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_tests.md b/docs/chart_tests.md index 300eeaf7345..408656c4ace 100644 --- a/docs/chart_tests.md +++ b/docs/chart_tests.md @@ -64,7 +64,7 @@ spec: ``` ## Steps to Run a Test Suite on a Release -1. `$ helm install wordpress` +1. `$ helm install stable/wordpress` ``` NAME: quirky-walrus LAST DEPLOYED: Mon Feb 13 13:50:43 2017 From 1f386a34ea170850f1239a850ce381356fd59ddd Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Fri, 1 Feb 2019 18:44:46 -0500 Subject: [PATCH 350/483] add --devel flag to inspect command (#5141) * fix(helm): add --devel flag to allow inspect on pre-release chart versions Signed-off-by: Arash Deshmeh * fix(helm): remove some duplication from inspect command preparation Signed-off-by: Arash Deshmeh --- cmd/helm/inspect.go | 43 +++++++----- cmd/helm/inspect_test.go | 66 ++++++++++++++++++ .../prerelease-0.2.0-pre-release.tgz | Bin 0 -> 1064 bytes .../testdata/testcharts/prerelease/Chart.yaml | 6 ++ .../testdata/testcharts/prerelease/README.md | 13 ++++ .../prerelease/templates/alpine-pod.yaml | 26 +++++++ docs/helm/helm_inspect.md | 3 +- docs/helm/helm_inspect_chart.md | 3 +- docs/helm/helm_inspect_readme.md | 3 +- docs/helm/helm_inspect_values.md | 3 +- 10 files changed, 146 insertions(+), 20 deletions(-) create mode 100644 cmd/helm/testdata/testcharts/prerelease-0.2.0-pre-release.tgz create mode 100644 cmd/helm/testdata/testcharts/prerelease/Chart.yaml create mode 100644 cmd/helm/testdata/testcharts/prerelease/README.md create mode 100644 cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml diff --git a/cmd/helm/inspect.go b/cmd/helm/inspect.go index 844116bc596..52e681e4813 100644 --- a/cmd/helm/inspect.go +++ b/cmd/helm/inspect.go @@ -59,6 +59,7 @@ type inspectCmd struct { repoURL string username string password string + devel bool certFile string keyFile string @@ -88,12 +89,9 @@ func newInspectCmd(out io.Writer) *cobra.Command { if err := checkArgsLength(len(args), "chart name"); err != nil { return err } - cp, err := locateChartPath(insp.repoURL, insp.username, insp.password, args[0], insp.version, insp.verify, insp.keyring, - insp.certFile, insp.keyFile, insp.caFile) - if err != nil { + if err := insp.prepare(args[0]); err != nil { return err } - insp.chartpath = cp return insp.run() }, } @@ -107,12 +105,9 @@ func newInspectCmd(out io.Writer) *cobra.Command { if err := checkArgsLength(len(args), "chart name"); err != nil { return err } - cp, err := locateChartPath(insp.repoURL, insp.username, insp.password, args[0], insp.version, insp.verify, insp.keyring, - insp.certFile, insp.keyFile, insp.caFile) - if err != nil { + if err := insp.prepare(args[0]); err != nil { return err } - insp.chartpath = cp return insp.run() }, } @@ -126,12 +121,9 @@ func newInspectCmd(out io.Writer) *cobra.Command { if err := checkArgsLength(len(args), "chart name"); err != nil { return err } - cp, err := locateChartPath(insp.repoURL, insp.username, insp.password, args[0], insp.version, insp.verify, insp.keyring, - insp.certFile, insp.keyFile, insp.caFile) - if err != nil { + if err := insp.prepare(args[0]); err != nil { return err } - insp.chartpath = cp return insp.run() }, } @@ -145,12 +137,9 @@ func newInspectCmd(out io.Writer) *cobra.Command { if err := checkArgsLength(len(args), "chart name"); err != nil { return err } - cp, err := locateChartPath(insp.repoURL, insp.username, insp.password, args[0], insp.version, insp.verify, insp.keyring, - insp.certFile, insp.keyFile, insp.caFile) - if err != nil { + if err := insp.prepare(args[0]); err != nil { return err } - insp.chartpath = cp return insp.run() }, } @@ -193,6 +182,12 @@ func newInspectCmd(out io.Writer) *cobra.Command { valuesSubCmd.Flags().StringVar(&insp.password, password, "", passworddesc) chartSubCmd.Flags().StringVar(&insp.password, password, "", passworddesc) + develFlag := "devel" + develDesc := "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored." + for _, subCmd := range cmds { + subCmd.Flags().BoolVar(&insp.devel, develFlag, false, develDesc) + } + certFile := "cert-file" certFiledesc := "verify certificates of HTTPS-enabled servers using this CA bundle" for _, subCmd := range cmds { @@ -218,6 +213,22 @@ func newInspectCmd(out io.Writer) *cobra.Command { return inspectCommand } +func (i *inspectCmd) prepare(chart string) error { + debug("Original chart version: %q", i.version) + if i.version == "" && i.devel { + debug("setting version to >0.0.0-0") + i.version = ">0.0.0-0" + } + + cp, err := locateChartPath(i.repoURL, i.username, i.password, chart, i.version, i.verify, i.keyring, + i.certFile, i.keyFile, i.caFile) + if err != nil { + return err + } + i.chartpath = cp + return nil +} + func (i *inspectCmd) run() error { chrt, err := chartutil.Load(i.chartpath) if err != nil { diff --git a/cmd/helm/inspect_test.go b/cmd/helm/inspect_test.go index b9dbf2ab625..c4ce005b003 100644 --- a/cmd/helm/inspect_test.go +++ b/cmd/helm/inspect_test.go @@ -19,8 +19,11 @@ package main import ( "bytes" "io/ioutil" + "os" "strings" "testing" + + "k8s.io/helm/pkg/repo/repotest" ) func TestInspect(t *testing.T) { @@ -78,3 +81,66 @@ func TestInspect(t *testing.T) { t.Errorf("expected empty values buffer, got %q", b.String()) } } + +func TestInspectPreReleaseChart(t *testing.T) { + hh, err := tempHelmHome(t) + if err != nil { + t.Fatal(err) + } + cleanup := resetEnv() + defer func() { + os.RemoveAll(hh.String()) + cleanup() + }() + + settings.Home = hh + + srv := repotest.NewServer(hh.String()) + defer srv.Stop() + + if _, err := srv.CopyCharts("testdata/testcharts/*.tgz*"); err != nil { + t.Fatal(err) + } + if err := srv.LinkIndices(); err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + args []string + flags []string + fail bool + expectedErr string + }{ + { + name: "inspect pre-release chart", + args: []string{"prerelease"}, + fail: true, + expectedErr: "chart \"prerelease\" not found", + }, + { + name: "inspect pre-release chart with 'devel' flag", + args: []string{"prerelease"}, + flags: []string{"--devel"}, + fail: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.flags = append(tt.flags, "--repo", srv.URL()) + cmd := newInspectCmd(ioutil.Discard) + cmd.SetArgs(tt.args) + cmd.ParseFlags(tt.flags) + if err := cmd.RunE(cmd, tt.args); err != nil { + if tt.fail { + if !strings.Contains(err.Error(), tt.expectedErr) { + t.Errorf("%q expected error: %s, got: %s", tt.name, tt.expectedErr, err.Error()) + } + return + } + t.Errorf("%q reported error: %s", tt.name, err) + } + }) + } +} diff --git a/cmd/helm/testdata/testcharts/prerelease-0.2.0-pre-release.tgz b/cmd/helm/testdata/testcharts/prerelease-0.2.0-pre-release.tgz new file mode 100644 index 0000000000000000000000000000000000000000..36c8f02da06c1b6b36342b1757e719074282c712 GIT binary patch literal 1064 zcmV+@1lRi?iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI&ykJ~mA-m`wiK)J@UY`yD!>)WCU(4cJ)Y=ZzrQNUwyY!RkN zl|xzUI{xnkNonnMw#cE24T^d$hDpvdADnrHYAjh&giPb_E3_`#VXdy7SMog1Z?3Py zZ=UDpzxlK%t|rC*CfAeMO)kmL1xw{2$vo5AI(gg1EG@ank5H zyrD*!9Uv@`WeK;ck(%HqsoQ&Kj7Ta|(;O=28lI2GoBwkr&A1{}CmQ|Ev6vDztu2Y? z$>`zyTDq!TW~HfvPE_2I)M5@Fj7Vy7DA3_N0f^n5?)TYUtd;CN)^s?G z_WSG;s+PE4ND}~sOH%CB0A9hziXg4XN{4Go<0eRkmPvp!;4GFK=qg!O;EYiq0tb-* zgtgp~hBAz$9`2p%l~=8Tm9c=LmYSif40NcShh!q?Ds<2nHUmO~*2%I}XoHm=O)^;G z#%PvHMIJBO!KTSJ?UJk}M}g#O)VL-wTJGj>l7?T%Ze>aE8UAREBRCvR!|v^;P#V1@ z?Ku`|+z^9wK*+n007-y@t9}8M0i{PQcPyz3>!~2l1 zN4W4A&J2euespI3ly`lPpE;R;H|tPpvf>g{{`TA=k%)}OOimLbdN!|LxweJvSA{%UNMkh z-|n!e0(hWwh@7wp7zB&s^K$`0S}L8fyMbXm9d60)1}D8Q!!U$Sx(YBUP3yPJ%FjWp z$&uv&d>a|ezh)P(l8TPNUywA1IpFDaarO{iz~E$-B)^&#O4JYrsZ!uh6A?p?;SL9c iDS6x<7~a^6?80>yxyVJnk^B_^0RR8mc}r0M6aWC+uN4~r literal 0 HcmV?d00001 diff --git a/cmd/helm/testdata/testcharts/prerelease/Chart.yaml b/cmd/helm/testdata/testcharts/prerelease/Chart.yaml new file mode 100644 index 00000000000..d8d90147328 --- /dev/null +++ b/cmd/helm/testdata/testcharts/prerelease/Chart.yaml @@ -0,0 +1,6 @@ +description: Deploy a basic Alpine Linux pod +home: https://k8s.io/helm +name: prerelease +sources: +- https://github.com/helm/helm +version: 0.2.0-pre-release diff --git a/cmd/helm/testdata/testcharts/prerelease/README.md b/cmd/helm/testdata/testcharts/prerelease/README.md new file mode 100644 index 00000000000..3c32de5db6a --- /dev/null +++ b/cmd/helm/testdata/testcharts/prerelease/README.md @@ -0,0 +1,13 @@ +#Alpine: A simple Helm chart + +Run a single pod of Alpine Linux. + +This example was generated using the command `helm create alpine`. + +The `templates/` directory contains a very simple pod resource with a +couple of parameters. + +The `values.yaml` file contains the default values for the +`alpine-pod.yaml` template. + +You can install this example using `helm install docs/examples/alpine`. diff --git a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml new file mode 100644 index 00000000000..f569d556ce8 --- /dev/null +++ b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{.Release.Name}}-{{.Values.Name}}" + labels: + # The "heritage" label is used to track which tool deployed a given chart. + # It is useful for admins who want to see what releases a particular tool + # is responsible for. + app.kubernetes.io/managed-by: {{.Release.Service | quote }} + # The "release" convention makes it easy to tie a release to all of the + # Kubernetes resources that were created as part of that release. + app.kubernetes.io/instance: {{.Release.Name | quote }} + # This makes it easy to audit chart usage. + helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" + annotations: + "helm.sh/created": {{.Release.Time.Seconds | quote }} +spec: + # This shows how to use a simple value. This will look for a passed-in value + # called restartPolicy. If it is not found, it will use the default value. + # {{default "Never" .restartPolicy}} is a slightly optimized version of the + # more conventional syntax: {{.restartPolicy | default "Never"}} + restartPolicy: {{default "Never" .Values.restartPolicy}} + containers: + - name: waiter + image: "alpine:3.3" + command: ["/bin/sleep","9000"] diff --git a/docs/helm/helm_inspect.md b/docs/helm/helm_inspect.md index 86689eeaa18..8bdf1092dfb 100644 --- a/docs/helm/helm_inspect.md +++ b/docs/helm/helm_inspect.md @@ -20,6 +20,7 @@ helm inspect [CHART] [flags] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. -h, --help help for inspect --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") @@ -49,4 +50,4 @@ helm inspect [CHART] [flags] * [helm inspect readme](helm_inspect_readme.md) - shows inspect readme * [helm inspect values](helm_inspect_values.md) - shows inspect values -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 8-Jan-2019 diff --git a/docs/helm/helm_inspect_chart.md b/docs/helm/helm_inspect_chart.md index 2b9adbb7ee8..1cd13fc7227 100644 --- a/docs/helm/helm_inspect_chart.md +++ b/docs/helm/helm_inspect_chart.md @@ -18,6 +18,7 @@ helm inspect chart [CHART] [flags] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. -h, --help help for chart --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") @@ -44,4 +45,4 @@ helm inspect chart [CHART] [flags] * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 8-Jan-2019 diff --git a/docs/helm/helm_inspect_readme.md b/docs/helm/helm_inspect_readme.md index d222cd53a8e..9570d19d659 100644 --- a/docs/helm/helm_inspect_readme.md +++ b/docs/helm/helm_inspect_readme.md @@ -18,6 +18,7 @@ helm inspect readme [CHART] [flags] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. -h, --help help for readme --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") @@ -42,4 +43,4 @@ helm inspect readme [CHART] [flags] * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 8-Jan-2019 diff --git a/docs/helm/helm_inspect_values.md b/docs/helm/helm_inspect_values.md index 9cca2fc3202..a634134dd48 100644 --- a/docs/helm/helm_inspect_values.md +++ b/docs/helm/helm_inspect_values.md @@ -18,6 +18,7 @@ helm inspect values [CHART] [flags] ``` --ca-file string chart repository url where to locate the requested chart --cert-file string verify certificates of HTTPS-enabled servers using this CA bundle + --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. -h, --help help for values --key-file string identify HTTPS client using this SSL key file --keyring string path to the keyring containing public verification keys (default "~/.gnupg/pubring.gpg") @@ -44,4 +45,4 @@ helm inspect values [CHART] [flags] * [helm inspect](helm_inspect.md) - inspect a chart -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 8-Jan-2019 From 1984f436afa9e9d0bacb1a74bae67a0cf591b15c Mon Sep 17 00:00:00 2001 From: Aaron Roydhouse Date: Mon, 4 Feb 2019 10:22:06 -0500 Subject: [PATCH 351/483] Document the HELM_TLS_HOSTNAME variable in 'helm --help' (#5123) * Document the HELM_TLS_HOSTNAME environment variable in 'helm --help' Resolves #5120 Also adjust order `ENABLE` -> `VERIFY` -> `HOSTNAME` Signed-off-by: Aaron Roydhouse * Update docs folder for addition of HELM_TLS_HOSTNAME documentation Signed-off-by: Aaron Roydhouse --- cmd/helm/helm.go | 3 ++- docs/helm/helm.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index f7628e44c49..b815568cbd2 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -69,8 +69,9 @@ Environment: $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_HOSTNAME the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for the passphrase while signing helm charts diff --git a/docs/helm/helm.md b/docs/helm/helm.md index 177be7e88da..b00ae91d691 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -29,8 +29,9 @@ Environment: $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") + $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") + $HELM_TLS_HOSTNAME the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for the passphrase while signing helm charts @@ -78,4 +79,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 16-Oct-2018 +###### Auto generated by spf13/cobra on 4-Feb-2019 From d8bdf484cc77e5e816b311d99609a2511c897eea Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Mon, 4 Feb 2019 17:38:08 -0500 Subject: [PATCH 352/483] fix(helm): add descriptive error if dependency has blank "repository" (#5152) Signed-off-by: Arash Deshmeh --- pkg/downloader/manager.go | 3 +++ pkg/downloader/manager_test.go | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 67f9dc7bf1e..aea48bd7edb 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -371,6 +371,9 @@ func (m *Manager) getRepoNames(deps []*chartutil.Dependency) (map[string]string, // by Helm. missing := []string{} for _, dd := range deps { + if dd.Repository == "" { + return nil, fmt.Errorf("no 'repository' field specified for dependency: %q", dd.Name) + } // if dep chart is from local path, verify the path is valid if strings.HasPrefix(dd.Repository, "file://") { if _, err := resolver.GetLocalPath(dd.Repository, m.ChartPath); err != nil { diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index 8c2377e47c4..cb588394ace 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -18,6 +18,7 @@ package downloader import ( "bytes" "reflect" + "strings" "testing" "k8s.io/helm/pkg/chartutil" @@ -99,10 +100,11 @@ func TestGetRepoNames(t *testing.T) { HelmHome: helmpath.Home("testdata/helmhome"), } tests := []struct { - name string - req []*chartutil.Dependency - expect map[string]string - err bool + name string + req []*chartutil.Dependency + expect map[string]string + err bool + expectedErr string }{ { name: "no repo definition failure", @@ -118,6 +120,14 @@ func TestGetRepoNames(t *testing.T) { }, err: true, }, + { + name: "dependency entry missing 'repository' field -- e.g. spelled 'repo'", + req: []*chartutil.Dependency{ + {Name: "dependency-missing-repository-field"}, + }, + err: true, + expectedErr: "no 'repository' field specified for dependency: \"dependency-missing-repository-field\"", + }, { name: "no repo definition failure", req: []*chartutil.Dependency{ @@ -152,6 +162,9 @@ func TestGetRepoNames(t *testing.T) { l, err := m.getRepoNames(tt.req) if err != nil { if tt.err { + if !strings.Contains(err.Error(), tt.expectedErr) { + t.Fatalf("%s: expected error: %s, got: %s", tt.name, tt.expectedErr, err.Error()) + } continue } t.Fatal(err) From 16c10be8e652165414eef007be3f57638d6894cf Mon Sep 17 00:00:00 2001 From: Henry Nash Date: Tue, 5 Feb 2019 16:24:54 +0000 Subject: [PATCH 353/483] Improve language describing deletion of hooks (#5065) * Improve language describing deletion of hooks The existing language was somewhat confusing and grammatically poor. Closes #5035 Signed-off-by: Henry Nash * Improve language describing deletion of hooks The existing language was somewhat confusing and grammatically poor. Closes #5035 Signed-off-by: Henry Nash --- docs/charts_hooks.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index 59c9c91a254..fbb30248188 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -246,12 +246,10 @@ annotated. ### Automatically delete hook from previous release -When helm release being updated it is possible, that hook resource already exists in cluster. By default helm will try to create resource and fail with `"... already exists"` error. +When a helm release, that uses a hook, is being updated, it is possible that the hook resource might already exist in the cluster. In such circumstances, by default, helm will fail trying to install the hook resource with an `"... already exists"` error. -One might choose `"helm.sh/hook-delete-policy": "before-hook-creation"` over `"helm.sh/hook-delete-policy": "hook-succeeded,hook-failed"` because: +A common reason why the hook resource might already exist is that it was not deleted following use on a previous install/upgrade. There are, in fact, good reasons why one might want to keep the hook: for example, to aid manual debugging in case something went wrong. In this case, the recommended way of ensuring subsequent attemps to create the hook do not fail is to define a `"hook-delete-policy"` that can handle this: `"helm.sh/hook-delete-policy": "before-hook-creation"`. This hook annotation causes any existing hook to be removed, before the new hook is installed. + +If it is preferred to actually delete the hook after each use (rather than have to handle it on a subsequent use, as shown above), then this can be achived using a delete policy of `"helm.sh/hook-delete-policy": "hook-succeeded,hook-failed"`. -* It is convenient to keep failed hook job resource in kubernetes for example for manual debug. -* It may be necessary to keep succeeded hook resource in kubernetes for some reason. -* At the same time it is not desirable to do manual resource deletion before helm release upgrade. -`"helm.sh/hook-delete-policy": "before-hook-creation"` annotation on hook causes tiller to remove the hook from previous release if there is one before the new hook is launched and can be used with another policy. From 3b716b6d735b5a3d8d92b28d25ab8be7a9083609 Mon Sep 17 00:00:00 2001 From: Don Bowman Date: Wed, 6 Feb 2019 12:10:30 -0500 Subject: [PATCH 354/483] Add imagePullSecret to the `default` helm create template This relates to [#3529](https://github.com/helm/helm/issues/3529). It adds image.pullSecret to the default generate blank chart when the user does `helm create`. Signed-off-by: Don Bowman --- pkg/chartutil/create.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 9af4b8f4582..2577527b3e6 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -62,6 +62,7 @@ image: repository: nginx tag: stable pullPolicy: IfNotPresent + # pullSecret: my_secret nameOverride: "" fullnameOverride: "" @@ -189,6 +190,10 @@ spec: app.kubernetes.io/name: {{ include ".name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: + {{- if .Values.image.pullSecret -}} + imagePullSecrets: + - name: {{ .Values.image.pullSecret }} + {{- end }} containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" From 6e26320befd19cc112f72d51e29230c26a191d9e Mon Sep 17 00:00:00 2001 From: Alex Ellis Date: Wed, 6 Feb 2019 21:01:46 +0000 Subject: [PATCH 355/483] Fix issue #5273 for get script on armv7l (#5275) This fixes issue #5273 in the get script by making the armv7l architecture point at the correctly named "arm" binary on the release page. Signed-off-by: Alex Ellis --- scripts/get | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get b/scripts/get index bf13d25bc79..9c93e1e842f 100755 --- a/scripts/get +++ b/scripts/get @@ -29,7 +29,7 @@ initArch() { case $ARCH in armv5*) ARCH="armv5";; armv6*) ARCH="armv6";; - armv7*) ARCH="armv7";; + armv7*) ARCH="arm";; aarch64) ARCH="arm64";; x86) ARCH="386";; x86_64) ARCH="amd64";; From a1ea9678be1442fc04883cc4b2c8bab526f72a9c Mon Sep 17 00:00:00 2001 From: Ian Howell Date: Wed, 6 Feb 2019 15:51:11 -0600 Subject: [PATCH 356/483] Add unit tests for checking sort order on helm get Signed-off-by: Ian Howell --- pkg/kube/client.go | 2 +- pkg/kube/client_test.go | 131 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 9aa821b5a58..c5f3bf77f40 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -266,8 +266,8 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // Now that each individual resource within the specific version/kind // is sorted, we print each resource using the k8s printer + vk := objs[t] for _, resourceName := range sortedResources { - vk := objs[t] if err := typePrinter.PrintObj(vk[resourceName], buf); err != nil { c.Log("failed to print object type %s, object: %q :\n %v", t, resourceName, err) return "", err diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index de33881c8ec..81356540e24 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -21,6 +21,7 @@ import ( "io" "io/ioutil" "net/http" + "sort" "strings" "testing" @@ -77,6 +78,18 @@ func newPodList(names ...string) v1.PodList { return list } +func newService(name string) v1.Service { + ns := v1.NamespaceDefault + return v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: ns, + SelfLink: "/api/v1/namespaces/default/services/" + name, + }, + Spec: v1.ServiceSpec{}, + } +} + func notFoundBody() *metav1.Status { return &metav1.Status{ Code: http.StatusNotFound, @@ -280,6 +293,95 @@ func TestGet(t *testing.T) { } } +func TestResourceTypeSortOrder(t *testing.T) { + pod := newPod("my-pod") + service := newService("my-service") + c := newTestClient() + defer c.Cleanup() + c.TestFactory.UnstructuredClient = &fake.RESTClient{ + GroupVersion: schema.GroupVersion{Version: "v1"}, + NegotiatedSerializer: unstructuredSerializer, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + p, m := req.URL.Path, req.Method + t.Logf("got request %s %s", p, m) + switch { + case p == "/namespaces/default/pods/my-pod" && m == "GET": + return newResponse(200, &pod) + case p == "/namespaces/default/services/my-service" && m == "GET": + return newResponse(200, &service) + default: + t.Fatalf("unexpected request: %s %s", req.Method, req.URL.Path) + return nil, nil + } + }), + } + + // Test sorting order + data := strings.NewReader(testResourceTypeSortOrder) + o, err := c.Get("default", data) + if err != nil { + t.Errorf("Expected missing results, got %q", err) + } + podIndex := strings.Index(o, "my-pod") + serviceIndex := strings.Index(o, "my-service") + if podIndex == -1 { + t.Errorf("Expected v1/Pod my-pod, got %s", o) + } + if serviceIndex == -1 { + t.Errorf("Expected v1/Service my-service, got %s", o) + } + if !sort.IntsAreSorted([]int{podIndex, serviceIndex}) { + t.Errorf("Expected order: [v1/Pod v1/Service], got %s", o) + } +} + +func TestResourceSortOrder(t *testing.T) { + list := newPodList("albacore", "coral", "beluga") + c := newTestClient() + defer c.Cleanup() + c.TestFactory.UnstructuredClient = &fake.RESTClient{ + GroupVersion: schema.GroupVersion{Version: "v1"}, + NegotiatedSerializer: unstructuredSerializer, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + p, m := req.URL.Path, req.Method + t.Logf("got request %s %s", p, m) + switch { + case p == "/namespaces/default/pods/albacore" && m == "GET": + return newResponse(200, &list.Items[0]) + case p == "/namespaces/default/pods/coral" && m == "GET": + return newResponse(200, &list.Items[1]) + case p == "/namespaces/default/pods/beluga" && m == "GET": + return newResponse(200, &list.Items[2]) + default: + t.Fatalf("unexpected request: %s %s", req.Method, req.URL.Path) + return nil, nil + } + }), + } + + // Test sorting order + data := strings.NewReader(testResourceSortOrder) + o, err := c.Get("default", data) + if err != nil { + t.Errorf("Expected missing results, got %q", err) + } + albacoreIndex := strings.Index(o, "albacore") + belugaIndex := strings.Index(o, "beluga") + coralIndex := strings.Index(o, "coral") + if albacoreIndex == -1 { + t.Errorf("Expected v1/Pod albacore, got %s", o) + } + if belugaIndex == -1 { + t.Errorf("Expected v1/Pod beluga, got %s", o) + } + if coralIndex == -1 { + t.Errorf("Expected v1/Pod coral, got %s", o) + } + if !sort.IntsAreSorted([]int{albacoreIndex, belugaIndex, coralIndex}) { + t.Errorf("Expected order: [albacore beluga coral], got %s", o) + } +} + func TestPerform(t *testing.T) { tests := []struct { name string @@ -361,6 +463,35 @@ func TestReal(t *testing.T) { } } +const testResourceTypeSortOrder = ` +kind: Service +apiVersion: v1 +metadata: + name: my-service +--- +kind: Pod +apiVersion: v1 +metadata: + name: my-pod +` + +const testResourceSortOrder = ` +kind: Pod +apiVersion: v1 +metadata: + name: albacore +--- +kind: Pod +apiVersion: v1 +metadata: + name: beluga +--- +kind: Pod +apiVersion: v1 +metadata: + name: coral +` + const testServiceManifest = ` kind: Service apiVersion: v1 From 2734066bcccb67e2021e28c90f595ed25259f0bb Mon Sep 17 00:00:00 2001 From: Elad Iwanir Date: Thu, 7 Feb 2019 22:56:38 +0200 Subject: [PATCH 357/483] changing return order of test items so the sorting tests will fail if actually broken Signed-off-by: Elad Iwanir --- pkg/kube/client_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 81356540e24..9c60f57e3ab 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -484,12 +484,12 @@ metadata: kind: Pod apiVersion: v1 metadata: - name: beluga + name: coral --- kind: Pod apiVersion: v1 metadata: - name: coral + name: beluga ` const testServiceManifest = ` From a3d7027152fc5ad0c7f057497026e6719f26d2bf Mon Sep 17 00:00:00 2001 From: Josh Dolitsky Date: Fri, 8 Feb 2019 12:09:45 -0600 Subject: [PATCH 358/483] Add docs on how to host repo with ChartMuseum (#5282) Signed-off-by: Josh Dolitsky --- docs/chart_repository.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/chart_repository.md b/docs/chart_repository.md index 5291f65e401..e3bbe3c7d20 100644 --- a/docs/chart_repository.md +++ b/docs/chart_repository.md @@ -123,6 +123,35 @@ startup. This part shows several ways to serve a chart repository. +### ChartMuseum + +The Helm project provides an open-source Helm repository server called [ChartMuseum](https://chartmuseum.com) that you can host yourself. + +ChartMuseum supports multiple cloud storage backends. Configure it to point to the directory or bucket containing your chart packages, and the index.yaml file will be generated dynamically. + +It can be deployed easily as a [Helm chart](https://github.com/helm/charts/tree/master/stable/chartmuseum): +``` +helm install stable/chartmuseum +``` + +and also as a [Docker image](https://hub.docker.com/r/chartmuseum/chartmuseum/tags): +``` +docker run --rm -it \ + -p 8080:8080 \ + -v $(pwd)/charts:/charts \ + -e DEBUG=true \ + -e STORAGE=local \ + -e STORAGE_LOCAL_ROOTDIR=/charts \ + chartmuseum/chartmuseum +``` + +You can then add the repo to your local repository list: +``` +helm repo add chartmuseum http://localhost:8080 +``` + +ChartMuseum provides other features, such as an API for chart uploads. Please see the [README](https://github.com/helm/chartmuseum) for more info. + ### Google Cloud Storage The first step is to **create your GCS bucket**. We'll call ours From bed4054c412f95d140c8c98b6387f40df7f3139e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Lipt=C3=A1k?= Date: Sun, 10 Feb 2019 04:14:32 -0500 Subject: [PATCH 359/483] Correct golint warning (#5287) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gábor Lipták --- pkg/tiller/kind_sorter.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/tiller/kind_sorter.go b/pkg/tiller/kind_sorter.go index ceeb0f92804..f980277d23c 100644 --- a/pkg/tiller/kind_sorter.go +++ b/pkg/tiller/kind_sorter.go @@ -129,9 +129,8 @@ func (k *kindSorter) Less(i, j int) bool { // if both are unknown then sort alphabetically by kind and name if a.Head.Kind != b.Head.Kind { return a.Head.Kind < b.Head.Kind - } else { - return a.Name < b.Name } + return a.Name < b.Name } // unknown kind is last From 5767f13aaa5bfb513747b73f3c5d8cd4b0640684 Mon Sep 17 00:00:00 2001 From: xichengliudui <1693291525@qq.com> Date: Sun, 10 Feb 2019 23:57:53 -0500 Subject: [PATCH 360/483] Fix function comment to consistent with its name Signed-off-by: xichengliudui <1693291525@qq.com> --- pkg/chartutil/capabilities.go | 2 +- pkg/chartutil/requirements.go | 2 +- pkg/downloader/chart_downloader.go | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/chartutil/capabilities.go b/pkg/chartutil/capabilities.go index d7e660b8a28..b4533e417b2 100644 --- a/pkg/chartutil/capabilities.go +++ b/pkg/chartutil/capabilities.go @@ -40,7 +40,7 @@ var ( // Capabilities describes the capabilities of the Kubernetes cluster that Tiller is attached to. type Capabilities struct { - // List of all supported API versions + // APIVersions list of all supported API versions APIVersions VersionSet // KubeVersion is the Kubernetes version KubeVersion *version.Info diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 0f11283052d..f21a22005c1 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -85,7 +85,7 @@ type Requirements struct { // // It represents the state that the dependencies should be in. type RequirementsLock struct { - // Genderated is the date the lock file was last generated. + // Generated is the date the lock file was last generated. Generated time.Time `json:"generated"` // Digest is a hash of the requirements file used to generate it. Digest string `json:"digest"` diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 5e62872995f..453e81470d2 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -65,11 +65,11 @@ type ChartDownloader struct { Keyring string // HelmHome is the $HELM_HOME. HelmHome helmpath.Home - // Getter collection for the operation + // Getters collection for the operation Getters getter.Providers - // Chart repository username + // Username chart repository username Username string - // Chart repository password + // Password chart repository password Password string } @@ -243,14 +243,14 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge return u, r.Client, nil } -// If HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. +// setCredentials if HttpGetter is used, this method sets the configured repository credentials on the HttpGetter. func (c *ChartDownloader) setCredentials(r *repo.ChartRepository) { if t, ok := r.Client.(*getter.HttpGetter); ok { t.SetCredentials(c.getRepoCredentials(r)) } } -// If this ChartDownloader is not configured to use credentials, and the chart repository sent as an argument is, +// getRepoCredentials if this ChartDownloader is not configured to use credentials, and the chart repository sent as an argument is, // then the repository's configured credentials are returned. // Else, this ChartDownloader's credentials are returned. func (c *ChartDownloader) getRepoCredentials(r *repo.ChartRepository) (username, password string) { From 9fb9850aca4afab0d38bcd73218098a145b4e7ac Mon Sep 17 00:00:00 2001 From: lIuDuI <1693291525@qq.com> Date: Tue, 12 Feb 2019 22:26:24 +0800 Subject: [PATCH 361/483] Fix function comment to consistent with its name (#5294) Signed-off-by: xichengliudui <1693291525@qq.com> --- pkg/downloader/manager.go | 2 +- pkg/engine/engine.go | 2 +- pkg/helm/client.go | 22 +++++++++++----------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index aea48bd7edb..372940880b2 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -604,7 +604,7 @@ func writeLock(chartpath string, lock *chartutil.RequirementsLock) error { return ioutil.WriteFile(dest, data, 0644) } -// archive a dep chart from local directory and save it into charts/ +// tarFromLocalDir archive a dep chart from local directory and save it into charts/ func tarFromLocalDir(chartpath string, name string, repo string, version string) (string, error) { destPath := filepath.Join(chartpath, "charts") diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index f3dd869c901..9a155de2eb9 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -130,7 +130,7 @@ type renderable struct { tpl string // vals are the values to be supplied to the template. vals chartutil.Values - // namespace prefix to the templates of the current chart + // basePath namespace prefix to the templates of the current chart basePath string } diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 0d4d1603907..fa867c2d302 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -334,7 +334,7 @@ func (h *Client) connect(ctx context.Context) (conn *grpc.ClientConn, err error) return conn, nil } -// Executes tiller.ListReleases RPC. +// list executes tiller.ListReleases RPC. func (h *Client) list(ctx context.Context, req *rls.ListReleasesRequest) (*rls.ListReleasesResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -365,7 +365,7 @@ func (h *Client) list(ctx context.Context, req *rls.ListReleasesRequest) (*rls.L return resp, nil } -// Executes tiller.InstallRelease RPC. +// install executes tiller.InstallRelease RPC. func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (*rls.InstallReleaseResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -377,7 +377,7 @@ func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (* return rlc.InstallRelease(ctx, req) } -// Executes tiller.UninstallRelease RPC. +// delete executes tiller.UninstallRelease RPC. func (h *Client) delete(ctx context.Context, req *rls.UninstallReleaseRequest) (*rls.UninstallReleaseResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -389,7 +389,7 @@ func (h *Client) delete(ctx context.Context, req *rls.UninstallReleaseRequest) ( return rlc.UninstallRelease(ctx, req) } -// Executes tiller.UpdateRelease RPC. +// update executes tiller.UpdateRelease RPC. func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rls.UpdateReleaseResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -401,7 +401,7 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl return rlc.UpdateRelease(ctx, req) } -// Executes tiller.RollbackRelease RPC. +// rollback executes tiller.RollbackRelease RPC. func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) (*rls.RollbackReleaseResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -413,7 +413,7 @@ func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) return rlc.RollbackRelease(ctx, req) } -// Executes tiller.GetReleaseStatus RPC. +// status executes tiller.GetReleaseStatus RPC. func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) (*rls.GetReleaseStatusResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -425,7 +425,7 @@ func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) ( return rlc.GetReleaseStatus(ctx, req) } -// Executes tiller.GetReleaseContent RPC. +// content executes tiller.GetReleaseContent RPC. func (h *Client) content(ctx context.Context, req *rls.GetReleaseContentRequest) (*rls.GetReleaseContentResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -437,7 +437,7 @@ func (h *Client) content(ctx context.Context, req *rls.GetReleaseContentRequest) return rlc.GetReleaseContent(ctx, req) } -// Executes tiller.GetVersion RPC. +// version executes tiller.GetVersion RPC. func (h *Client) version(ctx context.Context, req *rls.GetVersionRequest) (*rls.GetVersionResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -449,7 +449,7 @@ func (h *Client) version(ctx context.Context, req *rls.GetVersionRequest) (*rls. return rlc.GetVersion(ctx, req) } -// Executes tiller.GetHistory RPC. +// history executes tiller.GetHistory RPC. func (h *Client) history(ctx context.Context, req *rls.GetHistoryRequest) (*rls.GetHistoryResponse, error) { c, err := h.connect(ctx) if err != nil { @@ -461,7 +461,7 @@ func (h *Client) history(ctx context.Context, req *rls.GetHistoryRequest) (*rls. return rlc.GetHistory(ctx, req) } -// Executes tiller.TestRelease RPC. +// test executes tiller.TestRelease RPC. func (h *Client) test(ctx context.Context, req *rls.TestReleaseRequest) (<-chan *rls.TestReleaseResponse, <-chan error) { errc := make(chan error, 1) c, err := h.connect(ctx) @@ -499,7 +499,7 @@ func (h *Client) test(ctx context.Context, req *rls.TestReleaseRequest) (<-chan return ch, errc } -// Executes tiller.Ping RPC. +// ping executes tiller.Ping RPC. func (h *Client) ping(ctx context.Context) error { c, err := h.connect(ctx) if err != nil { From 70c509e77ee2acecc722c429bc78415b2c660616 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Tue, 12 Feb 2019 08:42:58 -0700 Subject: [PATCH 362/483] fix: Update gRPC to get better TLS connection handling (v2 minor release) (#5210) * fix: Update gRPC to get better TLS connection handling To avoid backward compatibility breakers, we have been pinned to a very old version of gRPC. But it appears that there have been some very significant network fixes since then. Looking closely at #3480, it appears that some of this fixes may be directly related to solving that bug. Note that this regenerates a few of the Go proto files, so the binary wire format may be broken. That means this MUST be held to a minor version, not a patch release. To test: - Build both client and server - Install Tiller into your cluster - Perform a number of Helm-Tiller interactions (`helm version`, `helm list`) Closes #3480 Signed-off-by: Matt Butcher * Switched to latest protobuf Signed-off-by: Matt Butcher --- glide.lock | 34 +++-- glide.yaml | 10 +- pkg/proto/hapi/services/tiller.pb.go | 195 ++++++++++++++------------- 3 files changed, 130 insertions(+), 109 deletions(-) diff --git a/glide.lock b/glide.lock index 105dada1f40..1fa7c3d95f9 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 2af9a5c4f891a0f44109a929a494b5aeaaffa3a87cd1f3881f25f79845703d5b -updated: 2018-12-14T21:39:31.112097Z +hash: 5dc21cc57b38ab1076f9e12d1e4248047ccc4470af8f81c8560560cb492bee9e +updated: 2019-02-08T15:20:12.179155-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -122,7 +122,7 @@ imports: subpackages: - lru - name: github.com/golang/protobuf - version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 + version: aa810b61a9c79d51363740d207bb46cf8e620ed5 subpackages: - proto - ptypes @@ -166,7 +166,7 @@ imports: subpackages: - simplelru - name: github.com/huandu/xstrings - version: 3959339b333561bf62a38b424fd41517c2c90f40 + version: f02667b379e2fb5916c3cda2cf31e0eb885d79f8 - name: github.com/imdario/mergo version: 9316a62528ac99aaecb4e47eadd6dc8aa6533d58 - name: github.com/inconshreveable/mousetrap @@ -184,7 +184,7 @@ imports: - name: github.com/Masterminds/semver version: 517734cc7d6470c0d07130e40fd40bdeb9bcd3fd - name: github.com/Masterminds/sprig - version: 15f9564e7e9cf0da02a48e0d25f12a7b83559aa6 + version: 544a9b1d90f323f6509491b389714fbbd126bee3 - name: github.com/Masterminds/vcs version: 3084677c2c188840777bff30054f2b553729d329 - name: github.com/mattn/go-runewidth @@ -281,7 +281,7 @@ imports: subpackages: - semaphore - name: golang.org/x/sys - version: 95c6576299259db960f6c5b9b69ea52422860fce + version: b90733256f2e882e81d52f9126de08df5615afd9 subpackages: - unix - windows @@ -325,26 +325,40 @@ imports: 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 - 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 @@ -597,7 +611,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: f2c8f1cadf1808ec28476682e49a3cce2b09efbf + version: c6d339953bd4fd8c021a6b5fb46d7952b30be9f9 subpackages: - pkg/api/legacyscheme - pkg/api/service diff --git a/glide.yaml b/glide.yaml index bf81b22ee60..42c10b3473e 100644 --- a/glide.yaml +++ b/glide.yaml @@ -6,6 +6,12 @@ import: - package: golang.org/x/sync subpackages: - semaphore + # This is temporary and can probably be removed the next time gRPC is updated + - package: golang.org/x/sys + version: b90733256f2e882e81d52f9126de08df5615afd9 + subpackages: + - unix + - windows - package: github.com/spf13/cobra version: fe5e611709b0c57fa4a89136deaa8e1d4004d053 - package: github.com/spf13/pflag @@ -22,13 +28,13 @@ import: - package: github.com/technosophos/moniker version: ~0.2 - package: github.com/golang/protobuf - version: 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9 + version: 1.2.0 subpackages: - proto - ptypes/any - ptypes/timestamp - package: google.golang.org/grpc - version: 1.7.2 + version: 1.18.0 - package: github.com/gosuri/uitable - package: github.com/asaskevich/govalidator version: ^4.0.0 diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 8708d0a18a4..ce76cad1247 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -467,18 +467,18 @@ func (m *UpdateReleaseRequest) GetForce() bool { return false } -func (m *UpdateReleaseRequest) GetSubNotes() bool { +func (m *UpdateReleaseRequest) GetDescription() string { if m != nil { - return m.SubNotes + return m.Description } - return false + return "" } -func (m *UpdateReleaseRequest) GetDescription() string { +func (m *UpdateReleaseRequest) GetSubNotes() bool { if m != nil { - return m.Description + return m.SubNotes } - return "" + return false } // UpdateReleaseResponse is the response to an update request. @@ -711,18 +711,18 @@ func (m *InstallReleaseRequest) GetDisableCrdHook() bool { return false } -func (m *InstallReleaseRequest) GetSubNotes() bool { +func (m *InstallReleaseRequest) GetDescription() string { if m != nil { - return m.SubNotes + return m.Description } - return false + return "" } -func (m *InstallReleaseRequest) GetDescription() string { +func (m *InstallReleaseRequest) GetSubNotes() bool { if m != nil { - return m.Description + return m.SubNotes } - return "" + return false } // InstallReleaseResponse is the response from a release installation. @@ -752,7 +752,7 @@ type UninstallReleaseRequest struct { Purge bool `protobuf:"varint,3,opt,name=purge" json:"purge,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. Timeout int64 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` - // Description, if set, will set the description for the uninnstalled release + // Description, if set, will set the description for the uninstalled release Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` } @@ -1018,7 +1018,7 @@ type ReleaseServiceClient interface { GetVersion(ctx context.Context, in *GetVersionRequest, opts ...grpc.CallOption) (*GetVersionResponse, error) // RollbackRelease rolls back a release to a previous version. RollbackRelease(ctx context.Context, in *RollbackReleaseRequest, opts ...grpc.CallOption) (*RollbackReleaseResponse, error) - // ReleaseHistory retrieves a releasse's history. + // ReleaseHistory retrieves a release's history. GetHistory(ctx context.Context, in *GetHistoryRequest, opts ...grpc.CallOption) (*GetHistoryResponse, error) // RunReleaseTest executes the tests defined of a named release RunReleaseTest(ctx context.Context, in *TestReleaseRequest, opts ...grpc.CallOption) (ReleaseService_RunReleaseTestClient, error) @@ -1190,7 +1190,7 @@ type ReleaseServiceServer interface { GetVersion(context.Context, *GetVersionRequest) (*GetVersionResponse, error) // RollbackRelease rolls back a release to a previous version. RollbackRelease(context.Context, *RollbackReleaseRequest) (*RollbackReleaseResponse, error) - // ReleaseHistory retrieves a releasse's history. + // ReleaseHistory retrieves a release's history. GetHistory(context.Context, *GetHistoryRequest) (*GetHistoryResponse, error) // RunReleaseTest executes the tests defined of a named release RunReleaseTest(*TestReleaseRequest, ReleaseService_RunReleaseTestServer) error @@ -1441,86 +1441,87 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1289 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x72, 0xdb, 0x44, - 0x17, 0x8e, 0x2d, 0x7f, 0x1e, 0xa7, 0x7e, 0xdd, 0x6d, 0x9a, 0xa8, 0x7a, 0x0b, 0x63, 0xc4, 0x40, - 0xdd, 0x42, 0x1d, 0x30, 0xfc, 0x61, 0x86, 0x61, 0x26, 0x75, 0x3d, 0x49, 0x21, 0xa4, 0x33, 0x72, - 0x5b, 0x66, 0x98, 0x61, 0x3c, 0x8a, 0xbd, 0x6e, 0x45, 0x65, 0xc9, 0x68, 0x57, 0xa1, 0xb9, 0x00, - 0x98, 0xe1, 0x3e, 0xb8, 0x10, 0xee, 0x83, 0xeb, 0xe0, 0x3f, 0xb3, 0x5f, 0x8a, 0x56, 0x96, 0x1c, - 0x91, 0x3f, 0xb1, 0x76, 0xcf, 0xd9, 0xf3, 0xf1, 0x3c, 0x7b, 0xce, 0x9e, 0x80, 0xf5, 0xc6, 0x5d, - 0x7b, 0x87, 0x04, 0x47, 0x17, 0xde, 0x1c, 0x93, 0x43, 0xea, 0xf9, 0x3e, 0x8e, 0x86, 0xeb, 0x28, - 0xa4, 0x21, 0xda, 0x63, 0xb2, 0xa1, 0x92, 0x0d, 0x85, 0xcc, 0xda, 0xe7, 0x27, 0xe6, 0x6f, 0xdc, - 0x88, 0x8a, 0xbf, 0x42, 0xdb, 0x3a, 0x48, 0xef, 0x87, 0xc1, 0xd2, 0x7b, 0x2d, 0x05, 0xc2, 0x45, - 0x84, 0x7d, 0xec, 0x12, 0xac, 0x7e, 0xb5, 0x43, 0x4a, 0xe6, 0x05, 0xcb, 0x50, 0x0a, 0xfe, 0xaf, - 0x09, 0x28, 0x26, 0x74, 0x16, 0xc5, 0x81, 0x14, 0xde, 0xd3, 0x84, 0x84, 0xba, 0x34, 0x26, 0x9a, - 0xb3, 0x0b, 0x1c, 0x11, 0x2f, 0x0c, 0xd4, 0xaf, 0x90, 0xd9, 0x7f, 0x55, 0xe1, 0xce, 0xa9, 0x47, - 0xa8, 0x23, 0x0e, 0x12, 0x07, 0xff, 0x12, 0x63, 0x42, 0xd1, 0x1e, 0xd4, 0x7d, 0x6f, 0xe5, 0x51, - 0xb3, 0xd2, 0xaf, 0x0c, 0x0c, 0x47, 0x2c, 0xd0, 0x3e, 0x34, 0xc2, 0xe5, 0x92, 0x60, 0x6a, 0x56, - 0xfb, 0x95, 0x41, 0xdb, 0x91, 0x2b, 0xf4, 0x0d, 0x34, 0x49, 0x18, 0xd1, 0xd9, 0xf9, 0xa5, 0x69, - 0xf4, 0x2b, 0x83, 0xee, 0xe8, 0xa3, 0x61, 0x1e, 0x4e, 0x43, 0xe6, 0x69, 0x1a, 0x46, 0x74, 0xc8, - 0xfe, 0x3c, 0xb9, 0x74, 0x1a, 0x84, 0xff, 0x32, 0xbb, 0x4b, 0xcf, 0xa7, 0x38, 0x32, 0x6b, 0xc2, - 0xae, 0x58, 0xa1, 0x63, 0x00, 0x6e, 0x37, 0x8c, 0x16, 0x38, 0x32, 0xeb, 0xdc, 0xf4, 0xa0, 0x84, - 0xe9, 0xe7, 0x4c, 0xdf, 0x69, 0x13, 0xf5, 0x89, 0xbe, 0x86, 0x5d, 0x01, 0xc9, 0x6c, 0x1e, 0x2e, - 0x30, 0x31, 0x1b, 0x7d, 0x63, 0xd0, 0x1d, 0xdd, 0x13, 0xa6, 0x14, 0xfc, 0x53, 0x01, 0xda, 0x38, - 0x5c, 0x60, 0xa7, 0x23, 0xd4, 0xd9, 0x37, 0x41, 0xf7, 0xa1, 0x1d, 0xb8, 0x2b, 0x4c, 0xd6, 0xee, - 0x1c, 0x9b, 0x4d, 0x1e, 0xe1, 0xd5, 0x86, 0x1d, 0x40, 0x4b, 0x39, 0xb7, 0x9f, 0x40, 0x43, 0xa4, - 0x86, 0x3a, 0xd0, 0x7c, 0x79, 0xf6, 0xdd, 0xd9, 0xf3, 0x1f, 0xce, 0x7a, 0x3b, 0xa8, 0x05, 0xb5, - 0xb3, 0xa3, 0xef, 0x27, 0xbd, 0x0a, 0xba, 0x0d, 0xb7, 0x4e, 0x8f, 0xa6, 0x2f, 0x66, 0xce, 0xe4, - 0x74, 0x72, 0x34, 0x9d, 0x3c, 0xed, 0x55, 0x51, 0x17, 0x60, 0x7c, 0x72, 0xe4, 0xbc, 0x98, 0x71, - 0x15, 0xc3, 0x7e, 0x1f, 0xda, 0x49, 0x0e, 0xa8, 0x09, 0xc6, 0xd1, 0x74, 0x2c, 0x4c, 0x3c, 0x9d, - 0x4c, 0xc7, 0xbd, 0x8a, 0xfd, 0x47, 0x05, 0xf6, 0x74, 0xca, 0xc8, 0x3a, 0x0c, 0x08, 0x66, 0x9c, - 0xcd, 0xc3, 0x38, 0x48, 0x38, 0xe3, 0x0b, 0x84, 0xa0, 0x16, 0xe0, 0x77, 0x8a, 0x31, 0xfe, 0xcd, - 0x34, 0x69, 0x48, 0x5d, 0x9f, 0xb3, 0x65, 0x38, 0x62, 0x81, 0x3e, 0x87, 0x96, 0x84, 0x82, 0x98, - 0xb5, 0xbe, 0x31, 0xe8, 0x8c, 0xee, 0xea, 0x00, 0x49, 0x8f, 0x4e, 0xa2, 0x66, 0x1f, 0xc3, 0xc1, - 0x31, 0x56, 0x91, 0x08, 0xfc, 0xd4, 0x0d, 0x62, 0x7e, 0xdd, 0x15, 0xe6, 0xc1, 0x30, 0xbf, 0xee, - 0x0a, 0x23, 0x13, 0x9a, 0xf2, 0xfa, 0xf1, 0x70, 0xea, 0x8e, 0x5a, 0xda, 0x14, 0xcc, 0x4d, 0x43, - 0x32, 0xaf, 0x3c, 0x4b, 0x1f, 0x43, 0x8d, 0x55, 0x06, 0x37, 0xd3, 0x19, 0x21, 0x3d, 0xce, 0x67, - 0xc1, 0x32, 0x74, 0xb8, 0x5c, 0xa7, 0xce, 0xc8, 0x52, 0x77, 0x92, 0xf6, 0x3a, 0x0e, 0x03, 0x8a, - 0x03, 0x7a, 0xb3, 0xf8, 0x4f, 0xe1, 0x5e, 0x8e, 0x25, 0x99, 0xc0, 0x21, 0x34, 0x65, 0x68, 0xdc, - 0x5a, 0x21, 0xae, 0x4a, 0xcb, 0xfe, 0xcd, 0x80, 0xbd, 0x97, 0xeb, 0x85, 0x4b, 0xb1, 0x12, 0x6d, - 0x09, 0xea, 0x01, 0xd4, 0x79, 0x87, 0x91, 0x58, 0xdc, 0x16, 0xb6, 0x45, 0x1b, 0x1a, 0xb3, 0xbf, - 0x8e, 0x90, 0xa3, 0x47, 0xd0, 0xb8, 0x70, 0xfd, 0x18, 0x13, 0x0e, 0x44, 0x82, 0x9a, 0xd4, 0xe4, - 0xed, 0xc9, 0x91, 0x1a, 0xe8, 0x00, 0x9a, 0x8b, 0xe8, 0x92, 0xf5, 0x17, 0x5e, 0x92, 0x2d, 0xa7, - 0xb1, 0x88, 0x2e, 0x9d, 0x38, 0x40, 0x1f, 0xc2, 0xad, 0x85, 0x47, 0xdc, 0x73, 0x1f, 0xcf, 0xde, - 0x84, 0xe1, 0x5b, 0xc2, 0xab, 0xb2, 0xe5, 0xec, 0xca, 0xcd, 0x13, 0xb6, 0x87, 0x2c, 0x76, 0x93, - 0xe6, 0x11, 0x76, 0x29, 0x36, 0x1b, 0x5c, 0x9e, 0xac, 0x19, 0x86, 0xd4, 0x5b, 0xe1, 0x30, 0xa6, - 0xbc, 0x94, 0x0c, 0x47, 0x2d, 0xd1, 0x07, 0xb0, 0x1b, 0x61, 0x82, 0xe9, 0x4c, 0x46, 0xd9, 0xe2, - 0x27, 0x3b, 0x7c, 0xef, 0x95, 0x08, 0x0b, 0x41, 0xed, 0x57, 0xd7, 0xa3, 0x66, 0x9b, 0x8b, 0xf8, - 0xb7, 0x38, 0x16, 0x13, 0xac, 0x8e, 0x81, 0x3a, 0x16, 0x13, 0x2c, 0x8f, 0xed, 0x41, 0x7d, 0x19, - 0x46, 0x73, 0x6c, 0x76, 0xb8, 0x4c, 0x2c, 0x50, 0x1f, 0x3a, 0x0b, 0x4c, 0xe6, 0x91, 0xb7, 0xa6, - 0x8c, 0xd1, 0x5d, 0x8e, 0x69, 0x7a, 0xcb, 0x3e, 0x81, 0xbb, 0x19, 0x1a, 0x6e, 0xca, 0xe8, 0xef, - 0x55, 0xd8, 0x77, 0x42, 0xdf, 0x3f, 0x77, 0xe7, 0x6f, 0x4b, 0x70, 0x9a, 0x82, 0xbf, 0xba, 0x1d, - 0x7e, 0x23, 0x07, 0xfe, 0xd4, 0x35, 0xad, 0x69, 0xd7, 0x54, 0x23, 0xa6, 0x5e, 0x4c, 0x4c, 0x43, - 0x27, 0x46, 0xa1, 0xde, 0x4c, 0xa1, 0x9e, 0x40, 0xda, 0xda, 0x02, 0x69, 0x7b, 0x13, 0xd2, 0x6f, - 0xe1, 0x60, 0x03, 0x87, 0x9b, 0x82, 0xfa, 0x4f, 0x15, 0xee, 0x3e, 0x0b, 0x08, 0x75, 0x7d, 0x3f, - 0x83, 0x69, 0x52, 0x13, 0x95, 0xd2, 0x35, 0x51, 0xfd, 0x2f, 0x35, 0x61, 0x68, 0xa4, 0x28, 0x06, - 0x6b, 0x29, 0x06, 0x4b, 0xd5, 0x89, 0xd6, 0x9d, 0x1a, 0x99, 0xee, 0x84, 0xde, 0x03, 0x10, 0x17, - 0x9b, 0x1b, 0x17, 0xe0, 0xb7, 0xf9, 0xce, 0x99, 0x6c, 0x46, 0x8a, 0xaf, 0x56, 0x3e, 0x5f, 0xe9, - 0x2a, 0x19, 0x40, 0x4f, 0xc5, 0x33, 0x8f, 0x16, 0x3c, 0x26, 0x59, 0x29, 0x5d, 0xb9, 0x3f, 0x8e, - 0x16, 0x2c, 0xaa, 0x2c, 0x87, 0x9d, 0x4d, 0x0e, 0x9f, 0xc1, 0x7e, 0x16, 0xf6, 0x9b, 0x52, 0xf8, - 0x67, 0x05, 0x0e, 0x5e, 0x06, 0x5e, 0x2e, 0x89, 0x79, 0x85, 0xb1, 0x01, 0x6b, 0x35, 0x07, 0xd6, - 0x3d, 0xa8, 0xaf, 0xe3, 0xe8, 0x35, 0x96, 0x34, 0x89, 0x45, 0x1a, 0xaf, 0x9a, 0x8e, 0x57, 0x26, - 0xe3, 0xfa, 0x66, 0xc6, 0x33, 0x30, 0x37, 0xa3, 0xbc, 0x61, 0xce, 0x2c, 0xaf, 0xe4, 0xed, 0x6a, - 0x8b, 0x77, 0xca, 0xbe, 0x03, 0xb7, 0x8f, 0x31, 0x7d, 0x25, 0xca, 0x54, 0x02, 0x60, 0x4f, 0x00, - 0xa5, 0x37, 0xaf, 0xfc, 0xc9, 0x2d, 0xdd, 0x9f, 0x1a, 0xec, 0x94, 0xbe, 0xd2, 0xb2, 0xbf, 0xe2, - 0xb6, 0x4f, 0x3c, 0x42, 0xc3, 0xe8, 0x72, 0x1b, 0xb8, 0x3d, 0x30, 0x56, 0xee, 0x3b, 0xf9, 0xb4, - 0xb1, 0x4f, 0xfb, 0x98, 0x47, 0x90, 0x1c, 0x95, 0x11, 0xa4, 0x07, 0x85, 0x4a, 0xb9, 0x41, 0xe1, - 0x1d, 0xa0, 0x17, 0x38, 0x99, 0x59, 0xae, 0x79, 0x63, 0x15, 0x4d, 0x55, 0x9d, 0x26, 0x13, 0x9a, - 0x73, 0x1f, 0xbb, 0x41, 0xbc, 0x96, 0xc4, 0xaa, 0x25, 0x6b, 0x6b, 0x6b, 0x37, 0x72, 0x7d, 0x1f, - 0xfb, 0xf2, 0xb9, 0x4a, 0xd6, 0xf6, 0x4f, 0x70, 0x47, 0xf3, 0x2c, 0x73, 0x60, 0xb9, 0x92, 0xd7, - 0xd2, 0x33, 0xfb, 0x44, 0x5f, 0x42, 0x43, 0x0c, 0x7d, 0xdc, 0x6f, 0x77, 0x74, 0x5f, 0xcf, 0x89, - 0x1b, 0x89, 0x03, 0x39, 0x25, 0x3a, 0x52, 0x77, 0xf4, 0x77, 0x0b, 0xba, 0x6a, 0x6c, 0x11, 0x23, - 0x29, 0xf2, 0x60, 0x37, 0x3d, 0x9f, 0xa1, 0x87, 0xc5, 0x13, 0x6b, 0x66, 0xec, 0xb6, 0x1e, 0x95, - 0x51, 0x15, 0x19, 0xd8, 0x3b, 0x9f, 0x55, 0x10, 0x81, 0x5e, 0x76, 0x6c, 0x42, 0x8f, 0xf3, 0x6d, - 0x14, 0xcc, 0x69, 0xd6, 0xb0, 0xac, 0xba, 0x72, 0x8b, 0x2e, 0xf8, 0x7d, 0xd2, 0x67, 0x1d, 0x74, - 0xad, 0x19, 0x7d, 0xbc, 0xb2, 0x0e, 0x4b, 0xeb, 0x27, 0x7e, 0x7f, 0x86, 0x5b, 0xda, 0x6b, 0x8c, - 0x0a, 0xd0, 0xca, 0x9b, 0x9c, 0xac, 0x4f, 0x4a, 0xe9, 0x26, 0xbe, 0x56, 0xd0, 0xd5, 0x5b, 0x1c, - 0x2a, 0x30, 0x90, 0xfb, 0xfe, 0x58, 0x9f, 0x96, 0x53, 0x4e, 0xdc, 0x11, 0xe8, 0x65, 0xfb, 0x4b, - 0x11, 0x8f, 0x05, 0xdd, 0xb2, 0x88, 0xc7, 0xa2, 0xb6, 0x65, 0xef, 0x20, 0x17, 0xe0, 0xaa, 0xbd, - 0xa0, 0x07, 0x85, 0x84, 0xe8, 0x5d, 0xc9, 0x1a, 0x5c, 0xaf, 0x98, 0xb8, 0x58, 0xc3, 0xff, 0x32, - 0xaf, 0x3d, 0x2a, 0x80, 0x26, 0x7f, 0x38, 0xb2, 0x1e, 0x97, 0xd4, 0xce, 0x24, 0x25, 0x3b, 0xd6, - 0x96, 0xa4, 0xf4, 0x76, 0xb8, 0x25, 0xa9, 0x4c, 0xf3, 0xb3, 0x77, 0x90, 0x07, 0x5d, 0x27, 0x0e, - 0xa4, 0x6b, 0xd6, 0x16, 0x50, 0xc1, 0xe9, 0xcd, 0x8e, 0x67, 0x3d, 0x2c, 0xa1, 0x79, 0x55, 0xdf, - 0x4f, 0xe0, 0xc7, 0x96, 0x52, 0x3d, 0x6f, 0xf0, 0xff, 0xd8, 0xbf, 0xf8, 0x37, 0x00, 0x00, 0xff, - 0xff, 0xb6, 0x48, 0x98, 0x76, 0x9f, 0x10, 0x00, 0x00, + // 1308 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x6e, 0x1b, 0x45, + 0x17, 0x8e, 0xbd, 0xfe, 0x3c, 0x4e, 0xfc, 0xba, 0xd3, 0x34, 0xd9, 0xee, 0x5b, 0x50, 0x58, 0x04, + 0x75, 0x0b, 0x75, 0xc0, 0xf0, 0x07, 0x09, 0x21, 0xa5, 0xae, 0x95, 0x14, 0x82, 0x2b, 0xad, 0xdb, + 0x22, 0x21, 0x21, 0x6b, 0x63, 0x8f, 0xdb, 0xa5, 0xeb, 0x5d, 0xb3, 0x33, 0x1b, 0x9a, 0x1b, 0x40, + 0xe2, 0x27, 0x97, 0x80, 0xc4, 0x85, 0x70, 0x1f, 0xdc, 0x0c, 0x9a, 0xaf, 0xcd, 0xce, 0x7a, 0xd7, + 0x5d, 0xf2, 0x27, 0xde, 0x99, 0x73, 0xe6, 0x7c, 0x3c, 0xcf, 0x9c, 0x33, 0x27, 0x60, 0xbd, 0x76, + 0xd7, 0xde, 0x31, 0xc1, 0xd1, 0xa5, 0x37, 0xc7, 0xe4, 0x98, 0x7a, 0xbe, 0x8f, 0xa3, 0xc1, 0x3a, + 0x0a, 0x69, 0x88, 0xf6, 0x99, 0x6c, 0xa0, 0x64, 0x03, 0x21, 0xb3, 0x0e, 0xf8, 0x89, 0xf9, 0x6b, + 0x37, 0xa2, 0xe2, 0xaf, 0xd0, 0xb6, 0x0e, 0xd3, 0xfb, 0x61, 0xb0, 0xf4, 0x5e, 0x49, 0x81, 0x70, + 0x11, 0x61, 0x1f, 0xbb, 0x04, 0xab, 0x5f, 0xed, 0x90, 0x92, 0x79, 0xc1, 0x32, 0x94, 0x82, 0xff, + 0x6b, 0x02, 0x8a, 0x09, 0x9d, 0x45, 0x71, 0x20, 0x85, 0x77, 0x35, 0x21, 0xa1, 0x2e, 0x8d, 0x89, + 0xe6, 0xec, 0x12, 0x47, 0xc4, 0x0b, 0x03, 0xf5, 0x2b, 0x64, 0xf6, 0xdf, 0x55, 0xb8, 0x7d, 0xee, + 0x11, 0xea, 0x88, 0x83, 0xc4, 0xc1, 0xbf, 0xc4, 0x98, 0x50, 0xb4, 0x0f, 0x75, 0xdf, 0x5b, 0x79, + 0xd4, 0xac, 0x1c, 0x55, 0xfa, 0x86, 0x23, 0x16, 0xe8, 0x00, 0x1a, 0xe1, 0x72, 0x49, 0x30, 0x35, + 0xab, 0x47, 0x95, 0x7e, 0xdb, 0x91, 0x2b, 0xf4, 0x0d, 0x34, 0x49, 0x18, 0xd1, 0xd9, 0xc5, 0x95, + 0x69, 0x1c, 0x55, 0xfa, 0xdd, 0xe1, 0x47, 0x83, 0x3c, 0x9c, 0x06, 0xcc, 0xd3, 0x34, 0x8c, 0xe8, + 0x80, 0xfd, 0x79, 0x7c, 0xe5, 0x34, 0x08, 0xff, 0x65, 0x76, 0x97, 0x9e, 0x4f, 0x71, 0x64, 0xd6, + 0x84, 0x5d, 0xb1, 0x42, 0xa7, 0x00, 0xdc, 0x6e, 0x18, 0x2d, 0x70, 0x64, 0xd6, 0xb9, 0xe9, 0x7e, + 0x09, 0xd3, 0xcf, 0x98, 0xbe, 0xd3, 0x26, 0xea, 0x13, 0x7d, 0x0d, 0xbb, 0x02, 0x92, 0xd9, 0x3c, + 0x5c, 0x60, 0x62, 0x36, 0x8e, 0x8c, 0x7e, 0x77, 0x78, 0x57, 0x98, 0x52, 0xf0, 0x4f, 0x05, 0x68, + 0xa3, 0x70, 0x81, 0x9d, 0x8e, 0x50, 0x67, 0xdf, 0x04, 0xdd, 0x83, 0x76, 0xe0, 0xae, 0x30, 0x59, + 0xbb, 0x73, 0x6c, 0x36, 0x79, 0x84, 0xd7, 0x1b, 0x76, 0x00, 0x2d, 0xe5, 0xdc, 0x7e, 0x0c, 0x0d, + 0x91, 0x1a, 0xea, 0x40, 0xf3, 0xc5, 0xe4, 0xbb, 0xc9, 0xb3, 0x1f, 0x26, 0xbd, 0x1d, 0xd4, 0x82, + 0xda, 0xe4, 0xe4, 0xfb, 0x71, 0xaf, 0x82, 0x6e, 0xc1, 0xde, 0xf9, 0xc9, 0xf4, 0xf9, 0xcc, 0x19, + 0x9f, 0x8f, 0x4f, 0xa6, 0xe3, 0x27, 0xbd, 0x2a, 0xea, 0x02, 0x8c, 0xce, 0x4e, 0x9c, 0xe7, 0x33, + 0xae, 0x62, 0xd8, 0xef, 0x43, 0x3b, 0xc9, 0x01, 0x35, 0xc1, 0x38, 0x99, 0x8e, 0x84, 0x89, 0x27, + 0xe3, 0xe9, 0xa8, 0x57, 0xb1, 0x7f, 0xaf, 0xc0, 0xbe, 0x4e, 0x19, 0x59, 0x87, 0x01, 0xc1, 0x8c, + 0xb3, 0x79, 0x18, 0x07, 0x09, 0x67, 0x7c, 0x81, 0x10, 0xd4, 0x02, 0xfc, 0x56, 0x31, 0xc6, 0xbf, + 0x99, 0x26, 0x0d, 0xa9, 0xeb, 0x73, 0xb6, 0x0c, 0x47, 0x2c, 0xd0, 0xe7, 0xd0, 0x92, 0x50, 0x10, + 0xb3, 0x76, 0x64, 0xf4, 0x3b, 0xc3, 0x3b, 0x3a, 0x40, 0xd2, 0xa3, 0x93, 0xa8, 0xd9, 0xa7, 0x70, + 0x78, 0x8a, 0x55, 0x24, 0x02, 0x3f, 0x75, 0x83, 0x98, 0x5f, 0x77, 0x85, 0x79, 0x30, 0xcc, 0xaf, + 0xbb, 0xc2, 0xc8, 0x84, 0xa6, 0xbc, 0x7e, 0x3c, 0x9c, 0xba, 0xa3, 0x96, 0x36, 0x05, 0x73, 0xd3, + 0x90, 0xcc, 0x2b, 0xcf, 0xd2, 0xc7, 0x50, 0x63, 0x95, 0xc1, 0xcd, 0x74, 0x86, 0x48, 0x8f, 0xf3, + 0x69, 0xb0, 0x0c, 0x1d, 0x2e, 0xd7, 0xa9, 0x33, 0xb2, 0xd4, 0x9d, 0xa5, 0xbd, 0x8e, 0xc2, 0x80, + 0xe2, 0x80, 0xde, 0x2c, 0xfe, 0x73, 0xb8, 0x9b, 0x63, 0x49, 0x26, 0x70, 0x0c, 0x4d, 0x19, 0x1a, + 0xb7, 0x56, 0x88, 0xab, 0xd2, 0xb2, 0xff, 0x34, 0x60, 0xff, 0xc5, 0x7a, 0xe1, 0x52, 0xac, 0x44, + 0x5b, 0x82, 0xba, 0x0f, 0x75, 0xde, 0x61, 0x24, 0x16, 0xb7, 0x84, 0x6d, 0xd1, 0x86, 0x46, 0xec, + 0xaf, 0x23, 0xe4, 0xe8, 0x21, 0x34, 0x2e, 0x5d, 0x3f, 0xc6, 0x84, 0x03, 0x91, 0xa0, 0x26, 0x35, + 0x79, 0x7b, 0x72, 0xa4, 0x06, 0x3a, 0x84, 0xe6, 0x22, 0xba, 0x62, 0xfd, 0x85, 0x97, 0x64, 0xcb, + 0x69, 0x2c, 0xa2, 0x2b, 0x27, 0x0e, 0xd0, 0x87, 0xb0, 0xb7, 0xf0, 0x88, 0x7b, 0xe1, 0xe3, 0xd9, + 0xeb, 0x30, 0x7c, 0x43, 0x78, 0x55, 0xb6, 0x9c, 0x5d, 0xb9, 0x79, 0xc6, 0xf6, 0x90, 0xc5, 0x6e, + 0xd2, 0x3c, 0xc2, 0x2e, 0xc5, 0x66, 0x83, 0xcb, 0x93, 0x35, 0xc3, 0x90, 0x7a, 0x2b, 0x1c, 0xc6, + 0x94, 0x97, 0x92, 0xe1, 0xa8, 0x25, 0xfa, 0x00, 0x76, 0x23, 0x4c, 0x30, 0x9d, 0xc9, 0x28, 0x5b, + 0xfc, 0x64, 0x87, 0xef, 0xbd, 0x14, 0x61, 0x21, 0xa8, 0xfd, 0xea, 0x7a, 0xd4, 0x6c, 0x73, 0x11, + 0xff, 0x16, 0xc7, 0x62, 0x82, 0xd5, 0x31, 0x50, 0xc7, 0x62, 0x82, 0xe5, 0xb1, 0x7d, 0xa8, 0x2f, + 0xc3, 0x68, 0x8e, 0xcd, 0x0e, 0x97, 0x89, 0x05, 0x3a, 0x82, 0xce, 0x02, 0x93, 0x79, 0xe4, 0xad, + 0x29, 0x63, 0x74, 0x97, 0x63, 0x9a, 0xde, 0x62, 0x79, 0x90, 0xf8, 0x62, 0x12, 0x52, 0x4c, 0xcc, + 0x3d, 0x91, 0x87, 0x5a, 0xdb, 0x67, 0x70, 0x27, 0x43, 0xd1, 0x4d, 0xd9, 0xfe, 0xad, 0x0a, 0x07, + 0x4e, 0xe8, 0xfb, 0x17, 0xee, 0xfc, 0x4d, 0x09, 0xbe, 0x53, 0xd4, 0x54, 0xb7, 0x53, 0x63, 0xe4, + 0x50, 0x93, 0xba, 0xc2, 0x35, 0xed, 0x0a, 0x6b, 0xa4, 0xd5, 0x8b, 0x49, 0x6b, 0xe8, 0xa4, 0x29, + 0x46, 0x9a, 0x29, 0x46, 0x12, 0xb8, 0x5b, 0x5b, 0xe0, 0x6e, 0x6f, 0xc0, 0x6d, 0x7f, 0x0b, 0x87, + 0x1b, 0x38, 0xdc, 0x14, 0xd4, 0x3f, 0x0c, 0xb8, 0xf3, 0x34, 0x20, 0xd4, 0xf5, 0xfd, 0x0c, 0xa6, + 0x49, 0xbd, 0x54, 0x4a, 0xd7, 0x4b, 0xf5, 0xbf, 0xd4, 0x8b, 0xa1, 0x91, 0xa2, 0x18, 0xac, 0xa5, + 0x18, 0x2c, 0x55, 0x43, 0x5a, 0xe7, 0x6a, 0x64, 0x3a, 0x17, 0x7a, 0x0f, 0x40, 0x5c, 0x7a, 0x6e, + 0x5c, 0x80, 0xdf, 0xe6, 0x3b, 0x13, 0xd9, 0xa8, 0x14, 0x5f, 0xad, 0x7c, 0xbe, 0xd2, 0x15, 0xd4, + 0x87, 0x9e, 0x8a, 0x67, 0x1e, 0x2d, 0x78, 0x4c, 0xb2, 0x8a, 0xba, 0x72, 0x7f, 0x14, 0x2d, 0x58, + 0x54, 0x59, 0x0e, 0x3b, 0xdb, 0x4b, 0x66, 0x37, 0x53, 0x32, 0x4f, 0xe1, 0x20, 0x4b, 0xc9, 0x4d, + 0xe9, 0xfd, 0xab, 0x02, 0x87, 0x2f, 0x02, 0x2f, 0x97, 0xe0, 0xbc, 0xa2, 0xd9, 0x80, 0xbc, 0x9a, + 0x03, 0xf9, 0x3e, 0xd4, 0xd7, 0x71, 0xf4, 0x0a, 0x4b, 0x0a, 0xc5, 0x22, 0x8d, 0x65, 0x4d, 0xc7, + 0x32, 0x83, 0x46, 0x7d, 0xf3, 0x46, 0xcf, 0xc0, 0xdc, 0x8c, 0xf2, 0x86, 0x39, 0xb3, 0xbc, 0x92, + 0x37, 0xaf, 0x2d, 0xde, 0x37, 0xfb, 0x36, 0xdc, 0x3a, 0xc5, 0xf4, 0xa5, 0x28, 0x61, 0x09, 0x80, + 0x3d, 0x06, 0x94, 0xde, 0xbc, 0xf6, 0x27, 0xb7, 0x74, 0x7f, 0x6a, 0x20, 0x54, 0xfa, 0x4a, 0xcb, + 0xfe, 0x8a, 0xdb, 0x3e, 0xf3, 0x08, 0x0d, 0xa3, 0xab, 0x6d, 0xe0, 0xf6, 0xc0, 0x58, 0xb9, 0x6f, + 0xe5, 0x93, 0xc8, 0x3e, 0xed, 0x53, 0x1e, 0x41, 0x72, 0x54, 0x46, 0x90, 0x1e, 0x30, 0x2a, 0xe5, + 0x06, 0x8c, 0xb7, 0x80, 0x9e, 0xe3, 0x64, 0xd6, 0x79, 0xc7, 0xdb, 0xac, 0x68, 0xaa, 0xea, 0x34, + 0x99, 0xd0, 0x9c, 0xfb, 0xd8, 0x0d, 0xe2, 0xb5, 0x24, 0x56, 0x2d, 0xd9, 0x65, 0x5d, 0xbb, 0x91, + 0xeb, 0xfb, 0xd8, 0x97, 0xcf, 0x5c, 0xb2, 0xb6, 0x7f, 0x82, 0xdb, 0x9a, 0x67, 0x99, 0x03, 0xcb, + 0x95, 0xbc, 0x92, 0x9e, 0xd9, 0x27, 0xfa, 0x12, 0x1a, 0x62, 0x58, 0xe4, 0x7e, 0xbb, 0xc3, 0x7b, + 0x7a, 0x4e, 0xdc, 0x48, 0x1c, 0xc8, 0xe9, 0xd2, 0x91, 0xba, 0xc3, 0x7f, 0x5a, 0xd0, 0x55, 0xe3, + 0x8e, 0x18, 0x65, 0x91, 0x07, 0xbb, 0xe9, 0xb9, 0x0e, 0x3d, 0x28, 0x9e, 0x74, 0x33, 0xe3, 0xba, + 0xf5, 0xb0, 0x8c, 0xaa, 0xc8, 0xc0, 0xde, 0xf9, 0xac, 0x82, 0x08, 0xf4, 0xb2, 0xe3, 0x16, 0x7a, + 0x94, 0x6f, 0xa3, 0x60, 0xbe, 0xb3, 0x06, 0x65, 0xd5, 0x95, 0x5b, 0x74, 0xc9, 0xef, 0x93, 0x3e, + 0x23, 0xa1, 0x77, 0x9a, 0xd1, 0xc7, 0x32, 0xeb, 0xb8, 0xb4, 0x7e, 0xe2, 0xf7, 0x67, 0xd8, 0xd3, + 0x5e, 0x6a, 0x54, 0x80, 0x56, 0xde, 0xc4, 0x65, 0x7d, 0x52, 0x4a, 0x37, 0xf1, 0xb5, 0x82, 0xae, + 0xde, 0xe2, 0x50, 0x81, 0x81, 0xdc, 0xb7, 0xc9, 0xfa, 0xb4, 0x9c, 0x72, 0xe2, 0x8e, 0x40, 0x2f, + 0xdb, 0x5f, 0x8a, 0x78, 0x2c, 0xe8, 0x96, 0x45, 0x3c, 0x16, 0xb5, 0x2d, 0x7b, 0x07, 0xb9, 0x00, + 0xd7, 0xed, 0x05, 0xdd, 0x2f, 0x24, 0x44, 0xef, 0x4a, 0x56, 0xff, 0xdd, 0x8a, 0x89, 0x8b, 0x35, + 0xfc, 0x2f, 0x33, 0x09, 0xa0, 0x02, 0x68, 0xf2, 0x07, 0x27, 0xeb, 0x51, 0x49, 0xed, 0x4c, 0x52, + 0xb2, 0x63, 0x6d, 0x49, 0x4a, 0x6f, 0x87, 0x5b, 0x92, 0xca, 0x34, 0x3f, 0x7b, 0x07, 0x79, 0xd0, + 0x75, 0xe2, 0x40, 0xba, 0x66, 0x6d, 0x01, 0x15, 0x9c, 0xde, 0xec, 0x78, 0xd6, 0x83, 0x12, 0x9a, + 0xd7, 0xf5, 0xfd, 0x18, 0x7e, 0x6c, 0x29, 0xd5, 0x8b, 0x06, 0xff, 0x4f, 0xff, 0x8b, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x30, 0x18, 0x95, 0x9c, 0xd7, 0x10, 0x00, 0x00, } From f5986db184cf6d16dcd48760ac749a20236fb845 Mon Sep 17 00:00:00 2001 From: liaoj Date: Wed, 13 Feb 2019 01:02:09 +0800 Subject: [PATCH 363/483] fix: helm fetch wrong version chart (#4850) when customer use --version flag, the version format include the Build metadata, the metadata will be ingorned Signed-off-by: jliao --- pkg/repo/index.go | 9 +++++++++ pkg/repo/index_test.go | 20 +++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pkg/repo/index.go b/pkg/repo/index.go index 9031463f320..ac19528faa6 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -168,6 +168,15 @@ func (i IndexFile) Get(name, version string) (*ChartVersion, error) { } } + // when customer input exact version, check whether have exact match one first + if len(version) != 0 { + for _, ver := range vs { + if version == ver.Version { + return ver, nil + } + } + } + for _, ver := range vs { test, err := semver.NewVersion(ver.Version) if err != nil { diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index 7c9239b7a91..7e9998a4da0 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -20,6 +20,7 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "testing" "k8s.io/helm/pkg/getter" @@ -39,14 +40,17 @@ func TestIndexFile(t *testing.T) { i.Add(&chart.Metadata{Name: "cutter", Version: "0.1.1"}, "cutter-0.1.1.tgz", "http://example.com/charts", "sha256:1234567890abc") i.Add(&chart.Metadata{Name: "cutter", Version: "0.1.0"}, "cutter-0.1.0.tgz", "http://example.com/charts", "sha256:1234567890abc") i.Add(&chart.Metadata{Name: "cutter", Version: "0.2.0"}, "cutter-0.2.0.tgz", "http://example.com/charts", "sha256:1234567890abc") + i.Add(&chart.Metadata{Name: "setter", Version: "0.1.9+alpha"}, "setter-0.1.9+alpha.tgz", "http://example.com/charts", "sha256:1234567890abc") + i.Add(&chart.Metadata{Name: "setter", Version: "0.1.9+beta"}, "setter-0.1.9+beta.tgz", "http://example.com/charts", "sha256:1234567890abc") + i.SortEntries() if i.APIVersion != APIVersionV1 { t.Error("Expected API version v1") } - if len(i.Entries) != 2 { - t.Errorf("Expected 2 charts. Got %d", len(i.Entries)) + if len(i.Entries) != 3 { + t.Errorf("Expected 3 charts. Got %d", len(i.Entries)) } if i.Entries["clipper"][0].Name != "clipper" { @@ -54,13 +58,23 @@ func TestIndexFile(t *testing.T) { } if len(i.Entries["cutter"]) != 3 { - t.Error("Expected two cutters.") + t.Error("Expected three cutters.") } // Test that the sort worked. 0.2 should be at the first index for Cutter. if v := i.Entries["cutter"][0].Version; v != "0.2.0" { t.Errorf("Unexpected first version: %s", v) } + + cv, err := i.Get("setter", "0.1.9") + if err == nil && strings.Index(cv.Metadata.Version, "0.1.9") < 0 { + t.Errorf("Unexpected version: %s", cv.Metadata.Version) + } + + cv, err = i.Get("setter", "0.1.9+alpha") + if err != nil || cv.Metadata.Version != "0.1.9+alpha" { + t.Errorf("Expected version: 0.1.9+alpha") + } } func TestLoadIndex(t *testing.T) { From 5b38cc2d888218b74a8ba1cef4341e7a18e1df26 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Tue, 12 Feb 2019 13:54:11 -0700 Subject: [PATCH 364/483] ref: Update Sprig to 2.18.0 (#5300) * ref: Update Sprig to 2.18.0 This fixes a problem with Go 1.11 and also adds some new functions. Signed-off-by: Matt Butcher * Added the glide.lock file. Signed-off-by: Matt Butcher --- glide.lock | 10 +++++----- glide.yaml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/glide.lock b/glide.lock index 1fa7c3d95f9..792ef28cdb1 100644 --- a/glide.lock +++ b/glide.lock @@ -1,13 +1,11 @@ -hash: 5dc21cc57b38ab1076f9e12d1e4248047ccc4470af8f81c8560560cb492bee9e -updated: 2019-02-08T15:20:12.179155-07:00 +hash: 70f4fe304d0034fd077f122570adc6bb5f40ceee5f4f53d8930ba5ad700a911d +updated: 2019-02-12T13:10:08.039408-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 subpackages: - compute/metadata - internal -- name: github.com/aokoli/goutils - version: 9c37978a95bd5c709a15883b6242714ea6709e64 - name: github.com/asaskevich/govalidator version: 7664702784775e51966f0885f5cd27435916517b - name: github.com/Azure/go-ansiterm @@ -181,10 +179,12 @@ imports: - 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: 544a9b1d90f323f6509491b389714fbbd126bee3 + version: b1fe2752acccf8c3d7f8a1e7c75c7ae7d83a1975 - name: github.com/Masterminds/vcs version: 3084677c2c188840777bff30054f2b553729d329 - name: github.com/mattn/go-runewidth diff --git a/glide.yaml b/glide.yaml index 42c10b3473e..e482e23c268 100644 --- a/glide.yaml +++ b/glide.yaml @@ -21,7 +21,7 @@ import: - package: github.com/imdario/mergo version: v0.3.5 - package: github.com/Masterminds/sprig - version: ^2.16.0 + version: ^2.18.0 - package: github.com/ghodss/yaml - package: github.com/Masterminds/semver version: ~1.3.1 From c99a3c676a11206352024d7851076106d2840b45 Mon Sep 17 00:00:00 2001 From: tuanvcw Date: Wed, 13 Feb 2019 21:59:17 +0700 Subject: [PATCH 365/483] Update deprecated links in docs (#5302) Signed-off-by: Vu Cong Tuan --- docs/chart_template_guide/control_structures.md | 2 +- docs/chart_template_guide/getting_started.md | 4 ++-- docs/chart_template_guide/wrapping_up.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/chart_template_guide/control_structures.md b/docs/chart_template_guide/control_structures.md index e2f9ca89d89..d411c2f796c 100644 --- a/docs/chart_template_guide/control_structures.md +++ b/docs/chart_template_guide/control_structures.md @@ -329,7 +329,7 @@ data: - "Onions" ``` -Now, in this example we've done something tricky. The `toppings: |-` line is declaring a multi-line string. So our list of toppings is actually not a YAML list. It's a big string. Why would we do this? Because the data in ConfigMaps `data` is composed of key/value pairs, where both the key and the value are simple strings. To understand why this is the case, take a look at the [Kubernetes ConfigMap docs](http://kubernetes.io/docs/user-guide/configmap/). For us, though, this detail doesn't matter much. +Now, in this example we've done something tricky. The `toppings: |-` line is declaring a multi-line string. So our list of toppings is actually not a YAML list. It's a big string. Why would we do this? Because the data in ConfigMaps `data` is composed of key/value pairs, where both the key and the value are simple strings. To understand why this is the case, take a look at the [Kubernetes ConfigMap docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/). For us, though, this detail doesn't matter much. > The `|-` marker in YAML takes a multi-line string. This can be a useful technique for embedding big blocks of data inside of your manifests, as exemplified here. diff --git a/docs/chart_template_guide/getting_started.md b/docs/chart_template_guide/getting_started.md index 87ae5fa3cde..eb1d966d3f9 100644 --- a/docs/chart_template_guide/getting_started.md +++ b/docs/chart_template_guide/getting_started.md @@ -51,8 +51,8 @@ already there. - `NOTES.txt`: The "help text" for your chart. This will be displayed to your users when they run `helm install`. -- `deployment.yaml`: A basic manifest for creating a Kubernetes [deployment](http://kubernetes.io/docs/user-guide/deployments/) -- `service.yaml`: A basic manifest for creating a [service endpoint](http://kubernetes.io/docs/user-guide/services/) for your deployment +- `deployment.yaml`: A basic manifest for creating a Kubernetes [deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) +- `service.yaml`: A basic manifest for creating a [service endpoint](https://kubernetes.io/docs/concepts/services-networking/service/) for your deployment - `_helpers.tpl`: A place to put template helpers that you can re-use throughout the chart And what we're going to do is... _remove them all!_ That way we can work through our tutorial from scratch. We'll actually create our own `NOTES.txt` and `_helpers.tpl` as we go. diff --git a/docs/chart_template_guide/wrapping_up.md b/docs/chart_template_guide/wrapping_up.md index ea5dc1183a3..c7ecad475c5 100755 --- a/docs/chart_template_guide/wrapping_up.md +++ b/docs/chart_template_guide/wrapping_up.md @@ -5,7 +5,7 @@ This guide is intended to give you, the chart developer, a strong understanding But there are many things this guide has not covered when it comes to the practical day-to-day development of charts. Here are some useful pointers to other documentation that will help you as you create new charts: - The [Helm Charts project](https://github.com/helm/charts) is an indispensable source of charts. That project is also sets the standard for best practices in chart development. -- The Kubernetes [User's Guide](http://kubernetes.io/docs/user-guide/) provides detailed examples of the various resource kinds that you can use, from ConfigMaps and Secrets to DaemonSets and Deployments. +- The Kubernetes [Documentation](https://kubernetes.io/docs/home/) provides detailed examples of the various resource kinds that you can use, from ConfigMaps and Secrets to DaemonSets and Deployments. - The Helm [Charts Guide](../charts.md) explains the workflow of using charts. - The Helm [Chart Hooks Guide](../charts_hooks.md) explains how to create lifecycle hooks. - The Helm [Charts Tips and Tricks](../charts_tips_and_tricks.md) article provides some useful tips for writing charts. From 5464a822ccd6d99da8b25d8ef690263c6d7a2d8c Mon Sep 17 00:00:00 2001 From: Nguyen Van Trung Date: Fri, 15 Feb 2019 12:17:44 +0700 Subject: [PATCH 366/483] Change http to https for security links Signed-off-by: Nguyen Van Trung --- CONTRIBUTING.md | 2 +- docs/chart_best_practices/conventions.md | 2 +- docs/chart_template_guide/yaml_techniques.md | 2 +- docs/charts.md | 4 ++-- docs/developers.md | 4 ++-- docs/glossary.md | 2 +- docs/history.md | 2 +- docs/provenance.md | 6 +++--- docs/related.md | 6 +++--- docs/release_checklist.md | 2 +- docs/using_helm.md | 4 ++-- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7736cbd6b28..a20c2b90b48 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ us a chance to try to fix the issue before it is exploited in the wild. The sign-off is a simple line at the end of the explanation for a commit. All commits needs to be signed. Your signature certifies that you wrote the patch or otherwise have the right to contribute the material. The rules are pretty simple, -if you can certify the below (from [developercertificate.org](http://developercertificate.org/)): +if you can certify the below (from [developercertificate.org](https://developercertificate.org/)): ``` Developer Certificate of Origin diff --git a/docs/chart_best_practices/conventions.md b/docs/chart_best_practices/conventions.md index 524928e2563..c8bbd7d94c7 100644 --- a/docs/chart_best_practices/conventions.md +++ b/docs/chart_best_practices/conventions.md @@ -22,7 +22,7 @@ The directory that contains a chart MUST have the same name as the chart. Thus, ## Version Numbers -Wherever possible, Helm uses [SemVer 2](http://semver.org) to represent version numbers. (Note that Docker image tags do not necessarily follow SemVer, and are thus considered an unfortunate exception to the rule.) +Wherever possible, Helm uses [SemVer 2](https://semver.org) to represent version numbers. (Note that Docker image tags do not necessarily follow SemVer, and are thus considered an unfortunate exception to the rule.) When SemVer versions are stored in Kubernetes labels, we conventionally alter the `+` character to an `_` character, as labels do not allow the `+` sign as a value. diff --git a/docs/chart_template_guide/yaml_techniques.md b/docs/chart_template_guide/yaml_techniques.md index 00b33b67458..0a84e4a2597 100644 --- a/docs/chart_template_guide/yaml_techniques.md +++ b/docs/chart_template_guide/yaml_techniques.md @@ -7,7 +7,7 @@ to read. ## Scalars and Collections -According to the [YAML spec](http://yaml.org/spec/1.2/spec.html), there are two +According to the [YAML spec](https://yaml.org/spec/1.2/spec.html), there are two types of collections, and many scalar types. The two types of collections are maps and sequences: diff --git a/docs/charts.md b/docs/charts.md index 7bc4f002013..d91dfe54ef1 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -71,7 +71,7 @@ Other fields will be silently ignored. ### Charts and Versioning Every chart must have a version number. A version must follow the -[SemVer 2](http://semver.org/) standard. Unlike Helm Classic, Kubernetes +[SemVer 2](https://semver.org/) standard. Unlike Helm Classic, Kubernetes Helm uses version numbers as release markers. Packages in repositories are identified by name plus version. @@ -792,7 +792,7 @@ standard references that will help you out. - [Go templates](https://godoc.org/text/template) - [Extra template functions](https://godoc.org/github.com/Masterminds/sprig) -- [The YAML format](http://yaml.org/spec/) +- [The YAML format](https://yaml.org/spec/) ## Using Helm to Manage Charts diff --git a/docs/developers.md b/docs/developers.md index 4edc4bea17e..fb704cb170c 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -170,7 +170,7 @@ workflow for doing this is as follows: 5. When you are ready for us to review, sign your commit, push your branch to GitHub, and then open a new pull request with us. -For Git commit messages, we follow the [Semantic Commit Messages](http://karma-runner.github.io/0.13/dev/git-commit-msg.html): +For Git commit messages, we follow the [Semantic Commit Messages](https://karma-runner.github.io/0.13/dev/git-commit-msg.html): ``` fix(helm): add --foo flag to 'helm install' @@ -201,7 +201,7 @@ Common scopes: Read more: - The [Deis Guidelines](https://github.com/deis/workflow/blob/master/src/contributing/submitting-a-pull-request.md) were the inspiration for this section. -- Karma Runner [defines](http://karma-runner.github.io/0.13/dev/git-commit-msg.html) the semantic commit message idea. +- Karma Runner [defines](https://karma-runner.github.io/0.13/dev/git-commit-msg.html) the semantic commit message idea. ### Go Conventions diff --git a/docs/glossary.md b/docs/glossary.md index 87580726897..02a5c125fee 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -37,7 +37,7 @@ are bundled with it. ## Chart Version Charts are versioned according to the [SemVer 2 -spec](http://semver.org). A version number is required on every chart. +spec](https://semver.org). A version number is required on every chart. ## Chart.yaml diff --git a/docs/history.md b/docs/history.md index 71e63c6b29d..1a3d9dbe4e7 100644 --- a/docs/history.md +++ b/docs/history.md @@ -12,7 +12,7 @@ Differences from Helm Classic: - Helm's chart format has changed for the better: - Dependencies are immutable and stored inside of a chart's `charts/` directory. - - Charts are strongly versioned using [SemVer 2](http://semver.org/spec/v2.0.0.html) + - Charts are strongly versioned using [SemVer 2](https://semver.org/spec/v2.0.0.html) - Charts can be loaded from directories or from chart archive files - Helm supports Go templates without requiring you to run `generate` or `template` commands. diff --git a/docs/provenance.md b/docs/provenance.md index 163e7284210..3f259a3918b 100644 --- a/docs/provenance.md +++ b/docs/provenance.md @@ -180,7 +180,7 @@ The following pieces of provenance data are added: * The signature (SHA256, just like Docker) of the chart package (the .tgz file) is included, and may be used to verify the integrity of the chart package. * The entire body is signed using the algorithm used by PGP (see - [http://keybase.io] for an emerging way of making crypto signing and + [https://keybase.io] for an emerging way of making crypto signing and verification easy). The combination of this gives users the following assurances: @@ -202,7 +202,7 @@ keywords: - proxy source: - https://github.com/foo/bar -home: http://nginx.com +home: https://nginx.com ... files: @@ -221,7 +221,7 @@ first is the Chart.yaml. The second is the checksums, a map of filenames to SHA-256 digests (value shown is fake/truncated) The signature block is a standard PGP signature, which provides [tamper -resistance](http://www.rossde.com/PGP/pgp_signatures.html). +resistance](https://www.rossde.com/PGP/pgp_signatures.html). ## Chart Repositories diff --git a/docs/related.md b/docs/related.md index ba1b0dfbf48..a8e49417240 100644 --- a/docs/related.md +++ b/docs/related.md @@ -8,9 +8,9 @@ or [pull request](https://github.com/helm/helm/pulls). ## Article, Blogs, How-Tos, and Extra Documentation - [Awesome Helm](https://github.com/cdwv/awesome-helm) - List of awesome Helm resources -- [CI/CD with Kubernetes, Helm & Wercker ](http://www.slideshare.net/Diacode/cicd-with-kubernetes-helm-wercker-madscalability) +- [CI/CD with Kubernetes, Helm & Wercker ](https://www.slideshare.net/Diacode/cicd-with-kubernetes-helm-wercker-madscalability) - [Creating a Helm Plugin in 3 Steps](http://technosophos.com/2017/03/21/creating-a-helm-plugin.html) -- [Deploying Kubernetes Applications with Helm](http://cloudacademy.com/blog/deploying-kubernetes-applications-with-helm/) +- [Deploying Kubernetes Applications with Helm](https://cloudacademy.com/blog/deploying-kubernetes-applications-with-helm/) - [GitLab, Consumer Driven Contracts, Helm and Kubernetes](https://medium.com/@enxebre/gitlab-consumer-driven-contracts-helm-and-kubernetes-b7235a60a1cb#.xwp1y4tgi) - [Honestbee's Helm Chart Conventions](https://gist.github.com/so0k/f927a4b60003cedd101a0911757c605a) - [Releasing backward-incompatible changes: Kubernetes, Jenkins, Prometheus Operator, Helm and Traefik](https://medium.com/@enxebre/releasing-backward-incompatible-changes-kubernetes-jenkins-plugin-prometheus-operator-helm-self-6263ca61a1b1#.e0c7elxhq) @@ -90,7 +90,7 @@ Tools layered on top of Helm or Tiller. Platforms, distributions, and services that include Helm support. - [Fabric8](https://fabric8.io) - Integrated development platform for Kubernetes -- [Jenkins X](http://jenkins-x.io/) - open source automated CI/CD for Kubernetes which uses Helm for [promoting](http://jenkins-x.io/about/features/#promotion) applications through [environments via GitOps](http://jenkins-x.io/about/features/#environments) +- [Jenkins X](https://jenkins-x.io/) - open source automated CI/CD for Kubernetes which uses Helm for [promoting](https://jenkins-x.io/about/features/#promotion) applications through [environments via GitOps](https://jenkins-x.io/about/features/#environments) - [Kubernetic](https://kubernetic.com/) - Kubernetes Desktop Client - [Qstack](https://qstack.com) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 4011b6675d4..d1c6c967a9c 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -41,7 +41,7 @@ Just kidding! :trollface: All releases will be of the form vX.Y.Z where X is the major version number, Y is the minor version number and Z is the patch release number. This project -strictly follows [semantic versioning](http://semver.org/) so following this +strictly follows [semantic versioning](https://semver.org/) so following this step is critical. It is important to note that this document assumes that the git remote in your diff --git a/docs/using_helm.md b/docs/using_helm.md index db723d993d6..79b5aef6ff1 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -17,7 +17,7 @@ cluster. Think of it like the Kubernetes equivalent of a Homebrew formula, an Apt dpkg, or a Yum RPM file. A *Repository* is the place where charts can be collected and shared. -It's like Perl's [CPAN archive](http://www.cpan.org) or the +It's like Perl's [CPAN archive](https://www.cpan.org) or the [Fedora Package Database](https://admin.fedoraproject.org/pkgdb/), but for Kubernetes packages. @@ -190,7 +190,7 @@ imageTag: 10.1.14-r3 ## Specify a imagePullPolicy ## Default to 'Always' if imageTag is 'latest', else set to 'IfNotPresent' -## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images +## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images ## # imagePullPolicy: From 9f964c11da1c1ae865aed2be87c1929f04683b82 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 15 Feb 2019 17:28:31 +0000 Subject: [PATCH 367/483] fix: helm display confused error message if version is empty (without quotes) (#5310) Signed-off-by: Alex Gladkikh --- pkg/downloader/chart_downloader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 453e81470d2..1ef85f50140 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -213,7 +213,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge cv, err := i.Get(chartName, version) if err != nil { - return u, r.Client, fmt.Errorf("chart %q matching %s not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) + return u, r.Client, fmt.Errorf("chart %q matching %q not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) } if len(cv.URLs) == 0 { From 35b782219041d39a56557728b5b6933cca7178d9 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Fri, 15 Feb 2019 12:48:46 -0500 Subject: [PATCH 368/483] Noting the version as the match element That the match is based on version is implicit. Making it explicit because I had to think when I saw it. Signed-off-by: Matt Farina --- pkg/downloader/chart_downloader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index 1ef85f50140..563188ec3ca 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -213,7 +213,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, ge cv, err := i.Get(chartName, version) if err != nil { - return u, r.Client, fmt.Errorf("chart %q matching %q not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) + return u, r.Client, fmt.Errorf("chart %q matching version %q not found in %s index. (try 'helm repo update'). %s", chartName, version, r.Config.Name, err) } if len(cv.URLs) == 0 { From 63d262e5ec3c1b0d935995c7354b2b239c18ff14 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Fri, 15 Feb 2019 12:58:23 -0500 Subject: [PATCH 369/483] Display the checksums in CI When Helm is packaging up the bundles it generates the checksums but does not display them. Having them here will aide in the generation of release notes and provide another source listing them. Signed-off-by: Matt Farina --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 0677cafe4d2..20ce7e5a451 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ dist: checksum: for f in _dist/*.{gz,zip} ; do \ shasum -a 256 "$${f}" | awk '{print $$1}' > "$${f}.sha256" ; \ + echo -n "Checksum: " && cat $${f}.sha256 ; \ done .PHONY: check-docker From d76eebb319eda349371f561c881ca91cc53907ad Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Fri, 15 Feb 2019 15:22:23 -0500 Subject: [PATCH 370/483] Adding PGP signing to the release process Signed-off-by: Matt Farina --- docs/release_checklist.md | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index d1c6c967a9c..c1595fb58c7 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -250,7 +250,21 @@ git tag --sign --annotate "${RELEASE_NAME}" --message "Helm release ${RELEASE_NA git push upstream $RELEASE_NAME ``` -## 7. Write the Release Notes +## 7. PGP Sign the downloads + +While hashes provide a signature that the content of the downloads is what it +was generated, signed packages provide traceability of where the package came +from. + +To do this follow the following steps: + +1. Download each of the release bundles generated by the CI system +2. Sign each of them using GnuPG using the command `gpg --armor --detach-sign [FILE NAME]`. + This will generate a file name `[FILE NAME].asc` with an ascii armored signature. + +Each of the signature files needs to be uploaded to the release on GitHub. + +## 8. Write the Release Notes We will auto-generate a changelog based on the commits that occurred during a release cycle, but it is usually more beneficial to the end-user if the release @@ -286,14 +300,14 @@ The community keeps growing, and we'd love to see you there! Download Helm X.Y. The common platform binaries are here: -- [MacOS amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256)) -- [Linux amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz.sha256)) -- [Linux arm](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz.sha256)) -- [Linux arm64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz.sha256)) -- [Linux i386](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz.sha256)) -- [Linux ppc64le](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz.sha256)) -- [Linux s390x](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz.sha256)) -- [Windows amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip.sha256)) +- [MacOS amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-darwin-amd64.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-amd64.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux arm](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux arm64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-arm64.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux i386](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-386.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux ppc64le](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-ppc64le.tar.gz.sha256) / CHECKSUM_VAL) +- [Linux s390x](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-linux-s390x.tar.gz.sha256) / CHECKSUM_VAL) +- [Windows amd64](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip) ([checksum](https://storage.googleapis.com/kubernetes-helm/helm-vX.Y.Z-windows-amd64.zip.sha256) / CHECKSUM_VAL) Once you have the client installed, upgrade Tiller with `helm init --upgrade`. @@ -335,7 +349,7 @@ in the example above. Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. -## 8. Evangelize +## 9. Evangelize Congratulations! You're done. Go grab yourself a $DRINK_OF_CHOICE. You've earned it. From 8224e3348ef004cbff7321e2b26b8fbcd7e190a3 Mon Sep 17 00:00:00 2001 From: Marc Jansen Date: Tue, 19 Feb 2019 13:31:47 +0100 Subject: [PATCH 371/483] Symmetrical asterisks (#5325) Signed-off-by: Marc Jansen --- cmd/helm/repo_update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 1a239b40753..42d242b8399 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -124,6 +124,6 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho return errors.New("Update Failed. Check log for details") } - fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming!⎈ ") + fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming! ⎈") return nil } From 73a17eb59900348234ad7c4cba75a537dcef9708 Mon Sep 17 00:00:00 2001 From: Miroslav Spousta Date: Tue, 19 Feb 2019 23:46:01 +0100 Subject: [PATCH 372/483] Fix wording in error message (#5322) Signed-off-by: Miroslav Spousta --- pkg/tiller/release_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index b85118cd27d..ffb922e401c 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -61,7 +61,7 @@ var ( // errInvalidRevision indicates that an invalid release revision number was provided. errInvalidRevision = errors.New("invalid release revision") //errInvalidName indicates that an invalid release name was provided - errInvalidName = errors.New("invalid release name, must match regex ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+$ and the length must not longer than 53") + errInvalidName = errors.New("invalid release name, must match regex ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])+$ and the length must not be longer than 53") ) // ListDefaultLimit is the default limit for number of items returned in a list. From d24ba97faeb39f692f74c87d183a723b4138ee52 Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Wed, 20 Feb 2019 13:29:50 +0700 Subject: [PATCH 373/483] Correct misspelling of Helm Although it is spelling mistakes, it might make an affects while reading. Signed-off-by: Nguyen Hai Truong --- _proto/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_proto/README.md b/_proto/README.md index 0ebd6b6a42a..7704572ebd5 100644 --- a/_proto/README.md +++ b/_proto/README.md @@ -3,7 +3,7 @@ Protobuf3 type declarations for the Helm API Packages - - `hapi.chart` Complete serialization of Heml charts + - `hapi.chart` Complete serialization of Helm charts - `hapi.release` Information about installed charts (Releases) such as metadata about when they were installed, their status, and how they were configured. - `hapi.services.rudder` Definition for the ReleaseModuleService used by Tiller to manipulate releases on a given node - `hapi.services.tiller` Definition of the ReleaseService provided by Tiller and used by Helm clients to manipulate releases cluster wide. From 2ca5d2ab9cf41a23a1d650ae2dc88a44344c898b Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Wed, 20 Feb 2019 14:35:35 +0700 Subject: [PATCH 374/483] trivial fix typo Signed-off-by: Nguyen Hai Truong --- docs/tiller_ssl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 41e704653b5..3d64635aec3 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -288,7 +288,7 @@ not available for public resolution. By default, the Helm client connects to Tiller via tunnel (i.e. kube proxy) at 127.0.0.1. During the TLS handshake, a target, usually provided as a hostname (e.g. example.com), is checked against the subject and subject alternative -names of the certificate (i.e. hostname verficiation). However, because of the tunnel, the target is an IP address. +names of the certificate (i.e. hostname verification). However, because of the tunnel, the target is an IP address. Therefore, to validate the certificate, the IP address 127.0.0.1 must be listed as an IP subject alternative name (IP SAN) in the Tiller certificate. From 8f9144332665f1aecb1b29925e70504cfb9210f5 Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Thu, 21 Feb 2019 01:25:43 +0700 Subject: [PATCH 375/483] Adding '/usr/bin/env bash' (#5334) This commit aims to add '/usr/bin/env bash' as a shebang line to indicates scripts use bash shell for interpreting. Signed-off-by: Nguyen Hai Truong --- scripts/completions.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/completions.bash b/scripts/completions.bash index c24f3d25730..36cb01f1581 100644 --- a/scripts/completions.bash +++ b/scripts/completions.bash @@ -1,3 +1,5 @@ +#!/usr/bin/env bash + # bash completion for helm -*- shell-script -*- __debug() From fbc89e13d1e0a92b39d3088dc02f5fdccae48aca Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Thu, 21 Feb 2019 01:25:59 +0700 Subject: [PATCH 376/483] The 'Linuxes' is obscure (#5332) Using `Linux distributions` instead of `Linuxes` Signed-off-by: Nguyen Hai Truong --- docs/developers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers.md b/docs/developers.md index fb704cb170c..70203b2d072 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -32,7 +32,7 @@ docker-test`. To run Helm and Tiller locally, you can run `bin/helm` or `bin/tiller`. -- Helm and Tiller are known to run on macOS and most Linuxes, including +- Helm and Tiller are known to run on macOS and most Linux distributions, including Alpine. - Tiller must have access to a Kubernetes cluster. It learns about the cluster by examining the Kube config files that `kubectl` uses. From ead111dd4f699b3cb0a56f1e6d4585e3363f925b Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 20 Feb 2019 10:30:31 -0800 Subject: [PATCH 377/483] add `make sign` and `make fetch-dist` (#5329) Signed-off-by: Matthew Fisher --- Makefile | 15 +++++++++++++++ docs/release_checklist.md | 21 +++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 20ce7e5a451..7248bbed2b3 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ DEV_IMAGE ?= golang:1.11 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 +TARGET_OBJS ?= darwin-amd64.tar.gz darwin-amd64.tar.gz.sha256 linux-amd64.tar.gz linux-amd64.tar.gz.sha256 linux-386.tar.gz linux-386.tar.gz.sha256 linux-arm.tar.gz linux-arm.tar.gz.sha256 linux-arm64.tar.gz linux-arm64.tar.gz.sha256 linux-ppc64le.tar.gz linux-ppc64le.tar.gz.sha256 linux-s390x.tar.gz linux-s390x.tar.gz.sha256 windows-amd64.zip windows-amd64.zip.sha256 DIST_DIRS = find * -type d -exec # go option @@ -44,6 +45,20 @@ dist: $(DIST_DIRS) zip -r helm-${VERSION}-{}.zip {} \; \ ) +.PHONY: fetch-dist +fetch-dist: + mkdir -p _dist + cd _dist && \ + for obj in ${TARGET_OBJS} ; do \ + curl -sSL -o helm-${VERSION}-$${obj} https://storage.googleapis.com/kubernetes-helm/helm-${VERSION}-$${obj} ; \ + done + +.PHONY: sign +sign: + for f in _dist/*.{gz,zip,sha256} ; do \ + gpg --armor --detach-sign $${f} ; \ + done + .PHONY: checksum checksum: for f in _dist/*.{gz,zip} ; do \ diff --git a/docs/release_checklist.md b/docs/release_checklist.md index c1595fb58c7..bddb50ffb61 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -256,13 +256,17 @@ While hashes provide a signature that the content of the downloads is what it was generated, signed packages provide traceability of where the package came from. -To do this follow the following steps: +To do this, run the following `make` commands: -1. Download each of the release bundles generated by the CI system -2. Sign each of them using GnuPG using the command `gpg --armor --detach-sign [FILE NAME]`. - This will generate a file name `[FILE NAME].asc` with an ascii armored signature. +```shell +make clean +make fetch-dist +make sign +``` -Each of the signature files needs to be uploaded to the release on GitHub. +This will generate ascii armored signature files for each of the files pushed by CI. + +All of the signature files need to be uploaded to the release on GitHub. ## 8. Write the Release Notes @@ -322,7 +326,7 @@ The [Quickstart Guide](https://docs.helm.sh/using_helm/#quickstart-guide) will g ### Features - ref(*): kubernetes v1.11 support efadbd88035654b2951f3958167afed014c46bc6 (Adam Reese) -- feat(helm): add $HELM_KEY_PASSPHRASE environment variable for signing helm charts (#4778) 1e26b5300b5166fabb90002535aacd2f9cc7d787 +- feat(helm): add $HELM_KEY_PASSPHRASE environment variable for signing helm charts (#4778) 1e26b5300b5166fabb90002535aacd2f9cc7d787 ### Bug fixes - fix circle not building tags f4f932fabd197f7e6d608c8672b33a483b4b76fa (Matthew Fisher) @@ -346,8 +350,9 @@ git log --no-merges --pretty=format:'- %s %H (%aN)' $PREVIOUS_RELEASE..$RELEASE_ After generating the changelog, you will need to categorize the changes as shown in the example above. -Once finished, go into GitHub and edit the release notes for the tagged release -with the notes written here. +Once finished, go into GitHub and edit the release notes for the tagged release with the notes written here. + +Remember to attach the ascii armored signatures generated in the previous step to the release notes. ## 9. Evangelize From 7d2e42669a214f55f78ad4bb007d67094d6c1f15 Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Fri, 22 Feb 2019 15:17:32 +0700 Subject: [PATCH 378/483] Adding github workflow for contributing to helm Describe detail step-by-step of using github to contribute to helm project. Co-Authored-By: Dao Cong Tien tiendc@vn.fujitsu.com Signed-off-by: Nguyen Hai Truong --- CONTRIBUTING.md | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a20c2b90b48..4368c6a9eb4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -172,10 +172,44 @@ contributing to Helm. All issue types follow the same general lifecycle. Differe ## How to Contribute a Patch -1. Fork the repo, develop and test your code changes. -1. Use sign-off when making each of your commits (see [above](#sign-your-work)). +1. **Fork** the repo [helm](https://github.com/helm/helm) + +Go to https://github.com/helm/helm then hit the `Fork` button to fork your own copy of repository **helm** to your github account. + +2. **Clone** the forked repo to your local working directory. +```sh +$ git clone https://github.com/$your_github_account/helm.git +``` +3. Add an `upstream` remote to keep your fork in sync with the main repo. +```sh +$ cd helm +$ git remote add upstream https://github.com/helm/helm.git +$ git remote -v + +origin https://github.com/$your_github_account/helm.git (fetch) +origin https://github.com/$your_github_account/helm.git (push) +upstream https://github.com/helm/helm.git (fetch) +upstream https://github.com/helm/helm.git (push) +``` +4. Sync your local `master` branch. +```sh +$ git pull upstream master +``` +5. Create a branch to add a new feature or fix issues. +```sh +$ git checkout -b new-feature +``` +6. Make any change on the branch `new-feature` then build and test your codes. +7. Include in what will be committed. +```sh +$ git add +``` +8. Use sign-off when making each of your commits (see [above](#sign-your-work)). If you forgot to sign some commits that are part of the contribution, you can ask [git to rewrite your commit history](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History). -1. Submit a pull request. +```sh +$ git commit --signoff +``` +9. Submit a pull request. Coding conventions and standards are explained in the official developer docs: [Developers Guide](docs/developers.md) From d819efa48b820591e314562975cf11175cbf283a Mon Sep 17 00:00:00 2001 From: Don Bowman Date: Sat, 23 Feb 2019 17:47:44 -0500 Subject: [PATCH 379/483] Make imagePullSecrets and array, move to root level Changes as per PR https://github.com/helm/helm/pull/5271 - make imagePullSecrets be an array - move imagePullSecrets to 'root' level of Values Signed-off-by: Don Bowman --- pkg/chartutil/create.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 2577527b3e6..c5bd6805ed6 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -62,8 +62,8 @@ image: repository: nginx tag: stable pullPolicy: IfNotPresent - # pullSecret: my_secret +imagePullSecrets: [] nameOverride: "" fullnameOverride: "" @@ -190,9 +190,9 @@ spec: app.kubernetes.io/name: {{ include ".name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: - {{- if .Values.image.pullSecret -}} + {{- with .Values.imagePullSecrets }} imagePullSecrets: - - name: {{ .Values.image.pullSecret }} + {{- toYaml . | nindent 8 }} {{- end }} containers: - name: {{ .Chart.Name }} From d9d2b3ae4812d756297ac89b8930eee61273c871 Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Tue, 26 Feb 2019 22:36:23 +0700 Subject: [PATCH 380/483] Fix many misspelling words (#5357) Although it is spelling mistakes, it might make an affects while reading. Co-Authored-By: Dao Cong Tien tiendc@vn.fujitsu.com Signed-off-by: Nguyen Hai Truong --- cmd/helm/verify.go | 2 +- docs/helm/helm_verify.md | 2 +- docs/man/man1/helm_verify.1 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/helm/verify.go b/cmd/helm/verify.go index bbc8347c15c..6b8e6895d42 100644 --- a/cmd/helm/verify.go +++ b/cmd/helm/verify.go @@ -27,7 +27,7 @@ import ( const verifyDesc = ` Verify that the given chart has a valid provenance file. -Provenance files provide crytographic verification that a chart has not been +Provenance files provide cryptographic verification that a chart has not been tampered with, and was packaged by a trusted provider. This command can be used to verify a local chart. Several other commands provide diff --git a/docs/helm/helm_verify.md b/docs/helm/helm_verify.md index 30ed436790d..acd1c29235f 100644 --- a/docs/helm/helm_verify.md +++ b/docs/helm/helm_verify.md @@ -7,7 +7,7 @@ verify that a chart at the given path has been signed and is valid Verify that the given chart has a valid provenance file. -Provenance files provide crytographic verification that a chart has not been +Provenance files provide cryptographic verification that a chart has not been tampered with, and was packaged by a trusted provider. This command can be used to verify a local chart. Several other commands provide diff --git a/docs/man/man1/helm_verify.1 b/docs/man/man1/helm_verify.1 index 5297924ae86..341449ad8b9 100644 --- a/docs/man/man1/helm_verify.1 +++ b/docs/man/man1/helm_verify.1 @@ -18,7 +18,7 @@ helm\-verify \- verify that a chart at the given path has been signed and is val Verify that the given chart has a valid provenance file. .PP -Provenance files provide crytographic verification that a chart has not been +Provenance files provide cryptographic verification that a chart has not been tampered with, and was packaged by a trusted provider. .PP From 44eba6d28c87a58299d94e0832fb52385923d2d1 Mon Sep 17 00:00:00 2001 From: hnwolf Date: Tue, 26 Feb 2019 22:40:06 +0700 Subject: [PATCH 381/483] Update incorrect link (#5359) Signed-off-by: Nguyen Hung Phuong --- docs/using_helm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/using_helm.md b/docs/using_helm.md index 79b5aef6ff1..faf3cc20fdb 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -18,8 +18,8 @@ an Apt dpkg, or a Yum RPM file. A *Repository* is the place where charts can be collected and shared. It's like Perl's [CPAN archive](https://www.cpan.org) or the -[Fedora Package Database](https://admin.fedoraproject.org/pkgdb/), but for -Kubernetes packages. +[Fedora Package Database](https://apps.fedoraproject.org/packages/s/pkgdb), but +for Kubernetes packages. A *Release* is an instance of a chart running in a Kubernetes cluster. One chart can often be installed many times into the same cluster. And From 268695813ba957821e53a784ac849aa3ca7f70a3 Mon Sep 17 00:00:00 2001 From: tuanvcw Date: Tue, 26 Feb 2019 22:41:50 +0700 Subject: [PATCH 382/483] Fix typos in various places (#5360) Signed-off-by: Vu Cong Tuan --- _proto/hapi/release/status.proto | 2 +- pkg/repo/chartrepo_test.go | 2 +- pkg/tiller/release_server.go | 4 ++-- pkg/tlsutil/cfg.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_proto/hapi/release/status.proto b/_proto/hapi/release/status.proto index aa90760b34d..e6ccd3d6e1c 100644 --- a/_proto/hapi/release/status.proto +++ b/_proto/hapi/release/status.proto @@ -29,7 +29,7 @@ message Status { UNKNOWN = 0; // Status_DEPLOYED indicates that the release has been pushed to Kubernetes. DEPLOYED = 1; - // Status_DELETED indicates that a release has been deleted from Kubermetes. + // Status_DELETED indicates that a release has been deleted from Kubernetes. DELETED = 2; // Status_SUPERSEDED indicates that this release object is outdated and a newer one exists. SUPERSEDED = 3; diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index a2f1daeb807..ed09b5c6d01 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -175,7 +175,7 @@ func verifyIndex(t *testing.T, actual *IndexFile) { t.Errorf("Expected %q, got %q", e.Version, g.Version) } if len(g.Keywords) != 3 { - t.Error("Expected 3 keyrwords.") + t.Error("Expected 3 keywords.") } if len(g.Maintainers) != 2 { t.Error("Expected 2 maintainers.") diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index ffb922e401c..eb3e876d0f6 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -115,7 +115,7 @@ func NewReleaseServer(env *environment.Environment, clientset kubernetes.Interfa // request values are not altered. func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current *release.Release) error { if req.ResetValues { - // If ResetValues is set, we comletely ignore current.Config. + // If ResetValues is set, we completely ignore current.Config. s.Log("resetting values to the chart's original version") return nil } @@ -191,7 +191,7 @@ func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) { rel := h[0] if st := rel.Info.Status.Code; reuse && (st == release.Status_DELETED || st == release.Status_FAILED) { - // Allowe re-use of names if the previous release is marked deleted. + // Allow re-use of names if the previous release is marked deleted. s.Log("name %s exists but is not in use, reusing name", start) return start, nil } else if reuse { diff --git a/pkg/tlsutil/cfg.go b/pkg/tlsutil/cfg.go index 2c1dfd340f5..6c2a829dfc5 100644 --- a/pkg/tlsutil/cfg.go +++ b/pkg/tlsutil/cfg.go @@ -40,7 +40,7 @@ type Options struct { ClientAuth tls.ClientAuthType } -// ClientConfig retusn a TLS configuration for use by a Helm client. +// ClientConfig returns a TLS configuration for use by a Helm client. func ClientConfig(opts Options) (cfg *tls.Config, err error) { var cert *tls.Certificate var pool *x509.CertPool From cdc09e54bca50a53c1e54f0e67b15a0913f5af1d Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Wed, 27 Feb 2019 01:30:52 +0700 Subject: [PATCH 383/483] Ignore Unix swap files `*.swp` in .gitignore (#5364) Co-Authored-By: Dao Cong Tien tiendc@vn.fujitsu.com Signed-off-by: Nguyen Hai Truong --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2414f7f2bf5..cfba7099874 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ rootfs/rudder vendor/ *.exe .idea/ -*.iml \ No newline at end of file +*.iml +*.swp From 42e424bb3bd24df1508d43b0bd40e0047e24abe9 Mon Sep 17 00:00:00 2001 From: Nguyen Hai Truong Date: Wed, 27 Feb 2019 10:09:39 +0700 Subject: [PATCH 384/483] Insert *~ when using emacs in .gitignore (#5366) Ignore temporary files *~ when editting source codes with emacs. Signed-off-by: Nguyen Hai Truong --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cfba7099874..14d942bf1ee 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ vendor/ .idea/ *.iml *.swp +*~ From 680b3fd05ac2dc5051afd69c96bca3fa929969e9 Mon Sep 17 00:00:00 2001 From: Vu Cong Tuan Date: Tue, 19 Feb 2019 14:55:28 +0700 Subject: [PATCH 385/483] Fixing many typos in docs Signed-off-by: Vu Cong Tuan --- docs/chart_template_guide/functions_and_pipelines.md | 2 +- docs/chart_template_guide/helm_ignore_file.md | 2 +- docs/helm/helm_verify.md | 2 +- docs/man/man1/helm_install.1 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/chart_template_guide/functions_and_pipelines.md b/docs/chart_template_guide/functions_and_pipelines.md index fe5a3c2b289..1c099887d02 100644 --- a/docs/chart_template_guide/functions_and_pipelines.md +++ b/docs/chart_template_guide/functions_and_pipelines.md @@ -150,7 +150,7 @@ Template functions and pipelines are a powerful way to transform information and ## Operators are functions -Operators are implemented as functions that return a boolean value. To use `eq`, `ne`, `lt`, `gt`, `and`, `or`, `not` etcetera place the operator at the front of the statement followed by its parameters just as you would a function. To chain multiple operations together, separate individual functions by surrounding them with paranthesis. +Operators are implemented as functions that return a boolean value. To use `eq`, `ne`, `lt`, `gt`, `and`, `or`, `not` etcetera place the operator at the front of the statement followed by its parameters just as you would a function. To chain multiple operations together, separate individual functions by surrounding them with parentheses. ```yaml {{/* include the body of this if statement when the variable .Values.fooString exists and is set to "foo" */}} diff --git a/docs/chart_template_guide/helm_ignore_file.md b/docs/chart_template_guide/helm_ignore_file.md index 6793bdfeccc..5980f439c1f 100644 --- a/docs/chart_template_guide/helm_ignore_file.md +++ b/docs/chart_template_guide/helm_ignore_file.md @@ -4,7 +4,7 @@ The `.helmignore` file is used to specify files you don't want to include in you If this file exists, the `helm package` command will ignore all the files that match the pattern specified in the `.helmignore` file while packaging your application. -This can help in avoiding unncessary or sensitive files or directories from being added in your helm chart. +This can help in avoiding unnecessary or sensitive files or directories from being added in your helm chart. The `.helmignore` file supports Unix shell glob matching, relative path matching, and negation (prefixed with !). Only one pattern per line is considered. diff --git a/docs/helm/helm_verify.md b/docs/helm/helm_verify.md index acd1c29235f..e6d683dfbec 100644 --- a/docs/helm/helm_verify.md +++ b/docs/helm/helm_verify.md @@ -42,4 +42,4 @@ helm verify [flags] PATH * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 25-Feb-2019 diff --git a/docs/man/man1/helm_install.1 b/docs/man/man1/helm_install.1 index fe1856bed20..df4011a62c8 100644 --- a/docs/man/man1/helm_install.1 +++ b/docs/man/man1/helm_install.1 @@ -80,7 +80,7 @@ the '\-\-debug' and '\-\-dry\-run' flags can be combined. This will still requir round\-trip to the Tiller server. .PP -If \-\-verify is set, the chart MUST have a provenance file, and the provenenace +If \-\-verify is set, the chart MUST have a provenance file, and the provenance fall MUST pass all verification steps. .PP From 63c970c5ce29b0971cdc6409d9c0e156321ea32a Mon Sep 17 00:00:00 2001 From: Nguyen Quang Huy Date: Wed, 27 Feb 2019 22:00:20 +0700 Subject: [PATCH 386/483] Fix some typos (#5352) Correct some words spelling for reading more easily. Signed-off-by: Nguyen Quang Huy Co-Authored-By: Nguyen Van Trung --- CONTRIBUTING.md | 2 +- docs/chart_template_guide/functions_and_pipelines.md | 2 +- docs/chart_template_guide/helm_ignore_file.md | 2 +- docs/charts.md | 2 +- docs/charts_hooks.md | 4 ++-- docs/charts_tips_and_tricks.md | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a20c2b90b48..c9716d0ce10 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -242,7 +242,7 @@ Documentation PRs will follow the same lifecycle as other PRs. They will also be ## The Triager Each week, one of the core maintainers will serve as the designated "triager" starting after the -public standup meetings on Thursday. This person will be in charge triaging new PRs and issues +public stand-up meetings on Thursday. This person will be in charge triaging new PRs and issues throughout the work week. ## Labels diff --git a/docs/chart_template_guide/functions_and_pipelines.md b/docs/chart_template_guide/functions_and_pipelines.md index fe5a3c2b289..1c099887d02 100644 --- a/docs/chart_template_guide/functions_and_pipelines.md +++ b/docs/chart_template_guide/functions_and_pipelines.md @@ -150,7 +150,7 @@ Template functions and pipelines are a powerful way to transform information and ## Operators are functions -Operators are implemented as functions that return a boolean value. To use `eq`, `ne`, `lt`, `gt`, `and`, `or`, `not` etcetera place the operator at the front of the statement followed by its parameters just as you would a function. To chain multiple operations together, separate individual functions by surrounding them with paranthesis. +Operators are implemented as functions that return a boolean value. To use `eq`, `ne`, `lt`, `gt`, `and`, `or`, `not` etcetera place the operator at the front of the statement followed by its parameters just as you would a function. To chain multiple operations together, separate individual functions by surrounding them with parentheses. ```yaml {{/* include the body of this if statement when the variable .Values.fooString exists and is set to "foo" */}} diff --git a/docs/chart_template_guide/helm_ignore_file.md b/docs/chart_template_guide/helm_ignore_file.md index 6793bdfeccc..5980f439c1f 100644 --- a/docs/chart_template_guide/helm_ignore_file.md +++ b/docs/chart_template_guide/helm_ignore_file.md @@ -4,7 +4,7 @@ The `.helmignore` file is used to specify files you don't want to include in you If this file exists, the `helm package` command will ignore all the files that match the pattern specified in the `.helmignore` file while packaging your application. -This can help in avoiding unncessary or sensitive files or directories from being added in your helm chart. +This can help in avoiding unnecessary or sensitive files or directories from being added in your helm chart. The `.helmignore` file supports Unix shell glob matching, relative path matching, and negation (prefixed with !). Only one pattern per line is considered. diff --git a/docs/charts.md b/docs/charts.md index d91dfe54ef1..6137898c2ab 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -492,7 +492,7 @@ create/update all of the above Kubernetes objects in the following order: This is because when Helm installs/upgrades charts, the Kubernetes objects from the charts and all its dependencies are -- aggregrated into a single set; then +- aggregated into a single set; then - sorted by type followed by name; and then - created/updated in that order. diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index fbb30248188..6d436402d15 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -248,8 +248,8 @@ annotated. When a helm release, that uses a hook, is being updated, it is possible that the hook resource might already exist in the cluster. In such circumstances, by default, helm will fail trying to install the hook resource with an `"... already exists"` error. -A common reason why the hook resource might already exist is that it was not deleted following use on a previous install/upgrade. There are, in fact, good reasons why one might want to keep the hook: for example, to aid manual debugging in case something went wrong. In this case, the recommended way of ensuring subsequent attemps to create the hook do not fail is to define a `"hook-delete-policy"` that can handle this: `"helm.sh/hook-delete-policy": "before-hook-creation"`. This hook annotation causes any existing hook to be removed, before the new hook is installed. +A common reason why the hook resource might already exist is that it was not deleted following use on a previous install/upgrade. There are, in fact, good reasons why one might want to keep the hook: for example, to aid manual debugging in case something went wrong. In this case, the recommended way of ensuring subsequent attempts to create the hook do not fail is to define a `"hook-delete-policy"` that can handle this: `"helm.sh/hook-delete-policy": "before-hook-creation"`. This hook annotation causes any existing hook to be removed, before the new hook is installed. -If it is preferred to actually delete the hook after each use (rather than have to handle it on a subsequent use, as shown above), then this can be achived using a delete policy of `"helm.sh/hook-delete-policy": "hook-succeeded,hook-failed"`. +If it is preferred to actually delete the hook after each use (rather than have to handle it on a subsequent use, as shown above), then this can be achieved using a delete policy of `"helm.sh/hook-delete-policy": "hook-succeeded,hook-failed"`. diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index e2c73b14ff9..d988184c536 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -281,7 +281,7 @@ According to the YAML specification, YAML is a superset of JSON. That means that any valid JSON structure ought to be valid in YAML. This has an advantage: Sometimes template developers may find it easier -to express a datastructure with a JSON-like syntax rather than deal with +to express a data structure with a JSON-like syntax rather than deal with YAML's whitespace sensitivity. As a best practice, templates should follow a YAML-like syntax _unless_ From 33589472cf02d8d10e96e06085d95791c0611a75 Mon Sep 17 00:00:00 2001 From: Nguyen Van Duc Date: Thu, 28 Feb 2019 01:38:51 +0700 Subject: [PATCH 387/483] Add .gitignore files for Eclipse (#5368) Signed-off-by: vanduc95 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 14d942bf1ee..d1ec1326507 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ vendor/ *.iml *.swp *~ +.classpath +.project +.settings/** From e80f1735260dadb7da11ded78c77d88ab471e041 Mon Sep 17 00:00:00 2001 From: Don Bowman Date: Sat, 2 Mar 2019 10:55:38 -0500 Subject: [PATCH 388/483] Change indent of {{ with }} Signed-off-by: Don Bowman --- pkg/chartutil/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index c5bd6805ed6..10395edaa30 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -190,10 +190,10 @@ spec: app.kubernetes.io/name: {{ include ".name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: - {{- with .Values.imagePullSecrets }} + {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} - {{- end }} + {{- end }} containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" From 55fbed95d586db554b33cfa4dceff1475d2d4d41 Mon Sep 17 00:00:00 2001 From: Jacob LeGrone Date: Mon, 4 Mar 2019 10:09:05 -0500 Subject: [PATCH 389/483] feat(resource-policy): delete manifests when policy value is delete Signed-off-by: Jacob LeGrone --- pkg/kube/client.go | 8 +++++--- pkg/kube/resource_policy.go | 23 +++++++++++++++++++---- pkg/tiller/resource_policy.go | 12 +++--------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index eccf888e8c9..955c75ab157 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -23,12 +23,13 @@ import ( goerrors "errors" "fmt" "io" - "k8s.io/apimachinery/pkg/api/meta" "log" "sort" "strings" "time" + "k8s.io/apimachinery/pkg/api/meta" + "github.com/evanphx/json-patch" appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" @@ -362,8 +363,9 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader if err != nil { c.Log("Unable to get annotations on %q, err: %s", info.Name, err) } - if annotations != nil && annotations[ResourcePolicyAnno] == KeepPolicy { - c.Log("Skipping delete of %q due to annotation [%s=%s]", info.Name, ResourcePolicyAnno, KeepPolicy) + if ResourcePolicyIsKeep(annotations) { + policy := annotations[ResourcePolicyAnno] + c.Log("Skipping delete of %q due to annotation [%s=%s]", info.Name, ResourcePolicyAnno, policy) continue } diff --git a/pkg/kube/resource_policy.go b/pkg/kube/resource_policy.go index 45cebcba8f0..9bce63a7c48 100644 --- a/pkg/kube/resource_policy.go +++ b/pkg/kube/resource_policy.go @@ -19,8 +19,23 @@ package kube // ResourcePolicyAnno is the annotation name for a resource policy const ResourcePolicyAnno = "helm.sh/resource-policy" -// KeepPolicy is the resource policy type for keep +// deletePolicy is the resource policy type for delete // -// This resource policy type allows resources to skip being deleted -// during an uninstallRelease action. -const KeepPolicy = "keep" +// This resource policy type allows explicitly opting in to the default +// resource deletion behavior, for example when overriding a chart's +// default annotations. Any other value allows resources to skip being +// deleted during an uninstallRelease action. +const deletePolicy = "delete" + +// ResourcePolicyIsKeep accepts a map of Kubernetes resource annotations and +// returns true if the resource should be kept, otherwise false if it is safe +// for Helm to delete. +func ResourcePolicyIsKeep(annotations map[string]string) bool { + if annotations != nil { + resourcePolicyType, ok := annotations[ResourcePolicyAnno] + if ok && resourcePolicyType != deletePolicy { + return true + } + } + return false +} diff --git a/pkg/tiller/resource_policy.go b/pkg/tiller/resource_policy.go index aa9c5d2bd01..c97621fcdfc 100644 --- a/pkg/tiller/resource_policy.go +++ b/pkg/tiller/resource_policy.go @@ -34,17 +34,11 @@ func filterManifestsToKeep(manifests []Manifest) ([]Manifest, []Manifest) { continue } - resourcePolicyType, ok := m.Head.Metadata.Annotations[kube.ResourcePolicyAnno] - if !ok { - remaining = append(remaining, m) - continue - } - - resourcePolicyType = strings.ToLower(strings.TrimSpace(resourcePolicyType)) - if resourcePolicyType == kube.KeepPolicy { + if kube.ResourcePolicyIsKeep(m.Head.Metadata.Annotations) { keep = append(keep, m) + } else { + remaining = append(remaining, m) } - } return keep, remaining } From ce4c3f51ade97b71a6eee5068d4f529d60b1272b Mon Sep 17 00:00:00 2001 From: Jacob LeGrone Date: Mon, 4 Mar 2019 10:17:37 -0500 Subject: [PATCH 390/483] test(resource-policy): verify behavior of non-standard policy types Signed-off-by: Jacob LeGrone --- pkg/kube/client_test.go | 2 +- pkg/kube/resource_policy_test.go | 72 ++++++++++++++++++++++++++++ pkg/tiller/release_server_test.go | 27 ++++++++--- pkg/tiller/release_uninstall_test.go | 5 +- 4 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 pkg/kube/resource_policy_test.go diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index f601b653677..89e630bb32b 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -213,7 +213,7 @@ func TestUpdate(t *testing.T) { // Test resource policy is respected actions = nil - listA.Items[2].ObjectMeta.Annotations = map[string]string{ResourcePolicyAnno: KeepPolicy} + listA.Items[2].ObjectMeta.Annotations = map[string]string{ResourcePolicyAnno: "keep"} if err := c.Update(v1.NamespaceDefault, objBody(&listA), objBody(&listB), false, false, 0, false); err != nil { t.Fatal(err) } diff --git a/pkg/kube/resource_policy_test.go b/pkg/kube/resource_policy_test.go new file mode 100644 index 00000000000..de6061b4869 --- /dev/null +++ b/pkg/kube/resource_policy_test.go @@ -0,0 +1,72 @@ +/* +Copyright The Helm Authors. + +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 kube + +import "testing" + +func TestResourcePolicyIsKeep(t *testing.T) { + type annotations map[string]string + type testcase struct { + annotations + keep bool + } + cases := []testcase{ + {nil, false}, + { + annotations{ + "foo": "bar", + }, + false, + }, + { + annotations{ + ResourcePolicyAnno: "keep", + }, + true, + }, + { + annotations{ + ResourcePolicyAnno: "KEEP ", + }, + true, + }, + { + annotations{ + ResourcePolicyAnno: "", + }, + true, + }, + { + annotations{ + ResourcePolicyAnno: "delete", + }, + false, + }, + { + annotations{ + ResourcePolicyAnno: "DELETE", + }, + true, + }, + } + + for _, tc := range cases { + if tc.keep != ResourcePolicyIsKeep(tc.annotations) { + t.Errorf("Expected function to return %t for annotations %v", tc.keep, tc.annotations) + } + } +} diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index a1502e8a206..4e29e4413ce 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -89,13 +89,22 @@ spec: var manifestWithKeep = `kind: ConfigMap metadata: - name: test-cm-keep + name: test-cm-keep-a annotations: "helm.sh/resource-policy": keep data: name: value ` +var manifestWithKeepEmpty = `kind: ConfigMap +metadata: + name: test-cm-keep-b + annotations: + "helm.sh/resource-policy": "" +data: + name: value +` + var manifestWithUpgradeHooks = `kind: ConfigMap metadata: name: test-cm @@ -449,23 +458,27 @@ func releaseWithKeepStub(rlsName string) *release.Release { Name: "bunnychart", }, Templates: []*chart.Template{ - {Name: "templates/configmap", Data: []byte(manifestWithKeep)}, + {Name: "templates/configmap-keep-a", Data: []byte(manifestWithKeep)}, + {Name: "templates/configmap-keep-b", Data: []byte(manifestWithKeepEmpty)}, }, } date := timestamp.Timestamp{Seconds: 242085845, Nanos: 0} - return &release.Release{ + rl := &release.Release{ Name: rlsName, Info: &release.Info{ FirstDeployed: &date, LastDeployed: &date, Status: &release.Status{Code: release.Status_DEPLOYED}, }, - Chart: ch, - Config: &chart.Config{Raw: `name: value`}, - Version: 1, - Manifest: manifestWithKeep, + Chart: ch, + Config: &chart.Config{Raw: `name: value`}, + Version: 1, } + + helm.RenderReleaseMock(rl, false) + + return rl } func MockEnvironment() *environment.Environment { diff --git a/pkg/tiller/release_uninstall_test.go b/pkg/tiller/release_uninstall_test.go index cb59b6bf57c..d95a52c4d01 100644 --- a/pkg/tiller/release_uninstall_test.go +++ b/pkg/tiller/release_uninstall_test.go @@ -150,7 +150,10 @@ func TestUninstallReleaseWithKeepPolicy(t *testing.T) { if res.Info == "" { t.Errorf("Expected response info to not be empty") } else { - if !strings.Contains(res.Info, "[ConfigMap] test-cm-keep") { + if !strings.Contains(res.Info, "[ConfigMap] test-cm-keep-a") { + t.Errorf("unexpected output: %s", res.Info) + } + if !strings.Contains(res.Info, "[ConfigMap] test-cm-keep-b") { t.Errorf("unexpected output: %s", res.Info) } } From e06c605b88d38c369a52dc86a2fa9890ea1aab66 Mon Sep 17 00:00:00 2001 From: Jacob LeGrone Date: Mon, 4 Mar 2019 10:18:26 -0500 Subject: [PATCH 391/483] docs(resource-policy): explain "delete" policy type Signed-off-by: Jacob LeGrone --- docs/charts_tips_and_tricks.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/charts_tips_and_tricks.md b/docs/charts_tips_and_tricks.md index d988184c536..fd7a08f7ed8 100644 --- a/docs/charts_tips_and_tricks.md +++ b/docs/charts_tips_and_tricks.md @@ -235,6 +235,9 @@ orphaned. Helm will no longer manage it in any way. This can lead to problems if using `helm install --replace` on a release that has already been deleted, but has kept resources. +To explicitly opt in to resource deletion, for example when overriding a chart's +default annotations, set the resource policy annotation value to `delete`. + ## Using "Partials" and Template Includes Sometimes you want to create some reusable parts in your chart, whether From 9689b02321be284f001a58c469d5ce13cd044b71 Mon Sep 17 00:00:00 2001 From: anton <0verc1ocker@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:18:26 -0500 Subject: [PATCH 392/483] Add --max-history tip and to the quickstart helm init docs (#5328) Signed-off-by: 0verc1ocker --- docs/quickstart.md | 4 +++- docs/rbac.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index ef3cb460e33..d7f2e3b914b 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -54,9 +54,11 @@ Once you have Helm ready, you can initialize the local CLI and also install Tiller into your Kubernetes cluster in one step: ```console -$ helm init +$ helm init --max-history 200 ``` +**TIP:** Setting `--max-history` on helm init is recommended as configmaps and other objects in helm history can grow large in number if not purged by max limit. Without a max history set the history is kept indefinitely, leaving a large number of records for helm and tiller to maintain. + This will install Tiller into the Kubernetes cluster you saw with `kubectl config current-context`. diff --git a/docs/rbac.md b/docs/rbac.md index 4b39ecdc6a3..45371cda86e 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -43,7 +43,7 @@ _Note: The cluster-admin role is created by default in a Kubernetes cluster, so $ kubectl create -f rbac-config.yaml serviceaccount "tiller" created clusterrolebinding "tiller" created -$ helm init --service-account tiller +$ helm init --service-account tiller --max-history 200 ``` ### Example: Deploy Tiller in a namespace, restricted to deploying resources only in that namespace From c94c00915f29fba5e816c277ff617babb3790cb1 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Tue, 5 Mar 2019 18:04:54 -0500 Subject: [PATCH 393/483] Fix #5046 compatible with MacOS (#5406) Signed-off-by: Marc Khouzam --- cmd/helm/completion.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index d0249b2ea99..3c031894114 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -212,7 +212,7 @@ __helm_convert_bash_to_zsh() { -e "s/${LWORD}compopt${RWORD}/__helm_compopt/g" \ -e "s/${LWORD}declare${RWORD}/__helm_declare/g" \ -e "s/\\\$(type${RWORD}/\$(__helm_type/g" \ - -e 's/aliashash\["\(\w\+\)"\]/aliashash[\1]/g' \ + -e 's/aliashash\["\(.\{1,\}\)"\]/aliashash[\1]/g' \ <<'BASH_COMPLETION_EOF' ` out.Write([]byte(zshInitialization)) From 7da53d6e70e7dde7760fb89a29bd63a8cf30e897 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Sat, 19 Jan 2019 14:52:14 +0100 Subject: [PATCH 394/483] Refactor helm init command for reuse, allowing other programs to initialize local helm home directory without shelling out to the helm binary Signed-off-by: Patrick Decat --- cmd/helm/helm_test.go | 3 +- cmd/helm/init.go | 129 +----------------- cmd/helm/init_test.go | 47 +------ cmd/helm/installer/init.go | 166 +++++++++++++++++++++++ cmd/helm/installer/init_test.go | 120 ++++++++++++++++ cmd/helm/{ => installer}/init_unix.go | 2 +- cmd/helm/{ => installer}/init_windows.go | 2 +- cmd/helm/repo_update.go | 3 +- 8 files changed, 295 insertions(+), 177 deletions(-) create mode 100644 cmd/helm/installer/init.go create mode 100644 cmd/helm/installer/init_test.go rename cmd/helm/{ => installer}/init_unix.go (92%) rename cmd/helm/{ => installer}/init_windows.go (92%) diff --git a/cmd/helm/helm_test.go b/cmd/helm/helm_test.go index 6e915fa7b31..83f1173f209 100644 --- a/cmd/helm/helm_test.go +++ b/cmd/helm/helm_test.go @@ -30,6 +30,7 @@ import ( "github.com/spf13/cobra" "k8s.io/client-go/util/homedir" + "k8s.io/helm/cmd/helm/installer" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm/environment" "k8s.io/helm/pkg/helm/helmpath" @@ -137,7 +138,7 @@ func ensureTestHome(home helmpath.Home, t *testing.T) error { } } - localRepoIndexFile := home.LocalRepository(localRepositoryIndexFile) + localRepoIndexFile := home.LocalRepository(installer.LocalRepositoryIndexFile) if fi, err := os.Stat(localRepoIndexFile); err != nil { i := repo.NewIndexFile() if err := i.WriteFile(localRepoIndexFile, 0644); err != nil { diff --git a/cmd/helm/init.go b/cmd/helm/init.go index db35ef037d7..682189f84f0 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -31,11 +31,9 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/helm/cmd/helm/installer" - "k8s.io/helm/pkg/getter" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/helm/portforwarder" - "k8s.io/helm/pkg/repo" "k8s.io/helm/pkg/version" ) @@ -60,12 +58,6 @@ To dump a manifest containing the Tiller deployment YAML, combine the '--dry-run' and '--debug' flags. ` -const ( - stableRepository = "stable" - localRepository = "local" - localRepositoryIndexFile = "index.yaml" -) - var ( stableRepositoryURL = "https://kubernetes-charts.storage.googleapis.com" // This is the IPv4 loopback, not localhost, because we have to force IPv4 @@ -266,14 +258,8 @@ func (i *initCmd) run() error { return nil } - if err := ensureDirectories(i.home, i.out); err != nil { - return err - } - if err := ensureDefaultRepos(i.home, i.out, i.skipRefresh); err != nil { - return err - } - if err := ensureRepoFileFormat(i.home.RepositoryFile(), i.out); err != nil { - return err + if err := installer.Initialize(i.home, i.out, i.skipRefresh, settings, stableRepositoryURL, localRepositoryURL); err != nil { + return fmt.Errorf("error initializing: %s", err) } fmt.Fprintf(i.out, "$HELM_HOME has been configured at %s.\n", settings.Home) @@ -351,117 +337,6 @@ func (i *initCmd) ping(image string) error { return nil } -// ensureDirectories checks to see if $HELM_HOME exists. -// -// If $HELM_HOME does not exist, this function will create it. -func ensureDirectories(home helmpath.Home, out io.Writer) error { - configDirectories := []string{ - home.String(), - home.Repository(), - home.Cache(), - home.LocalRepository(), - home.Plugins(), - home.Starters(), - home.Archive(), - } - for _, p := range configDirectories { - if fi, err := os.Stat(p); err != nil { - fmt.Fprintf(out, "Creating %s \n", p) - if err := os.MkdirAll(p, 0755); err != nil { - return fmt.Errorf("Could not create %s: %s", p, err) - } - } else if !fi.IsDir() { - return fmt.Errorf("%s must be a directory", p) - } - } - - return nil -} - -func ensureDefaultRepos(home helmpath.Home, out io.Writer, skipRefresh bool) error { - repoFile := home.RepositoryFile() - if fi, err := os.Stat(repoFile); err != nil { - fmt.Fprintf(out, "Creating %s \n", repoFile) - f := repo.NewRepoFile() - sr, err := initStableRepo(home.CacheIndex(stableRepository), out, skipRefresh, home) - if err != nil { - return err - } - lr, err := initLocalRepo(home.LocalRepository(localRepositoryIndexFile), home.CacheIndex("local"), out, home) - if err != nil { - return err - } - f.Add(sr) - f.Add(lr) - if err := f.WriteFile(repoFile, 0644); err != nil { - return err - } - } else if fi.IsDir() { - return fmt.Errorf("%s must be a file, not a directory", repoFile) - } - return nil -} - -func initStableRepo(cacheFile string, out io.Writer, skipRefresh bool, home helmpath.Home) (*repo.Entry, error) { - fmt.Fprintf(out, "Adding %s repo with URL: %s \n", stableRepository, stableRepositoryURL) - c := repo.Entry{ - Name: stableRepository, - URL: stableRepositoryURL, - Cache: cacheFile, - } - r, err := repo.NewChartRepository(&c, getter.All(settings)) - if err != nil { - return nil, err - } - - if skipRefresh { - return &c, nil - } - - // In this case, the cacheFile is always absolute. So passing empty string - // is safe. - if err := r.DownloadIndexFile(""); err != nil { - return nil, fmt.Errorf("Looks like %q is not a valid chart repository or cannot be reached: %s", stableRepositoryURL, err.Error()) - } - - return &c, nil -} - -func initLocalRepo(indexFile, cacheFile string, out io.Writer, home helmpath.Home) (*repo.Entry, error) { - if fi, err := os.Stat(indexFile); err != nil { - fmt.Fprintf(out, "Adding %s repo with URL: %s \n", localRepository, localRepositoryURL) - i := repo.NewIndexFile() - if err := i.WriteFile(indexFile, 0644); err != nil { - return nil, err - } - - //TODO: take this out and replace with helm update functionality - if err := createLink(indexFile, cacheFile, home); err != nil { - return nil, err - } - } else if fi.IsDir() { - return nil, fmt.Errorf("%s must be a file, not a directory", indexFile) - } - - return &repo.Entry{ - Name: localRepository, - URL: localRepositoryURL, - Cache: cacheFile, - }, nil -} - -func ensureRepoFileFormat(file string, out io.Writer) error { - r, err := repo.LoadRepositoriesFile(file) - if err == repo.ErrRepoOutOfDate { - fmt.Fprintln(out, "Updating repository file format...") - if err := r.WriteFile(file, 0644); err != nil { - return err - } - } - - return nil -} - // watchTillerUntilReady waits for the tiller pod to become available. This is useful in situations where we // want to wait before we call New(). // diff --git a/cmd/helm/init_test.go b/cmd/helm/init_test.go index fd6ef97c4d7..b58303f4217 100644 --- a/cmd/helm/init_test.go +++ b/cmd/helm/init_test.go @@ -28,7 +28,7 @@ import ( "github.com/ghodss/yaml" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -179,51 +179,6 @@ func TestInitCmd_dryRun(t *testing.T) { } } -func TestEnsureHome(t *testing.T) { - home, err := ioutil.TempDir("", "helm_home") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(home) - - b := bytes.NewBuffer(nil) - hh := helmpath.Home(home) - settings.Home = hh - if err := ensureDirectories(hh, b); err != nil { - t.Error(err) - } - if err := ensureDefaultRepos(hh, b, false); err != nil { - t.Error(err) - } - if err := ensureDefaultRepos(hh, b, true); err != nil { - t.Error(err) - } - if err := ensureRepoFileFormat(hh.RepositoryFile(), b); err != nil { - t.Error(err) - } - - expectedDirs := []string{hh.String(), hh.Repository(), hh.Cache(), hh.LocalRepository()} - for _, dir := range expectedDirs { - if fi, err := os.Stat(dir); err != nil { - t.Errorf("%s", err) - } else if !fi.IsDir() { - t.Errorf("%s is not a directory", fi) - } - } - - if fi, err := os.Stat(hh.RepositoryFile()); err != nil { - t.Error(err) - } else if fi.IsDir() { - t.Errorf("%s should not be a directory", fi) - } - - if fi, err := os.Stat(hh.LocalRepository(localRepositoryIndexFile)); err != nil { - t.Errorf("%s", err) - } else if fi.IsDir() { - t.Errorf("%s should not be a directory", fi) - } -} - func TestInitCmd_tlsOptions(t *testing.T) { const testDir = "../../testdata" diff --git a/cmd/helm/installer/init.go b/cmd/helm/installer/init.go new file mode 100644 index 00000000000..9edfc07974e --- /dev/null +++ b/cmd/helm/installer/init.go @@ -0,0 +1,166 @@ +/* +Copyright The Helm Authors. + +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 installer // import "k8s.io/helm/cmd/helm/installer" + +import ( + "fmt" + "io" + "os" + + "k8s.io/helm/pkg/getter" + helm_env "k8s.io/helm/pkg/helm/environment" + "k8s.io/helm/pkg/helm/helmpath" + "k8s.io/helm/pkg/repo" +) + +const ( + stableRepository = "stable" + + // LocalRepository is the standard name of the local repository + LocalRepository = "local" + + // LocalRepositoryIndexFile is the standard name of the local repository index file + LocalRepositoryIndexFile = "index.yaml" +) + +// Initialize initializes local config +// +// Returns an error if the command failed. +func Initialize(home helmpath.Home, out io.Writer, skipRefresh bool, settings helm_env.EnvSettings, stableRepositoryURL, localRepositoryURL string) error { + if err := ensureDirectories(home, out); err != nil { + return err + } + if err := ensureDefaultRepos(home, out, skipRefresh, settings, stableRepositoryURL, localRepositoryURL); err != nil { + return err + } + if err := ensureRepoFileFormat(home.RepositoryFile(), out); err != nil { + return err + } + + return nil +} + +// ensureDirectories checks to see if $HELM_HOME exists. +// +// If $HELM_HOME does not exist, this function will create it. +func ensureDirectories(home helmpath.Home, out io.Writer) error { + configDirectories := []string{ + home.String(), + home.Repository(), + home.Cache(), + home.LocalRepository(), + home.Plugins(), + home.Starters(), + home.Archive(), + } + for _, p := range configDirectories { + if fi, err := os.Stat(p); err != nil { + fmt.Fprintf(out, "Creating %s \n", p) + if err := os.MkdirAll(p, 0755); err != nil { + return fmt.Errorf("Could not create %s: %s", p, err) + } + } else if !fi.IsDir() { + return fmt.Errorf("%s must be a directory", p) + } + } + + return nil +} + +func ensureDefaultRepos(home helmpath.Home, out io.Writer, skipRefresh bool, settings helm_env.EnvSettings, stableRepositoryURL, localRepositoryURL string) error { + repoFile := home.RepositoryFile() + if fi, err := os.Stat(repoFile); err != nil { + fmt.Fprintf(out, "Creating %s \n", repoFile) + f := repo.NewRepoFile() + sr, err := initStableRepo(home.CacheIndex(stableRepository), home, out, skipRefresh, settings, stableRepositoryURL) + if err != nil { + return err + } + lr, err := initLocalRepo(home.LocalRepository(LocalRepositoryIndexFile), home.CacheIndex("local"), home, out, settings, localRepositoryURL) + if err != nil { + return err + } + f.Add(sr) + f.Add(lr) + if err := f.WriteFile(repoFile, 0644); err != nil { + return err + } + } else if fi.IsDir() { + return fmt.Errorf("%s must be a file, not a directory", repoFile) + } + return nil +} + +func initStableRepo(cacheFile string, home helmpath.Home, out io.Writer, skipRefresh bool, settings helm_env.EnvSettings, stableRepositoryURL string) (*repo.Entry, error) { + fmt.Fprintf(out, "Adding %s repo with URL: %s \n", stableRepository, stableRepositoryURL) + c := repo.Entry{ + Name: stableRepository, + URL: stableRepositoryURL, + Cache: cacheFile, + } + r, err := repo.NewChartRepository(&c, getter.All(settings)) + if err != nil { + return nil, err + } + + if skipRefresh { + return &c, nil + } + + // In this case, the cacheFile is always absolute. So passing empty string + // is safe. + if err := r.DownloadIndexFile(""); err != nil { + return nil, fmt.Errorf("Looks like %q is not a valid chart repository or cannot be reached: %s", stableRepositoryURL, err.Error()) + } + + return &c, nil +} + +func initLocalRepo(indexFile, cacheFile string, home helmpath.Home, out io.Writer, settings helm_env.EnvSettings, localRepositoryURL string) (*repo.Entry, error) { + if fi, err := os.Stat(indexFile); err != nil { + fmt.Fprintf(out, "Adding %s repo with URL: %s \n", LocalRepository, localRepositoryURL) + i := repo.NewIndexFile() + if err := i.WriteFile(indexFile, 0644); err != nil { + return nil, err + } + + //TODO: take this out and replace with helm update functionality + if err := createLink(indexFile, cacheFile, home); err != nil { + return nil, err + } + } else if fi.IsDir() { + return nil, fmt.Errorf("%s must be a file, not a directory", indexFile) + } + + return &repo.Entry{ + Name: LocalRepository, + URL: localRepositoryURL, + Cache: cacheFile, + }, nil +} + +func ensureRepoFileFormat(file string, out io.Writer) error { + r, err := repo.LoadRepositoriesFile(file) + if err == repo.ErrRepoOutOfDate { + fmt.Fprintln(out, "Updating repository file format...") + if err := r.WriteFile(file, 0644); err != nil { + return err + } + } + + return nil +} diff --git a/cmd/helm/installer/init_test.go b/cmd/helm/installer/init_test.go new file mode 100644 index 00000000000..1d53687e64d --- /dev/null +++ b/cmd/helm/installer/init_test.go @@ -0,0 +1,120 @@ +/* +Copyright The Helm Authors. + +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 installer // import "k8s.io/helm/cmd/helm/installer" + +import ( + "bytes" + "io/ioutil" + "os" + "testing" + + helm_env "k8s.io/helm/pkg/helm/environment" + "k8s.io/helm/pkg/helm/helmpath" +) + +func TestInitialize(t *testing.T) { + home, err := ioutil.TempDir("", "helm_home") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(home) + + b := bytes.NewBuffer(nil) + hh := helmpath.Home(home) + + settings := helm_env.EnvSettings{ + Home: hh, + } + stableRepositoryURL := "https://kubernetes-charts.storage.googleapis.com" + localRepositoryURL := "http://127.0.0.1:8879/charts" + + if err := Initialize(hh, b, false, settings, stableRepositoryURL, localRepositoryURL); err != nil { + t.Error(err) + } + + expectedDirs := []string{hh.String(), hh.Repository(), hh.Cache(), hh.LocalRepository()} + for _, dir := range expectedDirs { + if fi, err := os.Stat(dir); err != nil { + t.Errorf("%s", err) + } else if !fi.IsDir() { + t.Errorf("%s is not a directory", fi) + } + } + + if fi, err := os.Stat(hh.RepositoryFile()); err != nil { + t.Error(err) + } else if fi.IsDir() { + t.Errorf("%s should not be a directory", fi) + } + + if fi, err := os.Stat(hh.LocalRepository(LocalRepositoryIndexFile)); err != nil { + t.Errorf("%s", err) + } else if fi.IsDir() { + t.Errorf("%s should not be a directory", fi) + } +} + +func TestEnsureHome(t *testing.T) { + home, err := ioutil.TempDir("", "helm_home") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(home) + + b := bytes.NewBuffer(nil) + hh := helmpath.Home(home) + + settings := helm_env.EnvSettings{ + Home: hh, + } + stableRepositoryURL := "https://kubernetes-charts.storage.googleapis.com" + localRepositoryURL := "http://127.0.0.1:8879/charts" + + if err := ensureDirectories(hh, b); err != nil { + t.Error(err) + } + if err := ensureDefaultRepos(hh, b, false, settings, stableRepositoryURL, localRepositoryURL); err != nil { + t.Error(err) + } + if err := ensureDefaultRepos(hh, b, true, settings, stableRepositoryURL, localRepositoryURL); err != nil { + t.Error(err) + } + if err := ensureRepoFileFormat(hh.RepositoryFile(), b); err != nil { + t.Error(err) + } + + expectedDirs := []string{hh.String(), hh.Repository(), hh.Cache(), hh.LocalRepository()} + for _, dir := range expectedDirs { + if fi, err := os.Stat(dir); err != nil { + t.Errorf("%s", err) + } else if !fi.IsDir() { + t.Errorf("%s is not a directory", fi) + } + } + + if fi, err := os.Stat(hh.RepositoryFile()); err != nil { + t.Error(err) + } else if fi.IsDir() { + t.Errorf("%s should not be a directory", fi) + } + + if fi, err := os.Stat(hh.LocalRepository(LocalRepositoryIndexFile)); err != nil { + t.Errorf("%s", err) + } else if fi.IsDir() { + t.Errorf("%s should not be a directory", fi) + } +} diff --git a/cmd/helm/init_unix.go b/cmd/helm/installer/init_unix.go similarity index 92% rename from cmd/helm/init_unix.go rename to cmd/helm/installer/init_unix.go index bf61f19251f..d7f15a1c246 100644 --- a/cmd/helm/init_unix.go +++ b/cmd/helm/installer/init_unix.go @@ -16,7 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package main +package installer // import "k8s.io/helm/cmd/helm/installer" import ( "os" diff --git a/cmd/helm/init_windows.go b/cmd/helm/installer/init_windows.go similarity index 92% rename from cmd/helm/init_windows.go rename to cmd/helm/installer/init_windows.go index 447044bbac9..48c56e28860 100644 --- a/cmd/helm/init_windows.go +++ b/cmd/helm/installer/init_windows.go @@ -16,7 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package main +package installer // import "k8s.io/helm/cmd/helm/installer" import ( "os" diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 42d242b8399..2628b7f2f7c 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -24,6 +24,7 @@ import ( "github.com/spf13/cobra" + "k8s.io/helm/cmd/helm/installer" "k8s.io/helm/pkg/getter" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/repo" @@ -99,7 +100,7 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho wg.Add(1) go func(re *repo.ChartRepository) { defer wg.Done() - if re.Config.Name == localRepository { + if re.Config.Name == installer.LocalRepository { mu.Lock() fmt.Fprintf(out, "...Skip %s chart repository\n", re.Config.Name) mu.Unlock() From ea1bd7e1637b2573a2f418ef607fd3a671293cd9 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Wed, 6 Mar 2019 17:27:15 +0000 Subject: [PATCH 395/483] Update dependency build doc to improve understanding (#5379) Signed-off-by: Martin Hickey --- cmd/helm/dependency_build.go | 8 ++++---- docs/helm/helm_dependency_build.md | 9 ++++----- docs/man/man1/helm_dependency_build.1 | 9 ++++----- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/cmd/helm/dependency_build.go b/cmd/helm/dependency_build.go index 3af3c124393..64a80f3bda0 100644 --- a/cmd/helm/dependency_build.go +++ b/cmd/helm/dependency_build.go @@ -29,11 +29,11 @@ const dependencyBuildDesc = ` Build out the charts/ directory from the requirements.lock file. Build is used to reconstruct a chart's dependencies to the state specified in -the lock file. This will not re-negotiate dependencies, as 'helm dependency update' -does. +the lock file. -If no lock file is found, 'helm dependency build' will mirror the behavior -of 'helm dependency update'. +If no lock file is found, 'helm dependency build' will mirror the behavior of +the 'helm dependency update' command. This means it will update the on-disk +dependencies to mirror the requirements.yaml file and generate a lock file. ` type dependencyBuildCmd struct { diff --git a/docs/helm/helm_dependency_build.md b/docs/helm/helm_dependency_build.md index fba70f2ec76..1df32d9abc1 100644 --- a/docs/helm/helm_dependency_build.md +++ b/docs/helm/helm_dependency_build.md @@ -8,12 +8,11 @@ rebuild the charts/ directory based on the requirements.lock file Build out the charts/ directory from the requirements.lock file. Build is used to reconstruct a chart's dependencies to the state specified in -the lock file. This will not re-negotiate dependencies, as 'helm dependency update' -does. - -If no lock file is found, 'helm dependency build' will mirror the behavior -of 'helm dependency update'. +the lock file. +If no lock file is found, 'helm dependency build' will mirror the behavior of +the 'helm dependency update' command. This means it will update the on-disk +dependencies to mirror the requirements.yaml file and generate a lock file. ``` helm dependency build [flags] CHART diff --git a/docs/man/man1/helm_dependency_build.1 b/docs/man/man1/helm_dependency_build.1 index adc225a815b..ef92e895900 100644 --- a/docs/man/man1/helm_dependency_build.1 +++ b/docs/man/man1/helm_dependency_build.1 @@ -19,13 +19,12 @@ Build out the charts/ directory from the requirements.lock file. .PP Build is used to reconstruct a chart's dependencies to the state specified in -the lock file. This will not re\-negotiate dependencies, as 'helm dependency update' -does. +the lock file. .PP -If no lock file is found, 'helm dependency build' will mirror the behavior -of 'helm dependency update'. - +If no lock file is found, 'helm dependency build' will mirror the behavior of +the 'helm dependency update' command. This means it will update the on-disk +dependencies to mirror the requirements.yaml file and generate a lock file. .SH OPTIONS .PP From 3c86f112e246f3dcf8e5f550c78edbb297d24073 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 6 Mar 2019 17:39:51 -0800 Subject: [PATCH 396/483] restore klog flags (#5411) Signed-off-by: Matthew Fisher --- cmd/tiller/tiller.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index 478ca92f41a..a1141b591f2 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -36,6 +36,7 @@ import ( "google.golang.org/grpc/health" healthpb "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/keepalive" + "k8s.io/klog" // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" @@ -100,6 +101,7 @@ var ( ) func main() { + klog.InitFlags(nil) // TODO: use spf13/cobra for tiller instead of flags flag.Parse() From 29264c5765dd77e7270d4c41ce2e48e43b9408c4 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Wed, 6 Mar 2019 17:43:56 -0800 Subject: [PATCH 397/483] disable AppVeyor for branches other than master This should disable AppVeyor from running against dev-v3 PRs. Signed-off-by: Matthew Fisher --- .appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 40d02927dfe..4fe8ae6e596 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,4 +1,7 @@ version: "{build}" +branches: + only: + - master clone_folder: c:\go\src\k8s.io\helm environment: GOPATH: c:\go From 367b6fc12122536633ff16c67bdd2304192100f5 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Thu, 7 Mar 2019 16:58:12 -0700 Subject: [PATCH 398/483] chore: Update sprig to 2.19.0 (#5390) Update to the latest Sprig version, which is a reversion of some of the functions added in 2.18. Signed-off-by: Matt Butcher --- glide.lock | 6 +++--- glide.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/glide.lock b/glide.lock index 792ef28cdb1..764424e9472 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 70f4fe304d0034fd077f122570adc6bb5f40ceee5f4f53d8930ba5ad700a911d -updated: 2019-02-12T13:10:08.039408-07:00 +hash: 3a24b27ab669b7bd977526dd455c5739fc2e2c14eace7dab92060ff1a39fd804 +updated: 2019-03-02T10:15:45.243405-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -184,7 +184,7 @@ imports: - name: github.com/Masterminds/semver version: 517734cc7d6470c0d07130e40fd40bdeb9bcd3fd - name: github.com/Masterminds/sprig - version: b1fe2752acccf8c3d7f8a1e7c75c7ae7d83a1975 + version: 9f8fceff796fb9f4e992cd2bece016be0121ab74 - name: github.com/Masterminds/vcs version: 3084677c2c188840777bff30054f2b553729d329 - name: github.com/mattn/go-runewidth diff --git a/glide.yaml b/glide.yaml index e482e23c268..c7d82319642 100644 --- a/glide.yaml +++ b/glide.yaml @@ -21,7 +21,7 @@ import: - package: github.com/imdario/mergo version: v0.3.5 - package: github.com/Masterminds/sprig - version: ^2.18.0 + version: ^2.19.0 - package: github.com/ghodss/yaml - package: github.com/Masterminds/semver version: ~1.3.1 From a9c10fe104302f19e0eda5cec5b2ca314991cff0 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Fri, 8 Mar 2019 17:46:30 -0500 Subject: [PATCH 399/483] pkg/chartutil: fix SaveDir for nested templates directories Signed-off-by: Joe Lanford --- pkg/chartutil/save.go | 6 ++++++ pkg/chartutil/save_test.go | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 400b85e91db..0482b1eb930 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -63,6 +63,12 @@ func SaveDir(c *chart.Chart, dest string) error { // Save templates for _, f := range c.Templates { n := filepath.Join(outdir, f.Name) + + d := filepath.Dir(n) + if err := os.MkdirAll(d, 0755); err != nil { + return err + } + if err := ioutil.WriteFile(n, f.Data, 0644); err != nil { return err } diff --git a/pkg/chartutil/save_test.go b/pkg/chartutil/save_test.go index 0ec305e7896..9952fbbb00a 100644 --- a/pkg/chartutil/save_test.go +++ b/pkg/chartutil/save_test.go @@ -48,6 +48,9 @@ func TestSave(t *testing.T) { Files: []*any.Any{ {TypeUrl: "scheherazade/shahryar.txt", Value: []byte("1,001 Nights")}, }, + Templates: []*chart.Template{ + {Name: "templates/scheherazade/shahryar.txt.tmpl", Data: []byte("{{ \"1,001 Nights\" }}")}, + }, } where, err := Save(c, tmp) @@ -75,6 +78,9 @@ func TestSave(t *testing.T) { if len(c2.Files) != 1 || c2.Files[0].TypeUrl != "scheherazade/shahryar.txt" { t.Fatal("Files data did not match") } + if len(c2.Templates) != 1 || c2.Templates[0].Name != "templates/scheherazade/shahryar.txt.tmpl" { + t.Fatal("Templates data did not match") + } } func TestSavePreservesTimestamps(t *testing.T) { @@ -100,6 +106,9 @@ func TestSavePreservesTimestamps(t *testing.T) { Files: []*any.Any{ {TypeUrl: "scheherazade/shahryar.txt", Value: []byte("1,001 Nights")}, }, + Templates: []*chart.Template{ + {Name: "templates/scheherazade/shahryar.txt.tmpl", Data: []byte("{{ \"1,001 Nights\" }}")}, + }, } where, err := Save(c, tmp) @@ -171,6 +180,9 @@ func TestSaveDir(t *testing.T) { Files: []*any.Any{ {TypeUrl: "scheherazade/shahryar.txt", Value: []byte("1,001 Nights")}, }, + Templates: []*chart.Template{ + {Name: "templates/scheherazade/shahryar.txt.tmpl", Data: []byte("{{ \"1,001 Nights\" }}")}, + }, } if err := SaveDir(c, tmp); err != nil { @@ -191,4 +203,7 @@ func TestSaveDir(t *testing.T) { if len(c2.Files) != 1 || c2.Files[0].TypeUrl != "scheherazade/shahryar.txt" { t.Fatal("Files data did not match") } + if len(c2.Templates) != 1 || c2.Templates[0].Name != "templates/scheherazade/shahryar.txt.tmpl" { + t.Fatal("Templates data did not match") + } } From b7b372f693eca152773989079148ec916d09b7c9 Mon Sep 17 00:00:00 2001 From: Luis Davim Date: Wed, 27 Feb 2019 15:19:51 +0000 Subject: [PATCH 400/483] Add app.kubernetes.io/version label Signed-off-by: Luis Davim --- cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml | 1 + cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml | 1 + .../testdata/testcharts/prerelease/templates/alpine-pod.yaml | 1 + docs/chart_template_guide/variables.md | 1 + docs/charts_hooks.md | 3 ++- docs/examples/alpine/templates/alpine-pod.yaml | 1 + docs/examples/nginx/templates/configmap.yaml | 1 + docs/examples/nginx/templates/deployment.yaml | 1 + docs/examples/nginx/templates/post-install-job.yaml | 1 + docs/examples/nginx/templates/pre-install-secret.yaml | 1 + docs/examples/nginx/templates/service-test.yaml | 1 + docs/examples/nginx/templates/service.yaml | 1 + pkg/chartutil/create.go | 4 ++++ pkg/lint/rules/testdata/albatross/templates/svc.yaml | 1 + 14 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml index b8ae22b6c38..fc0576d5a56 100644 --- a/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/alpine/templates/alpine-pod.yaml @@ -10,6 +10,7 @@ metadata: # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{.Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" values: {{.Values.test.Name}} diff --git a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml index f569d556ce8..564429dea03 100644 --- a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml @@ -10,6 +10,7 @@ metadata: # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{.Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: diff --git a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml index f569d556ce8..564429dea03 100644 --- a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml @@ -10,6 +10,7 @@ metadata: # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{.Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: diff --git a/docs/chart_template_guide/variables.md b/docs/chart_template_guide/variables.md index dda92559b05..984b9b4e554 100644 --- a/docs/chart_template_guide/variables.md +++ b/docs/chart_template_guide/variables.md @@ -114,6 +114,7 @@ metadata: # I cannot reference .Chart.Name, but I can do $.Chart.Name helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}" app.kubernetes.io/instance: "{{ $.Release.Name }}" + app.kubernetes.io/version: {{ .Chart.AppVersion }} app.kubernetes.io/managed-by: "{{ $.Release.Service }}" type: kubernetes.io/tls data: diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index 6d436402d15..3044414c328 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -76,7 +76,7 @@ hooks, the lifecycle is altered like this: 5. Tiller sorts hooks by weight (assigning a weight of 0 by default) and by name for those hooks with the same weight in ascending order. 6. Tiller then loads the hook with the lowest weight first (negative to positive) 7. Tiller waits until the hook is "Ready" (except for CRDs) -8. Tiller loads the resulting resources into Kubernetes. Note that if the `--wait` +8. Tiller loads the resulting resources into Kubernetes. Note that if the `--wait` flag is set, Tiller will wait until all resources are in a ready state and will not run the `post-install` hook until they are ready. 9. Tiller executes the `post-install` hook (loading hook resources) @@ -129,6 +129,7 @@ metadata: labels: app.kubernetes.io/managed-by: {{.Release.Service | quote }} app.kubernetes.io/instance: {{.Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: # This is what defines this resource as a hook. Without this line, the diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml index 1fc299b6d57..2b54811fdab 100644 --- a/docs/examples/alpine/templates/alpine-pod.yaml +++ b/docs/examples/alpine/templates/alpine-pod.yaml @@ -10,6 +10,7 @@ metadata: # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "alpine.name" . }} diff --git a/docs/examples/nginx/templates/configmap.yaml b/docs/examples/nginx/templates/configmap.yaml index 0141cbc698d..d479920241f 100644 --- a/docs/examples/nginx/templates/configmap.yaml +++ b/docs/examples/nginx/templates/configmap.yaml @@ -6,6 +6,7 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} data: diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml index 5bb30f9af3d..cc4d4ea850a 100644 --- a/docs/examples/nginx/templates/deployment.yaml +++ b/docs/examples/nginx/templates/deployment.yaml @@ -14,6 +14,7 @@ metadata: # to all of the Kubernetes resources that were created as part of that # release. app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml index 3562e6cf5bc..856782a4d28 100644 --- a/docs/examples/nginx/templates/post-install-job.yaml +++ b/docs/examples/nginx/templates/post-install-job.yaml @@ -10,6 +10,7 @@ metadata: # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} diff --git a/docs/examples/nginx/templates/pre-install-secret.yaml b/docs/examples/nginx/templates/pre-install-secret.yaml index 07a9504b5ff..40451800d48 100644 --- a/docs/examples/nginx/templates/pre-install-secret.yaml +++ b/docs/examples/nginx/templates/pre-install-secret.yaml @@ -7,6 +7,7 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} # This declares the resource to be a hook. By convention, we also name the diff --git a/docs/examples/nginx/templates/service-test.yaml b/docs/examples/nginx/templates/service-test.yaml index ffb37e9f4f2..867f077ee24 100644 --- a/docs/examples/nginx/templates/service-test.yaml +++ b/docs/examples/nginx/templates/service-test.yaml @@ -5,6 +5,7 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} annotations: diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml index a12cb0982d4..e8eb8e51e7d 100644 --- a/docs/examples/nginx/templates/service.yaml +++ b/docs/examples/nginx/templates/service.yaml @@ -10,6 +10,7 @@ metadata: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} name: {{ template "nginx.fullname" . }} spec: # Provides options for the service so chart users have the full choice diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 9af4b8f4582..415e6f97b8c 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -137,6 +137,7 @@ metadata: app.kubernetes.io/name: {{ include ".name" . }} helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- with .Values.ingress.annotations }} annotations: @@ -176,6 +177,7 @@ metadata: app.kubernetes.io/name: {{ include ".name" . }} helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} app.kubernetes.io/managed-by: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} @@ -229,6 +231,7 @@ metadata: app.kubernetes.io/name: {{ include ".name" . }} helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} app.kubernetes.io/managed-by: {{ .Release.Service }} spec: type: {{ .Values.service.type }} @@ -307,6 +310,7 @@ metadata: app.kubernetes.io/name: {{ include ".name" . }} helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} app.kubernetes.io/managed-by: {{ .Release.Service }} annotations: "helm.sh/hook": test-success diff --git a/pkg/lint/rules/testdata/albatross/templates/svc.yaml b/pkg/lint/rules/testdata/albatross/templates/svc.yaml index aea11d83325..a976b4fddea 100644 --- a/pkg/lint/rules/testdata/albatross/templates/svc.yaml +++ b/pkg/lint/rules/testdata/albatross/templates/svc.yaml @@ -7,6 +7,7 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" kubeVersion: {{ .Capabilities.KubeVersion.Major }} tillerVersion: {{ .Capabilities.TillerVersion }} From 4fec4b67661b7cc48b8ed1f1c5827a255c74db75 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Sat, 9 Mar 2019 22:28:36 -0500 Subject: [PATCH 401/483] Fix debug printouts for zsh completion Cobra provides some out-of-the-box debugging for bash completion. To use it, one must set the variable BASH_COMP_DEBUG_FILE to some file where the debug output will be written. Many of the debug printouts indicate the current method name; they do so by using bash's ${FUNCNAME[0]} variable. This variable is different in zsh. To obtain the current method name in zsh we must use ${funcstack[1]}. This commit adds the proper sed modification to convert from bash to zsh. Signed-off-by: Marc Khouzam --- cmd/helm/completion.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index 3c031894114..962f06e3bcb 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -213,6 +213,7 @@ __helm_convert_bash_to_zsh() { -e "s/${LWORD}declare${RWORD}/__helm_declare/g" \ -e "s/\\\$(type${RWORD}/\$(__helm_type/g" \ -e 's/aliashash\["\(.\{1,\}\)"\]/aliashash[\1]/g' \ + -e 's/FUNCNAME\[0\]/funcstack[1]/g' \ <<'BASH_COMPLETION_EOF' ` out.Write([]byte(zshInitialization)) From 9cc6902875135a26c5edb2fecb08f39d9eeb2dd6 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Sun, 10 Mar 2019 00:22:08 -0500 Subject: [PATCH 402/483] Must use index 0 for funcstack Normally zsh arrays start at index 1 but when emulating other shells this may change. During completion, we run the command emulate -L sh which affects the indexing of zsh arrays to make it start at 0. Consequently, when replacing FUNCNAME by funcstack, we should not change the index. Signed-off-by: Marc Khouzam --- cmd/helm/completion.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/completion.go b/cmd/helm/completion.go index 962f06e3bcb..039dcbe5f9c 100644 --- a/cmd/helm/completion.go +++ b/cmd/helm/completion.go @@ -213,7 +213,7 @@ __helm_convert_bash_to_zsh() { -e "s/${LWORD}declare${RWORD}/__helm_declare/g" \ -e "s/\\\$(type${RWORD}/\$(__helm_type/g" \ -e 's/aliashash\["\(.\{1,\}\)"\]/aliashash[\1]/g' \ - -e 's/FUNCNAME\[0\]/funcstack[1]/g' \ + -e 's/FUNCNAME/funcstack/g' \ <<'BASH_COMPLETION_EOF' ` out.Write([]byte(zshInitialization)) From 528dc95521674baeb1a61d43d9a1c5378ddba80f Mon Sep 17 00:00:00 2001 From: tariqibrahim Date: Sun, 10 Mar 2019 03:11:30 -0700 Subject: [PATCH 403/483] update docker version and golang image version in helm Signed-off-by: tariqibrahim --- .circleci/config.yml | 4 ++-- Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 96f53ee402d..c83ee10cf17 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,13 +4,13 @@ jobs: working_directory: /go/src/k8s.io/helm parallelism: 3 docker: - - image: golang:1.11 + - image: golang:1.12 environment: PROJECT_NAME: "kubernetes-helm" steps: - checkout - setup_remote_docker: - version: 17.09.0-ce + version: 18.06.0-ce - restore_cache: keys: - glide-{{ checksum "glide.yaml" }}-{{ checksum "glide.lock" }} diff --git a/Makefile b/Makefile index 0677cafe4d2..ea7dd5fb75d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm -DEV_IMAGE ?= golang:1.11 +DEV_IMAGE ?= golang:1.12 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 From b480badd05ad01006363763c92b5394cdc5fc9c4 Mon Sep 17 00:00:00 2001 From: Jens Frank Date: Tue, 12 Mar 2019 00:11:26 +0100 Subject: [PATCH 404/483] Fix "helm init" parameters In the quickstart guide, --max-history is recommended as parameter for helm init. The actual name of the parameter is --history-max. Signed-off-by: Jens Frank --- docs/quickstart.md | 4 ++-- docs/rbac.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index d7f2e3b914b..6e760ced80c 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -54,10 +54,10 @@ Once you have Helm ready, you can initialize the local CLI and also install Tiller into your Kubernetes cluster in one step: ```console -$ helm init --max-history 200 +$ helm init --history-max 200 ``` -**TIP:** Setting `--max-history` on helm init is recommended as configmaps and other objects in helm history can grow large in number if not purged by max limit. Without a max history set the history is kept indefinitely, leaving a large number of records for helm and tiller to maintain. +**TIP:** Setting `--history-max` on helm init is recommended as configmaps and other objects in helm history can grow large in number if not purged by max limit. Without a max history set the history is kept indefinitely, leaving a large number of records for helm and tiller to maintain. This will install Tiller into the Kubernetes cluster you saw with `kubectl config current-context`. diff --git a/docs/rbac.md b/docs/rbac.md index 45371cda86e..d53edda49dc 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -43,7 +43,7 @@ _Note: The cluster-admin role is created by default in a Kubernetes cluster, so $ kubectl create -f rbac-config.yaml serviceaccount "tiller" created clusterrolebinding "tiller" created -$ helm init --service-account tiller --max-history 200 +$ helm init --service-account tiller --history-max 200 ``` ### Example: Deploy Tiller in a namespace, restricted to deploying resources only in that namespace From f2a83630efdd289a8d45581364d6a27e81b93ad1 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 12 Mar 2019 08:05:23 -0700 Subject: [PATCH 405/483] remove appveyor Signed-off-by: Matthew Fisher --- .appveyor.yml | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 4fe8ae6e596..00000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: "{build}" -branches: - only: - - master -clone_folder: c:\go\src\k8s.io\helm -environment: - GOPATH: c:\go - PATH: c:\ProgramData\bin;$(PATH) -install: - - ps: iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/fishworks/gofish/master/scripts/install.ps1')) - - gofish init - - gofish install glide - - glide install --strip-vendor -cache: - - vendor -> glide.lock -build: "off" -deploy: "off" -test_script: - - go build .\cmd\... - - go test .\... From a52b4b915df10f24b11774830738094cfbeacdd9 Mon Sep 17 00:00:00 2001 From: robertavram Date: Fri, 15 Mar 2019 12:19:36 -0400 Subject: [PATCH 406/483] update outdated docs image for google storage permissions Signed-off-by: robertavram --- docs/images/make-bucket-public.png | Bin 15768 -> 54186 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/make-bucket-public.png b/docs/images/make-bucket-public.png index f8a5e17f02b62f312325975638ea9bcaa2d7cb9e..e457e34b23adcb6f974c9035db63c1f2cc7f4293 100644 GIT binary patch literal 54186 zcmb4rWn5HU)UOJX($d`^B`q!80)li1NJ)2t^w0_jNJ`fbLpK5g$k5#_J%n^~&-lFW z{e15i@i#Lk_C9N`z5cOIr20E~EDSP?Cr_SWDJsakfARz==gE_&K4>VwCp%)sM^B#6 zJW-U9)bh%JXQFz2_%I!=laL-tPryWOe$8J9at zeqpRGgZzEjH{z|2!^5^we>)W?dT0V}*QNM~|6x-RyktaZ71zf9&IJudo9B@&HWT)BHR=VT- z%HxA4xqw}&6(d#r!cWN%c++;)!j9v+zBo!9eP+ZBL0IX5JDdGES)$48d^7P*WT>ON zx!!((sUC~s%_z3`)yIZ3Y-;hv86)Q&LQd_q{mPE|j)(Kg$a}qqj>p>$Le7IJ9h18K zik9Jujt8Fw&lUdz;L7zHd2(~RMcEFhR9-*DPJYuz`a^mVgQ#!2TwWN_)YAI1pB->x z)3OmK0_O_6j;3___0;32?Q$N3M=xp;K^@>F^+wQccC-U;1}yP-cWOVJAryJme+22H zvb{a(=)fX*{cC0@jep?bqM>6hR&aS|S2a_3YR1IxZ%_S#L(3dvilG@M5xaUAVy>Zb zs<740kd$%bar>9KmKyKhSHBO?C7zDh{DY$nJ&t^^Y-((rb#ZY48@KsPSDHu+{Qj-G zOEEPxnj>xW@$dD+?NNE)*8#mjPcKF`9(-E_n#geJMO0g>8Ug|l^=~ElXMl3EIM6gwJf`M@ta~t^G7xDYbcqZ z1AN1z3A^#`WMJu}c{ACd`H5_X`1zz}Rs;|RLn4I#mYsmMS+lDYXzyoL)utJ@Ahoh{QCNOy2420v6tWDaItB++CsTuCjn)8q}~74Crxn4Es?{par9!= z9H)V${e0TMVHXM`2@`$Nr~6}oefvvmtLUS{e65WXR2=xt#V;hBE1qk^Rxb$VYB44^ z4H1V6hhM~5v)k_aidCk2a?4Zm4~&$v&V7{k^9qTlD73LtQ!p7`?T=8tnHWamwWVT> zJi=i$GDO^l|77y|5E+XTsZJ~NJ=hECPjvZy(fFDZXVDf<|8ga;!^r=9s$IUykZxSq z^U$ucFVZi= z1;)zx)z#J2$d0FiSJx5At_JjVQ*_PHl%3T9`lZY%wf^~l!&0-mk$U10DX-<#&Fez~ z(^%z`tG^pdW-u>}P=1RrHb(_&;!nsPvKDN>T!S5@ie4Xy2uEI{Y3MOXh2efc>9SpJ z_2x{))!U5Brx_3a+Ok(#ws@Z8oY+{oely?V>3F*ug5#&cbXcW}Ldw?9$JyAmt~79^ z4vsXigM_uTQn`&vvSngItiJuNS59VE)a4I}W(&TK;T=A<09VII_dHMiDYxQ(nHeo6 zW0Q0&VyKMU?vZ z`vf=zvjV1p7xRHw2a(Ioq~G?j9`P?jqR_ZrMFS~4SLx#(A^4}rLG8pVBX``O#vUF{ zp0{6efONsgo`d$5J+mmwr}S~zG=kEuti1lj0!q%=h>ZIzlvTswa?y3<`*0ZUmZ9Ve zdTWCQhl2r-P(3XJJaDNWux)@!LoW%Ay&8<6xggR)nGOD3*R^l@8#Af`T2Jl~n>K@S);-ChFy8U|vU^}t`g zO_Nj6LIKte)Q1@~a$*>T*jhDi(T@Dw-$uh|JPm1OV&&UPHwg-Z@cyN|RK(UisnE5U zq2fu0r!Njte?}Kp+=}=PmmCQ{M+!vte9VlP({SgTMY)Rgl=cjjVM=4W^{0=8AW6Rn z=en}sjk%QTcf?%A@G;NsS^?ll8QIY5azbY#I~K%h;75TnQ$uIchz7lGt@Srd zZuVeXdJ-X&eb(L3tfk$FqFair#?pF+rTOhm=;z-;XteRO=HBbj$SF(bo~}qt`xcJ_ zyPeUTi%CtjIl&b_^F(H~i-SKlm2DT*t|MYI9!u^z+0?Z>bZPr<7g4wu@)Z-mUjTCn zu{jy!9hn6-;q_%+jewh7=Et+6l@%)gGYye_aE+F#*trIvqFK z=;PhC#B`Ysm+yKcv#3d<++Wjcpq9F{#}PaGdNjcOJ(7=t{dW?h1)>5I1y-X6kQ*3~ zcREq2;YU=<{1H?>#g*m@b5_|0w-_3f{}o;!HbW;i+el~v$emy;(w$&NGY&IZ9ZJ0M zN-@O(%9sleLZxyF>iaa`dGOtM#lWGd$H>dsw#O_g+HN43V@WmH^&2+z1^NOSvX-GC zd|PHRfoXwcp}%QBxeq2omy7T04Q!uGy=}>;3l)v)7)O~~sW5!lv*_Z&-*{3WRq|Gw z;WryGGNhw_Z-D!pWi85B*B$|is~LxugL0kEQ=O7LODTErP z3)n9zUBlQauLOp>XO(^8??nuh*>yZ>n89nd12^?`v(Yk0i)b!iJslrk9Sto!BSSNl%=f=4vlLlft4r@ z9rqqnBpRF6D#f^FA=OM$=w%!5xtfDNiE18#2JByBp0+(c+#ZycRp{I57(-ce5pm}Z zQOpupu;V4?v;KO}dOCc#6+M8DXN?!!0mp^t~=kOHbH0OaYRt~+p$!19|L!8Fp?$aPrm&;j`a1%FM>2xzqE;lE3KP= z$lW~wB7w0Y6MF_Is~1I-kaA81gbC-Fv;A_(=u0zFnM8D10UuBuGUZy)mx_5dZhUBX)q?I)65J%V~jK-4~onoX$Q=bkyzCK>^Txq)M#cHa~&8%fH0CHA3lh?kCku6>t zR0VC+S;=iN;QprkwP@%i))BYxyRhO{W-_3cQj?<7+My>2=-E4t$&lQ?gEL9n;(to2 zHEfDheykssFlRUgW7f==1TN(*J=2Co6}qEa5YhckZiprR+vvOjuV^`}HjfkP?Vh3c ziFiS}&UKI%FFs#h0FQs3d`@iS_Kn)NkJ59N$``&iKq>5YY@WC4^n%FXgrv~u>Ech^ z@eov;cQOp0uCF%YO=#n3OS#NHvSC^%&AA-T3y+inyIS2w`|V-P>9EKMXWQBP_;IR& z){6+-{dAHxN-0p9yewDHROBd)XktnT2^MD>VS!0vC*>t@zvnE0$h`Bw%-R9qVc8&h zvohBfV;|4Fk?MH^eO#XC&eH$@LH&at@v%*Z&HG@rY;h{a*YN0D4k9I=WD)nhKhtA0 zUm!jx``bVeSpny~$JoVv8TnVBY#{r?Yi4WNK6GH32|IlwW>HNK;XA(Jmn;qq@uDZc zmE;>7SB$mQH8!Es`Bp|~8vaSlqSFzKFUP_bK6{%LHKXUgCSxzA!~GFU#(x6ICSX!g z&~?R&k~uA7!Kx6t8^K%MKATWeyR)RyIQddV@y6+=k?%p>;bHW`0T5$0+u4EbO8^3F zKLWzk&MM2hFq?QR>cjVIv2ym0_}aScg~$v_?;?aGIv#Fp<9C#wFcii=UGy>WT6<3Y z7`edZgxwp-Bkm5Lg|x@r(fyi%1`pjA+F3j&1hP*G0&)gC-d_?{WM3jlULOy$#?!}( zR%g^nflbT^n<~+11=v5(O5wSPp7QTDSz)Wld_;?@5(d4F-k}GJnp5FLeW}8h;xpv> zSPm^uc1~%e<_>Vp_P_Y+EsR$HQdzWBL~UT04r2)dsa`ODMKXU!N(`IiM4JQ9;4l)y z)Ag@+1f9uzBza`2%x5e$_drGMMr`yk;5{mb-=3!{DPfmZa8jbBV;Ln6d}&|Vk{7eLYj&-gdbv8q56{v2&Xz!y7~>9kQCLI z!X^Wl7$6;7$_6PdepX6>( z@Uew3RUZLizm-dnqWz4>nLRhj`G=&Rb2&)PxVEtd--rm4F}T8hp}rmgmoPc{LY;Z@ z2OiF_&6gOy;^uy}CFB2`l(GrH=>2V}tLiL^VYLSZK_SX|+KlVo(wk9fobuN?JEc1- z9UTTb03I{6d8#Dds9m9W*a)QmEdL9=_-FCk8s5hherIFy1ja(P-D$12JxppI^NIj{ zk@>^IVULkk#-8?-LOI1+)H!xE#i@z*^m7kYNjU!4ckZucBB*re&f!kdwdG2D5X#Qq z4>CDD{6smCzg}p3+&$kU>*mSD(~w)GfwFbQ{KQ225KR7DM?aKxm#30B`JM4(%+iYm zg?RJ1-sofqU+X6!)a@+_!h-HPNbLRZM@dx5KYe)c;#_YDyl;bnQG_qQ8SAlG@7R5W zmykUL2JjKcR<)Y%gnCvUTQUFsTFaC&SgoCScWTpxcG18I?r$-%J9!D7htmLb&y(P< zDMVbAt4aoVcGBu6=rY^gF>+5|4A6>&nz_(~)4;FZy%V(C@G_ns^Pbd=c&#GdS316y z-b(lC$LDb8(m^hzFZAr0zZx}zN%4fU58wuKOM)+_*2E3TlN~R|!`P%X*rJa~Bv=n>#yY*YR-oljtm_b-AYq zioXHlNEWgP!s6d50y7ed%TJ0xps~;JdQf#}do|ai^cV8HTw^s-%tCD}z}fKbMl~6* zPaUGZhCpZ#m-$9h8eBE5^?p;6H0K}nr7`iZxb|YG|A)vw<9wb&r=1oteUZ0S{1Q<% zU}+Qgy#=u#26>L1Jg{?@kGOR4Qs`xSYl@78ItQK<*faG-dSq$h_8-I%G6$ia;zt4V zPo%)u{{Zr6v%76NpUpUihRJ`G{;JW4NVaDO?sv(c$WYu5Qm0!(93mnM0T0(!`=dD_ zKnNgg70-H#K6sx`?R1~)AxAlSb#@CbXrcU%L8Geu?qj%M3j_9a*W!His? zAG!5@ae(v?aY}_1vm@^KRago>b<-vSdDO+n#JpJg0O>_klBLhv^8bxDl=byDV0M7- z0UAQ)|A84~d9A@nbLW<-9qcse7YftoY))61N)HSS z)O2-q>GR_GvlE^2q)G&~1Ese?KtOwCkxJt-lWN+PIH;&J^yD4D6`dwT08A;D`856P z-ek$fWsu+3%4YZdn>LyeZ6>7|;w03W#abIp1ckNYdr}Wcwx^l2fh7nVrtd-i8#{k& zEr3<-o7dOZ2miB z{WD*vnr`X3J?#Dsdj7NvQzLHFcJyaZWszYi1{80z&29HRv7hAGH~AAD_dPA*EH|RB zD~KBRbg@90c*W6w8E4B|=Gf(^UmhsVXLMPn^Q*DcFPo@_DZ!8oPjkZD&T=8YVrevA z;nysVhom!&K(SHzfjRiUo8Esb`3fr#nfVzH-$y+;h zT17EUp9JKDjaeEdV2fy>>*Ag$QuEa45(2``8bG>r05vu)?6$LNLxV9F;a@iHpL9C% zgSU^$`wyN3^~@7L`nL!UwSnpVG=jpo2UtpUJX!Ik__9~q#j^Zw^}?zxvz;ng4E6?W zE88qJ3sn@8oMkUXexzyFYisvawbOwRl-=!KS*78qj+Svf(fK$`*j=iP;lRm0$M}8y z=4LF9g@}#ZzRMKJ}nqiMtYbvkFWDMnD;hMk$b(47DPri$M;pb zJ2U)ry(d~stX(=U!>!9F^quvhYdb(W%>wMH807`Ci60Zd`~lR+$z~Ooc0IRw?<`oa zMwH8LBh~wK%X?n;M4^QaA|su>zpbwaz~*Woe0+UstVZgIIP@E7w)JNbGnn=gs_xW; zH7z8J0uXi^7V)-c0C*AO>Z1;9rSv=Q3>c#5=C8@JWf~cCu@ni8_8k$fKg~G}S~2ug z2=QkzITYHK-l-ZCM&1AzFoG^H-M)n?+k$%gWadi1?NHeH?{D-*$gckVn{@)`JZN3& zacGhO5pmQNnKw#pSj#BdTQ?M;%p>?CTE*M&zM62j|+8yybc;eE}fj53$_Hpnib>Vmcfqou*B@n6sk3 z1!NNVcOB!uz5KfwK6@qg1Dq|h2&EvJtNr*4mlY_Gv$nsTjusa|+5r$UXH%596?;Hz z;x|S<%lF&&Y{#@H!zHTaW#DlqD(6<0kPu2vCc8r8GED-mUXDgQ=xq|s-EWgB9|)yR zU-71$KR&n*?dxl%85r1AS0NDK1tcUkVa*6&+e3K`U+D;3*N+o9e6s+QF9>3}t}_Ic zS@^}x`Tq9hBk*Be2Y~T7)d7eXAaZxyeeVab%vG4iCvWu-*|p%-a>xn)f1(~mhfPP@Cvy+dGct9rrgXr{4ajDR*#1)m&?d$o$!b}+L z=DT@A3HMZ<{KNO*@JC?I8-Hz!A~?59_i4T5oD%?%Uf1+N{@el&;;a>$lm~hwL5Z%L zjG*gp*CMD}DZDxLnEQ@O*sVA^Bk`SZKY1g-d7Q|3RCUn`SihzAS`G35icO#H)bP8(AG`-Z z$^=N8=6}M+G_wrhGfcrQX&kZ1iuRkL2S#=0*Fbqv?KNbyvpA6t&vPaRL9bbmF6 z%kBYa!EMbCL7*%!-zIJE^`E=gg9@r*Eh@gP==#o~4(K)p)JJ@joI>B;qH^}v<%I+! zpvs_1Z2{=n6LU`Na&dza!;ObV6gM^}WA34s+|kSGX>ho&G$}nzlQuHpVLE~@ZyBt1 ztipGR#}%UvxXQ`&-ue+B;r#sJ?sVinfH_58mBRq`WUSwt3&3*=pUcV(YfYVHevg$v z>d#No9or!$0oOf7eyl5i+O*swwqc4Fj9|7grw}|#-wd5G-b!c4m+DQgapAR40#W|} zdOp0J$fdVPI)Kbvz-yamXFbC+s(?PaH!xm`Hmc!-{kHvYemhcg7K-fAa+7n_KaiN6h4g zwu|`z@@+Kf3sXvmule#Dq!19vY9m65Fp{`j_H`tF0-_xb`6)$Vx+VktXw+r#?G&3_ zU=TpR+zTEH_DjN(_4Wo0AUbu(u|va>$1<+G^@l$KWQ;K@(hM}S&UG?XIy$2nQD_#_ zy_Y~@Kv5>P2rj1UK%)#rTStb-dPlgl11Q2!%dFGfB=kilHrhKFaT!fAd`MtnP*!X+ z<^!KhysY0hsxFW@D{*Lt>>@~~C!Es&7Vo3D+=RU+GIM`ABGE!qv|K&XJgK~BU2=-1 z0)`nlw$&LFK(ybR?B+}UJfWcb(i8v-+h}qGX=RCxo87Tf3W4tZFPCQa-%tvP*Sq500kK{wRsj`7!sYb!qTdfoq%% zmR$<8OOT&B(;c?99W24Ws+hL5DFBLgNuxjf_4O!Q{PM z`%NG3HseI{#_401EzRILnN0O}F*Q@{sjo#}<3CQ}Oj{zed86;|yje9yVJj=&F7E#? z2EphheDCl;Xwr)>ASbK6#NZrV8|XG?@1}=)%q8HkXO_q1Cu<>ipf9KSQ~cE&IO#b<0C@b6b&A9 zM9vLZ8bLGl#_y>zkQSvLxc=7*FxJoOJjmU5#oKjmcHVZ>ek;n=SgCo~sC`ONr9$e` zvGekm1*M=>FWjuDF!6bV=gF|H6;#AwYwaQ8WXqFeKq+mKbPstZOVkojBL3CfbO)gX z?;0zdH+p}Vz8hWr96j(#DjZ^~Yj1sK7D@jGYnq>|k1qjoMf2X;a03M-iw=pp`a~ra zTs4YYI2K)%W2zQHCMmm-Dkm-#=^PnTB#mqyl-n8CLL2Kc9BV<~{N+QUBiZcOFHWEm z32{RoCIFY`tLCNiDUh3nJjb9l(vZ&Bmp%*oBJ{;c&TcJN5h>eTG5VvhB(nDNMND>s zMbyP)=l%SeFV)>sBx}K|a-UWUBU_krvz|yT62m~}Xk$j6OHT%AX%NHpskixMN~HYL*!9jR9J_zIsSP9ImL~`dIKuWIu0L@6({o$<1r= z__JVN8PhyATX`%pjO z?F3Ys$^aPtw+;)nLe1W2j#a8uorRakf>qvzxs&qjBfvPw8FZ+(~nWF% zY5vN8sk{z7a#ZQ7oocCSsEruOC5d7Ahx%OMYyZz#l;@X!1zgN3jJ*BW7INJSjRKau zTCRWmC>xYzpJGq8Br+NJe0scpYInre3$AT{rJ%+(WDD7A{I{5Tw2-AhSp8NKRttBL zO&62q1_mojHKNQBe_k#Wb=MqFTcudS4~e&Db?9sCPp5x)ER~d(+t;{x+71mWxI3dt z%X2kE7^hn)rx4GTpbFF^UO2ArZ?nIuZZXNQH!s}Oi+4DO7xFI5ThS-a|5PI;GvXv( z7VL3&(-!M)eH~$YvTo5c{aDwOWqF%S>M;f3C^v`@W=k6Pl}?#Gb{47^<#G_Zc5Zo0 zz!tExixa!rGaQj#St4J!_D{cUFDZ%Xc~>`hHXhIsAI?$7yz;{_OqS7O>>CHzGhVJV z1Tk^5pFkg8_5l78Q`Qk4!ynu^|0AR<5gmPiNN+bMFY|Oi{DrF+q-om8AI!~$FD^}; zV61CX2)0~3unIW+ekS5_)O&H05^cESf1b@zu5r(|v6sdlHRq^#0{q*!3B(v{j5=Zg?F1OALJV_=`U>U zawc;<^vR^RRgF4`=EYj%7d5WhkJAi^Q-8DfuOPL$y|l9iAKcD3U-U|}%$v3-f)MM$ zY=TC6%r6dj)XE>8Gey1I*Cd#AT|l|$%`}3apcc)O3aV6XmGi=*HuUFL)NIWYt%zqQ z9ETeuGUs6q5|x?vM;l=t%R>b4eT_LzabB~=#FW`Y$B~-Jmo<`tp4G{!X7vj_c?Uge zMEU`yi{WvGmLU#Dc72BvP^tj`iY0NUx&7xE0l>gW6B>t(#*;eBs6oGX>i-SKO_UZr8;FxC3GETgtM^i0;W zyN|1(zMR*t@__8hn^Ua0An;>vuwP9QzCp5qohlg=e}dYguxM7BlIMUL$#QPPap=5O zxW2zOCchICZ4oSIGwoV-^WY1gG+gk#z2SVj_PdP?xHXQd=gOEI$@=TwnQcEuiMY6` z!_VJ?FHL&&om-)M(~6MXb%|i-@5|CPi@}Y7Gc2FZVdEX zY$Pts{=F6WJF<+4X*XIF4e#nsUpUDyTPX8I5-C!1C9XbAe%Vxfw|!c}PQ^v&**LL9 z3_YlKUC^J9+pYhom=nM0ciF-y;QB6zL-+ls^0fSgjIc0)KYaxru&1i*$!Y7IvA91q zm_~*hmIKLbi!N;}A3g2m$*(&7ZYSs`{0yyL2AK8BKn04^En~^@=O%>$2PH+FwSzEm z3o~d}d9%+_^^5}|3;N!}gOo+C1d!b~P;4T7Vg5hrs(!^a2V`&zMH<`-lkq^frTY~1 z)ATOm&f#F`w7I7uf=Yvm?4iXJWj@9X>S42QBBvM{L}{VaNtfeBI(RTIbwKulmSAUj z`DPjYUFBobH?$V>9ICFJl&Hw7UHWQfpH{RmV!~A|T}ing>sH83%FWalw>LG5efVv2 z{clK)GFWYd9ayrzviz*F+FX>0l@(bb-k6x>dfln#yJMrqfr0H<_x?=>O-9nbXR%EM zoYlAdkPZp)rH8ZMS|V+pt}RCea~A`tn;zo$1JQHuOKm}O-qk8JdVf45h>7A^{X6G|2XZsY}{N+yorn$sYw->?azub zwDRFyr*?{_!3sa8G=7JdHGz*7t|Ff+d$k4W`JEjed~g%)v2E9|&P7lLYs+rb+-D|{ zeE4b&h8?WR(+d|K9rmn=7e(gYwR&e@&U9Z`!|5QBnOfA3O`?^vHTX%^WJwUf>DBeg^N7L9~;;MJv$YQ=j#;!#OPV-FQJ&xQjDuQ<%v zL!-U9#K7gQhBep%JKIov+ggl(fNMa|{U*eQ6J{W&+;Etw)MMWmQJw~cPu#YA?>B;I zbo1#t*UWV2f0_{&SgP=Gin4FhD?Fd49Z*tIGO7r}C9HWh67*?|^dgajFn24F$Ln~t zz;assQVEdayt$Un*W%I>6E_YU0k>mKOiax8VMzO%{fhpJJCW0axpa{x8upfFj&Aam zv_nIAtjXy**1SY7o1@`G_Io$Yxw&)=^Sv8A0?w9MQv)hB^&ESt-(MPdyo0o?P4|B+ zP3FtK@Y=dF9O#d}HOyOUoSft{NHSV|1~E^6QI`0_IN70;!%%;xGq@{>>k}IXf6x2( z6LvR?h9mR~PSLVgbh${+!x*)74HKMF7{yLryT7YwK{4O_Be)IYVt2OH%{+TKFsPyo z@AI1AJV?D^9J<6@-AhkP*5((K)8b`}WNkuy@xyj|S)l)&5V#5J&R2d#TdVfOl{54z zgodTtDeR=4kt^lW08JzB_q6Cg@g~>y57cm>+15xTU}d~XBCl(Lj;^`5c$Oo>eLr6> z#bb@DWEKNMsf`Z<1H(UVi1T1S*&&L!$;(z(qE6)x#PM5vjopH14g3l}{+Z!kFhv6s zmia?uMbY1pD-Chb>H2!3pgsor=ao_4>xZTLKR8$+KJJ{q$E7+E?paTt7@}0vCJx?_z72)XHpsAx=OQ z6}hVlb7hPZ=t>ML#jT6H3#K#3F#3ERmjX3PH47t_0%y@M<>e-P^bI-z=a@}}HgyO6 z46`9ap)18hXk>&5382F?_P5<{rcOdjaO+|da$i=Sa-=7z_DSD!MFBoNC>gGyW60>A zYf~Z6SaF@!^yqg}kOE6K#Jq1F!2T&LA}|DTT2*1xa^naCzuJ&P(_o}aiW)QwJu80A z9Z(%F-o{a2ULAGTr;g4-9}G^4Ghlmn*Izx{S4BuvN--1kC#$2bP9>Ds2;mLR`m?!N zKB{a$87hkF#R7;br;=jm8#HAc)REq@N^}Ek7^5^&-H$=Ibw6?&^|ZVBd>;?(?_TYH zD!gfqd7(!Ys!N`*AfZ9~89$rtTXwc1;Gr(#Fm9b)*a4)TQx7TJG_=Ww`&)w$6f8e~ zz)pWqnC?(LI5_xy9N)|zH_v5E*Ek#J6`>Dcax%^_sQX+O>>hF&npIXOW|b-IZurXq zW1a0T(q-tblT)vnK_e@PcY(#~eyl>sbXg_q=^n#6fh6>(Ksm+dUY`K3zdc_FVFM4+ z)6**>tSuNbow&}jOb5fzKss`3*9ciVZ~Y{s0(G1KfrPqO3Gx-%_%Op zs>w<))5B7}4Tz3{Z5@8_C(a#bXkg4cYB=UpB+6UIk@CgIn+G&IM|rt{qzj}2TXZiC zO6U%H4umY!dXk-*5!8EP7?Jy}|4JPK7;(%ri{8~Kb2c%oxl+A)L|D~T)A%3=VVnGR zOwPJmmLVA2Y}HaKhiYTV^oWw zoYn~U>$sS=tp}Xn3po)~dt!0@eKPyP1B=oZ8$vH^7_zx;?!I5fgzoC#j(JhH{_Q27 zE>fcol%oo~a~1&{9(L*W^?$cHZZdSJH`N$5js4jiGjZ#l?s=H5MLn{X9!Y`4`sHGe z16Um&Mpccp#8cW7yks=BcZ&g z0yy3k5#p;MkBbcoQTad>!GyG`ahHx+szagc7hJ>_8-lw>)dQSaoZB0u+l{L*qq@7b z1lvty`uRy=F#x86O@c4gtuJL(crmnUd1}v{o3J>WHt`IdE1R~`TgD9tPdH~81vyZlvd8z~mP;*8RW>H6$OF)Y;^19}|K5RLH1M1va^Z`I4 z0(0(hu^!Fk6Cf1s<}quEN{n3hoklmfWed@vfbf6bseP9~55-vkJdJx6-EFIvc=8mc zK)*!oP?p#N!kTi#uxdL;JO5gFe8TEqeewMa%hji5%6=sUJ9* zlz@=bfvK^_K=-ve_eF`-cphYst7bAL6tol_w4IodBqR;uz5gfX%LYj!ATdX}&f11L5s!lFjgQ zp*p-on0C%XtUdu2awRlNHiCIKp5ye^p;YefW#1z);z~sGPmyL%0R_X3(uO1>;3t*> zV@ifHp)!^JrfV*d7D@1+J;?YFsXk8wXHzaNR(kLK)+RI%@Mt|K zuFU1VQ70Qs6bT-E+naW=lNWyzfClAizv_Cp?094Zr=uB?&EzYZXP}5;xsna91U|M2 zF5}$l>FO31jC`i`Yr42+R(+@PgY)CO0ifo<& za*ywk_V#e*y`UK(WDMv)Ar?%s1uVsWkG_XZeMihvtMj&%?#>|}e%vD@y-J*PrPRaY zb)cyu16ZOk6dWpeCWV;K+41(5I9y~_sW|_VkR;*(gwIo~nIhRg&L40;6I@35L~Y&x z%HFAjGwcD-c8qc=G&^?R(%Q$Fb`*yc3rV2LtvyeO1mXjz8(QVRxe_`M#>ezNZeRvZ2B_EYhR}!zBFQXDr~aoSBPTB4X{c*m09V~XEexe(R9G-x)!}Lq~?H%REeo>s0uih)et`J zwodFA-%lzGxlhUnD@p(rzvMhPQbG%C5c78fhgfphOCN^&P0i{FCrtMnwa*SMmv5Jy zIkyEnO>TnYA=ai39MX5=pHG3O1xf*eb7X*&)@NGJ>bk8EDYssFNfPXTvs=VThPRC- zyeB$sj!Z`+ll*j_cVqz2vhRhi_e~!6a`9EeCQ zCHIsSiM=zR2WdCi7Rt8&TgR)!>>4UX*?VB7XtDUp0h%B0`RqI-E&}i<49+}n$RF*8 zp2A#Z(}3OI6>q>@NBLegDvlg#Wi2YRREVGmr|_0ZJM);Jtsv}?1V$}TnraLRTcIae zKAJEJM?^&WGA`K)U)Oake-8{S&qrnBUt2zk=QG&u3ab z{J4d_kr95%LVdUb2zRD{G3fLhLtIAetQ$Z$};o;(MnUGE~KOf+3l=b-KO1fuIco`KU0(RXR0uJOBC z>*A;EI_W#nGJUZD!T-3F>2MmU5G%vU1xwApJNRbijN!A=qhoJ-$ik<>R=`D)F#y3H zfq#yLgZBZCpU-P9rT2BLg^Zf@CzKgIWHmG>K9&Gf7?7G&=OR!%t)ZvsfE$43E1o>a z@TVlTl(OS1F{4FduoI{^@NR=TARbqZ_BX*g@;=KY5(FEK5Eg$h7A|qC-o7{iwENL; zTd{RC$)^VsPSSOu;YCKj>T*8Y8M_!3Ir1W{isi|n=+=5ei_hs!*~ko!c7KT%|JA~d zITNXIXW3%-)`LtarGkGJzRG6m#~hrDBF5QzXPH4!^#HUTxJ$}>A?&Tj za|_#Wp0HS?G$US%`izP1~{D!TEkpxKaLkfF0w@t)}wCpB#Se8%L`d9aZI zX&qnrQOCr8)1mf@Y=ZDes!A5A;e>N!eYNC0MLed6`^yGvSPFKMwb8cjA=U`VWr#2( zc;YFP%VEN=t42<^5tH7_IlJ)PYwdGDH}|k*p-U1C_33Ua%KB=>zM1WJ66tBJ#Y$NF zG?!8x;~fJ)KH5imfaO;>`oW*mam~8%Fb_d7n$j}(so`?3yOQMI#C|fwPAre*ON+#X zc?4sQRTXd#>B@ll;A+wov`R>nwpiO}6|JUG=)KhVKg0eyqbVU1(t-ZQ>Uxko{^pkH z?0G-nEc1%-%ZqENud+p9CHBZE39r9UNCsJ(IjF;uEs#;C1q|KvMz~{AdNN<)LEB>9 zZFV}wnWm8&Do_I+C(pl(9KqCKte&4mCP^y@m6@K!oydUk2+5)u2axT$#8Pe|ce>4# zNKay;-vkqWgYmka^fUYF)AI0XPhoO4{*q;RT0pX*q9?yEJgo-KN0S+r4mg(k)%^<= zjOi?Xi1RH5GR;$wcH4c8t_9^CsDlGWi2(KyEE|+)Yp2^Dqpa;cz}w|Q?A;r#T_>B= zSM8=^eH|2;d-{l=Zof0SjqAKjRlsx6DRiq?@A{C8zR*?cB&EfOFzOnU#rKhqs~4=V zy~os*^Dgc_WA0CetR^T(`y$Nf)?2BgPjJi?ZGLYsMNRR_Jnbos{33cf$lI1%!?j&7 zrb0$Ru!sR!tWwz^f7*)*QBGUCtMfP1OQrw5j~&3ivi6|{cfGY(hmTnrW8hBh6uDhJ{(8$`Yj>Ad-?z=05?}&B^D^eDLS-RD;>@b6J zs@}aXl3v2u$nvHNW=v~Vodf2oBZS3#&@q)b$vr>9{kvMff4TLP?5fLF`^{{Y zaWZyG4qxrDLPer9Q)?Xi-{cOB zrUh5{QegRNBfW4MNzq!F#=7dJ(5^S?WR?A$pS%8C@ip7Tm@{HL4FTH?T9T;AAHV#` z9fwKRsrOFoT+1Zl_of=s-|mM$^jBA>l!b(m72BeGjUfh(_79rqX4LzP>!N5Bp&GcW zNm!Xr&@k9P)22Dh3L=9r)(LEl8at3V*OzJEvaYBqehCNppmpq!sO&LV;Pv*tub5o> zNV!Fl%<8%))Y){U`omRpS~bp!@{&DC;yk++R<;i=$_u;2CxonJCCWL~V40WoGq2Gzee8=Ij&aysl%o#F8%YTwWBdh$gw;gyULh(xm}FeEEgzy$9c{3#JMi>WY5vt z0+;=G(_U@4_vTn6pSq9)W4*4mnX1im?TrlM#7jub7YpA>e|}MsPJ1TdDRgg89C|Dj zv9ahsA*c4|#vS0u=MYQ~w|_1?6IP5}TFyuo%5wTu|HlVDUB6IVwh%AI(XZcS|j7tV9ztwwKmvA~I2};oMcm?I4;&SfnjBwxNI4x27 zt>f&BV7J-D%J+J(gQL7bGbqUV-WHiE&d$#3hNdu9@v)VCf^h@QvESTDNVfridlb<| zy$@g^_oL;duwB4Qc)#qqJI=^`faCfG6EQ+9W{AZ=a@nu2;vg-C&s{e(40&{XXd@pY zM=~-pUNr>wn6V}&C!2YPIkOGfM}2S-+J9cbEg~X9i@_#6+wd+^xNMR9Z$03P_1(#d z@LQe^$0FAUC=k29>pk_K`tcE_D>zV|U;5*@NhZCYrscA+u?c9W`Gf?Pf04`_ikAqO zZO_j+^lKFsl`pp6j4K_gtdi6tI`J<6M5d1*Qh;n(b8)a>us>aXfbhTqZO|=16OHH* zqVrw5T)&*AIPsLMf)+IW$M)YN)73O9**({?mYRGEBgknlwe#0cVC0K?%W4qu#&j-f zgNQ5A0Hb5Wj-@_HH?jb#&CxpjU6{0Fx=qu__hHFf;A)`9!}2J3`llp>aI=qto?{Bb zyd>GOL|eV_uzMUY5^WSPEzWL@WFI|)@X)XTZG;YpPI1hEDE8na#`OxIt&Q`S)bREi7{7lo&&1qIxEmo4de8fv0N?rx03LRB#3GC!OznGCP zGH}*_P&Qdfv$1m4XDrgOv9nh%0)IF;tBJ}#dmMBt{Q#`p5fm<q_PY+_NMD>brt~Y+d)B!@rfvf`=myJXMH}jhi)c#RoZ%8IC?6<4-SwA0-t{4 z5;qAhI)!YrfdZkNMDJy602{qOP?K=F;pN!jB&)FZQglC{jY@`~%mM9W+v_(#2Y*B0 z^{utCB1P7=RTd(|5W9 zU{}@vfD$Z#BKXufHT-Q)lnHGs0LAP9Oysc8jrjt79nqQFiT5$=0mfbf$`Fu$%+$@h z$kkh%?JdlS+~2q&dT^tlrg6g44ozEh^~#)o6K!7#GglR6`!_|sJDc^{DHCSt2@Q2~ zmRK}TF|Y$Fy^|eF(O@pkQ6M4eJaz>=wliP&U3WpR)EO6UW&ONM6h)ABvRpahn@xw* zqSL<$#wq#8&{|wf>oLlzu=~}3c%~)9doNT^U3(cQvmzVTEG+U%tBX)`t2s?25_<#7 z-&Jb9=q5^5L}CzswnL}+wkO(T4C&DWTvDs)QXPNA?gg+6JJ%}Yc55>@xCBlqn4Qme zUM0UR%^gLUJABHLdW1shmbauWnU}oCu9@V5GHp2!!%4(p5**NHq^X(gxVHFysP-*8 zv%)?V;-qv(K>aG_>3g5R*>4US;w>S5%|i-OhGrS&#k+bJw(4aXnBpkxaRs+2d4|N`xa<`mGY{ z$Ilp&jkP#CjQ21`niH%HURHhumMcP(!T)qs(@#0%%1mF3s2PK95{!8#Ty-g_Uz*Av zP-65P9OfeI<*u?Ba#w1avK^~_aa9n z{%~L=LU6qrR@;sSnA+INYsRXon3aHUN^kZa042y-Qr=4=$(oQdUjD4*L4)@BNZRyC zG$?k{w3qD);0*Yoya}d#k@EiUb92#g`u8e?djIsERc&v%nYg03WzoFAVI!d^Atq^R z>j_+CjqS^SA zl3sSY?{50q&beZJJU)xo7t2l3L5%W$+ls|!mFYgKF_b7P=HQlc=-Mi|+!{a+BTl!c z&QU6(H=>4j8onWoJy!^7d=u4Gt;{28<(8#R>lT@(6F6)g7Nnj}ULbv75jlXUBFRF7hvC*>20%k|4i? zePxf1f+Un5@=zBb)V^{|MpQ$Bpf{k@dg7bm2w#Ag;ibZ)?l&i~mZN~wFZAOU6x+|P zos4F)cTBz$#8L_$J-@}qRI8&Iks~(vE1_#FWQ9`(fTKhEd?nqL06u|=VjOY1x19kb z_gXj5L!-Wc=l6p*SjP-uIap)-pMWMKa5r`RclBfhubyA?M~kW+3#lk37D?-`pLsl9 zm*wZz&EEa<)8=yhsb*cApavPgH zY)Y!7v4L?d6B61kaQN)D2yG-;DsW$UbJMo4Qx$UsSynJ>p0LJHk?~1WN~#YdS7EU-wfF9 zZmfvT)-U^N_;Rd3R62m3%e(yejeJKZ2bV-phkZFx^>OD8AIRwwd>DX znq!=3!lgO8#a)i=r=j-E2A(^Rz8n!`_DjM&2^=bBYPtMZ94f9Qo?RoIJ>#XGLl$6a62d*uu4q$CiJxv;)iH zNi~x>rb5&&W;Qmc|BZ7IyhToF&L;zIH`W<)b|@oZw>aPE;n0r0Fdo4~luS#!g$Xe^ zsgVqdUOL^Gs!r9DIbNVjN>GKp=}m{#*$eK>y7Dfim=g2YeNGh;VZj`HUl&yfgB3}8 znNnVRU$Ec56oJ(`?!Q1WS<)?Rt#04e!c- zRcLj~(l_EcrrR#|xJ0WyYn|Yap0ofN%@fp}0GzDo_OA3Mud&?mH4>h84TDGe`GviH zbN5*k?=7T>SKEU^JbF&Hfcw(EM|XU$ZtK;l{do5w&qWf!g3Xj|`(tL7_McK3 z{{C47zs7HUR?SV&7Y6-fs?%pc@@7}1-Gono-`s#X;Ww$-IWuyEqPc$h(3+An4Sg~J ziE-qGD@3z8XQu6JrwD}V*Ynca~#f5{n@QL;mF`N_p`1mN?W`+aIpx} zv$Aq>tUcv98x1=5n*0R_X0ITB(0qG_eAP>VRTWDnsHd67?1_2(w}cJ8Am!MEBE0!Y z!agdN%-}(@6iSKWf`B=z*(=ru(lIx`+HSAp91r#zCRpos_I#U8zt`zX1-Tl}aL4qubLZ&EmJ96)px|b381Pc282#W_L{RyFQskcPqL;6?SGRKb8$&OIACKUL+1J=<*+2^>E)N$iuSV~ zOBvJlFuL4|Z~5u9j!PY9TeaCyF!r?wVp| z4!Cu#LA9e{Y!D8evT906ssl_Matjx1WzL+lzr5Aa?Tcg7%jb0`}QZ* z1Ru@6^c??fZH?+jOCpO`=+Zg^f#<(Dt-Ccs50kO__Kt8y&yv6~^*<1>B!% zc@7mA-`#pH%}l;ZoPQVJ$~D&$M`oHS;OUXlVR^sbp4=?d%gHJC*le<7=_j3H>ihlH z>u-9FJ#i$qBSN>qQ^jgf0lT`!)`Ob|^-ah-R`ySr(5B0&;{>LqV@ZwKgwExQM;Q(e zdZt@+Ts`gmR}aI=ObZpKTcpr^m%&vT7Wjxz!~1(FoNYx$#G;bR?79!Kcem(4MFQ%| zdhEpjsL1sR^_gMbnCkhp+KR(X-@kKu?XS|Vi$85Ul@_3`k)ofKwD^_sfPjV~?kWNI9Up4a!QW%OneSVD;Fb%XGyUWZ=SDm>lWf!Z z)~`h!TN-A55jcD+E`D`3MUbrnWz~cIN-K|kV>=B&>+(SBj;LYuNeLisC54Rif z^zcGs(HWvb(v276V|f9!v(=Wf61Ulvh+Vq$zC44K1nt&LjQpS*O4k`aT4!3%tNS?f z?G7}JS&H1He$Wmd0-dux23lLpvgPeD8C=Iz=?#KL-ls+jF$6mz;*R~Rw1({gq*s|K zaE{(=t6p-?T!l2w*|wV-HP0O3vx`K#o0%$)rPlkCYtL2L!mHG!HW^ZTmh}1>z?sr@ zbL_PtwRx{xS{f*W*6?2cd$^Y1&b&X5_qb%eRaU^5`E=_w)?UP$jjl?HfJ#KG>nJ00 zPQ%JG8q{-lfe-=rZIi+;KGKb1UH^h*aFLBkG2XrLixD>b973(+;i}KG_tgn!DXHu0 z>Q^Ty9qasqENr~J3rOb+o&ohQXrH#BypYq!1PyDPg(ImBm?T`4JoYf351AH28T18) z=~&|Lt6A!t9tt|bxCBossr4C{b$&EV^A_RGpc61x+TPuGk{sPNd-U4#>M*xX`h;2m z_^K3i3pH~yC&%xdKN#dRbwx#*$~BkE;C2mtx>~H)-bPVxH|s+1zW#0v+4KJ75<7#3 z1^<+3{i{cyAk)W>SR#Me=Pa7x`r++IM^SskzAL{{Xuow-y}d1vps~Ed0OQ+s~5Q zrbXNUYc0E9t1WI$0XQmdSvK!i)jw5VZR5Osy7&a;&v0h*OiN>RnZ)%O(>xpVa)`N_ zca8PjbVZuA+4#5_=6}pKr{tIyPaWjQTnluJ%XQM{q*=^|qcq3=ysVD?``1)jOU&6h zo;UxR)TaSNX;xM$74}B{#^j8QwK-fN?Zn&{a*p~01kJQ)=Oa?+1YTwajwcmnqs)h) zLK`|+neZ2sbf(#_ed~Cyx(FL!d(V1Ln8Uk8@7D#IcZT(ZiJkWs!T4vz_<8-PP`ri@&68zcwVn zD?$t0FZ3D*nH`qadSX3tl!%lq)~A<%7En_Yih3h430v|fvj!*o=})QFYf^_O0+t$j z@*PL$!U1-6O5z(m2)5{efalisn%qPhcD;jeoPYGDrA;2r6JEFJW!=H&WR_WwtOCpY z>ls4Uhb*vv{kS9vV|uhAtH4(<|WhXBIx81^$iUt^IJqe{@c%iDL$JzibCk` zg2rq<7G_aJSMqy;0+;XDUgu1;{_PQE6aB{^LRV=dRegd&`AoYd|Kp?>GC>&BbWEoq z{B08jSUT61vG(^JemgLGIqb-wsi#h&>%1nlbDDay=MwF;#-dp6T76;HOO7Dhw6{hY z*A<}S((Ww%?IUD)#!PVYlx)6tqw4q2U@aCIPrZFT9Dsf|Uoo$Zi=NUG3tiC8xkH78 zIQJ50qe?5kzU1IWai|+iF`py%J#)!9U3t3idyrAle$`1HP}3eqAFcbqmZ>0F;kb#% zdDSa}&$tBwBs^zl85PaG_7guYi4u3%%x4PZwCdlqUk_(2&K^yZRLp*`%s#_<+OARfWVv?~uJGVJUW*~30IR*r~0fRUoq8Re7faO=;|`;$Dq1spM`K|s`k|Biyk6h6Tv zhy1$Bid4$%>MwLq_gIKzqU@!hko3%$6kBX(M6ot@X89bckQ^-vvS!5!UGcT2jP+&J z;%_s)5S!O-zdp0Qww{SItdsN<**(b9?}j(ui}75n-H#g1IG?!YM>1t|Hw?7`+h!R)=o}Yr3ldpG&phnf#`>k^ni+ORvV}%E4ypFNl zc9ZNJ2G}nQV>`@!kN(J#uk)Vw?AY9@vw&O|SPlM-Ke|~`P1e=T3@tEr&`C6=Rq&`y zs3S;Lm{P4Ake^_Xu6+49p)6j~$XuWFQNjnt2K+1i5c9;w3BDdG0boLsEuIVREDp1; z7)hF6(Cx8h;&BbJ6lup;$Y=k3p^9WHWGL`4z}}tZWSR5uS$0+dmybPk++yLQGt-e1M)or>nizKym>2FO>v!5haW}MT)DwhY`5p` zsAX{FQ0=5w^nnJHdq9b6U>KpFp&!sHWNJNKWSrdGKAg=9)va@|*NGwae(L~JChq2bsoM^ zLpteXA&|4)BHX5uQ;l-p~fa*gUHyj~}eMUNljmhi*bmm=`{n)I3 zZWjHHhihU>?`hnjogEexUI{j)6SJcx zU2Nbovpw^M@6}DtsMES1t2C~udB>+tQb=u*(-2Z^|Hz=8v7$J$70RR#_RFNz^@tBE z(xJ#A*GC(_IoC8~so|VdA|}6iV|Cinia?oe&mgMtLC# zQY9|^Z?49ZOmpZ*=<~!`DcO!XG1a@B$HPY_CAsUSKNSEv@A7dpwbPEIAdQ zg@fspZoz}v?$lA$L#q<6hSrA$l|Q7Cq??mo7YoLyAQdGw=7l1A%}9Sp*}SVwa~d*k z`n*YD?V!WI4Aaq#4XLx!S$SuUcZO~%?&|9DtR3Pz9I5h&H%WBs&s9bXi?ZP@=3HWZ zm58p9@NLWZ;m~JK6_v4fr(}@>rB%spaZGD3hFsN^l~-S=MNJYh=V;O)OVBH>Ub>*~ z4s=BQZ?1zc)2`w8zg{?}QGcxvi7Vpe|JY&w_l-OVyUhQ*piTlTcK-7g%I}y!#{8eR z;QW6mK( zOdzsChZ#!q?Q+mxYtBZo1idW7yzOhWcLw^T^{ZZf1vR|Si;Iiz5Z0iKL5n2fb~oKe zF0O7QfRp=7FV6Bq#E_0A2!#ceYVwywMAS%vSBqPt{AVhWV^>!e;ba?p8YB4g=g&V! zZW7Z(gRe5FkMlJoB&10~+^)Mjou|CwnjR2~Lb$}W!O1i_;z1~wxz*}kwtX zPsR1W&$f6}gX#YF*+LHrZcf6lUSMm@3EUvCG+TcooFE9~y3EY0N5TejVDk7X0c-c# zmd*ffuoL|CTnz)bkoN$QDkm_BfNo@4E@juXX9c#+_+c&EgBJCw4?cqqMDj15xP+S*aGi^%_kmv=7`E(J>^C9w@Uh3wa}mdj^W?+_=v==SMNz1RIu(Wh z^NLJE$2Nk{J(@&$RX}@{y8s@;lj!1*$YdL6{25XVJap3Re)KohSvxG{dy6cddjS`c zfu|IHqj^Xpm7OIBRo7=gj@5&DOmQ6mciyw^P=i6>Pos=*drvMd%xWqzsF5l3o%Dl@ z%hI!eQ%rjn&|Cw6J=WXTXyIM|tTqiH2mU5geAMi6U1~Gd?MQmA0p03KVoQ^8!@zIE z#UcjT^MAAe+r@>+Kww%;3RY+x7#Hmw@zhT&%49%9VOzjQUe0^@<5QctWUM)^>!y36 z+6urO+|K#mue!obOCbSOnXVQLMlSud>%cL-==>0fT_N6JlQu?-*&NApP#vqkF!WksbowoF{jnbV+LBNZ89VkqV)Ae2&0=-7=-pwQ zc|UCm^Aa%o90XcWQC*TrSTXRRL|E@J$+6U`UtU4m4Ta-izTb<#ea}t<(&&=&!QGbY z%{JU}$*0D}3*n6RyRIwiUw~GBr`0{Xrtuv1WPoczUhTd|cw?oG;@aIoa?@=>fj2y? zx$vvPNiV`Rh`H@z)x6^g0W(6%i638X4yz=ig_jsVQQjK$5WY++K@A7uc_+S z8p-yvKim=Uyb8fO*MmiHnH$yt>sVM;mhaLAY1b_!bC>P5z7X$X%YHzwYu0cptX zS^JDh)YPp&76-ZULMD=ZLbNqkukEofL65xkZ8A}NkM5^6dc+wSnz;z9Q_L_s%!&*F zi?dE~e<8zNO0*14dLwV3To?dnla@sC4N3(FLI#U3khyU$>f3M2hzTUzxHjgRP z)-oI7fvNNbP>zG|n99_pR8b7CjkS$Hgj)wrnZ=<;2tQdVOzL#4SQ-4KtLgfIN9fGT zfS~;1(^glN9r8lA2rY0d>8~9^#%|aK)Wup#l~Db2V3nhfFq38c5Ii;voW$2-H6#xnd5KWS3L7uG~Fpe^vj&n^Fm;sz=Z1Cdcq_=FuofLsV4cZYn zCE8;#;qYUa7zr^`%Vh4uJ0N_9o}cVn7#RU4c^kpGuu2g;aiA90O*0N9`hI9jdI$8n z-^ms5uz{G{M8_;%YTHaQ7@NcwA$V`i?&$+8-yChKoSfBhA82_2XJ?2DSp8|=x(;NL zlLp^p8fs$GPHh6=_ng>tYPW4f5^cx-;_;=)i3!r{PDda$W8@2$673Xv9qlaI(}_=1 zv4a2jaT+1QiD!EQg)ndvh#Xy0JQIJK>(9}fet9^;Zpnuyjp5k|bv0xNtzTOOQg#+# zNT2<^e%P5T?9JJiKC;9k@h)4bPqq??j}UaYtswfETL4N1ZL)T58~u$-50ND^5cpRN z>R4uKgb0r{^^*I#MJS4gSQ+?i6$}FLiEfvl_i#9omF4+gggs>sfw5a3W!PsBs49t# zfe=^jl-U2Y#Hj2%;b|p3TKd5ip#IlRVJHrXq(;{;==NzU3gugBI~@ud^OJ9k?E`#-XQ}GS?nM>r;|MDG`~zt0fw&v72?a0DfV9+3`>gQ~9g% zTX4kGdaJ|kV=VVC<^LUSqv%CRqza6nbPg7-lrR~?uQlh zT9M1UxY0;$5;56@C0NSzyoNq!->M5J`*MiW==4woAXzhXI2nuBd-$HN;?Pz9 z=9J@h@Rshls1+U=E3F>Z#dIaFX2@R+m_wsS5Zl{4u~NS;#w=%Ko`{DEJpO|F<^f03 z(7QO)UlF-fYaljgNwC(+c*%5Wk7srEhRdBR2&NNW3_1F%#R_Z}UA5bV5uNTo%Jrl$2y-qhwFr3>!W8>>`wG$(JK5eE!?V9rxVn zTPLHxAWRZ}e9zej;eEL5Ka+C2k;a`Rh|kBlD9@P2$C+IH-7?`Ou1FTA76%sL=bJV5 zcpdI7k;erIwnOfL$fQ zEJc}YQAJsC_y>nu1kW~#b5+<lPtCze-6{e=gOfFFyknB5Q$RTA5=9>;((Q>3>9 zF0@-gzZlksK84ltD|ihU7pnq`^+*`q;>5l|^Bn;m7v*Hf>+R~6JQbA4r!cdRI19in zxc$u3erb0HHrM*{M2_jE4kDYRy`dIx4&^Wn>`Sd3DdJSnmR5A6|F|VQcTEza1@eNM z>-TTH*qBxkxoAH@Apy0f6*G2(lUOK=DfAh3Fva5*;oqD{bRRqM=rH1+zTG2U`w~ya zAKjfls%)Geza;yTW7B&|D1}~2m%KfSwW$b=*!Zi<>~n*vR(1nJL6a1xm|8*^PbI5r zmppbo{%mnp;c%Jr$gi(r(){3fom|N^@flVw9|Wh~l*LechwJn>Xt^5-Li}Qc}B*q7AtPa-i?$tNf0vbz7mN&MZIQLJmVQUexc+s4C z^QXa7t(wFYMqktstd?df3T)+Xb8~+j-`%NOzvb$w@eO{+)5_dkao`$9XnRJjpSq0y zOrd)~BWccdyaVEdWz0-sdll@;L*xv)D4=bhX!@7^V4m8A@0$LdE*QeC)TAm|pk}aQ z4~)Q)=A+i>Grq=V%hL%_-Ur7>ujd3i;G%20;Ltmik8M)X+yp66Nog$pMIL<6Acpu4J&fF`w}{4A+39wtK72NbsakG z2z68Gxfw0>&}j=qVpoEqv92ljU2}eShYo3;?a`R?mpH57q5&dfD4K7v4~AAgq9UzL zm`N6*@~)}hhjYJA%%}f!%L5KB(GKX)^z;1r;bGzh$3fo9{1-^F%#T%ddz=zcWX-Jb zc%m)lf*+DM=3{tg@fnU3J$gros{wrGt+m?n);Ry}cJbh9_PMSF^mwW>(s;mM$BNPg z%UI(<7cqP>bH*@|&H~gMY3Wc27Wo>3s)lWYIc0FMRwKht_~&Gb9G|nV-n#1ZHyL^c zM6ejDBmaQNkeeu-JZt#78CIU6eg5U=%SvzhQ|ClZT%Xc?Z>5Z_D9N_7$TkY^5m@>s z&;1ko^RKf|;W!*o%Hb;3BIs_M=M)DNSkf_)lF@hCwC)Qnn4Zu1?ghzIXY+Yj;~W2Q zG#&6oXiY)oH{^8PzylfY^5&=5C}Z;(%707$k-H}R*~_B^JgLFwT2VZso~Q@FpWdRu zu*9|AD5N7jb@b)gx^=S!VQsHahVgN!5t!sDg~7R;qTF7CHkD|H-O4(BvAhorZ1O zeyT@9W(E{-%;0PtdB0C@`odpSlKt|QJ;zp`IIpK1D%8mu!I2)1A1TBykuK_%wz zwSMCr{N8w;cpl!pdJ*l=!$-MVi*ju0CnJ)1e)IEn50O@6^}(a0>FAzRbbTB_&QsB1ge)$zegWw10lZjAzI^^8< zdU#t;+pnf7YzS)^2fEoD>z%eo#5e2T#^LOhQ_?+yRXO6($c{)+jB6^nh!N^gRj8C>0 zw))MkmiCWA}X(@613u9Q98G_>*Zaz^I*vU|rkJcZ-ECKHS=dP`A~q|wN@RN8%# z(w<;&kt;@Tj%#0P{{A2|rOtQMul4pe>rLU^+?GJ+s@MRzGxoA)DS<7E!}>^F)#sFWHfhnaQvWQ}y(IU<#<2BA+NT zTrzB15mM( zZm0MzYx+=CP(H5Dv$ensIZeTXHy&H$=v52vyj?A??qmiRi01Q@W^rg#*&DY&8f;W1b7IV48AAH{}6AgF!B*^;c%?h8&b2>AWH#@k!jup3QZ{r`cNopGL zq^arR_0vfRg&X0~QDKG#um6<)fughoKn>(e^+JDJ(hl2UsF%9N{ERzR+qn>dy({Rz zoE}M^bQa0Q*3WR>g)vi0)8H*gqJ9egyb4A_)ZN_gIyYXjC7r7e`{w^76wIXSvXi?(4f13? zO7}jKV`}=U)*f?ULaq!Q^xcNwv5kAkvwDwkH%lLM6O+UrJCqKCMuSsb{D?%gl1xOR zsghk|mq@cUCfSjv6tu!@H)SLh1T;xC+ftOQ>(-oYEV5EUJWuTZOra5&&2##BCws-I zOC-;cNc$$Dm|K3h9_;h5llHJ?X`R4Wvk#Twjp7RF*q=uYA3sXqckE0neoRybs#G5RssdkNaf@e&24QdYGA;-VP^Akl%D_@xCd_VIi z@y?Wd9nbjVr~C18lLd6+CSvm?U4p)Zmk_Gv#{PV*Qgjvg(q@x%QUEa(Chn|KD<>ZL zL|Q%m%!7Po<&Q8b;Zb<5o&ql6>ZhXTKwaW|>QB$cZOphaB+x9RC&bl>l>!`eui9?8 z>P>|Lh-2}R22F2ad=-klNY!!sX+KVPH>jh=^~ z5e|L)q<`SR_+nE3=v5@J-J-Q#OtHwRQyR2&H1eSPuAZWq>gXzJe1VPHyVA%~w%sUJ zsJxtSX>4z_*tMLobYpS4Cza|huY5q2oUA3%vicFNza@Mq*S{d?7+4NlPE+Z3dWLio zqf6ST_tB9DX^R)vbT1$)*X z>Jk`411?j92c1-?QlZs;N{!!+j^33#sy%q)w??v5M6S6baOCyu37kFHyS5zIDcH0y zS^YVVz8Xg>Q~x8yP)WrCTFLF9?3gue>=sD>p<EODBc7ek4>6Ir z;(b`yF8TJm{|`{KCxcr`1u0m^sf-Fo>7+S?T?Fgn+TWamlWTpyqV?qlN%;vHM`Goc z$-Mu>2i24u7(yoQ=2WJ5%RkB_f3QEBBaF)mOR2Bv^kBiqYslJM;~)<{K%2EUWOBBf z``h;K3P`D91+)A#kX>>bX^4Jps)uk+KeoSHx?83VmpN{{_r~-hL!ntr#*G)9^7mh< z4SysaZGl{Ne2`A743p3b!_TR0NscVyI^W_p4j-!2%C-+}7ZUd3;tYZcu32Bn?$6^3WYo%OTj19K8}6(NG6rWe(PUjSn?l`hE>wr?IP^XiFTC zzCKE@70nHWDrncY51FV`(N!FFu9dT)SWmSpP+`R3D4*+RPf`f5G_MI$G40iMiU@sf zIgckGUDI2#{)-m%XjJLM9V)N?%$Ckk@5VmR;#F7+T%y`QKX z6Oq`ihnv2hZpC6NhtJ3T^$L%m*qCb3gzk~YDDJ$ZmyixPC);iw^UQZ9Iv3r3ut{=d z4=e$(5s-EE<$Kag@X98{D-~8d^* zhFDwzM-gOSVcCTHLxA=sAqJK9*1WyHyB!2!N(~u{R~&CF1+$JpoCF0l;?M z2Y{i9(HZy%r_=J!@Y)KJ(+TWD zR|Y_mOA&qF>!1bdVp4bsKy>B^xEbK(2k-YGFMzi-g#T(YPjpQUaTF1U)<@_c77b_! zxQ&_rmYfkIfSH{xx3$_~>kw}Qrw2+`Zm`Q>3NAC~BJ6ozVOl$-$prrDzBO0x2)Wsm z5oHAS4}0&k<$CN+C?Tg{TlVl~Ft1Qq2aH+XamBG*y1zRw;SEs#B^mAN2TuMH0_QL? z4~9YJYI*1^aexFdJ;E2AAM}I_0En4$#y1);;~@1BB_!b};#qmJhpd))yPghBMOUuobmwvh52n5U@Kbq3}R zmUdzTzbNxG&;tIn@i#z$3y7nKoOH!c5yKLXayi9??*SLmEOHDw1eE>6Z(<){)Q<$MSUd8Fw2+x`KkAz=TwCAplkThBmo z?$#@C+avm*I)*18H35*JTZi+vcgNZHrI7b;sp9F654y0~5C}28 z5x}4oAixXbo}nE;u-le&nQr3(nv0;d*N0r8s?XJ?beMCH*`T5oK=tm??%RWaD)d?i zI}Sl5zg^_U0pyiU?otyL#w*4S&%hmA3(;w9)2aRF&3(Fu^HG1bonm@0SIFjp=leRC zmQpriw~^IAF+AIdK&$U*|C1HwmTOfQt^?w6w<#JN@nSSJayoVf32kt&O3VRN&&pI< zDL(797Bi@>rl5fdA3rK$tr-!G;Q&9#4`^OI` zoSmKEwCm#i(w3tEjZbK(^am&H2+}C@_cMn|(R1e*?r8=D;b&tsJu+Hh)c)gSTn-v0 z!rq1Pdh%_MA_M{`bp{0D&}67*U65oGaD{;4vq{i9*JEUQp#fjCtRt*9emw?UIA5N; z=O#&}KuQ)4!8Mod;)BOCynIR#{G#`Q^ zo6g1SQ9BP{w}1yLJ~wD@1LJGHZzwH|Vgus4nbBl{LQZze}jxO27*UCUZ7z$vYBy1k>+op0|Y;jJdccYuRlAiNq*yO%4H^tsSvB8f0+~q3itLx8M zpkQqjYoo{E#{XRF%(8Xl$y)5!qF*cGt4V%q zV+XRC&j3aJ_Ln_<8HMc{mHvyeu;*1ID)Q>ihsRh&w_+3?BY7rezVF^gK3K-ZWGhCE ztAN05H6EZfXMyRIHiY)R4&SRLim~~id=$AVW3*WiQ|2qtLyN#CNGITG(74|iqK%~H z{6M&l?;%VV7;fubgs3^;$8-tH=`qJ1q`eo@9y6e=85uPSiVS-_9M_8v>rEZC*o#|> zvS27HLOG8uoY`5?alf&`&P`vw8}@8dJ7+pFkyPITI;X9Oli}uM8d;@KXM!FFyim5s zX}C)AKEYvXUhjW?dRl>bNYGhbgZBANL&fNvM_kEyD-^2(YAuTv%J^}m^$fysWNK7S z-+BGcHX`j?&eCsRR|RK-hhw|2h~Bd=8oj7vtS9k=8^ZVkZ-Wm!VACQ*cip^QX;m!w z%7#YPA?tKTr03p%MJ|_e6$%zReses``^4zv>AA(nCoc&9H1vG9erEWNO3kWlqa{Q# zd46!y^-6WV*MijoQGIvDjJnESyWG!Fl6#NN;i8dx=U=Jr@}3#!dZ#-N_hcUPAO{o7 zg=(FXEL})re#A$8x!Z!ufg0F4D-GYAD8PTFp;^^mwSF!GXA_#A= z63sT7(XlBm`2Gf??Q+Obvjd+hTc)apj^~|iU{34L&p677BpgJz5cQcdQpt1W3sw#b zW*pyOCaTZed)6p2kZ^)H&*=o(qi+gtgEu&r#nefQ4Z`oXlmfQVTTPp%$VQ2TXDksk?tw(M|NdXL9VZ=5QuQlO?4m#9dIdW`yOkr0#s4 zT<(Om4517p+C|F#)IL6dYF}>t_AO8A>mi#~46FVAfF!){gwH5DN{Cj!-SQdxG1+x3 z(@}LwNZjx_QpQOlbr}g-n_fn)@RKAwPzuF*;uV~ONboB7!+=mh@UJm5W?Tm9V~DtR z*}PO^!d^X&s<;d*4Tml<6<3R^xZbIR@xmhYro7j0ft}LYKCF?is3_vx-CH2C8~!3$ zVYE~;;#dJqcYpZM!lpz?d(A!tieHu9^p8jKytD{GMUP3E8z8ayLEZhznDKdI4V|-> zafHz|w|{U1$%Ocr6fMJy8RSzd zS7R!ANpF-st2v8%`We#}o_kMLh5gd~copyBOpwa%(R4Wjfbd19DfEtzoLw^n?P&g> zoPAz{(0n&pv(MPefH{$BUL}ikh4w!BP**pJh3M-M6VY(6cCf(F4;r$r+C!kB2Y@>ya z-A+K~nfS9_b_zl1Pai*l$on%`ndwpWw?f-dMbGJkwq5*DnG>3{aU$G$qZT-gjdWylac z${SBZWAKn+3>T&?XhUsijJ-Ce9X0A_UlNmHyw_8=A9;2kBFQVeSPvH@oQ9M?4gy&dArU{pIidP)T@-EsBxk8ZTBti%9CyGuNYwB z+XF(tib60&iq^226HR1x0(^sqKI@^3kZVAP{OvM7Ore}a$^SG6(YC2 zXsy8MHY(2a+^zBF8MrgCr8f@bKIrU% zr$@-)5&VNfT4`@u*w9`syZ;%YRux30E|x$@uovUbrWRqJ3we^&8OxmW z;?h1@FQpt>CKN!Zx_4lO{2#lz-lcj7c-rSKP)DcG!(8F{*>gRu+;^l*$v!SvLp;-e z%Vq8lW)HaLQbu|kxQ&;|-3KTXLdos7u4R3jMO82cTf+q&IAfbeW5rda)AT##D1qXY zNNTH}swT7?li7UN#`27*qU}!Q@*=U#{LQ`pdSV+ykLn~y6&Z^mikT}Qj^H&lUKXWs zXy%pN(N^?3DmSy2Ey;!YdkC{fontC*cJH6fk1xOfZ!2-7 zK{f$HtLeMJ*`7w0|KWnm=4?gs)9kCS#2BrSfr7UKKkp!e&5%VlH68Q&N3}gHOud=^~c@Ak>uX&`vyPjfvS=RWbBnjuO8nqi7)LP`=>cXRt<{YH>jq0 z1%APnYs%(WzynI;v=dMS$I%G`wK0Z~&ndAsGS;RRmgvURQ8)VSK+Eg6b0b`#4{!H0 zz~42HPxdvgPT?AKq!n7Si7yfPd4kz*lLPr%@PO^7wkam4_)m?!57OcWQ@(8*AY<%} z{#Vo7^B$4Ij3}lO$&>vH#lyjVy^Z6?oB)h~a5%K$TC&&yPfQ8DNv( z2jd+AbO=Q^ctY`WAFybtbdYc zP{=geHPKvR0I;X^2uv;wxC%pjTaHMC?EA#Z5ICy*!)96PW^zk`x_Moz{Yt|dfIQMO zw3z{SmxvPMUx}Lro(xh&F{>H|+@5xbq|jui0Pv=A7nBm_K+Vkd|KdV(2LHu{m=O>; zaFJcQ$2?j@@K!&@q)9OAFdf=&&wc=DToQrd|5MvrhDF)7?Z1e$AT1#c(%m549nvk` zAkB~}LrMrpND7D`jg;Vkl%&!Pf=G9F{m;wieYSUfSYOt**7D2Tj`z%5d0ywaAHRJ+ z{4J}_Kv6pWU)f6#>b}+wu6hxfgfy^`L86dow=paRgrODCoSYrBJk%l11$J?V_nv($ z{T8=}X@fpScjw)bB?s5A>E~fMCA3$$ch^PNyMEu(%xRGI(+4z$(UV(Mu4Y~N z=S*^hSrDcSbzj@xU0VWzR&jSIm~x7S%=6ggz*aq>GNj<`)xw>5s-ac%;0+}YKeQ|r z_avZIPWt%m-%2yV4lpDq$I-o@oLNu4^^cYX8NFsuW3LL;rE z>}jT+%D+>29#1Vm;)&$_t`o_-i$O@fYq|r8LzU!Ttm6dqH^#R@Eehjd;C!S(MB3XW z{_qknw}?ZKAJ!mtGNxnEgQpq5*vWYCQS%yb9N#{$hwllDG{FbAr!+w}0asDR^(2#Z;0qWiz z7U0JM;&#M<(%?fq&`{eI@3BK3HEs78wY2PuimSz*qqP+bNFU`3_~v&&q3Q!1ukmaP z3r$?FL#8i$$@z|Sa-c&1#BBXo(FDvZP5u=Cs4H?^zf-yHP&ryB8}&wYocT%|@`#En zpa-n^fhw8!d%Tyi66Wz9U1UW8^3k$6xaK3EBk1SrWhO}$9d!Y{n>mo*Y=+YXl(|9( zgZBwUV_971LkMGcVlt+GI0k{_5QPj8-erH0AZ=100s=k*5W6m=jh#M2jO{z>n{~zU^=#*g#y$|6tqrL9T2e{r~MxZ$3+_Q^HVyeZMk0eL8>;z7q z*=YWI@WejiUe4f7B}<+H{dG(7`nEdo?9ZWM)A$Q}=GT$OY!(+P0!lD>qGy&bIICKb z$M=~Y!UBRe_5hK)0yyK(Xdv46elCy7%RZr{3mSMOfTNt`X1PGgDgQFfpz{J6z)nQ+ zxPf|Ua9@!I`g#Y6yn-McD~ z(U=C2bSe7EIVmD7S?Nh^^Qy6W3!Y=w<9jMZ&#ArZpXQ>+Ao?G{ zWerj_2|m86#z+=dkMgm~mA04Z6}SasVdcVoU}$mvEyUBS695_+8w}R+gaD~%(s#^m zAhX!pqE2 zvv&}*T)-r0_4nzeuV#+nKbKO$lVmksWdkLON(O0_7rYAo&qz1Klxqe=op01IuR`-YfXw~Qv`vh8dvo1rm4pv{dSI9-bMFnjU!ub-@AD@gG5C>%Duw+^}oV|<| zltFvop1PFOY`HnA-Kvx$;UOk=j%Gz34NKFF7Z?D`vctN{;BqV}g#jSH>Y#q9mg7c? zrJ-u`ZU4i?!Br{d^aG*N|3KNBFtwVCj?ZrzJ{zlIOSgs2-1@F{~J+0h4A4 zA5v8*&(y89AF^bT&V(t&oi4@2dF+V&z0?5O=ccV0cnCO8Rd}#>3e&6yOMVTl*eWiF zFA2pJS$=zoxo~fnXOAaw?^@k7_-b~6YC9{5D?-AVuA}2DNb`*Ji83MGn5>+VWAK7t z^PPA&^qh}P#q(`{B>e|J4MB}9AEE3|X}y8bwG6yOCe7I;+XN*G=UqZ2XSI$~ylyjT znful>B<}5)OccvL5rNm-z?j51-t$BW6E_s5zEUmnXwZOnRT`T&N&T%qP-8jj?l6;G zAJHE+ju7Y|j?|A$ZiMVQqgm<3yn+WhqqK(Ca~btz#00!};vVFPoU<)>+})h*Ww`F? zw!ZP_HyVvUz-u2Qjk@V-X(J?GQ)3Wzw~p4T!AZ2k<^-&hz_DO^N*Gi*zV!p1s)r*A z03dvGBjf?a2pYPou60B`sQoq>XyD5xvM^ z8HJ7zhUat3hlZbFhQG0;Tb{+_W9R6Yg>|1w(EG8=z``XXs-H5DCW*1cYF-_MAz21m z&hZ*X<5&jBc$3wNJ%y@TM&O}@&R3Ppb6=#LQQ=s*r-R|^vU2JKwx44Zi+Q8naOnua z(^LEfxi-QOlWiy(ioE?fy& zrm42mPDe`-E;Cx-MDdvV7R%aIs5lEf!HrNGE#95tl|e0KKCX=GQjiMU_jd-qS z5@s~XKqUyodJiV?y)W#_czr9Y`wW{^$cAt}V_BAA5$npyGw47Z@eO|hp(RK%3_$Xdhsq+BhG ztz?9`I{0K*!kI-$=5uU*!l!hnRw1w3uY-3?2uNbbrO&TCNY7lx(`TDZXEIBqrmcX- zn)Vc2tuAW}Z`z+bs?&Hu`857v>WtG9Um2xVI#W|8>l?G*nz*`(FfNUT$P1ju z(y4Zd=asR#`$u+sa}IJwzo`0t{)5ZuYnGs|X^tMOo)xpBC6l-@c`@<|j}TRvSF|Aa zY^=8oS}gIJZcKiEw^6jMx0+LJ(D?WC)^-F_p^Vh_C05#snT;V~EcOImXspv>aI9^_ zI`Cx~gVkpQFev4~t98t6c(~K(6QpuO$q^5tz zB#1pQV$3Q-H9ZOHe3x1G*oqQ_mAcfH9~}Pa^;zCodNmfB|C$v*s}wT9n$pxi!u+XS z`@KF-;Z@Qt+Ox}Xev^+a8H6)za%z2QB#=zpJ0(D za%4IFh=GyVhfX-wVkzg(xS;xS!fR&lhuT`qGlsMB<}7k7%(o2i`Q?Wme7OG!sw?ZaeRn`ow8GMMe`=4RLxk1mm$j;3h zZ`us{>zRU{nTG^s@t!c;S0S7Fj!iLDiA^z73B;BL#OT@$?+#IOUpW(p1!KnZskIK% z$6@cfqatNmY?(-3is6cp7uHEw`Dc<&A++k_5F*5UWS_K~lc$I-^KWW1@9LQ7X9Ry~ zr89pe_+goWhx5xfA*=P{)vzDkTADwBpvrT(c=gt+BKJmj#1;ZHJv#9tB;>0aarO+`umW|1d;8?oaLbHI=HZxV$RDq+6z-+d;De+XLx;h()236hq$;n< zy3Di8e4W{+4W~C`rC8}?{W}Y6?Fp1`S|{pf7!QA{8*i}TGrCB&Xl@t4+*+OvBBm{ZNyk-BDPtN9f zxh9&41_r_$SyFeUT1ui&^W)z3_omx8fW>_5#<4ekMyf>;Lr02va~JDU+*7xWqxnwT zJP}FutBR{Bs)rIKP%mN~ITPtx$MG4t#W za`59+YQ!>RMs)s1GJzf?U)$)Hc?N`=`#TBM4d>Z((msEpEMgZs_-3~FB{yiK0nES~ z0&KcB1$>Fi0i7Z#6T0#yME_(BKio=<3g{8N>5Bj42sXLmYi3LBpvOz`d>Zdx{Oxs` zQewZiNK3u>J@3bVk(Mrof0DTKM-5KvY>8-6{w5Zfqtx3x4RA|NZzs0OLQOP5QrQTWm;shYlIYM3$#i zlXBFdZ3XTKh1+jGwUQWqtH(D3o4Jk8+`o5K{4Gh_sDt*U%aO9tJd(VryRx2qR|$|y z{@9)LAG>)(qG13t&{MprMOGuIQ`G{&(!C#))D0NZpT8bn`I1B>_1|Cc?9F4?2x;<~ zgIdz8fVS}L&@%tMLwlE69GnPv_NRd)rfRqbcnj-VmY0SI@Ok!u7EI>1K;4+& zTh=BqU9}r%O4R8|zgaJ*Zd+o4-9uYtw&QF>lqf>xu z@^B zPk6Q22`o{1=HN>zoL{)KyMdi&1-&tpA!ub&U&g}%vc&%OnZ%(}atC11rExNlb&9FZ zfV@Gz9fh)1H)(E?fQftt4nf6^_qd)xibU`w_92YQc;6FkCbe~~JR341gA%TZ`0%e6 zmafjBnvyr(!5V7NI(G$1D89tLx0|8bU$AolDHT6`cpIB}~Bte4NeLScbK8449&H!be$4%bwjq_)c*pVJ@ig`9UV}f8Yi1 z;8z_&>)If&w%}a2UKQ$x=qg}wZaD;yO-)EnDJFSY zvkouWxoJ0G0o$8l((Zq{{gv-0w``g}gCOiFiHS?~7r^VJZG6hCFz+WeFx7r2w%>aB zey4u6BETv$Xzl3&3!#Rv<;e)z!5y^3zqbPaas(e zY~;TzfLM!11tUh#Dp)y|4FcZmju&{w#*Y}_bsb5noJO<1eHk%;*1whW)u7@DnaBT< zb%Gc@P)Nb576BZ-1UWk8hY~`L3l70^Mo$@8Q99afC&{1cD=8 zPB3P=d{J)Z%%AeXDsKj$+tykdfN2BR_u51NVeu&}>%qNkfxr8pFjrBDpJE8QP;FXt z`)LS6j2NVKrU0_PF2Dw4I!p(IE;mv`3jw?_$*53 zoqqY!Z3z4s|Hi^j3>n0cSxK%B1RijTL8 z@b1N0uEm{&RrHfh3o6~(H8-q#oE&+Ra8l!nh#ibKZ-&8Q5-1z(l5;_c;cec_ty$b679!WF!s8dg_x`U5(1muJyTImNEz;W3Qw zZIU*_6-=-4-*6h=9XkB8rAuB-4{qKedH~F$dUFSu>ax6%dA~RsHQ3Yevv`n>BEax| z?OhL(6fEEl)KDh_Q(}d`h`K@JSgZ|cJ+@4Qlcre!9rldf0p4VLn2zyczz(r`LElCX zyD-7pJJk?|ogN$ptq|aGH>f1lq_wOAI+4L3S)#si@M8#UJ7GrisBsXz~QHYl)qXyc9?XhOTR}V)77lY;bEQs+(9&Q}vZRnW9{G%EbQ~(lUpgheRW^ z+Q)r5>Si@ax&1R>Fjxgl9hMg7zDBuZI>1`JLq*VsAK;uT=g#~0KQS&~u0bjrE2hBI z!8);Vl-0Hp9NIk4N=_`FE)1!}PWOH^(}8MO$Sx8aHsf89a}JG(UCiT;^@r^jDGGa^_Lm zR*JXGZ3XG^$Rd#7h{J}{o@rqGniLV1SXyGm?p_p9s-^YqMJCYVHZ6!9GUXGNLtn4) zT?S>b`3JYDPEnA^0p}p<2;&5ao-VMWogukf(eS4;4f{XXbGzPw4`L;*C_hn}O>2wx zdZ7l9eZ{WpZO+%_?!l$==<`O&s52%x?3$nV%?E!E?mr~Ff!E$(aX?Od=h;4zI4gzT zsQ++z8Nhnc2oa@bKM0o#_(MCBZFIx^{~G|EvVJUuk-0+KJYj5=BDk_%yQl5o$0wlVYD`pFvieW z+paVfK`RkMK;!y&=JIvM77=4Kq7~!mxF&dpey<3UM~#qi2{1cn8DwC8V_6s6RLcr7*;lM7(L}zW&rmJ(Pxvd{CFox6L2o+cvHY1J z3G3m3jOg0F`5|3{!3+)s*V_j(*A-gB`m@hLL8c;99RtEY1*i>#J&7LCMdf`Z&#M>`cHE_0eu8IJd$ zQs$`Hzw>HwJXSHVxauab$H>|r>)@#6H7ztse3P&zi`@Sp9FoOHKYD^+g&?D)%j`Zj z&Po_;uxR)mYvbCPIV={s)}>nT@&Q-ETC7$mrmd?Qv&rk%FZXj4i?-q?+h@tCwlJQ! z)tenPMqUw{FP_#9_~0tKMhRLyTX;0$n51KCa*?!KdaZB~kF~rnh$X34t5{9*S7{;b ztanSng&-VK5}WOUXW@jExxouSzttPUH|Yw)d;a>()Tl-H%%-BJE~Z9aDM~UXRdCje zH*-UbVzDh2QR-W6eZTn+2vLK!Wuv$?^Lc1PQ~Z5@7ZQu$SypLL#e;ld8^tH(x*CEM7302~QWmC%wqsbu2=R+nn=3NI*|zcH5vbZ_F?Y zdzqtH*WC`TBTMS|6TQ9OCQhUCrk3X2u zO#SfcRCZM{DUILL>bmLy@u798m8E0&qYLfR`&`~VE)MWr{G$4UX$)F|hb!nmdA9qv z{fX>eh}$`nJyQ95)uuPpc2e5cjTCpC&RBAf_iai{f|q&|`dOE_-3L4}yQ|;0p_x=X zXJUuBq{(vF1wT$ZmH4oaj|k@Pp=DVy!gb+WfH+?$jmS9J^k?^%BmEM~xEN4acm48x zXcuMJ7%)H|OFQ2qXkeAjC_czqi#Y3OK!HU@wAu9sz=t3ov2VzCd-d{F zz0iO^mA}@qg|y);h%YklezauRk``>TzHl2$W{$bG?H}ufR)6GcYOXylnH}kYZ%&Fl z5fBZ(1hWObv#l#Q&j9I4xE021- zJiFONgHGrR=!c6RcIpa`JWbIg!%U<}x|)wX%Ejd4Y3H=(v%UI zoiD_T=*mNF0bRm9i_E>NnWAT^Xi!+8>`a8=ukZ{j7Ea1U-Ns-GdUo!S;3MSVIp1H^ zm9F9xHI2UZjw{AacdHV}Yb9|Ru*#i%nff&w(aPdKkA@&*ijPZWL7;}v{K+ij{RibG28vbxbVUb9y>r3B}6uGwVRh; zbQ?an*Y{z3l2VnKicanAb6@t*Y=bD3E&;AjOISYq@kGHML6du4RETGce*Vh3UEVJJ zY;r$TWk%EEDU8vYf*WrQ*@m_{X$$x#^!Nvsgt2E&w*=!kOx-2njMC4iaa@1lon@WZ z#huc+z+6pBo%vv`#c_3*bt0B|H<6K2Dhgt|)OjPyFWa|%y_RJZQ8VNZzvrQbQKxyk z>8Fmr+|YLrgpT1Skc!ZJnIZP@9{JVSq=f2A!Guww4~0Iiv_r8gcnOf!O(~hG7`<8l z%Grl18=kR%&_J%Ol}VRWf0?R};qeq7Hq_}gInOEebf;icV#zcU2&zBQM9mC%uc3l- zuY>gREQ-u4_|`l9^tW?l?L)Dg^ao)1Tz0|I9zo-hPz^dG%IQ62aDll*b&h2GW~3@d z?Ium>=y*$v=CYcxIB!vt>6z8wO|u4mynYzlN)u^vhgH!)H-WpseX9xL}1a2 z=d)EPHg~X*aEZ|gGcaoBUVjWYhOt<`N4tvS{=H8`*wRj@>Z~t;NX^H}e;HN1;qy0x z`%xoJ&;aR@_+OZ1?PI^L&q2Jih6(#np@fRIpDi7Q*BsM#a(M=0({L`Al%$2!JXx4z z$2!*N^jW3#Qr*GtaNbdzCdF#Lr3O+>MQ9N*d0kcKR?*FUg8V&vmgdy z?cdchk+&7l>uOY^cX5Y3mEnLX6L~&&A;^}vj}}C_B6nZA?Seuk@myz0w_=L1#FE3-Np7Y(v2&$GAqv6INGj`H&Wrq}e zKlrrqX3>(i>sWf8jJ8lNSB#UkMeG&A58s?gE){RZ=$$ihULN8Q+rs))_rS+^ZX>!c zMhv|l)!_Px1WFJQr{#yo3teS<Tt){J@bVgfDXWo<wX61wDoB{+9c_Dy0oF(MR81aBge^&i$LEK<|^hMu=^epqQX#5LQVStqd%P; z)4ja$Edyx>4Cn_j*1c3I$oS{%y!>-Sp~uPL5&a4+Lcc3zu;1EEZPxrd#duzaC(X zS}&=#`A{#=ipVMDq&tw;R~eRfWQ!$>JMO2W zs{vuG7l%mXT%HW{X{@Q@%pBF@riV0iL>VySF5EOa943g(vW+=q)+ zb5jQXB4&h^%ItmP6BUR)4>xIl227*8+MP+tNtN?M-zG(|5l;tsZsCLxyw(}c&&J6dsZlkz#SZBrC5hnU-_awus-Z?RByku7{Q zV5ZnVnT4gr`kI$6@SGm&`4-@5J7OTAD*2becL{I?)E|;oVo0~Wk-=u`Y)|fdY4DqG zl7)f~gH{Hyo|!5zjC(y8$g=!S3#Y9p^g-@Q-V(=(z&JWg?L_2;W#a0M1Zj?Demv3_ zbE;PgQHO}FK}NGE)+-@2nV|!s&AS+S{5T24uOdYlHFaE;yJC&-Y&_%OY{j9kZ%_{? z`}42bwLmoqYbNq7Fffml=u%qNbfwhe<&*`KiK!(^qvU4|_k`D#p}O1ZVz)r}Ph`V} zPuz;LzZ9`NPrY?{$5(U|&)RI|4;quM)B{2-53Cx|D;pSK^mX_%5|A z#u-CmK>e)&B_ECX$|C;#Q`+tL;eJxL%AlV8RQv8?yUrPdGK;=289D9}vT`v=xI5`s z?>bJNQtW=n(Vv5{gVO`4zQI@-8b)5CTiVlOpPTgOhcMbz_&Yk0b}PLMVo|DKEh)=&TO4tQ|07uE2bptkm^(2fps~ zn6{y-x}Jd`E_jV}vG=q?R<)Szl)$_{%A7_c*!^Xs&f{7Ozvt?f$%>sGj(X$z7X~J2 zsogVQ*W?8;^^GqOjJa8n^%rHEAAo#njohf=kQAHmZS2QAiAhOuwHE#S&$MLN7eW+z z*|cgi?+hqVKI7q?#N;SnQYbZ!mE^$A?Cdiszvm* z?V1avnl-%YNND10Df>+5k}A)En$a4W*!DzoY0P7L0j7xZdh1~Vo3=AM{ zm&O%J>*e25aTaZtcWMUh!e>XAkrBA)HdxFt?a#@sZt)nC)@15lp^Ux`AsK7^7m?2#HuvLkGohB z%R)ICu8&$4BH1Vo7|#_#j)bcReGwCLen&OGj@->H{Jl6ztv2%ao$5m+I*lnBMtuT> z?JL6#jz$Nn8{erN`Bzucn)w|GABZuIMf}_Kn7k(i5-4v9eV4bpJ&i-q;ikB_%Q|Ta z4*r@l12v*(vi%?j*J!dg)qq2C*6&^-3&F?QRJWuf4it;{`uel1=aDOAYTSnXh7QdF z-&Zn2%|(g%u;o;g(H#=(E)nZ&GPlWtimRZaofM=Y2r3mWB{sD$X$T3}LYo@-wctbX zN{K{PYUXu{z`zr?zQou&ln=B9eLb>N(Z4%MM{4h0ljyA2S?+W`lS4^2OmOzk5weX$**dCLfhy7`5s!*~~5D(2|J!>a6yW&lch-te1Aw8`9U( zT#gL>tfyt{$a**^Pq&X%qTR~3LEbztTJ{jRZSr{c4QZmJ>r*-{X{l~Vop+A^>I~%V zUuZ@VWwj-mN9?7%%@fAXM8(hRIVd90oG~lg|r-+La93UHLF7v4?$N( zrn!&tCu&dg`UI-Wf|rvCZ|aY-NaJ6>?yQIw-aBCJy7_~d7Fgl`zTGkLs@&myAkCB4 zN_LN<7_`TJUI8V+TOdoUxzn z9{nT}poOkbC6=bYI<|^$~ofnuqB#K8?Wk` z^i?fLo7L0q>c?nLS{uF~?1&#W&G~8gL}h7F#N)GJMwRirI*Vj=*)y7BbEQCx^FPbU zniYCA!6d@D#e$R=*-wr?YV5xy@Ty);T*r~`o$=s`l1{$gDVV2f>g?A|V><4mC18;! z<)E2wm?>hg^VyIl&+!ZA?!DnYFIAcckM*yA!Cx!in^f$%;#@g!t>>!FxlVvM2{26{ zRauVl6T)W|J}^l#LaW_%P)*-y)2qliu5iK0V9 z{Xml}im;snOCL4H?=zbE^|=^r@ji+4j|a+sj1Si$C9f?{Sg|zqKAW|$zS1=Y;5^A7 za{>iE@x@QMvKNM^tr$OXgyyPp+~H(|9}vZ2tyE%JzYu=Ji0C;8|Ga%d6|H3z+wirP z)%*y%UeVZLw5O3N0@JpA`T{RX&LS}79PeA9UZaUIcH7T4WjMN@-SQ6+DzhklMCM*` zp4za&=n&+@B7F%K+R~{Hf8mUzwaHmN;j_BOoE(+KS=u{_&zsP-w0_lnOM}qs6BLt~ z-e7uTSYko2x-P@r|D~`c?IIV&m?tlX_f}>aQ^1^SYmtD0QP+PWO472RlXiF|6nRuu zo6<_4s#!5mgZUMUOu3|WA^dh^9bPy_3!1C-i^=oQ zUj4~i;qcCBe?x47b%w+2BU3OAzwcl+;Hkn> zOcm*-?2#{Gs;PJeODHt+VM0nR&5 z+oS4GY5Sbn8@|-Wh}LmErGGbJ@BbDi0izM8&@uFMEW|QwVkudCJ+zEjhhtePOq9sN zJ_7oDhpU`dm5&vD_P^WczGnDMR}YA=O~{Y zHk+pD7Dlw=+~w~!U`q0@u$xpX?SQW?hv82cZg?2Q8Y8=mM}{&2vNkQeq^(7Gts?h{ zzLW?*^sqK!crCYHwr@(C-L60DB~ze9a*qX}GgWef?=P2uXP&>eT{BoA^OFa5>5mcp z>_;Gcbsk{cbyE11J0MubLj2``K^r}tvd=U~R7S*bP-$BI(z?(lapkll!QHziN4b&iUzu>en+vp9`x~`LF&4NyC zu$t&(pYpG-u^`8< zQT#U8S(TUv`MW;U?WN(TGYv1yEPD!9Zr-79%?D^=xYY#1R8*Z=NUz98$pS%%Z7TT% z_2^?dWd)K9=ZMsY&TlSh55kySK0TdSbFt_cBMG|x8o&{voBZ)xbfI?pn>=@3f@{~) zUPJQ^|3ogLuEL$TLiXZhhTp2O%E-fp0uSR7+Qu)PkcHN3HO5EmV9y! zoW(>xp?L{W!~t%I*N7LO)X6f->>?-U3eZb|*vY+Z$OjDJkek1C9VdB~%?S(!a@REP z(VJ_nF))qr_}dVVIg$jVmU{fENK8+8!0M-`_k7$rT740*Qzahc$2ulUO3*zJ*`W8B z@U7T48E>=5lA3s~!HJ7LJ)avm#j8I0CQxB~_^jC=)DRd!og~Tz0dJo@-p|I6DmCVY z$g42XVAU?e(W4Nw{P21oQc3sfO4{KJnwwCy+k#}EEIldYdHbs(;~v38b*-o1hK;YF zpD}RbaWCUGOU6AtlYbGyNa)`%+dLrtQnRZGWOiSCXX@P>WFV_suRRZD@|eEeFC zJz|#ni#|+}+UN6&x_MFl>LPqUc6!mUSezC0vU>L+PZq<@dZyhunSUzL^IF!+VeCa# zjxd7-0dpcU%RlMi4b3~G&DmYfNeuL8)&uDb*s*$f@45s?uNnO-$CDB9aN&%A(dre?9Go6BLSvi=wL*;FIw)rp~*0a*isMgVtp>v^zZJ zQXNdldOjZqldKW$-$I!ab;4R+hw4{{qy%t$ySaF;hVsEqKSs^6qu8oB+QoocdaigkGRV`eT zknkO%EwN$tb8v9ioy8cM7stRWq*Ifzj`igKU?#k=+z+3UC4hRUaFg>KKGqI0(GGH{ zS=2jyb1R*F0aTkBm3izpW>@DFF;ty|u=a<)a2nZjqMOZXgo~REz;kZDF_bDGx?dGM4d~mb0jeD+33W6o6JTL&;}b4)n=FJ?bO%*r~wIy zkVRQeT6ckpnN$(uKM;})Gv*)@t~96}ZG_PIaTVYtExx+7DIY0&J{$Z$5P&5EDp*5N zcy2%GAQUOD?s6Ovw-I;?jbLO7BM*`p=p!itl}Bp+*<=1^VEg|tNXPpR@D;I8gQ@u+ z_y3HV3>H!I(?LMkwt-AgQ0XoWG|_GW#dh>U5c%PQe*`LLMeLwP4H|FzvH&BMJ(vc= zB+m3&Kuy?o!pNQj3V)df@C|07Q6jK>_hF@a6r0MKFad zMwh~%{MyG>iQv^ubHG0amYAoIz7A~^{Yz**Gg3gt{ai}?2Dk#sp)iavQ>=tlz=`Ot z0z(Zed-ND&_?Zj6yRogGwkyS*1EV11Mq*(ruYDFgkSPlImo&(sA_gdc6%bF%0t5h; z_aL$ceOhwy3V;!*#QKJLA@w)Spv(ODS-=_9acTXH|9>{YngBYXWE?c)vyC9=p&v3O zQGsIuVJrGPD*S%|=feTzbH4{BsQyt+Ni)GxQT`ifJdvel-WlIkuk*Q&~Zv zkAe}uaQ){hfjLaZ1Brvz}o zWOuBgK%*-_+RK)F4FYft0P(3`L%td+FOUpWyx0mFns}Ua2JAs`4147u1}2Qs{S8Nb z&%<;8+9BiJOJ*ow6K@VJ0?x@KD)p!#uxHf)M0$1EP9>lFKvszqD z1HtztZFuIA%sH+gT3KJm~Au5mcRFP)xrBDnpXr2;W zSB1~D0rY#5f7v01D;^P5D3#0@1CW6&;2C(}pMC*D`lMGnFjQ?_AwIUdfO94_1|NMm5l0ll9!0&VtX!`IDO5SH8uzt;}9KgDr0YJTSPSv7` z@Bm_Q0U`eXME^8q6fWYs66_r~M9>g7y#`!C{VIGHpnSFf+9^fQ>5QQdL z1DXV+K^-M-E0u;JUd*22R~erR)N{r7trCX2Zj(6hyls&evhIsUEcM+xp|`v`T{`%X z0}fbNb|4r4cwNq01ZY2>Q@AGbTu%0FC*B4L@;zc{!dBd%w-|=%!cl0h!YFc9+%jW5z4t%7 z?8$qC$2|T>W$~9!r2T>;2ciXp_U+uIsrmZZ`8JF`w5^;U^hyBJxZLaOpoNnC&)wGD z@h7`qZ?4YHoa6gS^hy!R+HP(YKHF2nXt-3{UfO!LIF&E}ZeCqEX*fE(`?#hTDv4@_ zB=vhZ(v#!zPCD)HGh*G)Vr+WLmmf#gu+$%5H(F}WU5QcYhQwXuT=rEbw zfM9(GjPaZHc9~qEj}>)IaMdc?{ztggKYsj}k5xJnyZ`HG%z2}7D_Hz=@v}_)104EIcvUlUa6b9Q-CDc>f(7^n#(rI){|FcGf3di%PBmWd(eMW z)54LVS1VZzROq!c0uKv%jl!WNf?n|+%P>Q)G=gv~=vB%E{51IU|L+&j3~S_wIgWl( zuK^v5^h9F4)&?#vL7StNzRRQ}0t*W*Ev+TXN|T0x25M37b@y4YLHm2QhvF!2Z4~1v zs^9b3&wz)iV{^cX3Z=58WnSe%jeP=#MT=P7ZD%xLi#Ze}*WcUw+4C55zJaHtrp|nj z4l8q>tjKx{zRD+7h54nN^F-PE(2MEmX}yO_;L8qXaUKgA0wBsMc*;V*(%fuCBvZ)! z6p6LmxbAN!_|#W4aAY>K@1sAQx;)u(J^1@Wg57ViJ^Zt*F3rx^=VYJVxoOZ@T4!Zw zZ6MoOJyWm_^lH_`tN#>&k)CsMYZAr$Ohy>9Nl`H&ws@?Zd{&Sx@=Y_k2kK zbng4}v%kOQ_U399ctV4lUzbK4Yov3xfxg|GNc?3Vh~C-D(^-6W<*_2Z>10qsEz!UBOW*djGIfeqjWg2F)=YN=lhEj^{yt5MZJr0zw4bG|9sDv zg$ItnBwmUZQnbF2(S}7!yRDJY`*O2y6Kq)*7Z;y9ME&6W)im;{yS>1;<`0OJbsqxwQaQUtizhm6Q3$HD^wT58YTFq4N-^D|3&*IDtxhyC;#Jiek3Td9B06 z=ewv+ySUHhJKWjvTddNNB2DV20mlwb=@k)sPEVoRejl|wFN-0q|t1dW#wsv+iP&auI8bQ%JRyMYqo#H5DBs?zYL(c?Q*`>0C*Z%t@ z&xpa_P5=F!diDRofN=6!G+WSZEz(<2+_(0c|3 znXUV@L{e6^wzktC?#T|^TD73@^(>ffxqw+`viS9WhoJoc1#bR~gjFZT6)<6zfqTGQ z#1-_pT)=(P{&~XQ&Q9N`601aRQownFUGG(S3kSR9w|U7X^OUK5G4Kl!F^gZ32$b8j z-?XoS8>GCpcFefmWh0U|===qgNa(UXRecIz)LGEDx~!^dhziWDzAZ*P4$6gYl*;e7 zPGE$p1EAe+&;i=selVww&wjw4^mny&WaKP(YZlxB*B(V0*@&4EDIeur+~QKKfB$k{4Tr*#@R3h3{)*H3W=bpfV175$U^{mPItvU zF8}bM)$Uiu$`+$~#xkvzwDJ-Dnb~xrKFsx65Io>vyWghPrt89Y)eB#2O3)!37tflUR zSrUsNOJIln3{GILg-&HrNl{7OV?mdFypo$`a1t6oNWd(34D8}0fnono<>QDAF!b>2 zg3&X&khU6xFC-7%AKy38BZol#t(m$~10KEd?TPYCYV%x);2_R*z`So*YK?1!tA*?S zx-o6?{_LKH`rwg&)wq@^P9deBOZu;Lo({IGlIKo6b}(s+;VzzPhiktGle81g?K_R&Z-|KBLhs)b20?SHjM(NPcwPH0#E@ z+pFeH(uig!j5211dBAk*Jv2(uLG2&nUkAf=Na?XZ+T;s(=L*T;Nz zvFHOsi~4$+j^iaM!C1+l-_ARGDc#HYlnM6_hFE?=dn zr3%2!K@rMO7}}v4^JR;m5tAPx6-;?Nt`gO&J9}fS+mU7V4xq48JfIU=9FN zv1a7Y7w^Gfe%LWGG<)wpntw7Kst&4dxcW{dEdr~?>Dk9ma!>tskK-F@8JtMnLPA>n zrm~;cYog=ln+!n=viq&_gTa$zC0-?IZnr76x4VypNnpTU= zmq3#(CCXl)^lqoU8upPpkq8J5{%xB7r1|&;_l}BR&cw^#C#N_s#qFd9x1IW-H>bmS zLxlg<-0(&DQFQJTJjt7@@jZh$wc$ONn{U{o{IwcyLJ}gKRc2R0`;jUh*nfsb=HOPX z=UT;jDLQY=9u`@WR>%}YjI*Y*DmjGyF3BeoU1N=6)>^->rlFzXMBQ95akf6(aW)!B z)vQnYsWd{?$?#)dL(};65U}|OpJZHef7~a7uPO!Mfm;=a42Q|9{>GC<$W+a8*o3@fT$RC!WDPXmN2#5v*0-=kf|2FPn^OGR(c`#}Hps&l} z`n##F8Kj%Gpnzu#b_1BWe#HXQ)UnqQ$fYtRRiCdOZIq}YL2vVdx33@MEfQ`9FVQrQ{C(a(GOLh33Md_=cb#IKw@E(%X4mbiI<9t*8TzMOJ& zE2=m#)@dDU;yylAu>=p;v3PRAmHp=XZ#jcn6`Nk{-a~r(NTdW##aH9fa)&gM_lcDV j4}Cx!32CIY>{t?u-+@m^*X$bH@<__^8gdmf&tLx^>|4

^&-}$oN({|79XZP$L-fF5VQIa!|6A%zkswgXJ z6A)Zzz`qw=x`=;1_fHojARwo=Q&7-UQBYvjbOYMhIa(7CD8G%1C)Ly)X6Wc^9A|V& z$Y~w$U1tR?KK7xFv!;))Yu0}3sC=L3>SIOX>++BE?lai)zTu<`2_o7HA|}M#~>^p+p?tc5s;sSy9-Q@2o796ao(2@(1Z_~&L z-aUCPcvr;kJ%T!S^V7wv6D92^kg3tr$mh1b!{Vp#XRm|_n_~=kW#|bk`7?zFMvb$t zl+sy9GjoK6Z%Ds_j`s6fF})2d(SP)4hGG0p5#45j1S$}6b5lu;F7k*J*3>mjZOz`! zv2~OA8R^9sS{9lX+ngtEr+vU}*}J!8R?Uu}DFout^i$PHvFL#yvTO2E(SFSY%->@! z2ni8V^jpdiXO_uvzadT@`rbWMN!0x<+v)g*vj=zU74bIZFrFxAR@?obgJMMHtLjC- z?f6p=$D4p<4ZfS=0^5FybEgHR*9jMVt`LA0HPkjK2WI36_^*@>?k_HnjcpQj57$4r za7~Vm^A6hK!Uc08-e5i#V&`Ux{ZQ%>k`nm`%5sOj1f%9u-!G6%u|6c~l&5`2!q9xv z<%&lT#T0qX73a{~_sN-q$?j8{hLDsH>$6_^Du4YAxr&_IN1<%8n{qZEMdmJf%fU4- zUBBXbn>qHPwSsR3QT`3?@WPBI3#9oJbwub_VHu=9?>!)G43_!I`T6po`OW7f$k#pQ zk|Rue;bN`E4{!E{xKCejxoLbMEo^+6XT!L^ZH$B|$R;bMU$X!8f}6*MIwo{D zJTg^LAic?)^M>6!_I9G#2(oq;!JD6@o^j<~84RlpyV>^aMSRI~UM5I{NL!t`LP_b! z>d2!NS4W;IQptBIU-@TT9+D-q_mX2@znIo`^{#nQGg#AAa~1VqO*-{eLM!7`%0`A4 zvka+O1n{fb*QhDm4Ibj#Awn%7Q;(;ptFA^|s(j`AmFepPi`SgbblD8Ap1dvnCjCvw zl46r#Q*e{-t)e#Tml!`~!EAK4(15`J<-ong3kI)>}^@(lhA*Nn#&g(dKk1eXw(440SX`JY~ zwO2k=woy*~*uX9>@HnO{*77OlX-bR_C*@NI|_Qd+yKX3%eV5 zO_2Jc`c;a1(JRTf^m+~XpA;*um7yrYI9oql?c;p0BS<%wgE5&KoP%IUF@Wp3v_#k4 zt{c*(a$ckDxt?|X>2+UP`q;TxskpMZ#5iVdn%JJ$thgv{9FG7bzmT|KMQ2g-iykci zq}QYEr0-w!M5|ousXj!jKJSB`m`;?AY_Uu>p~DRaMF-uNsQy18NlI6G$LB)RIbYO|`sRQDlV{eyaVFOLZuS`)2McT#7z^KN%$*M66IF>;}P5xW3h zZW8=?-<(nR21+>lhQ!S^p_K=IPT6+X?L59Nzy%Q_gI;N_uuWSU9U8bwBC)KUc!U+ffsK2?r$GRCMfg1$0>6fbyZLcjb;{$>{XD+inW0VO%^UJn?#! zh*u)55~#!M-B<4$D7$jo=f6NR`8uk4J=@jM{K&NmG>@;eFWf)rL})OiHgt40$j!y` zJNSmjb=S)-ykNhj?5S@cdrw0bQO}7r)NF{WD_DF^XpMWe)6>br#6=i1K8?hxd*a*$ zz=87_(=E7#y;ss`DJox?iTs97)upWzUbQ|^rWz)xpc1eHM*K@)N<%_Yt4%^243^qKUx=IAM=mTHB23YL!~6kIccGe8-U zNw>t9MjtTQ+={0ctug?)&(9|r-K+ivtgX>=;c-|#aCzpX>7}#J5l;^ZtGqGIpmnpf z*`_S2%*@SEoGrOl8S;JR`xj0~{!G3>F)i*sn177D?tza?*i9YgZ3!e>6}P8&FHfQA(@eK zRniyCwbqFiX&m!Z*f;fbJke%BLL1M(Jf=o!$5BJuzPQ zF5l*pzVTxPP%Q)k8G&B04gcRL<&p;_h zzZn_q=}PE6DU2mo*4Vq^NO0culqQ2CMms;h{orqNT;66%KgCy8f1 zyK2)$Z>x9L-%afD`v}OGs6IC|=nWLuginW#hMz{sv)Jkj$xO?{`RkvdPTEeoW)ZIt zhuPD5MU3-pmZ1TOeAmEGzdZCB?DQO6noCq(CPzI6C zXsNRnyt{w%<}hzo6JHP|<=OYiyKJ35%^T^yL_LqeK_EbDf@aW#jW11gb#8v3UEvuP zEh>Tq6;oVTtK-RB<9)t*Vb06OtoSOG1q`MsQ6@U005q`V~XuTIt;7OY-Qj?V59Ueb4dwUEHS zpOXddu>NY|;UInIxtb=c0?^HxRfPWm|NT2Mbsi$Ul!Hwh#~q2B;{?>v|EcqDhl)S)X)la$p817GEW5#`c;;=xVVNMda&} zT>o_EPEUg3)g9O+ZN&&(E~3D=JFMCyLvIEitrHSuTvUFftlVhaWpcXh&)-yATZ?WS zN7t`(uVB3!*KEL^ox8M$!FgO0W0_yMC z1cX3#Fc0JFe=b3;xl8b$^RRwYAtai3wx%yi{&yaz<${6|Ui@<&Io22=;)X9MsN?m2 z@D)TrDA4iGd4lBF@yrU>8jW)PO)%%I6PbSa=R5?#&&a7aY}~5LwEiwE{3?kXZe92n z>C1K2sh&A!>#ToC5ii(_{~`(f{|j~@=}AaiBz^tCHnzU5PGWdqAi7t5Yz4a`&xh1xBO1(ATaMS4kDV->3$hSylmjPBn)7L} zf^Zv1B=V3?f181%USGbaq%xB^+);dIb$r-tq+cG!e*A~J4{*vI@EKufI+I@GI55># zDLLBo8w_Sm0Vl^@rj0&=mx*1zueq8-Z`7Ef;U|}W$z^~W-=`i!%M=rwN=FT-~E7L)%zWa1YqwkuF=w@wGbGF{i3uBbm|8lqciy%(Q+Ge&n#|~y-B~4u>9@u%UQhRn zhHjA^m2aFr!&X1=tyOnwhVXExUUtn7n{8%UIac^JJu8MNcAT?%k-9j3mK9?*+-)UW zNhkn_B{$Rh%3&n)MSQm8_Ak}c6#sEXwS zRkuyHw!vpdlV^3f$-v3?jAFh1n~`Q7jlQ_v1F6XZoxHm037@Xr^~uTA>dAoO++237 z$C9e3G<#SO4Tam>Yn))2AR-<1;NzWhd zE)P40CMG5xAAyht9ZprFHqJx&T5ow1xW1qCM+MAn`;0qPvx%nVtg*~@nOt!Omu%%) zo^SV4O8(Q$sKAFQFY$dC#q0*M8#vm0*J?X7#C&#MRu7x{)>^cNT^+iH!b+Q}N;B6> zn6>p%qf0DJ9(2aJy$8O0>0+DeovYI_|CK_Zn{k8RsH*#93DC4P=)dNk=5BVnm0*%4 z;`iWwgYUFguJ(`z;mCJ4kIG&kysR(mnyQUu1(!nIpPU8 zjys&#^VSY?pYL{sz~DX!WjfszCWhuD9I8&uMoS5nQ_aDtzWW=~0iS{5qABd$yR5b{ z_V8^cv$hX7QU}^&ou3j`->I8&HX-}{JyGgn0mu6r-U0n~UhmJX`J+^@W#F0P;Q}zk z-VHqAZJQUFtt!y45#oD#fIV5>?vtHt#7+3F;Wuq>-Rbn+W&f~{z*s6sp5MzODY8~2 zX76u}2lGklv?S*k)52>fq1H4V#(21H*z#6q!@~Z8X$o&_1k;$zqN7YwZ&-?2A2w%| z3RO36({a1?0}%)WVp0;ic#i6W7SNEE^F)I;{PhI5 z>Bt0Epy6M*;AUBSuJb|tgD{fXJ#%G1MTNrZaaAgb2gcfM^~v#Y9-k&L#y|yg%z<{9Y*%^S<{9NP>fAaB4&pPA>q+iiq0zX zmf4>Q-H?Rg>a-ao6&6K(G-$GhWk@T5PwM{IIMK+&$k zBst>QHMp)*a4(G+9;#A&UR7tGz#e@ZzytT%x`+<61PyZ>6jVHSX`Ci<(m16qwW@n5 zIMB4vux;WzsqB7m{X%BsSLQR?l_jD@H8HeRqzm_Y<5njR{L!N>EzGMX94af)ks-!3AK+2&s=j)+CYV~%oP|+>t4go+hlWL~ zY~7`wbfcrk{fk4y?IGydDA|c&mx8IH#O!rEe*xNvZkf$*G!}4Xuc_esBho7+t;ZF0 zA(;YG0QeTIY!ovrb3Q>ep5=^vAGZn&9GAu$TEG{H+A-|quJN64qh_hL$v(t$y%BeKyeMd; zTE`8Ww^MbKIoTO(_1-bjomQCD3vHb6Sw2_{*eg#vFf=-2-_xk9B(IP?T(}!pX*LO@ z@C4m{no{^(5vrgrx%xo1+9yNbR0Z!2tikbk)cV7t>uq#9 zq{yb}>C%uYA802}D3RGVJ39z~wc`U|q$xZRnJR>k_>4*E9-s==wJSWH1v-k@#_k?v zZ8rrN&HR|pN**c4i1UQEok;ouw?_lGK_jC+`WP&^4{dXM4F9*YU0C4zs5Nb@K9h~= z!keLs4NFcM1w$FDQN8m~>Ul~u2JY6#9f{?la#S^Z7wW<+VpR1gf=Cw~MXM3G-^$|G6O?%PGDY>!dE7z7tV*f?(Lu(M zOwDgO{q^;e%INa`n8E%Y_n4;S=%Tfn)G^8=% zhhT&rpq2@Y>TeqMlUykY9bA9>z)lMDZJ=wjO14fY`xxmt*A{9TH>$gsOCiTiW6-JE zQ|zQ+pY&i^HS)@qc39OW16`u5j7deoJN1t~K{XPJnzkb3%6hEGA6==i+?Y}ki-TjV z?0V9p!m5rfs0}~&o8`iE_1N%RZpvOcn#=kLM|-HMM+X%cLEcp_&UQ6={@5b#!oZkW zvz<BFVmSRtp)uknQrZ!8 znmhhFWgW)(i*6M<;+1PZqii0uO)d+Qlp(VZ^JGs7sIn0j@yLSa=W3~yX?#@um`w&e zOnk4CgHP7>wkw$onJL1vx2x;{t70mApLiFm4VL?X!C?}8Q8$I#W%i))MKnCS#7<3< z5-`Xf0P7UjwNsyo^zT3AE+R>{e^-qU{+j%f%oISn3~Gk5m~W{9)uXO@tC;GAQrn&+ zy>bV>XS=l_rfeoFrFO?}E+0R2YG#yvJJNzeWUPv*!Ds;RgUmrYe~Gt?%pWD!8wREE zUi4IBaG_b#DWRCX(6b}n_O*kW`}Ax2L)pgO1VosHZpraEIyuSzyy;A6CRLI(a-VcB%oG-_0lY2ZQ2F=(BkZf{JkD zZz9$D*K2wpEM$lW`JT^lxN+%IrCYAAfRz~xp)WOhMOhT^!A?2@u_|AE%U5T*g;vwdN15gbg_2G0td1{@{vHf$1ykC4U}6V(BG9&H+GVo~^lg3`? zd|3inl|Ed^YMp-(*O`Qb@a)#fp6*P+jh`+F8sKcW(h<@oV`19SuBRoSj0 zc6p_eo8dv)>Chu=&Flw?w8RY4cmysY@qtndv?HuD!BA%OX#eMY<>nr|{5Iy>8W*X) z!vUXFYw*CEf)YFQ-A$vUx9mq7tt}M2&Dh%)%km5K4n95wQ%z}!3Z(nX)>(c3i z`n2cTN9%@WU2%&IzyrwP7~}4BMm261$i?R(sj~~DhRXWz>Md0kD=zm-s}_nh9<9~;m-{*-LK4lE=j`<6`+XFvL4|v| zjSfqn%sOLI+r0KhZI9IRb&JDfC;c+x!R4mMUo9T;j*XOtkY;7u;-|-L6 zZ_^YV+is6O?0gF;P6jw(#3b7vRG1I9b1mo%Y~E;821<+C=GeKP2k}y|s!U506zG_Y z4`ef4{VGqX*a6xdA`+$c()Q!U*qVY_E)p^OnIc)*bi`;+z|kret3~aYLc4#pMHUoI z1EsCn+{|!_dS8vhJK#xaOx~zUd+rr_O=#lEYw-AncLi@8aMO$t=fLui*)O88VJgBexCisk#{?&<_(KeQkh^{zAb+0_sPe7*6#)?!UCCsnW%#Dr zhhEsYp2uX-T2|wHqJv+~tJEKi8WMd<6uX;!yQW=wXV>GeuM`&DFiG>z&1mO&UJ?mA zWYRtu;Ex{j+nf|)1a@U6*VuP?BXk4GU+^-ojCnbfzLYP<^J;L($9MdRUe`u>+DXx* zt_evuf}~nTw|aZ;`$v&sW8ntXypAsmGEyRD`WfPh?8LbD-(uz~ZA9zDT0<5VJnRF! zTS(~l6DJqEO!JiF2%m99@v8RGRn6-LXYGVw)2922`?U*E&BdjA_aGcqzSS1W@Zuv+YctiWC#FWaKTq}!fw zQ`wW;DSz4dHR_3n@2`{LJ$X5iLVLsu6^sbP746o==Tsppi^ZQlZUs*I<6aN?+7q$wn1lQJZd1%E!@=tY;`dE7M&TN?bO_M z@D#EexF>7MA>5Of+M~Mx5Su{i_S@*fhmJ>6`yk#!C_NJ_#2jwkLX$jSYF*qg7w&4x%GJJGfGF2yGz4mY`<=O@@mvjASx z_T_sDMV^?hLPS7uYt0;bry@JDBA$u_>8Yi2(wOgv`@xa6zm-blqUWa= za~=okuZeUNQDz-AXu}Y9dhH#uyi4$QPD}0s)k{%JsPhe@?PPY(Fk&pa zpN+LOqOnc_Oj?k9$9tQE_e=M6(~CnAd_WxMCukKqP8_(kswZB@{$Mqjl=+f?X5r*@ z2YK7BVa?zoiFj@87`@$iSh_ZJ%VTpO#9UT>B`tu|Ll7V><=~TolZ1?Ff6G?rfGK4ho3YlB8?aE36hkiF=nUSqD7BQWt>Zain|n7pV)-gi+Xdw;KEESe4RXG zRt2{XVL!@Eawbn(ya8=Qir-Eh3XTZzuB3Y_X=k{*#m^FguDP{-^*ltGX#$$~1N#th zS`{`T5=}nZ$QKK-*HML2#eE=tz{b(C+1Xei-AUdgYf1vh_e<}hXd^$$u%|=~W~Ucy z(MPCHS&TN#I@nRZQ+dBE(KJb;ddb*lF~`C{qv>uuP)$KxuwJCm^Rlkb4N8|Rm^+4t zVd{w)Hc^ysR@TeT~9nndx#9i)1{Y3+?61JJ2HF?K+}(m`bmfv zro#?AW`@Wbl8?bvGBN_|`^ph%_D|wep{h+U&Wu1AqT4sxqExz`tE zEPL|Yo8GTGDvJv;VnoOL(0T#O#p@M`?2s>k0BylRPiybEWOhX3gYg#KUQG^u5jK9z z93;l7beqQ*$iK@BBCyeLCt%ty;KCUoH&g??bZo>ODNh% zxSY1KZ?$vWYV#}mru&5eBi0E+=*mFLU|>rzu}VUqh`+(U>r}_>Qd?@FUuBgbxvS?w zaTiS8vcqBq@4y+JjfI}Ca+gi#|4A%KNl7Q_KjR*;g*~*|efaX_%Z(1N^@)O$y2Imb zs^6mO1jY{U@a2cONuJj_*0lj4%u-$@!%4!n9|nVU`2cT5dY2mRj13LV&G#f>qYi>E zkg{XD<<)=7n)6Z6mJulaMPcQ!>H+jkOe^>2igoViO4Y@d_>_2YRTYxYq;BX8wEWfJ z1`!$E4M|VO(OO7BfvW_WMv^FW#k!Q>eAj}PsL%6uqm1}L93Rnr)DB+bY|8N%q={KI zZHY@jK2?AFLmPY3puwv&Nj4A;fk52(`1n%#ny+8Vel7=S1C>=kW-*Qtf7Q8o!@Pgj zxfJE-RXd_s*25?n_4nv>0(g=>l4L8VOLhUd##R(kIUH1!VOZ~TicjxPmb76b+UMgHIBa{nVGbI2}gOCq$l!9%%LRZ!{N zUc_Eq5%4&e>)_H~0EB;gUP+W@082YsTT?*kw|vw!2sY&j(H-TzUhPRzpNB3Hs9vF-#b-Kz7GVw%bq8pJKx5D2J8N?B8&Nc*pq{)Unv4MllDgs_$+xjVmL>ObXu6`B(L{2ejf1L>Htpz1A;xxc3W z4c|ZT2B0z_IY;>qcI48n@Ms&o`1$HT$*lj?&HZDN#kYQe=*L^ZDHDgE(YLpP)qxi>2Kg;owl3wl___c+d z)Lt{Y7s2bopkgq!6>}5rzL=-iB4rG-PtFATL^p-%In`yNVfnj99*O0&JjwODrG~iE z1{<;bK!NJBE1@Qn>NfSe{f6M4rue$bCpcFCljPX$Y(kZeE&Fc`NzWtRzq!U`5dXWX z9xwNl+R@Z+-IB%8UOp>q&y!Q=an(c-g%ZfWs?Q*l4#=ylC;yn&pu4`r z0I0cH9$%j~>F6TqG&I=<>ofI%^#|sT&1~M4c$<7;{6|5WAlQvKV*iJLt;p{Revq6i z(YjxS)MZZ*>|`3${e4%Y(G##bdI)teFog1+`-n_K%CwlDAjXS%1PqZg>J9TWVh4vL zYhbXznxDn9;6MDcHAThAwS-1aI()E!m!TYv47EE~=1F0MEcq%;GxT|_rmVdJ9WK59 zM5L!J+ntJWTE-ML6GpX!E*5uJ)6^+qt*LFR&A3oIVf>D3@XoJMGz;;UPYT?+!_SBO z`GSa?oW-lSxOEFiv6i>0+I+P0?upn*E4%F3oAh=Ntnadi!o?~PyS0)j^H)UUTms1Y zD7q?rOtElo)VOsFp|d%?WObQ!ui3!NynvnO(`6&ntMtXKEpwxZ)N&MGzLTf^)8mPb zE_C-4d}`i2ho-~xm@DyqFvgU)Ag1db!kb6_cmWl2XXMK+vGd(x_84eFWth8H%iwpEyK^4=sjQM9H;rA zIh@D3k>=78eYRpN*xsYw?=FUDnj)u^`usMSLrTAY3elpM1n6v9X5{SPJw?j=+gxEF zXsvAhy;~A&T=4S;^$v&M2#CLX(VT>oR)XU#BiQ-c$ia{}8(#rrTiU00>9K&BNUf?p zk(6B*p|cgW7x$E2&w4EVGD^&o8D;V1aOEfKn`C-2&2Y*kO#Bekg_3Eu!zBO_&FnoY z)#S)1F7+AMUq<_wv_4UGLR?=h?O3Es;VzQ}*BNQrSt+cv(oZp5gQOCvWGvBV5;(I^ zqOY%(MZ3ZMvC_Ockh=a!H7;mvNXegKB6)FPE zY;YdUmT{&ZnVI=j_XEem9ESFNEvk=n16h=jVo(>Kl|DkrD_25gg!hd!A@(iBM3~4A zw-&1mVQH{R>22ieHCch-@$A(wdQ|Ph%bvrx5FNu_A8sPYC&PVL;$8P zr>`sdoG0Dq4{drRfvCwv)5({0$ER!-C6L}?ei{30BPSQ2*m8^w_$y)?tt4-L^FxAazhbAmZ7{|rnqC_>LG12_nrwB2nhbF|DF^ex?$=J|COv}9} zxc<5)MWR^DZ#KUt5;WRaIYpI8pIc%l$(paH!Hpp1npxIKW3bD{WmJm(MQ`%siO&dl zr#^0S;zZYo13*qkyTZLFUSoT!AyG%}h6eegG=E4-6mlDMCXg?!R|3hNX3=0+y-4d# z1xpj}XoAbD!4k!JMzcN`PF8wafz~^Z9sGxHiH(ugANswY@@}DL65&q9rS*Xusts^A z&Ah&SFDbw+u&!e-_M|!ak5x_H5*;9|H_Tnrkg;w;>>|sx|uC8@WI}MTRP!`cb2JAQgKHGA+^t z(3WDBtH(N1xG!&+93CS|<3RT+amY{!56zq@cRy;EJr5tuN$y4}Ms2uY6Sue&V0uyj zUb2u6H#z~xPVjmRA9T`f7!}>Cr!RN>gQ}TzO^t`u+dJEmhhn`bu5#`Cs?47DNdV z`lliTR}prkm%%h!#QufT4aaacc-S`Fb{VB*c57xRvfRf4S#D2H+>^Q<;PYi%AfK%= zdu&!R&C!A1X;zGq$N}^$hjqJjk#Y?x-j%{kW~G9=zN{sOPMK+`mKYt__NCpB-7roW zw@s2~@`;0Q|FAwSrwEz&T-o^NP0t16Ak#!iF-!7ul@Dg7^9l?o*Le>esF`jIO^qK9 z>D@2na1y`261!A9r6p6B23Y)P5>^4fbZX``Yzf9(c#1k^<6A?dlg@?qCM~ClGpd(t zz4i$?9rJ_+mxiph3Vgw?Q4y)5Iga}1m(WzjiIYxh;aNS!Ecm!Z8t3_9!z%|9aBvc; zKSH`T6dyGkf?b=~ae-1z?B1Gi2b#_GQl-)t5gfm3;(Z6a_-8cB8YOpn?Q!bO8-M5t zm;yyZT?atR3wHx+ z;|H(RitHcxQi9GXC7QLjUt*?<#_34P7ho^Sq&$!B;XW_;gi$W7BFTvkz#$B?b?HwI zzB$Nj;#ekyyx#%i{dbrZ(2?t+bqNzrTL(2Wr)=th{r3`Hgd7_Vyh!H7bQ%@Aic0?h zC57_oa-T98MAMvp-C)SC2ns2~hED0J5TcpIeM~>hYxNDG#RiNIN*8yhJ7gtYY9#%t zs}fC*%x5d@QENsOGJ^n(J4-CJV8C+2rqYWL+fz?Jbr{hCrM{@EzOW^)Vf+bc~V%r_o%=rdeAq6whl5Y zKa<+>;*he?&KyM9xv|3VHr`xFSF#O*iv7S^Akupc zMphC-#)08fOPF>j-EvE(=pE4^;h=<}%9{3c&~9SZ;l7-ZsLCjC7jm@Lsl*DU8#?@O zDV6V*M&f*iUK*dq@}Z zJEX&q=x!URYINB1Lz_~c6?(7o0uytggT<*m8XC?#T~B@;G13R{fpgr%g(8;o(cTgO z@^#9xzO(-hf-b!xG8VnU<@IOKi09~h=#OmpSe|!Pt%~FiO!)1__4Csvj8*jx`N%`|xWI z{&*N%(`-Y5&P->->{>!&+c-pjd=1R8a#LF?~BI!k|2DjM|ex- zUsv3fVR*6+j!FD?KJ(8dQggD(H5(CxNBy~qKL-2XrT_OxedBDMW#Kd1?QieT|1n18 MvASaMBlD2|15`@6hX4Qo From bc85db3a196d1f372e91528056dcdcb434903bb9 Mon Sep 17 00:00:00 2001 From: Pavel Eremeev Date: Sat, 16 Mar 2019 15:22:57 +0000 Subject: [PATCH 407/483] refactor(*): make "not found" error message user-friendly Signed-off-by: Pavel Eremeev --- pkg/kube/client.go | 10 ++++++++-- pkg/kube/client_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 955c75ab157..3830c4eef19 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -333,9 +333,15 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader } originalInfo := original.Get(info) + + // Resource exists in the current cluster state, but not in the current helm configuration + // See: https://github.com/helm/helm/issues/1193 for more info if originalInfo == nil { - kind := info.Mapping.GroupVersionKind.Kind - return fmt.Errorf("no %s with the name %q found", kind, info.Name) + return fmt.Errorf( + "%s %q is not managed by Helm; delete the resource from the current cluster state to let Helm manage it", + info.Mapping.GroupVersionKind.Kind, + info.Name, + ) } if err := updateResource(c, info, originalInfo.Object, force, recreate); err != nil { diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 89e630bb32b..5bd9449b724 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -224,6 +224,43 @@ func TestUpdate(t *testing.T) { } } +func TestUpdateNonManagedResourceError(t *testing.T) { + actual := newPodList("starfish") + current := newPodList() + target := newPodList("starfish") + + tf := cmdtesting.NewTestFactory() + defer tf.Cleanup() + + tf.UnstructuredClient = &fake.RESTClient{ + NegotiatedSerializer: unstructuredSerializer, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + p, m := req.URL.Path, req.Method + t.Logf("got request %s %s", p, m) + switch { + case p == "/namespaces/default/pods/starfish" && m == "GET": + return newResponse(200, &actual.Items[0]) + default: + t.Fatalf("unexpected request: %s %s", req.Method, req.URL.Path) + return nil, nil + } + }), + } + + c := &Client{ + Factory: tf, + Log: nopLogger, + } + + if err := c.Update(v1.NamespaceDefault, objBody(¤t), objBody(&target), false, false, 0, false); err != nil { + if err.Error() != "Pod \"starfish\" is not managed by Helm; delete the resource from the current cluster state to let Helm manage it" { + t.Fatal(err) + } + } else { + t.Fatalf("error expected") + } +} + func TestBuild(t *testing.T) { tests := []struct { name string From 83d66b643c591e8ba9a63f2173115e30c6619bbd Mon Sep 17 00:00:00 2001 From: tariqibrahim Date: Sun, 17 Mar 2019 20:53:54 -0700 Subject: [PATCH 408/483] update kubernetes deps to latest patch releases Signed-off-by: tariqibrahim --- glide.lock | 20 ++++++++++---------- glide.yaml | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/glide.lock b/glide.lock index 764424e9472..824e30041c1 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 3a24b27ab669b7bd977526dd455c5739fc2e2c14eace7dab92060ff1a39fd804 -updated: 2019-03-02T10:15:45.243405-07:00 +hash: f86919aea9f9b6df70967eb0b00d8a3807a2f5e924d7bd82d317f7969fddb3ef +updated: 2019-03-17T20:36:59.222397-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -85,7 +85,7 @@ imports: subpackages: - spdy - name: github.com/evanphx/json-patch - version: 36442dbdb585210f8d5a1b45e67aa323c197d5c4 + version: 5858425f75500d40c52783dce87d085a483ce135 - name: github.com/exponent-io/jsonpath version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5 - name: github.com/fatih/camelcase @@ -370,7 +370,7 @@ imports: - name: gopkg.in/yaml.v2 version: 670d4cfef0544295bc27a114dbac37980d83185a - name: k8s.io/api - version: 05914d821849570fba9eacfb29466f2d8d3cd229 + version: 5cb15d34447165a97c76ed5a60e4e99c8a01ecfe subpackages: - admission/v1beta1 - admissionregistration/v1alpha1 @@ -407,11 +407,11 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: 0fe22c71c47604641d9aa352c785b7912c200562 + version: d002e88f6236312f0289d9d1deab106751718ff0 subpackages: - pkg/features - name: k8s.io/apimachinery - version: 2b1284ed4c93a43499e781493253e2ac5959c4fd + version: 86fb29eff6288413d76bd8506874fddd9fccdff0 subpackages: - pkg/api/equality - pkg/api/errors @@ -467,7 +467,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 3ccfe8365421eb08e334b195786a2973460741d8 + version: 79427f02047f9189a75b8cdaadccaf65a126853e subpackages: - pkg/authentication/authenticator - pkg/authentication/serviceaccount @@ -475,13 +475,13 @@ imports: - pkg/features - pkg/util/feature - name: k8s.io/cli-runtime - version: 835b10687cb6556f6b113099ef925146a56d5981 + version: a9e421a7932607ce4623ff45add8274499cca193 subpackages: - pkg/genericclioptions - pkg/genericclioptions/printers - pkg/genericclioptions/resource - name: k8s.io/client-go - version: 8d9ed539ba3134352c586810e749e58df4e94e4f + version: b40b2a5939e43f7ffe0028ad67586b7ce50bb675 subpackages: - discovery - discovery/fake @@ -611,7 +611,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: c6d339953bd4fd8c021a6b5fb46d7952b30be9f9 + version: f2c8f1cadf1808ec28476682e49a3cce2b09efbf subpackages: - pkg/api/legacyscheme - pkg/api/service diff --git a/glide.yaml b/glide.yaml index c7d82319642..23a3cdaf4e8 100644 --- a/glide.yaml +++ b/glide.yaml @@ -53,17 +53,17 @@ import: - package: k8s.io/kubernetes version: release-1.13 - package: k8s.io/client-go - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: k8s.io/api - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: k8s.io/apimachinery - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: k8s.io/apiserver - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: k8s.io/cli-runtime - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: k8s.io/apiextensions-apiserver - version: kubernetes-1.13.1 + version: kubernetes-1.13.4 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 From 63ef73d4168980e650bc95c225f9be1b63b7b37c Mon Sep 17 00:00:00 2001 From: Mikhail Kirpichev Date: Mon, 18 Mar 2019 18:54:53 +0300 Subject: [PATCH 409/483] fix(tiller): fixed a typo in tiller and unit test There was a typo in a tiller error with "released named" message, I've changed it to "a release named". Also fix a unit-test for it. Signed-off-by: Mikhail Kirpichev --- pkg/tiller/release_server.go | 2 +- pkg/tiller/release_update_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index eb3e876d0f6..d32fd82f66f 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -195,7 +195,7 @@ func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) { s.Log("name %s exists but is not in use, reusing name", start) return start, nil } else if reuse { - return "", fmt.Errorf("a released named %s is in use, cannot re-use a name that is still in use", start) + return "", fmt.Errorf("a release named %s is in use, cannot re-use a name that is still in use", start) } return "", fmt.Errorf("a release named %s already exists.\nRun: helm ls --all %s; to check the status of the release\nOr run: helm del --purge %s; to delete it", start, start, start) diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index ea1c88f62ee..e47e526d6ef 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -604,7 +604,7 @@ func TestUpdateReleasePendingInstall_Force(t *testing.T) { t.Error("Expected failed update") } - expectedError := "a released named forceful-luke is in use, cannot re-use a name that is still in use" + expectedError := "a release named forceful-luke is in use, cannot re-use a name that is still in use" got := err.Error() if err.Error() != expectedError { t.Errorf("Expected error %q, got %q", expectedError, got) From ab9cc982a0616e28d6e308d69033534cb7e62025 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 19 Mar 2019 21:00:12 -0700 Subject: [PATCH 410/483] fix(scripts): use a more precise method of grepping Github recently changed the output of the releases page. grepping for the exact tag fixes the issue where the wrong tag was being filtered. Signed-off-by: Matthew Fisher --- scripts/get | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/get b/scripts/get index 9c93e1e842f..bc13039e233 100755 --- a/scripts/get +++ b/scripts/get @@ -80,9 +80,9 @@ checkDesiredVersion() { # Use the GitHub releases webpage for the project to find the desired version for this project. local release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION:-latest}" if type "curl" > /dev/null; then - TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | head -n 1 | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') + TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | grep " /dev/null; then - TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | grep -v no-underline | head -n 1 | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') + TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | grep -v no-underline | grep " Date: Wed, 20 Mar 2019 10:52:00 -0700 Subject: [PATCH 411/483] style: fix golint error in init.go for redundant err!=nil check Signed-off-by: tariqibrahim --- cmd/helm/installer/init.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cmd/helm/installer/init.go b/cmd/helm/installer/init.go index 9edfc07974e..7731a4a98a3 100644 --- a/cmd/helm/installer/init.go +++ b/cmd/helm/installer/init.go @@ -47,11 +47,8 @@ func Initialize(home helmpath.Home, out io.Writer, skipRefresh bool, settings he if err := ensureDefaultRepos(home, out, skipRefresh, settings, stableRepositoryURL, localRepositoryURL); err != nil { return err } - if err := ensureRepoFileFormat(home.RepositoryFile(), out); err != nil { - return err - } - return nil + return ensureRepoFileFormat(home.RepositoryFile(), out) } // ensureDirectories checks to see if $HELM_HOME exists. From 7cb03fb5628f3decb9ab547c1f71ca6a21a31ee8 Mon Sep 17 00:00:00 2001 From: Arief Hidayat Date: Thu, 21 Mar 2019 17:48:18 +0800 Subject: [PATCH 412/483] fix(script): follow redirected URL of github latest release When checking version and desired version is not set, we follow redirected URL of github latest release to get the latest tag instead of trying to get the tag value from html content. Closes #5480 Signed-off-by: Arief Hidayat --- scripts/get | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/scripts/get b/scripts/get index bc13039e233..4daf504dacb 100755 --- a/scripts/get +++ b/scripts/get @@ -78,16 +78,31 @@ verifySupported() { # checkDesiredVersion checks if the desired version is available. checkDesiredVersion() { # Use the GitHub releases webpage for the project to find the desired version for this project. - local release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION:-latest}" + local latest_release_url="https://github.com/helm/helm/releases/latest" + local release_url + if [ "x$DESIRED_VERSION" == "x" ]; then + if type "curl" > /dev/null; then + release_url=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url) + elif type "wget" > /dev/null; then + release_url=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^ Location: /{DEST=$2} END{ print DEST}') + fi + else + release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION}" + fi + + local status_code if type "curl" > /dev/null; then - TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | grep " /dev/null; then - TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | grep -v no-underline | grep "&1 | grep "HTTP/" | awk '{print $2}') fi - if [ "x$TAG" == "x" ]; then + + if [[ "$status_code" -ne 200 ]] ; then echo "Cannot determine ${DESIRED_VERSION} tag." exit 1 fi + + TAG=$(echo $release_url | grep -oE "[^/]+$" ) } # checkHelmInstalledVersion checks which version of helm is installed and From 65193adc10bc50edcf96499b5321c7aab46b796c Mon Sep 17 00:00:00 2001 From: Arief Hidayat Date: Fri, 22 Mar 2019 22:50:35 +0700 Subject: [PATCH 413/483] fix(script): remove check on release URL Closes #5480 Signed-off-by: Arief Hidayat --- scripts/get | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/scripts/get b/scripts/get index 4daf504dacb..5479abddbad 100755 --- a/scripts/get +++ b/scripts/get @@ -77,32 +77,17 @@ verifySupported() { # checkDesiredVersion checks if the desired version is available. checkDesiredVersion() { - # Use the GitHub releases webpage for the project to find the desired version for this project. - local latest_release_url="https://github.com/helm/helm/releases/latest" - local release_url if [ "x$DESIRED_VERSION" == "x" ]; then + # Get tag from release URL + local latest_release_url="https://github.com/helm/helm/releases/latest" if type "curl" > /dev/null; then - release_url=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url) + TAG=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url | grep -oE "[^/]+$" ) elif type "wget" > /dev/null; then - release_url=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^ Location: /{DEST=$2} END{ print DEST}') + TAG=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^ Location: /{DEST=$2} END{ print DEST}' | grep -oE "[^/]+$") fi else - release_url="https://github.com/helm/helm/releases/${DESIRED_VERSION}" + TAG=$DESIRED_VERSION fi - - local status_code - if type "curl" > /dev/null; then - status_code=$(curl --write-out %{http_code} --silent --output /dev/null $release_url) - elif type "wget" > /dev/null; then - status_code=$(wget --spider -S $release_url -O /dev/null 2>&1 | grep "HTTP/" | awk '{print $2}') - fi - - if [[ "$status_code" -ne 200 ]] ; then - echo "Cannot determine ${DESIRED_VERSION} tag." - exit 1 - fi - - TAG=$(echo $release_url | grep -oE "[^/]+$" ) } # checkHelmInstalledVersion checks which version of helm is installed and From 5ffe4ce5881449d31b9e14cb94d56dcf2453b0d7 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Fri, 22 Mar 2019 21:15:00 +0300 Subject: [PATCH 414/483] Fix `no RESOURCE with the name NAME found` This is the fix for only one particular, but important case. The case when a new resource has been added to the chart and there is an error in the chart, which leads to release failure. In this case after first failed release upgrade new resource will be created in the cluster. On the next release upgrade there will be the error: `no RESOURCE with the name NAME found` for this newly created resource from the previous release upgrade. The root of this problem is in the side effect of the first release process, Release invariant says: if resouce exists in the kubernetes cluster, then it should exist in the release storage. But this invariant has been broken by helm itself -- because helm created new resources as side effect and not adopted them into release storage. To maintain release invariant for such case during release upgrade operation all newly *successfully* created resources will be deleted in the case of an error in the subsequent resources update. This behaviour will be enabled only when `--cleanup-on-fail` option used for `helm upgrade` or `helm rollback`. Signed-off-by: Timofey Kirillov --- _proto/hapi/rudder/rudder.proto | 2 + _proto/hapi/services/tiller.proto | 10 ++-- cmd/helm/rollback.go | 27 +++++----- cmd/helm/upgrade.go | 61 ++++++++++++---------- cmd/rudder/rudder.go | 16 +++++- docs/helm/helm_rollback.md | 3 +- docs/helm/helm_upgrade.md | 3 +- pkg/helm/option.go | 14 +++++ pkg/kube/client.go | 52 +++++++++++++++--- pkg/tiller/environment/environment.go | 17 +++++- pkg/tiller/environment/environment_test.go | 3 ++ pkg/tiller/release_modules.go | 16 +++++- pkg/tiller/release_server_test.go | 12 +++++ 13 files changed, 177 insertions(+), 59 deletions(-) diff --git a/_proto/hapi/rudder/rudder.proto b/_proto/hapi/rudder/rudder.proto index 188491512cf..3f3d8030dac 100644 --- a/_proto/hapi/rudder/rudder.proto +++ b/_proto/hapi/rudder/rudder.proto @@ -92,6 +92,7 @@ message UpgradeReleaseRequest{ bool Wait = 4; bool Recreate = 5; bool Force = 6; + bool CleanupOnFail = 7; } message UpgradeReleaseResponse{ hapi.release.Release release = 1; @@ -105,6 +106,7 @@ message RollbackReleaseRequest{ bool Wait = 4; bool Recreate = 5; bool Force = 6; + bool CleanupOnFail = 7; } message RollbackReleaseResponse{ hapi.release.Release release = 1; diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index 286d22e8b80..1d0cc7ec602 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -212,8 +212,10 @@ message UpdateReleaseRequest { bool force = 11; // Description, if set, will set the description for the updated release string description = 12; - // Render subchart notes if enabled + // Render subchart notes if enabled bool subNotes = 13; + // Allow deletion of new resources created in this update when update failed + bool cleanup_on_fail = 14; } // UpdateReleaseResponse is the response to an update request. @@ -241,6 +243,8 @@ message RollbackReleaseRequest { bool force = 8; // Description, if set, will set the description for the rollback string description = 9; + // Allow deletion of new resources created in this rollback when rollback failed + bool cleanup_on_fail = 10; } // RollbackReleaseResponse is the response to an update request. @@ -283,8 +287,8 @@ message InstallReleaseRequest { // Description, if set, will set the description for the installed release string description = 11; - - bool subNotes = 12; + + bool subNotes = 12; } diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 78d79659d1e..4cffd43d530 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -36,17 +36,18 @@ second is a revision (version) number. To see revision numbers, run ` type rollbackCmd struct { - name string - revision int32 - dryRun bool - recreate bool - force bool - disableHooks bool - out io.Writer - client helm.Interface - timeout int64 - wait bool - description string + name string + revision int32 + dryRun bool + recreate bool + force bool + disableHooks bool + out io.Writer + client helm.Interface + timeout int64 + wait bool + description string + cleanupOnFail bool } func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { @@ -87,6 +88,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { f.Int64Var(&rollback.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)") f.BoolVar(&rollback.wait, "wait", false, "if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful. It will wait for as long as --timeout") f.StringVar(&rollback.description, "description", "", "specify a description for the release") + f.BoolVar(&rollback.cleanupOnFail, "cleanup-on-fail", false, "allow deletion of new resources created in this rollback when rollback failed") // set defaults from environment settings.InitTLS(f) @@ -104,7 +106,8 @@ func (r *rollbackCmd) run() error { helm.RollbackVersion(r.revision), helm.RollbackTimeout(r.timeout), helm.RollbackWait(r.wait), - helm.RollbackDescription(r.description)) + helm.RollbackDescription(r.description), + helm.RollbackCleanupOnFail(r.cleanupOnFail)) if err != nil { return prettyError(err) } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 044ec045d45..e52ca2ba349 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -84,34 +84,35 @@ which results in "pwd: 3jk$o2z=f\30with'quote". ` type upgradeCmd struct { - release string - chart string - out io.Writer - client helm.Interface - dryRun bool - recreate bool - force bool - disableHooks bool - valueFiles valueFiles - values []string - stringValues []string - fileValues []string - verify bool - keyring string - install bool - namespace string - version string - timeout int64 - resetValues bool - reuseValues bool - wait bool - atomic bool - repoURL string - username string - password string - devel bool - subNotes bool - description string + release string + chart string + out io.Writer + client helm.Interface + dryRun bool + recreate bool + force bool + disableHooks bool + valueFiles valueFiles + values []string + stringValues []string + fileValues []string + verify bool + keyring string + install bool + namespace string + version string + timeout int64 + resetValues bool + reuseValues bool + wait bool + atomic bool + repoURL string + username string + password string + devel bool + subNotes bool + description string + cleanupOnFail bool certFile string keyFile string @@ -179,6 +180,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&upgrade.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored.") f.BoolVar(&upgrade.subNotes, "render-subchart-notes", false, "render subchart notes along with parent") f.StringVar(&upgrade.description, "description", "", "specify the description to use for the upgrade, rather than the default") + f.BoolVar(&upgrade.cleanupOnFail, "cleanup-on-fail", false, "allow deletion of new resources created in this upgrade when upgrade failed") f.MarkDeprecated("disable-hooks", "use --no-hooks instead") @@ -273,7 +275,8 @@ func (u *upgradeCmd) run() error { helm.ReuseValues(u.reuseValues), helm.UpgradeSubNotes(u.subNotes), helm.UpgradeWait(u.wait), - helm.UpgradeDescription(u.description)) + helm.UpgradeDescription(u.description), + helm.UpgradeCleanupOnFail(u.cleanupOnFail)) if err != nil { fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v\n", prettyError(err)) if u.atomic { diff --git a/cmd/rudder/rudder.go b/cmd/rudder/rudder.go index 051640542af..d68daf45365 100644 --- a/cmd/rudder/rudder.go +++ b/cmd/rudder/rudder.go @@ -131,7 +131,13 @@ func (r *ReleaseModuleServiceServer) RollbackRelease(ctx context.Context, in *ru grpclog.Print("rollback") c := bytes.NewBufferString(in.Current.Manifest) t := bytes.NewBufferString(in.Target.Manifest) - err := kubeClient.Update(in.Target.Namespace, c, t, in.Force, in.Recreate, in.Timeout, in.Wait) + err := kubeClient.UpdateWithOptions(in.Target.Namespace, c, t, kube.UpdateOptions{ + Force: in.Force, + Recreate: in.Recreate, + Timeout: in.Timeout, + ShouldWait: in.Wait, + CleanupOnFail: in.CleanupOnFail, + }) return &rudderAPI.RollbackReleaseResponse{}, err } @@ -140,7 +146,13 @@ func (r *ReleaseModuleServiceServer) UpgradeRelease(ctx context.Context, in *rud grpclog.Print("upgrade") c := bytes.NewBufferString(in.Current.Manifest) t := bytes.NewBufferString(in.Target.Manifest) - err := kubeClient.Update(in.Target.Namespace, c, t, in.Force, in.Recreate, in.Timeout, in.Wait) + err := kubeClient.UpdateWithOptions(in.Target.Namespace, c, t, kube.UpdateOptions{ + Force: in.Force, + Recreate: in.Recreate, + Timeout: in.Timeout, + ShouldWait: in.Wait, + CleanupOnFail: in.CleanupOnFail, + }) // upgrade response object should be changed to include status return &rudderAPI.UpgradeReleaseResponse{}, err } diff --git a/docs/helm/helm_rollback.md b/docs/helm/helm_rollback.md index 80fc83a839c..87c68f6c8e5 100644 --- a/docs/helm/helm_rollback.md +++ b/docs/helm/helm_rollback.md @@ -20,6 +20,7 @@ helm rollback [flags] [RELEASE] [REVISION] ### Options ``` + --cleanup-on-fail allow deletion of new resources created in this rollback when rollback failed --description string specify a description for the release --dry-run simulate a rollback --force force resource update through delete/recreate if needed @@ -52,4 +53,4 @@ helm rollback [flags] [RELEASE] [REVISION] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 29-Jan-2019 +###### Auto generated by spf13/cobra on 5-Feb-2019 diff --git a/docs/helm/helm_upgrade.md b/docs/helm/helm_upgrade.md index 676c2659542..d54b7c3a205 100644 --- a/docs/helm/helm_upgrade.md +++ b/docs/helm/helm_upgrade.md @@ -68,6 +68,7 @@ helm upgrade [RELEASE] [CHART] [flags] --atomic if set, upgrade process rolls back changes made in case of failed upgrade, also sets --wait flag --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --cert-file string identify HTTPS client using this SSL certificate file + --cleanup-on-fail allow deletion of new resources created in this upgrade when upgrade failed --description string specify the description to use for the upgrade, rather than the default --devel use development versions, too. Equivalent to version '>0.0.0-0'. If --version is set, this is ignored. --dry-run simulate an upgrade @@ -117,4 +118,4 @@ helm upgrade [RELEASE] [CHART] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 28-Jan-2019 +###### Auto generated by spf13/cobra on 5-Feb-2019 diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 1f5cf6904c5..930434178e3 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -297,6 +297,20 @@ func DeleteDescription(description string) DeleteOption { } } +// UpgradeCleanupOnFail allows deletion of new resources created in this upgrade when upgrade failed +func UpgradeCleanupOnFail(cleanupOnFail bool) UpdateOption { + return func(opts *options) { + opts.updateReq.CleanupOnFail = cleanupOnFail + } +} + +// RollbackCleanupOnFail allows deletion of new resources created in this rollback when rollback failed +func RollbackCleanupOnFail(cleanupOnFail bool) RollbackOption { + return func(opts *options) { + opts.rollbackReq.CleanupOnFail = cleanupOnFail + } +} + // DeleteDisableHooks will disable hooks for a deletion operation. func DeleteDisableHooks(disable bool) DeleteOption { return func(opts *options) { diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 955c75ab157..36cb3f3181c 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -290,13 +290,33 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { return buf.String(), nil } -// Update reads in the current configuration and a target configuration from io.reader +// Deprecated; use UpdateWithOptions instead +func (c *Client) Update(namespace string, originalReader, targetReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { + return c.UpdateWithOptions(namespace, originalReader, targetReader, UpdateOptions{ + Force: force, + Recreate: recreate, + Timeout: timeout, + ShouldWait: shouldWait, + }) +} + +// UpdateOptions provides options to control update behavior +type UpdateOptions struct { + Force bool + Recreate bool + Timeout int64 + ShouldWait bool + // Allow deletion of new resources created in this update when update failed + CleanupOnFail bool +} + +// UpdateWithOptions reads in the current configuration and a target configuration from io.reader // and creates resources that don't already exists, updates resources that have been modified // in the target configuration and deletes resources from the current configuration that are // not present in the target configuration. // // Namespace will set the namespaces. -func (c *Client) Update(namespace string, originalReader, targetReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { +func (c *Client) UpdateWithOptions(namespace string, originalReader, targetReader io.Reader, opts UpdateOptions) error { original, err := c.BuildUnstructured(namespace, originalReader) if err != nil { return fmt.Errorf("failed decoding reader into objects: %s", err) @@ -308,6 +328,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader return fmt.Errorf("failed decoding reader into objects: %s", err) } + newlyCreatedResources := []*resource.Info{} updateErrors := []string{} c.Log("checking %d resources for changes", len(target)) @@ -326,6 +347,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader if err := createResource(info); err != nil { return fmt.Errorf("failed to create resource: %s", err) } + newlyCreatedResources = append(newlyCreatedResources, info) kind := info.Mapping.GroupVersionKind.Kind c.Log("Created a new %s called %q\n", kind, info.Name) @@ -338,7 +360,7 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader return fmt.Errorf("no %s with the name %q found", kind, info.Name) } - if err := updateResource(c, info, originalInfo.Object, force, recreate); err != nil { + if err := updateResource(c, info, originalInfo.Object, opts.Force, opts.Recreate); err != nil { c.Log("error updating the resource %q:\n\t %v", info.Name, err) updateErrors = append(updateErrors, err.Error()) } @@ -346,11 +368,27 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader return nil }) + cleanupErrors := []string{} + + if opts.CleanupOnFail { + if err != nil || len(updateErrors) != 0 { + for _, info := range newlyCreatedResources { + kind := info.Mapping.GroupVersionKind.Kind + + c.Log("Deleting newly created %s with the name %q in %s...", kind, info.Name, info.Namespace) + if err := deleteResource(info); err != nil { + c.Log("Error deleting newly created %s with the name %q in %s: %s", kind, info.Name, info.Namespace, err) + cleanupErrors = append(cleanupErrors, err.Error()) + } + } + } + } + switch { case err != nil: - return err + return fmt.Errorf(strings.Join(append([]string{err.Error()}, cleanupErrors...), " && ")) case len(updateErrors) != 0: - return fmt.Errorf(strings.Join(updateErrors, " && ")) + return fmt.Errorf(strings.Join(append(updateErrors, cleanupErrors...), " && ")) } for _, info := range original.Difference(target) { @@ -373,8 +411,8 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader c.Log("Failed to delete %q, err: %s", info.Name, err) } } - if shouldWait { - return c.waitForResources(time.Duration(timeout)*time.Second, target) + if opts.ShouldWait { + return c.waitForResources(time.Duration(opts.Timeout)*time.Second, target) } return nil } diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 290337d7b33..993e27910cf 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -126,14 +126,17 @@ type KubeClient interface { // error. WatchUntilReady(namespace string, reader io.Reader, timeout int64, shouldWait bool) error - // Update updates one or more resources or creates the resource + // Deprecated; use UpdateWithOptions instead + Update(namespace string, originalReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error + + // UpdateWithOptions updates one or more resources or creates the resource // if it doesn't exist. // // namespace must contain a valid existing namespace. // // reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n"). - Update(namespace string, originalReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error + UpdateWithOptions(namespace string, originalReader, modifiedReader io.Reader, opts kube.UpdateOptions) error Build(namespace string, reader io.Reader) (kube.Result, error) BuildUnstructured(namespace string, reader io.Reader) (kube.Result, error) @@ -177,6 +180,16 @@ func (p *PrintingKubeClient) WatchUntilReady(ns string, r io.Reader, timeout int // Update implements KubeClient Update. func (p *PrintingKubeClient) Update(ns string, currentReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { + return p.UpdateWithOptions(ns, currentReader, modifiedReader, kube.UpdateOptions{ + Force: force, + Recreate: recreate, + Timeout: timeout, + ShouldWait: shouldWait, + }) +} + +// UpdateWithOptions implements KubeClient UpdateWithOptions. +func (p *PrintingKubeClient) UpdateWithOptions(ns string, currentReader, modifiedReader io.Reader, opts kube.UpdateOptions) error { _, err := io.Copy(p.Out, modifiedReader) return err } diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 5c19a9b21ed..c2694a84ab2 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -52,6 +52,9 @@ func (k *mockKubeClient) Delete(ns string, r io.Reader) error { func (k *mockKubeClient) Update(ns string, currentReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { return nil } +func (k *mockKubeClient) UpdateWithOptions(ns string, currentReader, modifiedReader io.Reader, opts kube.UpdateOptions) error { + return nil +} func (k *mockKubeClient) WatchUntilReady(ns string, r io.Reader, timeout int64, shouldWait bool) error { return nil } diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 85995480cc5..360794481d3 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -58,14 +58,26 @@ func (m *LocalReleaseModule) Create(r *release.Release, req *services.InstallRel func (m *LocalReleaseModule) Update(current, target *release.Release, req *services.UpdateReleaseRequest, env *environment.Environment) error { c := bytes.NewBufferString(current.Manifest) t := bytes.NewBufferString(target.Manifest) - return env.KubeClient.Update(target.Namespace, c, t, req.Force, req.Recreate, req.Timeout, req.Wait) + return env.KubeClient.UpdateWithOptions(target.Namespace, c, t, kube.UpdateOptions{ + Force: req.Force, + Recreate: req.Recreate, + Timeout: req.Timeout, + ShouldWait: req.Wait, + CleanupOnFail: req.CleanupOnFail, + }) } // Rollback performs a rollback from current to target release func (m *LocalReleaseModule) Rollback(current, target *release.Release, req *services.RollbackReleaseRequest, env *environment.Environment) error { c := bytes.NewBufferString(current.Manifest) t := bytes.NewBufferString(target.Manifest) - return env.KubeClient.Update(target.Namespace, c, t, req.Force, req.Recreate, req.Timeout, req.Wait) + return env.KubeClient.UpdateWithOptions(target.Namespace, c, t, kube.UpdateOptions{ + Force: req.Force, + Recreate: req.Recreate, + Timeout: req.Timeout, + ShouldWait: req.Wait, + CleanupOnFail: req.CleanupOnFail, + }) } // Status returns kubectl-like formatted status of release objects diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 4e29e4413ce..99fc0e724a7 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -500,6 +500,15 @@ type updateFailingKubeClient struct { } func (u *updateFailingKubeClient) Update(namespace string, originalReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { + return u.UpdateWithOptions(namespace, originalReader, modifiedReader, kube.UpdateOptions{ + Force: force, + Recreate: recreate, + Timeout: timeout, + ShouldWait: shouldWait, + }) +} + +func (u *updateFailingKubeClient) UpdateWithOptions(namespace string, originalReader, modifiedReader io.Reader, opts kube.UpdateOptions) error { return errors.New("Failed update in kube client") } @@ -632,6 +641,9 @@ func (kc *mockHooksKubeClient) WatchUntilReady(ns string, r io.Reader, timeout i func (kc *mockHooksKubeClient) Update(ns string, currentReader, modifiedReader io.Reader, force bool, recreate bool, timeout int64, shouldWait bool) error { return nil } +func (kc *mockHooksKubeClient) UpdateWithOptions(ns string, currentReader, modifiedReader io.Reader, opts kube.UpdateOptions) error { + return nil +} func (kc *mockHooksKubeClient) Build(ns string, reader io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } From bf7106f6c0018f3638201752a32529648e253e3e Mon Sep 17 00:00:00 2001 From: Fernando Barbosa Date: Tue, 19 Mar 2019 14:06:33 -0300 Subject: [PATCH 415/483] Add cleanup on fail after wait Signed-off-by: Timofey Kirillov --- pkg/kube/client.go | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 36cb3f3181c..d5666fedf8a 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -35,7 +35,7 @@ import ( appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta2 "k8s.io/api/apps/v1beta2" batch "k8s.io/api/batch/v1" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" extv1beta1 "k8s.io/api/extensions/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" @@ -370,18 +370,8 @@ func (c *Client) UpdateWithOptions(namespace string, originalReader, targetReade cleanupErrors := []string{} - if opts.CleanupOnFail { - if err != nil || len(updateErrors) != 0 { - for _, info := range newlyCreatedResources { - kind := info.Mapping.GroupVersionKind.Kind - - c.Log("Deleting newly created %s with the name %q in %s...", kind, info.Name, info.Namespace) - if err := deleteResource(info); err != nil { - c.Log("Error deleting newly created %s with the name %q in %s: %s", kind, info.Name, info.Namespace, err) - cleanupErrors = append(cleanupErrors, err.Error()) - } - } - } + if opts.CleanupOnFail && (err != nil || len(updateErrors) != 0) { + cleanupErrors = c.cleanup(newlyCreatedResources) } switch { @@ -412,11 +402,30 @@ func (c *Client) UpdateWithOptions(namespace string, originalReader, targetReade } } if opts.ShouldWait { - return c.waitForResources(time.Duration(opts.Timeout)*time.Second, target) + err := c.waitForResources(time.Duration(opts.Timeout)*time.Second, target) + + if opts.CleanupOnFail && err != nil { + cleanupErrors = c.cleanup(newlyCreatedResources) + return fmt.Errorf(strings.Join(append([]string{err.Error()}, cleanupErrors...), " && ")) + } + + return err } return nil } +func (c *Client) cleanup(newlyCreatedResources []*resource.Info) (cleanupErrors []string) { + for _, info := range newlyCreatedResources { + kind := info.Mapping.GroupVersionKind.Kind + c.Log("Deleting newly created %s with the name %q in %s...", kind, info.Name, info.Namespace) + if err := deleteResource(info); err != nil { + c.Log("Error deleting newly created %s with the name %q in %s: %s", kind, info.Name, info.Namespace, err) + cleanupErrors = append(cleanupErrors, err.Error()) + } + } + return +} + // Delete deletes Kubernetes resources from an io.reader. // // Namespace will set the namespace. From 175bb2e4c4aded1f291cfc59d7ce6f63c076b6f4 Mon Sep 17 00:00:00 2001 From: Devin Burnette Date: Sat, 23 Mar 2019 01:54:46 -0400 Subject: [PATCH 416/483] remove kubernetes Signed-off-by: Devin Burnette --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9716d0ce10..fc35e0643ef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing Guidelines -The Kubernetes Helm project accepts contributions via GitHub pull requests. This document outlines the process to help get your contribution accepted. +The Helm project accepts contributions via GitHub pull requests. This document outlines the process to help get your contribution accepted. ## Reporting a Security Issue From 470203a173942dac23396dbba575cc9b16253486 Mon Sep 17 00:00:00 2001 From: ialidzhikov Date: Sun, 24 Mar 2019 23:17:46 +0200 Subject: [PATCH 417/483] Update golang version Signed-off-by: ialidzhikov --- .circleci/config.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c83ee10cf17..7bba262a84d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: working_directory: /go/src/k8s.io/helm parallelism: 3 docker: - - image: golang:1.12 + - image: golang:1.12.1 environment: PROJECT_NAME: "kubernetes-helm" steps: diff --git a/Makefile b/Makefile index f4b08ace8ec..3584521a4cf 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm -DEV_IMAGE ?= golang:1.12 +DEV_IMAGE ?= golang:1.12.1 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 From 535f9cece5c4147c74a88106f83690b197806dfa Mon Sep 17 00:00:00 2001 From: Pavel Eremeev Date: Mon, 25 Mar 2019 12:02:44 +0000 Subject: [PATCH 418/483] refactor(*): update error message Signed-off-by: Pavel Eremeev --- pkg/kube/client.go | 9 ++++++--- pkg/kube/client_test.go | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 3830c4eef19..37c1d53e410 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -334,11 +334,14 @@ func (c *Client) Update(namespace string, originalReader, targetReader io.Reader originalInfo := original.Get(info) - // Resource exists in the current cluster state, but not in the current helm configuration - // See: https://github.com/helm/helm/issues/1193 for more info + // The resource already exists in the cluster, but it wasn't defined in the previous release. + // In this case, we consider it to be a resource that was previously un-managed by the release and error out, + // asking for the user to intervene. + // + // See https://github.com/helm/helm/issues/1193 for more info. if originalInfo == nil { return fmt.Errorf( - "%s %q is not managed by Helm; delete the resource from the current cluster state to let Helm manage it", + "kind %s with the name %q already exists in the cluster and wasn't defined in the previous release. Before upgrading, please either delete the resource from the cluster or remove it from the chart", info.Mapping.GroupVersionKind.Kind, info.Name, ) diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 5bd9449b724..401ac7e5887 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -253,7 +253,7 @@ func TestUpdateNonManagedResourceError(t *testing.T) { } if err := c.Update(v1.NamespaceDefault, objBody(¤t), objBody(&target), false, false, 0, false); err != nil { - if err.Error() != "Pod \"starfish\" is not managed by Helm; delete the resource from the current cluster state to let Helm manage it" { + if err.Error() != "kind Pod with the name \"starfish\" already exists in the cluster and wasn't defined in the previous release. Before upgrading, please either delete the resource from the cluster or remove it from the chart" { t.Fatal(err) } } else { From bc660928de32f8b21df77890dd365a04ae0bf94b Mon Sep 17 00:00:00 2001 From: Mike Eves Date: Mon, 25 Mar 2019 21:12:02 +0000 Subject: [PATCH 419/483] Don't print ROLLING BACK if atomic is not set Signed-off-by: Mike Eves --- cmd/helm/upgrade.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 044ec045d45..62ed6ddeb1d 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -275,8 +275,9 @@ func (u *upgradeCmd) run() error { helm.UpgradeWait(u.wait), helm.UpgradeDescription(u.description)) if err != nil { - fmt.Fprintf(u.out, "UPGRADE FAILED\nROLLING BACK\nError: %v\n", prettyError(err)) + fmt.Fprintf(u.out, "UPGRADE FAILED\nError: %v\n", prettyError(err)) if u.atomic { + fmt.Fprint(u.out, "ROLLING BACK") rollback := &rollbackCmd{ out: u.out, client: u.client, From 7990363d152dabf8de7b0d59d20d2f1d40733980 Mon Sep 17 00:00:00 2001 From: Xiangxuan Liu Date: Tue, 26 Mar 2019 11:16:41 +0800 Subject: [PATCH 420/483] Fix description of helm dependency command Signed-off-by: Xiangxuan Liu --- cmd/helm/dependency.go | 2 +- docs/helm/helm_dependency.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/helm/dependency.go b/cmd/helm/dependency.go index 1e3079dedd3..f8fe4cf8f7c 100644 --- a/cmd/helm/dependency.go +++ b/cmd/helm/dependency.go @@ -73,7 +73,7 @@ the dependency charts stored locally. The path should start with a prefix of repository: "file://../dependency_chart/nginx" If the dependency chart is retrieved locally, it is not required to have the -repository added to helm by "helm add repo". Version matching is also supported +repository added to helm by "helm repo add". Version matching is also supported for this case. ` diff --git a/docs/helm/helm_dependency.md b/docs/helm/helm_dependency.md index 317860bdba0..8c7d7d65ffb 100644 --- a/docs/helm/helm_dependency.md +++ b/docs/helm/helm_dependency.md @@ -49,7 +49,7 @@ the dependency charts stored locally. The path should start with a prefix of repository: "file://../dependency_chart/nginx" If the dependency chart is retrieved locally, it is not required to have the -repository added to helm by "helm add repo". Version matching is also supported +repository added to helm by "helm repo add". Version matching is also supported for this case. @@ -78,4 +78,4 @@ for this case. * [helm dependency list](helm_dependency_list.md) - list the dependencies for the given chart * [helm dependency update](helm_dependency_update.md) - update charts/ based on the contents of requirements.yaml -###### Auto generated by spf13/cobra on 1-Aug-2018 +###### Auto generated by spf13/cobra on 26-Mar-2019 From 3c871c0030866519805ee360ae58037cf2129a88 Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Tue, 26 Mar 2019 10:51:40 -0700 Subject: [PATCH 421/483] chore(glide): bump kubernetes to 1.14 Signed-off-by: Matthew Fisher --- cmd/helm/installer/uninstall.go | 4 +- glide.lock | 128 +++++++++++++++------ glide.yaml | 14 +-- pkg/kube/client.go | 4 +- pkg/kube/client_test.go | 4 +- pkg/kube/result.go | 2 +- pkg/kube/result_test.go | 2 +- pkg/tiller/environment/environment.go | 4 +- pkg/tiller/environment/environment_test.go | 4 +- pkg/tiller/release_server_test.go | 4 +- 10 files changed, 115 insertions(+), 55 deletions(-) diff --git a/cmd/helm/installer/uninstall.go b/cmd/helm/installer/uninstall.go index 87fbd40501a..b1d78004e20 100644 --- a/cmd/helm/installer/uninstall.go +++ b/cmd/helm/installer/uninstall.go @@ -31,13 +31,13 @@ const ( // Uninstall uses Kubernetes client to uninstall Tiller. func Uninstall(client kubernetes.Interface, opts *Options) error { - if err := deleteService(client.Core(), opts.Namespace); err != nil { + if err := deleteService(client.CoreV1(), opts.Namespace); err != nil { return err } if err := deleteDeployment(client, opts.Namespace); err != nil { return err } - return deleteSecret(client.Core(), opts.Namespace) + return deleteSecret(client.CoreV1(), opts.Namespace) } // deleteService deletes the Tiller Service resource diff --git a/glide.lock b/glide.lock index 824e30041c1..eedbd9381c7 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: f86919aea9f9b6df70967eb0b00d8a3807a2f5e924d7bd82d317f7969fddb3ef -updated: 2019-03-17T20:36:59.222397-07:00 +hash: 9a8f0b6c906f605bb879fbcdf0c122096f7698fe6a975ec4e6648f2ee85fce3e +updated: 2019-03-26T10:33:38.977361532-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -84,6 +84,10 @@ imports: 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 @@ -91,7 +95,7 @@ imports: - name: github.com/fatih/camelcase version: f6a740d52f961c60348ebb109adde9f4635d7540 - name: github.com/ghodss/yaml - version: 73d445a93680fa1a78ae23a5839bad48f32ba1ee + version: c7ce16629ff4cd059ed96ed06419dd3856fd3577 - name: github.com/go-openapi/jsonpointer version: ef5f0afec364d3b9396b7b77b43dbe26bf1f8004 - name: github.com/go-openapi/jsonreference @@ -130,7 +134,7 @@ imports: - name: github.com/google/btree version: 7d79101e329e5a3adf994758c578dab82b90c017 - name: github.com/google/gofuzz - version: 44d81051d367757e1c7c6a5a86423ece9afcf63c + version: 24818f796faf91cd76ec7bddd72458fbced7a6c1 - name: github.com/google/uuid version: 064e2069ce9c359c118179501254f67d7d37ba24 - name: github.com/googleapis/gnostic @@ -140,7 +144,7 @@ imports: - compiler - extensions - name: github.com/gophercloud/gophercloud - version: 781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d + version: c818fa66e4c88b30db28038fe3f18f2f4a0db9a8 subpackages: - openstack - openstack/identity/v2/tenants @@ -160,7 +164,7 @@ imports: - name: github.com/grpc-ecosystem/go-grpc-prometheus version: 0c1b191dbfe51efdabe3c14b9f6f3b96429e0722 - name: github.com/hashicorp/golang-lru - version: a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4 + version: 20f1fb78b0740ba8c3cb143a61e86ba5c8669768 subpackages: - simplelru - name: github.com/huandu/xstrings @@ -171,6 +175,8 @@ imports: version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 - name: github.com/json-iterator/go version: ab8a2e0c74be9d3be70b3184d9acc634935ded82 +- name: github.com/liggitt/tabwriter + version: 89fcab3d43de07060e4fd4c1547430ed57e87f24 - name: github.com/mailru/easyjson version: 2f5df55504ebc322e4d52d34df6a1f5b503bf26d subpackages: @@ -215,7 +221,7 @@ imports: subpackages: - go - name: github.com/prometheus/common - version: 13ba4ddd0caa9c28ca7b7bffe1dfa9ed8d5ef207 + version: cfeb6f9992ffa54aaa4f2170ade4067ee478b250 subpackages: - expfmt - internal/bitbucket.org/ww/goautoneg @@ -259,15 +265,15 @@ imports: - scrypt - ssh/terminal - name: golang.org/x/net - version: 0ed95abb35c445290478a5348a7b38bb154135fd + version: 65e2d4e15006aab9813ff8769e768bbf4bb667a0 subpackages: - context - context/ctxhttp + - http/httpguts - http2 - http2/hpack - idna - internal/timeseries - - lex/httplex - trace - name: golang.org/x/oauth2 version: a6bd8cefa1811bd24b86f8902872e4e8225f74c4 @@ -368,12 +374,11 @@ imports: - json - jwt - name: gopkg.in/yaml.v2 - version: 670d4cfef0544295bc27a114dbac37980d83185a + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 - name: k8s.io/api - version: 5cb15d34447165a97c76ed5a60e4e99c8a01ecfe + version: 40a48860b5abbba9aa891b02b32da429b08d96a0 subpackages: - admission/v1beta1 - - admissionregistration/v1alpha1 - admissionregistration/v1beta1 - apps/v1 - apps/v1beta1 @@ -390,16 +395,21 @@ imports: - 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 @@ -407,11 +417,11 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: d002e88f6236312f0289d9d1deab106751718ff0 + version: 53c4693659ed354d76121458fb819202dd1635fa subpackages: - pkg/features - name: k8s.io/apimachinery - version: 86fb29eff6288413d76bd8506874fddd9fccdff0 + version: d7deff9243b165ee192f5551710ea4285dcfd615 subpackages: - pkg/api/equality - pkg/api/errors @@ -467,7 +477,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 79427f02047f9189a75b8cdaadccaf65a126853e + version: 8b27c41bdbb11ff103caa673315e097bf0289171 subpackages: - pkg/authentication/authenticator - pkg/authentication/serviceaccount @@ -475,23 +485,31 @@ imports: - pkg/features - pkg/util/feature - name: k8s.io/cli-runtime - version: a9e421a7932607ce4623ff45add8274499cca193 + version: 2899ed30580fdbc8286718edb4382b529463099d subpackages: - pkg/genericclioptions - - pkg/genericclioptions/printers - - pkg/genericclioptions/resource + - 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: b40b2a5939e43f7ffe0028ad67586b7ce50bb675 + version: 6ee68ca5fd8355d024d02f9db0b3b667e8357a0f subpackages: - discovery + - discovery/cached/disk - discovery/fake - dynamic - dynamic/fake - kubernetes - kubernetes/fake - kubernetes/scheme - - kubernetes/typed/admissionregistration/v1alpha1 - - kubernetes/typed/admissionregistration/v1alpha1/fake - kubernetes/typed/admissionregistration/v1beta1 - kubernetes/typed/admissionregistration/v1beta1/fake - kubernetes/typed/apps/v1 @@ -524,6 +542,8 @@ imports: - kubernetes/typed/batch/v2alpha1/fake - kubernetes/typed/certificates/v1beta1 - kubernetes/typed/certificates/v1beta1/fake + - kubernetes/typed/coordination/v1 + - kubernetes/typed/coordination/v1/fake - kubernetes/typed/coordination/v1beta1 - kubernetes/typed/coordination/v1beta1/fake - kubernetes/typed/core/v1 @@ -534,6 +554,12 @@ imports: - kubernetes/typed/extensions/v1beta1/fake - kubernetes/typed/networking/v1 - kubernetes/typed/networking/v1/fake + - kubernetes/typed/networking/v1beta1 + - kubernetes/typed/networking/v1beta1/fake + - kubernetes/typed/node/v1alpha1 + - kubernetes/typed/node/v1alpha1/fake + - kubernetes/typed/node/v1beta1 + - kubernetes/typed/node/v1beta1/fake - kubernetes/typed/policy/v1beta1 - kubernetes/typed/policy/v1beta1/fake - kubernetes/typed/rbac/v1 @@ -542,6 +568,8 @@ imports: - kubernetes/typed/rbac/v1alpha1/fake - kubernetes/typed/rbac/v1beta1 - kubernetes/typed/rbac/v1beta1/fake + - kubernetes/typed/scheduling/v1 + - kubernetes/typed/scheduling/v1/fake - kubernetes/typed/scheduling/v1alpha1 - kubernetes/typed/scheduling/v1alpha1/fake - kubernetes/typed/scheduling/v1beta1 @@ -588,30 +616,35 @@ imports: - tools/pager - tools/portforward - tools/record + - tools/record/util - tools/reference - tools/remotecommand - tools/watch - transport - transport/spdy - - util/buffer - util/cert - util/connrotation - util/exec - util/flowcontrol - util/homedir - - util/integer - util/jsonpath + - util/keyutil - util/retry +- name: k8s.io/cloud-provider + version: 9c9d72d1bf90eb62005f5112f3eea019b272c44b + subpackages: + - features - name: k8s.io/klog - version: 8139d8cb77af419532b33dfa7dd09fbc5f1d344f + version: 8e90cee79f823779174776412c13478955131846 - name: k8s.io/kube-openapi - version: c59034cc13d587f5ef4e85ca0ade0c1866ae8e1d + version: b3a7cee44a305be0a69e1b9ac03018307287e1b0 subpackages: + - pkg/common - pkg/util/proto - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: f2c8f1cadf1808ec28476682e49a3cce2b09efbf + version: b805719a99126e54bcbc0a3d9ee8a45cd7e85632 subpackages: - pkg/api/legacyscheme - pkg/api/service @@ -644,6 +677,7 @@ imports: - pkg/apis/certificates/v1beta1 - pkg/apis/coordination - pkg/apis/coordination/install + - pkg/apis/coordination/v1 - pkg/apis/coordination/v1beta1 - pkg/apis/core - pkg/apis/core/helper @@ -659,6 +693,7 @@ imports: - pkg/apis/extensions/install - pkg/apis/extensions/v1beta1 - pkg/apis/networking + - pkg/apis/node - pkg/apis/policy - pkg/apis/policy/install - pkg/apis/policy/v1beta1 @@ -669,6 +704,7 @@ imports: - pkg/apis/rbac/v1beta1 - pkg/apis/scheduling - pkg/apis/scheduling/install + - pkg/apis/scheduling/v1 - pkg/apis/scheduling/v1alpha1 - pkg/apis/scheduling/v1beta1 - pkg/apis/settings @@ -713,30 +749,54 @@ imports: - pkg/kubectl/util/templates - pkg/kubectl/util/term - pkg/kubectl/validation - - pkg/kubelet/apis - pkg/kubelet/types - pkg/master/ports - pkg/printers - pkg/printers/internalversion - - pkg/scheduler/api - pkg/security/apparmor - pkg/serviceaccount - - pkg/util/file - pkg/util/hash - pkg/util/interrupt - pkg/util/labels - - pkg/util/net/sets - pkg/util/node - pkg/util/parsers - pkg/util/taints - pkg/version - name: k8s.io/utils - version: 66066c83e385e385ccc3c964b44fd7dcd413d0ed + version: c2654d5206da6b7b6ace12841e8f359bb89b443c subpackages: - - clock + - buffer - exec - - exec/testing + - 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 - name: vbom.ml/util @@ -745,7 +805,7 @@ imports: - sortorder testImports: - name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + version: 5d4384ee4fb2527b0a1256a821ebfc92f91efefc subpackages: - difflib - name: github.com/stretchr/testify diff --git a/glide.yaml b/glide.yaml index 23a3cdaf4e8..8600ed0ac38 100644 --- a/glide.yaml +++ b/glide.yaml @@ -51,19 +51,19 @@ import: version: 0.8.0 - package: github.com/grpc-ecosystem/go-grpc-prometheus - package: k8s.io/kubernetes - version: release-1.13 + version: release-1.14 - package: k8s.io/client-go - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: k8s.io/api - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: k8s.io/apimachinery - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: k8s.io/apiserver - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: k8s.io/cli-runtime - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: k8s.io/apiextensions-apiserver - version: kubernetes-1.13.4 + version: kubernetes-1.14.0 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 37c1d53e410..66c822ebd94 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -47,7 +47,7 @@ import ( "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/watch" "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/kubernetes/scheme" watchtools "k8s.io/client-go/tools/watch" "k8s.io/kubernetes/pkg/api/legacyscheme" @@ -74,7 +74,7 @@ type Client struct { // New creates a new Client. func New(getter genericclioptions.RESTClientGetter) *Client { if getter == nil { - getter = genericclioptions.NewConfigFlags() + getter = genericclioptions.NewConfigFlags(true) } return &Client{ Factory: cmdutil.NewFactory(getter), diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 401ac7e5887..a41490f9bc2 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -25,11 +25,11 @@ import ( "strings" "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest/fake" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" diff --git a/pkg/kube/result.go b/pkg/kube/result.go index cc222a66fc5..cf4a4195ed7 100644 --- a/pkg/kube/result.go +++ b/pkg/kube/result.go @@ -16,7 +16,7 @@ limitations under the License. package kube // import "k8s.io/helm/pkg/kube" -import "k8s.io/cli-runtime/pkg/genericclioptions/resource" +import "k8s.io/cli-runtime/pkg/resource" // Result provides convenience methods for comparing collections of Infos. type Result []*resource.Info diff --git a/pkg/kube/result_test.go b/pkg/kube/result_test.go index c4cf989b8be..d4c18ee6a9a 100644 --- a/pkg/kube/result_test.go +++ b/pkg/kube/result_test.go @@ -21,7 +21,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + "k8s.io/cli-runtime/pkg/resource" ) func TestResult(t *testing.T) { diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 290337d7b33..dca7c0756e3 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -26,8 +26,8 @@ import ( "io" "time" - "k8s.io/api/core/v1" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + v1 "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/engine" diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 5c19a9b21ed..9e9b549d492 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -22,8 +22,8 @@ import ( "testing" "time" - "k8s.io/api/core/v1" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + v1 "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/kube" diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 4e29e4413ce..ecf5ffd17bb 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -31,8 +31,8 @@ import ( "github.com/technosophos/moniker" "golang.org/x/net/context" "google.golang.org/grpc/metadata" - "k8s.io/api/core/v1" - "k8s.io/cli-runtime/pkg/genericclioptions/resource" + v1 "k8s.io/api/core/v1" + "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/kubernetes/fake" "k8s.io/helm/pkg/helm" From b8e40a7c31faf094c950be40a0d08ce554bdc7dd Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 27 Dec 2018 01:56:00 -0800 Subject: [PATCH 422/483] fix(helm): Wait for CRDs to reach established state for crd_install hook Makes sure CRDs installed through the crd_install hook reaches the `established` state before the hook is considered complete. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 57 ++++++++ pkg/kube/client_test.go | 150 ++++++++++++++++++++- pkg/tiller/environment/environment.go | 7 + pkg/tiller/environment/environment_test.go | 4 + pkg/tiller/release_server.go | 8 +- pkg/tiller/release_server_test.go | 4 + 6 files changed, 225 insertions(+), 5 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 66c822ebd94..ee643fadedf 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -37,6 +37,7 @@ import ( batch "k8s.io/api/batch/v1" "k8s.io/api/core/v1" extv1beta1 "k8s.io/api/extensions/v1beta1" + apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -45,6 +46,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/resource" @@ -76,6 +78,12 @@ func New(getter genericclioptions.RESTClientGetter) *Client { if getter == nil { getter = genericclioptions.NewConfigFlags(true) } + + err := apiextv1beta1.AddToScheme(scheme.Scheme) + if err != nil { + panic(err) + } + return &Client{ Factory: cmdutil.NewFactory(getter), Log: nopLogger, @@ -439,6 +447,55 @@ func (c *Client) WatchUntilReady(namespace string, reader io.Reader, timeout int return perform(infos, c.watchTimeout(time.Duration(timeout)*time.Second)) } +// WatchUntilCRDEstablished polls the given CRD until it reaches the established +// state. A CRD needs to reach the established state before CRs can be created. +// +// If a naming conflict condition is found, this function will return an error. +func (c *Client) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { + infos, err := c.BuildUnstructured(metav1.NamespaceAll, reader) + if err != nil { + return err + } + + return perform(infos, c.pollCRDEstablished(timeout)) +} + +func (c *Client) pollCRDEstablished(t time.Duration) ResourceActorFunc { + return func(info *resource.Info) error { + return c.pollCRDUntilEstablished(t, info) + } +} + +func (c *Client) pollCRDUntilEstablished(timeout time.Duration, info *resource.Info) error { + return wait.PollImmediate(time.Second, timeout, func() (bool, error) { + err := info.Get() + if err != nil { + return false, fmt.Errorf("unable to get CRD: %v", err) + } + + crd := &apiextv1beta1.CustomResourceDefinition{} + err = scheme.Scheme.Convert(info.Object, crd, nil) + if err != nil { + return false, fmt.Errorf("unable to convert to CRD type: %v", err) + } + + for _, cond := range crd.Status.Conditions { + switch cond.Type { + case apiextv1beta1.Established: + if cond.Status == apiextv1beta1.ConditionTrue { + return true, nil + } + case apiextv1beta1.NamesAccepted: + if cond.Status == apiextv1beta1.ConditionFalse { + return false, fmt.Errorf("naming conflict detected for CRD %s", crd.GetName()) + } + } + } + + return false, nil + }) +} + func perform(infos Result, fn ResourceActorFunc) error { if len(infos) == 0 { return ErrNoObjectsVisited diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index a41490f9bc2..810abdf17c4 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -24,8 +24,10 @@ import ( "sort" "strings" "testing" + "time" - v1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" + apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,15 +35,35 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest/fake" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" + kubectlscheme "k8s.io/kubernetes/pkg/kubectl/scheme" ) +func init() { + err := apiextv1beta1.AddToScheme(scheme.Scheme) + if err != nil { + panic(err) + } + + // Tiller use the scheme from go-client, but the cmdtesting + // package used here is hardcoded to use the scheme from + // kubectl. So for testing, we need to add the CustomResourceDefinition + // type to both schemes. + err = apiextv1beta1.AddToScheme(kubectlscheme.Scheme) + if err != nil { + panic(err) + } +} + var ( - codec = scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) unstructuredSerializer = resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer ) +func getCodec() runtime.Codec { + return scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) +} + func objBody(obj runtime.Object) io.ReadCloser { - return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) + return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(getCodec(), obj)))) } func newPod(name string) v1.Pod { @@ -103,7 +125,7 @@ func notFoundBody() *metav1.Status { func newResponse(code int, obj runtime.Object) (*http.Response, error) { header := http.Header{} header.Set("Content-Type", runtime.ContentTypeJSON) - body := ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(codec, obj)))) + body := ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(getCodec(), obj)))) return &http.Response{StatusCode: code, Header: header, Body: body}, nil } @@ -434,6 +456,88 @@ func TestResourceSortOrder(t *testing.T) { } } +func TestWaitUntilCRDEstablished(t *testing.T) { + testCases := map[string]struct { + conditions []apiextv1beta1.CustomResourceDefinitionCondition + returnConditionsAfter int + success bool + }{ + "crd reaches established state after 2 requests": { + conditions: []apiextv1beta1.CustomResourceDefinitionCondition{ + { + Type: apiextv1beta1.Established, + Status: apiextv1beta1.ConditionTrue, + }, + }, + returnConditionsAfter: 2, + success: true, + }, + "crd does not reach established state before timeout": { + conditions: []apiextv1beta1.CustomResourceDefinitionCondition{}, + returnConditionsAfter: 100, + success: false, + }, + "crd name is not accepted": { + conditions: []apiextv1beta1.CustomResourceDefinitionCondition{ + { + Type: apiextv1beta1.NamesAccepted, + Status: apiextv1beta1.ConditionFalse, + }, + }, + returnConditionsAfter: 1, + success: false, + }, + } + + for tn, tc := range testCases { + func(name string) { + c := newTestClient() + defer c.Cleanup() + + crdWithoutConditions := newCrdWithStatus("name", apiextv1beta1.CustomResourceDefinitionStatus{}) + crdWithConditions := newCrdWithStatus("name", apiextv1beta1.CustomResourceDefinitionStatus{ + Conditions: tc.conditions, + }) + + requestCount := 0 + c.TestFactory.UnstructuredClient = &fake.RESTClient{ + GroupVersion: schema.GroupVersion{Version: "v1"}, + NegotiatedSerializer: unstructuredSerializer, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + var crd apiextv1beta1.CustomResourceDefinition + if requestCount < tc.returnConditionsAfter { + crd = crdWithoutConditions + } else { + crd = crdWithConditions + } + requestCount += 1 + return newResponse(200, &crd) + }), + } + + err := c.WaitUntilCRDEstablished(strings.NewReader(crdManifest), 5*time.Second) + if err != nil && tc.success { + t.Errorf("%s: expected no error, but got %v", name, err) + } + if err == nil && !tc.success { + t.Errorf("%s: expected error, but didn't get one", name) + } + }(tn) + } +} + +func newCrdWithStatus(name string, status apiextv1beta1.CustomResourceDefinitionStatus) apiextv1beta1.CustomResourceDefinition { + crd := apiextv1beta1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: apiextv1beta1.CustomResourceDefinitionSpec{}, + Status: status, + } + return crd +} + func TestPerform(t *testing.T) { tests := []struct { name string @@ -701,3 +805,41 @@ spec: ports: - containerPort: 80 ` + +const crdManifest = ` +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + labels: + controller-tools.k8s.io: "1.0" + name: applications.app.k8s.io +spec: + group: app.k8s.io + names: + kind: Application + plural: applications + scope: Namespaced + validation: + openAPIV3Schema: + properties: + apiVersion: + description: 'Description' + type: string + kind: + description: 'Kind' + type: string + metadata: + type: object + spec: + type: object + status: + type: object + version: v1beta1 +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +` diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index dca7c0756e3..6063e9c5faf 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -141,6 +141,8 @@ type KubeClient interface { // WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase // and returns said phase (PodSucceeded or PodFailed qualify). WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) + + WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error } // PrintingKubeClient implements KubeClient, but simply prints the reader to @@ -197,6 +199,11 @@ func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reade return v1.PodUnknown, err } +func (p *PrintingKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { + _, err := io.Copy(p.Out, reader) + return err +} + // Environment provides the context for executing a client request. // // All services in a context are concurrency safe. diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 9e9b549d492..464cee19161 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -69,6 +69,10 @@ func (k *mockKubeClient) WaitAndGetCompletedPodStatus(namespace string, reader i return "", nil } +func (k *mockKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { + return nil +} + var _ Engine = &mockEngine{} var _ KubeClient = &mockKubeClient{} var _ KubeClient = &PrintingKubeClient{} diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index d32fd82f66f..c95b3147705 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -23,6 +23,7 @@ import ( "path" "regexp" "strings" + "time" "github.com/technosophos/moniker" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -399,7 +400,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin b.Reset() b.WriteString(h.Manifest) - // We can't watch CRDs + // We can't watch CRDs, but need to wait until they reach the established state before continuing if hook != hooks.CRDInstall { if err := kubeCli.WatchUntilReady(namespace, b, timeout, false); err != nil { s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err) @@ -410,6 +411,11 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin } return err } + } else { + if err := kubeCli.WaitUntilCRDEstablished(b, time.Duration(timeout)*time.Second); err != nil { + s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err) + return err + } } } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index ecf5ffd17bb..4087b2f767b 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -642,6 +642,10 @@ func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, rea return v1.PodUnknown, nil } +func (kc *mockHooksKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { + return nil +} + func deletePolicyStub(kubeClient *mockHooksKubeClient) *ReleaseServer { e := environment.New() e.Releases = storage.Init(driver.NewMemory()) From 6cf4b8703fab9f77bb9d37a9bf4fac09f09d9e0d Mon Sep 17 00:00:00 2001 From: Joschka Tillmanns Date: Wed, 3 Apr 2019 13:52:12 +0200 Subject: [PATCH 423/483] don't do multiple chart reads on upgrade Signed-off-by: Joschka Tillmanns --- cmd/helm/upgrade.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 044ec045d45..bc4ec5ad9c6 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -248,7 +248,8 @@ func (u *upgradeCmd) run() error { } // Check chart requirements to make sure all dependencies are present in /charts - if ch, err := chartutil.Load(chartPath); err == nil { + ch, err := chartutil.Load(chartPath) + if err == nil { if req, err := chartutil.LoadRequirements(ch); err == nil { if err := renderutil.CheckDependencies(ch, req); err != nil { return err @@ -260,9 +261,9 @@ func (u *upgradeCmd) run() error { return prettyError(err) } - resp, err := u.client.UpdateRelease( + resp, err := u.client.UpdateReleaseFromChart( u.release, - chartPath, + ch, helm.UpdateValueOverrides(rawVals), helm.UpgradeDryRun(u.dryRun), helm.UpgradeRecreate(u.recreate), From 6cf433d719acbe165cf96000c935e11ad0147750 Mon Sep 17 00:00:00 2001 From: Sergey Kozlov Date: Wed, 3 Apr 2019 18:41:00 +0700 Subject: [PATCH 424/483] Fixed a typo in docs Replaced `chart` command by `helm`. Signed-off-by: Sergey Kozlov --- docs/chart_template_guide/notes_files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/notes_files.md b/docs/chart_template_guide/notes_files.md index 5a8b78ca436..670f78fc2b6 100644 --- a/docs/chart_template_guide/notes_files.md +++ b/docs/chart_template_guide/notes_files.md @@ -1,6 +1,6 @@ # Creating a NOTES.txt File -In this section we are going to look at Helm's tool for providing instructions to your chart users. At the end of a `chart install` or `chart upgrade`, Helm can print out a block of helpful information for users. This information is highly customizable using templates. +In this section we are going to look at Helm's tool for providing instructions to your chart users. At the end of a `helm install` or `helm upgrade`, Helm can print out a block of helpful information for users. This information is highly customizable using templates. To add installation notes to your chart, simply create a `templates/NOTES.txt` file. This file is plain text, but it is processed like as a template, and has all the normal template functions and objects available. From ff686d59671d32ea18c682cfa2e886e7b404243e Mon Sep 17 00:00:00 2001 From: Arvind Kumar <10303369+aku163@users.noreply.github.com> Date: Thu, 4 Apr 2019 01:10:46 +0100 Subject: [PATCH 425/483] Document update | variable representation change Signed-off-by: Arvind Kumar <10303369+aku163@users.noreply.github.com> --- docs/chart_template_guide/values_files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/values_files.md b/docs/chart_template_guide/values_files.md index 218da19dc77..0a72b6bc26d 100644 --- a/docs/chart_template_guide/values_files.md +++ b/docs/chart_template_guide/values_files.md @@ -29,7 +29,7 @@ data: drink: {{ .Values.favoriteDrink }} ``` -Notice on the last line we access `favoriteDrink` as an attribute of `Values`: `{{ .Values.favoriteDrink}}`. +Notice on the last line we access `favoriteDrink` as an attribute of `Values`: `{{ .Values.favoriteDrink }}`. Let's see how this renders. From 87e495c57d4585e6570cf2635644b97992ea5cd9 Mon Sep 17 00:00:00 2001 From: Sergey Kozlov Date: Thu, 4 Apr 2019 11:46:23 +0700 Subject: [PATCH 426/483] Fixed typos in docs/chart_best_practices Signed-off-by: Sergey Kozlov --- docs/chart_best_practices/values.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_best_practices/values.md b/docs/chart_best_practices/values.md index 28e3a3eac3d..bdc53e338d3 100644 --- a/docs/chart_best_practices/values.md +++ b/docs/chart_best_practices/values.md @@ -88,7 +88,7 @@ data is lost after one parse. ## Consider How Users Will Use Your Values -There are three potential sources of values: +There are four potential sources of values: - A chart's `values.yaml` file - A values file supplied by `helm install -f` or `helm upgrade -f` From e2a9bf29134297cacacf441c10ee6b1b2107ce5d Mon Sep 17 00:00:00 2001 From: Sergey Kozlov Date: Thu, 4 Apr 2019 13:06:49 +0700 Subject: [PATCH 427/483] Fixed default value for `helm.sh/chart` label Signed-off-by: Sergey Kozlov --- docs/chart_best_practices/labels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_best_practices/labels.md b/docs/chart_best_practices/labels.md index 6b7d24c49a6..5a41ed1cc1c 100644 --- a/docs/chart_best_practices/labels.md +++ b/docs/chart_best_practices/labels.md @@ -26,7 +26,7 @@ are recommended, and _should_ be placed onto a chart for global consistency. Tho Name|Status|Description -----|------|---------- `app.kubernetes.io/name` | REC | This should be the app name, reflecting the entire app. Usually `{{ template "name" . }}` is used for this. This is used by many Kubernetes manifests, and is not Helm-specific. -`helm.sh/chart` | REC | This should be the chart name and version: `{{ .Chart.Name }}-{{ .Chart.Version \| replace "+" "_" }}`. +`helm.sh/chart` | REC | This should be the chart name and version: `{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}`. `app.kubernetes.io/managed-by` | REC | This should always be set to `{{ .Release.Service }}`. It is for finding all things managed by Tiller. `app.kubernetes.io/instance` | REC | This should be the `{{ .Release.Name }}`. It aids in differentiating between different instances of the same application. `app.kubernetes.io/version` | OPT | The version of the app and can be set to `{{ .Chart.AppVersion }}`. From faa5fd0b5e312333c6a579b904794b27fc136807 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Thu, 4 Apr 2019 21:34:26 +0300 Subject: [PATCH 428/483] Add clarification log messages before calling cleanup-on-fail during update Signed-off-by: Timofey Kirillov --- pkg/kube/client.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index d5666fedf8a..6e51729cd91 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -371,6 +371,7 @@ func (c *Client) UpdateWithOptions(namespace string, originalReader, targetReade cleanupErrors := []string{} if opts.CleanupOnFail && (err != nil || len(updateErrors) != 0) { + c.Log("Cleanup on fail enabled: cleaning up newly created resources due to update manifests failures") cleanupErrors = c.cleanup(newlyCreatedResources) } @@ -405,6 +406,7 @@ func (c *Client) UpdateWithOptions(namespace string, originalReader, targetReade err := c.waitForResources(time.Duration(opts.Timeout)*time.Second, target) if opts.CleanupOnFail && err != nil { + c.Log("Cleanup on fail enabled: cleaning up newly created resources due to wait failure during update") cleanupErrors = c.cleanup(newlyCreatedResources) return fmt.Errorf(strings.Join(append([]string{err.Error()}, cleanupErrors...), " && ")) } From a8145d6f17a7c0fbe9c7b4d16d287cfc5901c232 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Fri, 22 Mar 2019 21:17:33 +0300 Subject: [PATCH 429/483] Regenerate proto files for `--cleanup-on-fail` option Signed-off-by: Timofey Kirillov --- pkg/proto/hapi/release/status.pb.go | 2 +- pkg/proto/hapi/rudder/rudder.pb.go | 119 +++++++++-------- pkg/proto/hapi/services/tiller.pb.go | 186 +++++++++++++++------------ 3 files changed, 172 insertions(+), 135 deletions(-) diff --git a/pkg/proto/hapi/release/status.pb.go b/pkg/proto/hapi/release/status.pb.go index 284892642f9..bc75e64b2c2 100644 --- a/pkg/proto/hapi/release/status.pb.go +++ b/pkg/proto/hapi/release/status.pb.go @@ -20,7 +20,7 @@ const ( Status_UNKNOWN Status_Code = 0 // Status_DEPLOYED indicates that the release has been pushed to Kubernetes. Status_DEPLOYED Status_Code = 1 - // Status_DELETED indicates that a release has been deleted from Kubermetes. + // Status_DELETED indicates that a release has been deleted from Kubernetes. Status_DELETED Status_Code = 2 // Status_SUPERSEDED indicates that this release object is outdated and a newer one exists. Status_SUPERSEDED Status_Code = 3 diff --git a/pkg/proto/hapi/rudder/rudder.pb.go b/pkg/proto/hapi/rudder/rudder.pb.go index 6e26d71eb0f..3a0de7746e1 100644 --- a/pkg/proto/hapi/rudder/rudder.pb.go +++ b/pkg/proto/hapi/rudder/rudder.pb.go @@ -214,12 +214,13 @@ func (m *DeleteReleaseResponse) GetResult() *Result { } type UpgradeReleaseRequest struct { - Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` - Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` - Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` - Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` - Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` - Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` + Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` + Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` + Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` + Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` + Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` + Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` + CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail" json:"CleanupOnFail,omitempty"` } func (m *UpgradeReleaseRequest) Reset() { *m = UpgradeReleaseRequest{} } @@ -269,6 +270,13 @@ func (m *UpgradeReleaseRequest) GetForce() bool { return false } +func (m *UpgradeReleaseRequest) GetCleanupOnFail() bool { + if m != nil { + return m.CleanupOnFail + } + return false +} + type UpgradeReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` @@ -294,12 +302,13 @@ func (m *UpgradeReleaseResponse) GetResult() *Result { } type RollbackReleaseRequest struct { - Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` - Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` - Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` - Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` - Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` - Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` + Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` + Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` + Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` + Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` + Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` + Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` + CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail" json:"CleanupOnFail,omitempty"` } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } @@ -349,6 +358,13 @@ func (m *RollbackReleaseRequest) GetForce() bool { return false } +func (m *RollbackReleaseRequest) GetCleanupOnFail() bool { + if m != nil { + return m.CleanupOnFail + } + return false +} + type RollbackReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` @@ -680,43 +696,44 @@ var _ReleaseModuleService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/rudder/rudder.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 597 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x5f, 0x8f, 0xd2, 0x4e, - 0x14, 0xa5, 0xb0, 0x14, 0xb8, 0x64, 0x7f, 0x3f, 0x32, 0xa1, 0xd0, 0x34, 0x3e, 0x90, 0x3e, 0x18, - 0xe2, 0xba, 0x25, 0x41, 0x1f, 0x7d, 0x51, 0x96, 0xfd, 0x13, 0x23, 0x9b, 0x0c, 0xe2, 0x26, 0xbe, - 0x75, 0xe1, 0x82, 0xd5, 0xd2, 0xd6, 0xe9, 0x74, 0x1f, 0xd5, 0x4f, 0xe3, 0x57, 0xd2, 0x8f, 0x63, - 0xda, 0x69, 0x89, 0xad, 0xd3, 0x88, 0x6b, 0xc2, 0x83, 0x4f, 0x9d, 0xe9, 0x3d, 0xdc, 0x39, 0xe7, - 0xf4, 0xce, 0x09, 0xa0, 0xbf, 0xb3, 0x03, 0x67, 0xc4, 0xa2, 0xd5, 0x0a, 0x59, 0xfa, 0xb0, 0x02, - 0xe6, 0x73, 0x9f, 0x74, 0xe3, 0x8a, 0x15, 0x22, 0xbb, 0x73, 0x96, 0x18, 0x5a, 0xa2, 0x66, 0xf4, - 0x05, 0x1e, 0x5d, 0xb4, 0x43, 0x1c, 0x39, 0xde, 0xda, 0x17, 0x70, 0xc3, 0xc8, 0x15, 0xd2, 0xa7, - 0xa8, 0x99, 0x2e, 0xa8, 0x14, 0xc3, 0xc8, 0xe5, 0x84, 0xc0, 0x51, 0xfc, 0x1b, 0x5d, 0x19, 0x28, - 0xc3, 0x16, 0x4d, 0xd6, 0xa4, 0x03, 0x35, 0xd7, 0xdf, 0xe8, 0xd5, 0x41, 0x6d, 0xd8, 0xa2, 0xf1, - 0xd2, 0x7c, 0x06, 0xea, 0x9c, 0xdb, 0x3c, 0x0a, 0x49, 0x1b, 0x1a, 0x8b, 0xd9, 0xcb, 0xd9, 0xf5, - 0xcd, 0xac, 0x53, 0x89, 0x37, 0xf3, 0xc5, 0x64, 0x32, 0x9d, 0xcf, 0x3b, 0x0a, 0x39, 0x86, 0xd6, - 0x62, 0x36, 0xb9, 0x7c, 0x3e, 0xbb, 0x98, 0x9e, 0x75, 0xaa, 0xa4, 0x05, 0xf5, 0x29, 0xa5, 0xd7, - 0xb4, 0x53, 0x33, 0xfb, 0xa0, 0xbd, 0x41, 0x16, 0x3a, 0xbe, 0x47, 0x05, 0x0b, 0x8a, 0x1f, 0x23, - 0x0c, 0xb9, 0x79, 0x0e, 0xbd, 0x62, 0x21, 0x0c, 0x7c, 0x2f, 0xc4, 0x98, 0x96, 0x67, 0x6f, 0x31, - 0xa3, 0x15, 0xaf, 0x89, 0x0e, 0x8d, 0x3b, 0x81, 0xd6, 0xab, 0xc9, 0xeb, 0x6c, 0x6b, 0x5e, 0x82, - 0x76, 0xe5, 0x85, 0xdc, 0x76, 0xdd, 0xfc, 0x01, 0x64, 0x04, 0x8d, 0x54, 0x78, 0xd2, 0xa9, 0x3d, - 0xd6, 0xac, 0xc4, 0xc4, 0xcc, 0x8d, 0x0c, 0x9e, 0xa1, 0xcc, 0xcf, 0xd0, 0x2b, 0x76, 0x4a, 0x19, - 0xfd, 0x69, 0x2b, 0xf2, 0x14, 0x54, 0x96, 0x78, 0x9c, 0xb0, 0x6d, 0x8f, 0x1f, 0x58, 0xb2, 0xef, - 0x67, 0x89, 0xef, 0x40, 0x53, 0xac, 0x79, 0x01, 0xdd, 0x33, 0x74, 0x91, 0xe3, 0xdf, 0x2a, 0xf9, - 0x04, 0x5a, 0xa1, 0xd1, 0x61, 0x85, 0x7c, 0x53, 0x40, 0x5b, 0x04, 0x1b, 0x66, 0xaf, 0x24, 0x52, - 0x96, 0x11, 0x63, 0xe8, 0xf1, 0xdf, 0x10, 0x48, 0x51, 0xe4, 0x14, 0x54, 0x6e, 0xb3, 0x0d, 0x66, - 0x04, 0x4a, 0xf0, 0x29, 0x28, 0x9e, 0x93, 0xd7, 0xce, 0x16, 0xfd, 0x88, 0xeb, 0xb5, 0x81, 0x32, - 0xac, 0xd1, 0x6c, 0x1b, 0x4f, 0xd5, 0x8d, 0xed, 0x70, 0xfd, 0x68, 0xa0, 0x0c, 0x9b, 0x34, 0x59, - 0x13, 0x03, 0x9a, 0x14, 0x97, 0x0c, 0x6d, 0x8e, 0x7a, 0x3d, 0x79, 0xbf, 0xdb, 0x93, 0x2e, 0xd4, - 0xcf, 0x7d, 0xb6, 0x44, 0x5d, 0x4d, 0x0a, 0x62, 0x13, 0xcf, 0x48, 0x51, 0xd8, 0x61, 0xad, 0xfd, - 0xae, 0x40, 0x8f, 0xfa, 0xae, 0x7b, 0x6b, 0x2f, 0x3f, 0xfc, 0x63, 0xde, 0x7e, 0x51, 0xa0, 0xff, - 0x8b, 0xb4, 0x83, 0xdf, 0xc0, 0xb4, 0x93, 0x88, 0xbc, 0x7b, 0xdf, 0xc0, 0x00, 0xb4, 0x42, 0xa3, - 0xfb, 0x0a, 0x79, 0x98, 0x86, 0xb4, 0x90, 0x41, 0xf2, 0xe8, 0x2b, 0x6f, 0xed, 0x8b, 0xe0, 0x1e, - 0x7f, 0xad, 0xef, 0xb8, 0xbf, 0xf2, 0x57, 0x91, 0x8b, 0x73, 0x21, 0x95, 0xac, 0xa1, 0x91, 0x06, - 0x2d, 0x39, 0x91, 0x9b, 0x20, 0x0d, 0x68, 0xe3, 0xf1, 0x7e, 0x60, 0xa1, 0xcb, 0xac, 0x90, 0x2d, - 0xfc, 0x97, 0x8f, 0xcf, 0xb2, 0xe3, 0xa4, 0x71, 0x5d, 0x76, 0x9c, 0x3c, 0x91, 0xcd, 0x0a, 0x79, - 0x0f, 0xc7, 0xb9, 0x8c, 0x23, 0x8f, 0xe4, 0x0d, 0x64, 0x89, 0x6a, 0x9c, 0xec, 0x85, 0xdd, 0x9d, - 0x15, 0xc0, 0xff, 0x85, 0xc1, 0x24, 0x25, 0x74, 0xe5, 0x57, 0xd3, 0x38, 0xdd, 0x13, 0xfd, 0xb3, - 0x99, 0xf9, 0x9c, 0x29, 0x33, 0x53, 0x1a, 0xb3, 0x65, 0x66, 0xca, 0xa3, 0x4b, 0x98, 0x99, 0x1b, - 0xd7, 0x32, 0x33, 0x65, 0x97, 0xa3, 0xcc, 0x4c, 0xe9, 0xfc, 0x9b, 0x95, 0x17, 0xcd, 0xb7, 0xaa, - 0x40, 0xdc, 0xaa, 0xc9, 0x1f, 0x92, 0x27, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb6, 0xa5, 0x37, - 0x75, 0xf7, 0x08, 0x00, 0x00, + // 615 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x56, 0x4d, 0x6f, 0xd3, 0x40, + 0x10, 0x8d, 0x9b, 0xc6, 0x69, 0xa6, 0x2a, 0x44, 0xab, 0xba, 0xb5, 0x2c, 0x0e, 0x91, 0x85, 0x50, + 0x44, 0xa9, 0x2b, 0x15, 0x8e, 0x5c, 0x20, 0xfd, 0x14, 0x22, 0x95, 0x36, 0x84, 0x4a, 0xdc, 0xb6, + 0xc9, 0x24, 0x18, 0x36, 0xb6, 0x59, 0xaf, 0x7b, 0x04, 0x7e, 0x0d, 0xff, 0x12, 0x84, 0xec, 0xb5, + 0x23, 0x6c, 0xd6, 0x22, 0x14, 0x29, 0x17, 0x4e, 0xde, 0xd9, 0x79, 0x9d, 0x9d, 0xf7, 0x76, 0xf6, + 0x35, 0x60, 0xbf, 0x67, 0x91, 0x7f, 0x24, 0x92, 0xe9, 0x14, 0x45, 0xfe, 0xf1, 0x22, 0x11, 0xca, + 0x90, 0xec, 0xa6, 0x19, 0x2f, 0x46, 0x71, 0xeb, 0x4f, 0x30, 0xf6, 0x54, 0xce, 0xd9, 0x57, 0x78, + 0xe4, 0xc8, 0x62, 0x3c, 0xf2, 0x83, 0x59, 0xa8, 0xe0, 0x8e, 0x53, 0x4a, 0xe4, 0x5f, 0x95, 0x73, + 0x39, 0x98, 0x14, 0xe3, 0x84, 0x4b, 0x42, 0x60, 0x33, 0xfd, 0x1b, 0xdb, 0xe8, 0x19, 0xfd, 0x0e, + 0xcd, 0xd6, 0xa4, 0x0b, 0x4d, 0x1e, 0xce, 0xed, 0x8d, 0x5e, 0xb3, 0xdf, 0xa1, 0xe9, 0xd2, 0x7d, + 0x0e, 0xe6, 0x48, 0x32, 0x99, 0xc4, 0x64, 0x1b, 0xda, 0xe3, 0xe1, 0xab, 0xe1, 0xd5, 0xf5, 0xb0, + 0xdb, 0x48, 0x83, 0xd1, 0x78, 0x30, 0x38, 0x1d, 0x8d, 0xba, 0x06, 0xd9, 0x81, 0xce, 0x78, 0x38, + 0xb8, 0x78, 0x31, 0x3c, 0x3f, 0x3d, 0xe9, 0x6e, 0x90, 0x0e, 0xb4, 0x4e, 0x29, 0xbd, 0xa2, 0xdd, + 0xa6, 0xbb, 0x0f, 0xd6, 0x5b, 0x14, 0xb1, 0x1f, 0x06, 0x54, 0x75, 0x41, 0xf1, 0x53, 0x82, 0xb1, + 0x74, 0xcf, 0x60, 0xaf, 0x9a, 0x88, 0xa3, 0x30, 0x88, 0x31, 0x6d, 0x2b, 0x60, 0x0b, 0x2c, 0xda, + 0x4a, 0xd7, 0xc4, 0x86, 0xf6, 0xad, 0x42, 0xdb, 0x1b, 0xd9, 0x76, 0x11, 0xba, 0x17, 0x60, 0x5d, + 0x06, 0xb1, 0x64, 0x9c, 0x97, 0x0f, 0x20, 0x47, 0xd0, 0xce, 0x89, 0x67, 0x95, 0xb6, 0x8f, 0x2d, + 0x2f, 0x13, 0xb1, 0x50, 0xa3, 0x80, 0x17, 0x28, 0xf7, 0x0b, 0xec, 0x55, 0x2b, 0xe5, 0x1d, 0xfd, + 0x6d, 0x29, 0xf2, 0x0c, 0x4c, 0x91, 0x69, 0x9c, 0x75, 0xbb, 0x7d, 0xfc, 0xc0, 0xd3, 0xdd, 0x9f, + 0xa7, 0xee, 0x81, 0xe6, 0x58, 0xf7, 0x1c, 0x76, 0x4f, 0x90, 0xa3, 0xc4, 0x7f, 0x65, 0xf2, 0x19, + 0xac, 0x4a, 0xa1, 0xf5, 0x12, 0xf9, 0x6e, 0x80, 0x35, 0x8e, 0xe6, 0x82, 0x4d, 0x35, 0x54, 0x26, + 0x89, 0x10, 0x18, 0xc8, 0x3f, 0x34, 0x90, 0xa3, 0xc8, 0x21, 0x98, 0x92, 0x89, 0x39, 0x16, 0x0d, + 0xd4, 0xe0, 0x73, 0x50, 0x3a, 0x27, 0x6f, 0xfc, 0x05, 0x86, 0x89, 0xb4, 0x9b, 0x3d, 0xa3, 0xdf, + 0xa4, 0x45, 0x98, 0x4e, 0xd5, 0x35, 0xf3, 0xa5, 0xbd, 0xd9, 0x33, 0xfa, 0x5b, 0x34, 0x5b, 0x13, + 0x07, 0xb6, 0x28, 0x4e, 0x04, 0x32, 0x89, 0x76, 0x2b, 0xdb, 0x5f, 0xc6, 0x64, 0x17, 0x5a, 0x67, + 0xa1, 0x98, 0xa0, 0x6d, 0x66, 0x09, 0x15, 0x90, 0x87, 0xb0, 0x33, 0xe0, 0xc8, 0x82, 0x24, 0xba, + 0x0a, 0xce, 0x98, 0xcf, 0xed, 0x76, 0x96, 0x2d, 0x6f, 0xa6, 0x93, 0x54, 0xa5, 0xbf, 0xde, 0x0b, + 0xf8, 0x61, 0xc0, 0x1e, 0x0d, 0x39, 0xbf, 0x61, 0x93, 0x8f, 0xff, 0xe5, 0x0d, 0x7c, 0x35, 0x60, + 0xff, 0x37, 0x01, 0xd6, 0xfe, 0x9a, 0xf3, 0x4a, 0xca, 0x3e, 0xef, 0xfc, 0x9a, 0x23, 0xb0, 0x2a, + 0x85, 0xee, 0x4a, 0xe4, 0x51, 0x6e, 0xf8, 0x8a, 0x06, 0x29, 0xa3, 0x2f, 0x83, 0x59, 0xa8, 0xfe, + 0x09, 0x1c, 0x7f, 0x6b, 0x2d, 0x7b, 0x7f, 0x1d, 0x4e, 0x13, 0x8e, 0x23, 0x45, 0x95, 0xcc, 0xa0, + 0x9d, 0x9b, 0x36, 0x39, 0xd0, 0x8b, 0xa0, 0x35, 0x7b, 0xe7, 0xc9, 0x6a, 0x60, 0xc5, 0xcb, 0x6d, + 0x90, 0x05, 0xdc, 0x2b, 0x5b, 0x71, 0xdd, 0x71, 0x5a, 0xeb, 0xaf, 0x3b, 0x4e, 0xef, 0xee, 0x6e, + 0x83, 0x7c, 0x80, 0x9d, 0x92, 0x5f, 0x92, 0xc7, 0xfa, 0x02, 0x3a, 0x77, 0x76, 0x0e, 0x56, 0xc2, + 0x2e, 0xcf, 0x8a, 0xe0, 0x7e, 0x65, 0x30, 0x49, 0x4d, 0xbb, 0xfa, 0x07, 0xec, 0x1c, 0xae, 0x88, + 0xfe, 0x55, 0xcc, 0xb2, 0x1b, 0xd5, 0x89, 0xa9, 0xb5, 0xec, 0x3a, 0x31, 0xf5, 0x06, 0xa7, 0xc4, + 0x2c, 0x8d, 0x6b, 0x9d, 0x98, 0xba, 0xc7, 0x51, 0x27, 0xa6, 0x76, 0xfe, 0xdd, 0xc6, 0xcb, 0xad, + 0x77, 0xa6, 0x42, 0xdc, 0x98, 0xd9, 0x8f, 0x9b, 0xa7, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe2, + 0x9e, 0x21, 0x0d, 0x43, 0x09, 0x00, 0x00, } diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index ce76cad1247..ab6e573e5ab 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -383,6 +383,8 @@ type UpdateReleaseRequest struct { Description string `protobuf:"bytes,12,opt,name=description" json:"description,omitempty"` // Render subchart notes if enabled SubNotes bool `protobuf:"varint,13,opt,name=subNotes" json:"subNotes,omitempty"` + // Allow deletion of new resources created in this update when update failed + CleanupOnFail bool `protobuf:"varint,14,opt,name=cleanup_on_fail,json=cleanupOnFail" json:"cleanup_on_fail,omitempty"` } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } @@ -481,6 +483,13 @@ func (m *UpdateReleaseRequest) GetSubNotes() bool { return false } +func (m *UpdateReleaseRequest) GetCleanupOnFail() bool { + if m != nil { + return m.CleanupOnFail + } + return false +} + // UpdateReleaseResponse is the response to an update request. type UpdateReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -518,6 +527,8 @@ type RollbackReleaseRequest struct { Force bool `protobuf:"varint,8,opt,name=force" json:"force,omitempty"` // Description, if set, will set the description for the rollback Description string `protobuf:"bytes,9,opt,name=description" json:"description,omitempty"` + // Allow deletion of new resources created in this rollback when rollback failed + CleanupOnFail bool `protobuf:"varint,10,opt,name=cleanup_on_fail,json=cleanupOnFail" json:"cleanup_on_fail,omitempty"` } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } @@ -588,6 +599,13 @@ func (m *RollbackReleaseRequest) GetDescription() string { return "" } +func (m *RollbackReleaseRequest) GetCleanupOnFail() bool { + if m != nil { + return m.CleanupOnFail + } + return false +} + // RollbackReleaseResponse is the response to an update request. type RollbackReleaseResponse struct { Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` @@ -1441,87 +1459,89 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1308 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xed, 0x6e, 0x1b, 0x45, - 0x17, 0x8e, 0xbd, 0xfe, 0x3c, 0x4e, 0xfc, 0xba, 0xd3, 0x34, 0xd9, 0xee, 0x5b, 0x50, 0x58, 0x04, - 0x75, 0x0b, 0x75, 0xc0, 0xf0, 0x07, 0x09, 0x21, 0xa5, 0xae, 0x95, 0x14, 0x82, 0x2b, 0xad, 0xdb, - 0x22, 0x21, 0x21, 0x6b, 0x63, 0x8f, 0xdb, 0xa5, 0xeb, 0x5d, 0xb3, 0x33, 0x1b, 0x9a, 0x1b, 0x40, - 0xe2, 0x27, 0x97, 0x80, 0xc4, 0x85, 0x70, 0x1f, 0xdc, 0x0c, 0x9a, 0xaf, 0xcd, 0xce, 0x7a, 0xd7, - 0x5d, 0xf2, 0x27, 0xde, 0x99, 0x73, 0xe6, 0x7c, 0x3c, 0xcf, 0x9c, 0x33, 0x27, 0x60, 0xbd, 0x76, - 0xd7, 0xde, 0x31, 0xc1, 0xd1, 0xa5, 0x37, 0xc7, 0xe4, 0x98, 0x7a, 0xbe, 0x8f, 0xa3, 0xc1, 0x3a, - 0x0a, 0x69, 0x88, 0xf6, 0x99, 0x6c, 0xa0, 0x64, 0x03, 0x21, 0xb3, 0x0e, 0xf8, 0x89, 0xf9, 0x6b, - 0x37, 0xa2, 0xe2, 0xaf, 0xd0, 0xb6, 0x0e, 0xd3, 0xfb, 0x61, 0xb0, 0xf4, 0x5e, 0x49, 0x81, 0x70, - 0x11, 0x61, 0x1f, 0xbb, 0x04, 0xab, 0x5f, 0xed, 0x90, 0x92, 0x79, 0xc1, 0x32, 0x94, 0x82, 0xff, - 0x6b, 0x02, 0x8a, 0x09, 0x9d, 0x45, 0x71, 0x20, 0x85, 0x77, 0x35, 0x21, 0xa1, 0x2e, 0x8d, 0x89, - 0xe6, 0xec, 0x12, 0x47, 0xc4, 0x0b, 0x03, 0xf5, 0x2b, 0x64, 0xf6, 0xdf, 0x55, 0xb8, 0x7d, 0xee, - 0x11, 0xea, 0x88, 0x83, 0xc4, 0xc1, 0xbf, 0xc4, 0x98, 0x50, 0xb4, 0x0f, 0x75, 0xdf, 0x5b, 0x79, - 0xd4, 0xac, 0x1c, 0x55, 0xfa, 0x86, 0x23, 0x16, 0xe8, 0x00, 0x1a, 0xe1, 0x72, 0x49, 0x30, 0x35, - 0xab, 0x47, 0x95, 0x7e, 0xdb, 0x91, 0x2b, 0xf4, 0x0d, 0x34, 0x49, 0x18, 0xd1, 0xd9, 0xc5, 0x95, - 0x69, 0x1c, 0x55, 0xfa, 0xdd, 0xe1, 0x47, 0x83, 0x3c, 0x9c, 0x06, 0xcc, 0xd3, 0x34, 0x8c, 0xe8, - 0x80, 0xfd, 0x79, 0x7c, 0xe5, 0x34, 0x08, 0xff, 0x65, 0x76, 0x97, 0x9e, 0x4f, 0x71, 0x64, 0xd6, - 0x84, 0x5d, 0xb1, 0x42, 0xa7, 0x00, 0xdc, 0x6e, 0x18, 0x2d, 0x70, 0x64, 0xd6, 0xb9, 0xe9, 0x7e, - 0x09, 0xd3, 0xcf, 0x98, 0xbe, 0xd3, 0x26, 0xea, 0x13, 0x7d, 0x0d, 0xbb, 0x02, 0x92, 0xd9, 0x3c, - 0x5c, 0x60, 0x62, 0x36, 0x8e, 0x8c, 0x7e, 0x77, 0x78, 0x57, 0x98, 0x52, 0xf0, 0x4f, 0x05, 0x68, - 0xa3, 0x70, 0x81, 0x9d, 0x8e, 0x50, 0x67, 0xdf, 0x04, 0xdd, 0x83, 0x76, 0xe0, 0xae, 0x30, 0x59, - 0xbb, 0x73, 0x6c, 0x36, 0x79, 0x84, 0xd7, 0x1b, 0x76, 0x00, 0x2d, 0xe5, 0xdc, 0x7e, 0x0c, 0x0d, - 0x91, 0x1a, 0xea, 0x40, 0xf3, 0xc5, 0xe4, 0xbb, 0xc9, 0xb3, 0x1f, 0x26, 0xbd, 0x1d, 0xd4, 0x82, - 0xda, 0xe4, 0xe4, 0xfb, 0x71, 0xaf, 0x82, 0x6e, 0xc1, 0xde, 0xf9, 0xc9, 0xf4, 0xf9, 0xcc, 0x19, - 0x9f, 0x8f, 0x4f, 0xa6, 0xe3, 0x27, 0xbd, 0x2a, 0xea, 0x02, 0x8c, 0xce, 0x4e, 0x9c, 0xe7, 0x33, - 0xae, 0x62, 0xd8, 0xef, 0x43, 0x3b, 0xc9, 0x01, 0x35, 0xc1, 0x38, 0x99, 0x8e, 0x84, 0x89, 0x27, - 0xe3, 0xe9, 0xa8, 0x57, 0xb1, 0x7f, 0xaf, 0xc0, 0xbe, 0x4e, 0x19, 0x59, 0x87, 0x01, 0xc1, 0x8c, - 0xb3, 0x79, 0x18, 0x07, 0x09, 0x67, 0x7c, 0x81, 0x10, 0xd4, 0x02, 0xfc, 0x56, 0x31, 0xc6, 0xbf, - 0x99, 0x26, 0x0d, 0xa9, 0xeb, 0x73, 0xb6, 0x0c, 0x47, 0x2c, 0xd0, 0xe7, 0xd0, 0x92, 0x50, 0x10, - 0xb3, 0x76, 0x64, 0xf4, 0x3b, 0xc3, 0x3b, 0x3a, 0x40, 0xd2, 0xa3, 0x93, 0xa8, 0xd9, 0xa7, 0x70, - 0x78, 0x8a, 0x55, 0x24, 0x02, 0x3f, 0x75, 0x83, 0x98, 0x5f, 0x77, 0x85, 0x79, 0x30, 0xcc, 0xaf, - 0xbb, 0xc2, 0xc8, 0x84, 0xa6, 0xbc, 0x7e, 0x3c, 0x9c, 0xba, 0xa3, 0x96, 0x36, 0x05, 0x73, 0xd3, - 0x90, 0xcc, 0x2b, 0xcf, 0xd2, 0xc7, 0x50, 0x63, 0x95, 0xc1, 0xcd, 0x74, 0x86, 0x48, 0x8f, 0xf3, - 0x69, 0xb0, 0x0c, 0x1d, 0x2e, 0xd7, 0xa9, 0x33, 0xb2, 0xd4, 0x9d, 0xa5, 0xbd, 0x8e, 0xc2, 0x80, - 0xe2, 0x80, 0xde, 0x2c, 0xfe, 0x73, 0xb8, 0x9b, 0x63, 0x49, 0x26, 0x70, 0x0c, 0x4d, 0x19, 0x1a, - 0xb7, 0x56, 0x88, 0xab, 0xd2, 0xb2, 0xff, 0x34, 0x60, 0xff, 0xc5, 0x7a, 0xe1, 0x52, 0xac, 0x44, - 0x5b, 0x82, 0xba, 0x0f, 0x75, 0xde, 0x61, 0x24, 0x16, 0xb7, 0x84, 0x6d, 0xd1, 0x86, 0x46, 0xec, - 0xaf, 0x23, 0xe4, 0xe8, 0x21, 0x34, 0x2e, 0x5d, 0x3f, 0xc6, 0x84, 0x03, 0x91, 0xa0, 0x26, 0x35, - 0x79, 0x7b, 0x72, 0xa4, 0x06, 0x3a, 0x84, 0xe6, 0x22, 0xba, 0x62, 0xfd, 0x85, 0x97, 0x64, 0xcb, - 0x69, 0x2c, 0xa2, 0x2b, 0x27, 0x0e, 0xd0, 0x87, 0xb0, 0xb7, 0xf0, 0x88, 0x7b, 0xe1, 0xe3, 0xd9, - 0xeb, 0x30, 0x7c, 0x43, 0x78, 0x55, 0xb6, 0x9c, 0x5d, 0xb9, 0x79, 0xc6, 0xf6, 0x90, 0xc5, 0x6e, - 0xd2, 0x3c, 0xc2, 0x2e, 0xc5, 0x66, 0x83, 0xcb, 0x93, 0x35, 0xc3, 0x90, 0x7a, 0x2b, 0x1c, 0xc6, - 0x94, 0x97, 0x92, 0xe1, 0xa8, 0x25, 0xfa, 0x00, 0x76, 0x23, 0x4c, 0x30, 0x9d, 0xc9, 0x28, 0x5b, - 0xfc, 0x64, 0x87, 0xef, 0xbd, 0x14, 0x61, 0x21, 0xa8, 0xfd, 0xea, 0x7a, 0xd4, 0x6c, 0x73, 0x11, - 0xff, 0x16, 0xc7, 0x62, 0x82, 0xd5, 0x31, 0x50, 0xc7, 0x62, 0x82, 0xe5, 0xb1, 0x7d, 0xa8, 0x2f, - 0xc3, 0x68, 0x8e, 0xcd, 0x0e, 0x97, 0x89, 0x05, 0x3a, 0x82, 0xce, 0x02, 0x93, 0x79, 0xe4, 0xad, - 0x29, 0x63, 0x74, 0x97, 0x63, 0x9a, 0xde, 0x62, 0x79, 0x90, 0xf8, 0x62, 0x12, 0x52, 0x4c, 0xcc, - 0x3d, 0x91, 0x87, 0x5a, 0xdb, 0x67, 0x70, 0x27, 0x43, 0xd1, 0x4d, 0xd9, 0xfe, 0xad, 0x0a, 0x07, - 0x4e, 0xe8, 0xfb, 0x17, 0xee, 0xfc, 0x4d, 0x09, 0xbe, 0x53, 0xd4, 0x54, 0xb7, 0x53, 0x63, 0xe4, - 0x50, 0x93, 0xba, 0xc2, 0x35, 0xed, 0x0a, 0x6b, 0xa4, 0xd5, 0x8b, 0x49, 0x6b, 0xe8, 0xa4, 0x29, - 0x46, 0x9a, 0x29, 0x46, 0x12, 0xb8, 0x5b, 0x5b, 0xe0, 0x6e, 0x6f, 0xc0, 0x6d, 0x7f, 0x0b, 0x87, - 0x1b, 0x38, 0xdc, 0x14, 0xd4, 0x3f, 0x0c, 0xb8, 0xf3, 0x34, 0x20, 0xd4, 0xf5, 0xfd, 0x0c, 0xa6, - 0x49, 0xbd, 0x54, 0x4a, 0xd7, 0x4b, 0xf5, 0xbf, 0xd4, 0x8b, 0xa1, 0x91, 0xa2, 0x18, 0xac, 0xa5, - 0x18, 0x2c, 0x55, 0x43, 0x5a, 0xe7, 0x6a, 0x64, 0x3a, 0x17, 0x7a, 0x0f, 0x40, 0x5c, 0x7a, 0x6e, - 0x5c, 0x80, 0xdf, 0xe6, 0x3b, 0x13, 0xd9, 0xa8, 0x14, 0x5f, 0xad, 0x7c, 0xbe, 0xd2, 0x15, 0xd4, - 0x87, 0x9e, 0x8a, 0x67, 0x1e, 0x2d, 0x78, 0x4c, 0xb2, 0x8a, 0xba, 0x72, 0x7f, 0x14, 0x2d, 0x58, - 0x54, 0x59, 0x0e, 0x3b, 0xdb, 0x4b, 0x66, 0x37, 0x53, 0x32, 0x4f, 0xe1, 0x20, 0x4b, 0xc9, 0x4d, - 0xe9, 0xfd, 0xab, 0x02, 0x87, 0x2f, 0x02, 0x2f, 0x97, 0xe0, 0xbc, 0xa2, 0xd9, 0x80, 0xbc, 0x9a, - 0x03, 0xf9, 0x3e, 0xd4, 0xd7, 0x71, 0xf4, 0x0a, 0x4b, 0x0a, 0xc5, 0x22, 0x8d, 0x65, 0x4d, 0xc7, - 0x32, 0x83, 0x46, 0x7d, 0xf3, 0x46, 0xcf, 0xc0, 0xdc, 0x8c, 0xf2, 0x86, 0x39, 0xb3, 0xbc, 0x92, - 0x37, 0xaf, 0x2d, 0xde, 0x37, 0xfb, 0x36, 0xdc, 0x3a, 0xc5, 0xf4, 0xa5, 0x28, 0x61, 0x09, 0x80, - 0x3d, 0x06, 0x94, 0xde, 0xbc, 0xf6, 0x27, 0xb7, 0x74, 0x7f, 0x6a, 0x20, 0x54, 0xfa, 0x4a, 0xcb, - 0xfe, 0x8a, 0xdb, 0x3e, 0xf3, 0x08, 0x0d, 0xa3, 0xab, 0x6d, 0xe0, 0xf6, 0xc0, 0x58, 0xb9, 0x6f, - 0xe5, 0x93, 0xc8, 0x3e, 0xed, 0x53, 0x1e, 0x41, 0x72, 0x54, 0x46, 0x90, 0x1e, 0x30, 0x2a, 0xe5, - 0x06, 0x8c, 0xb7, 0x80, 0x9e, 0xe3, 0x64, 0xd6, 0x79, 0xc7, 0xdb, 0xac, 0x68, 0xaa, 0xea, 0x34, - 0x99, 0xd0, 0x9c, 0xfb, 0xd8, 0x0d, 0xe2, 0xb5, 0x24, 0x56, 0x2d, 0xd9, 0x65, 0x5d, 0xbb, 0x91, - 0xeb, 0xfb, 0xd8, 0x97, 0xcf, 0x5c, 0xb2, 0xb6, 0x7f, 0x82, 0xdb, 0x9a, 0x67, 0x99, 0x03, 0xcb, - 0x95, 0xbc, 0x92, 0x9e, 0xd9, 0x27, 0xfa, 0x12, 0x1a, 0x62, 0x58, 0xe4, 0x7e, 0xbb, 0xc3, 0x7b, - 0x7a, 0x4e, 0xdc, 0x48, 0x1c, 0xc8, 0xe9, 0xd2, 0x91, 0xba, 0xc3, 0x7f, 0x5a, 0xd0, 0x55, 0xe3, - 0x8e, 0x18, 0x65, 0x91, 0x07, 0xbb, 0xe9, 0xb9, 0x0e, 0x3d, 0x28, 0x9e, 0x74, 0x33, 0xe3, 0xba, - 0xf5, 0xb0, 0x8c, 0xaa, 0xc8, 0xc0, 0xde, 0xf9, 0xac, 0x82, 0x08, 0xf4, 0xb2, 0xe3, 0x16, 0x7a, - 0x94, 0x6f, 0xa3, 0x60, 0xbe, 0xb3, 0x06, 0x65, 0xd5, 0x95, 0x5b, 0x74, 0xc9, 0xef, 0x93, 0x3e, - 0x23, 0xa1, 0x77, 0x9a, 0xd1, 0xc7, 0x32, 0xeb, 0xb8, 0xb4, 0x7e, 0xe2, 0xf7, 0x67, 0xd8, 0xd3, - 0x5e, 0x6a, 0x54, 0x80, 0x56, 0xde, 0xc4, 0x65, 0x7d, 0x52, 0x4a, 0x37, 0xf1, 0xb5, 0x82, 0xae, - 0xde, 0xe2, 0x50, 0x81, 0x81, 0xdc, 0xb7, 0xc9, 0xfa, 0xb4, 0x9c, 0x72, 0xe2, 0x8e, 0x40, 0x2f, - 0xdb, 0x5f, 0x8a, 0x78, 0x2c, 0xe8, 0x96, 0x45, 0x3c, 0x16, 0xb5, 0x2d, 0x7b, 0x07, 0xb9, 0x00, - 0xd7, 0xed, 0x05, 0xdd, 0x2f, 0x24, 0x44, 0xef, 0x4a, 0x56, 0xff, 0xdd, 0x8a, 0x89, 0x8b, 0x35, - 0xfc, 0x2f, 0x33, 0x09, 0xa0, 0x02, 0x68, 0xf2, 0x07, 0x27, 0xeb, 0x51, 0x49, 0xed, 0x4c, 0x52, - 0xb2, 0x63, 0x6d, 0x49, 0x4a, 0x6f, 0x87, 0x5b, 0x92, 0xca, 0x34, 0x3f, 0x7b, 0x07, 0x79, 0xd0, - 0x75, 0xe2, 0x40, 0xba, 0x66, 0x6d, 0x01, 0x15, 0x9c, 0xde, 0xec, 0x78, 0xd6, 0x83, 0x12, 0x9a, - 0xd7, 0xf5, 0xfd, 0x18, 0x7e, 0x6c, 0x29, 0xd5, 0x8b, 0x06, 0xff, 0x4f, 0xff, 0x8b, 0x7f, 0x03, - 0x00, 0x00, 0xff, 0xff, 0x30, 0x18, 0x95, 0x9c, 0xd7, 0x10, 0x00, 0x00, + // 1337 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x72, 0xdb, 0x44, + 0x14, 0x8e, 0x2d, 0xff, 0x1e, 0x27, 0xae, 0xbb, 0x4d, 0x13, 0xd5, 0x14, 0x26, 0x88, 0xa1, 0x75, + 0x0b, 0x75, 0x20, 0x70, 0xc3, 0x0c, 0xc3, 0x4c, 0xea, 0x86, 0xa4, 0x10, 0xd2, 0x19, 0xb9, 0x2d, + 0x33, 0xcc, 0x30, 0x1e, 0xc5, 0x5e, 0xb7, 0xa2, 0xb2, 0xd6, 0x68, 0x57, 0xa1, 0x79, 0x04, 0x2e, + 0x79, 0x07, 0xae, 0x79, 0x06, 0x6e, 0x79, 0x06, 0x5e, 0x86, 0xd9, 0x3f, 0x45, 0x2b, 0x4b, 0xae, + 0xc8, 0x4d, 0xac, 0xdd, 0x73, 0xf6, 0xfc, 0x7c, 0xdf, 0x9e, 0xb3, 0x67, 0x02, 0xfd, 0xd7, 0xde, + 0xd2, 0xdf, 0xa7, 0x38, 0xba, 0xf0, 0xa7, 0x98, 0xee, 0x33, 0x3f, 0x08, 0x70, 0x34, 0x5c, 0x46, + 0x84, 0x11, 0xb4, 0xcd, 0x65, 0x43, 0x2d, 0x1b, 0x4a, 0x59, 0x7f, 0x47, 0x9c, 0x98, 0xbe, 0xf6, + 0x22, 0x26, 0xff, 0x4a, 0xed, 0xfe, 0x6e, 0x7a, 0x9f, 0x84, 0x73, 0xff, 0x95, 0x12, 0x48, 0x17, + 0x11, 0x0e, 0xb0, 0x47, 0xb1, 0xfe, 0x35, 0x0e, 0x69, 0x99, 0x1f, 0xce, 0x89, 0x12, 0xbc, 0x67, + 0x08, 0x18, 0xa6, 0x6c, 0x12, 0xc5, 0xa1, 0x12, 0xde, 0x31, 0x84, 0x94, 0x79, 0x2c, 0xa6, 0x86, + 0xb3, 0x0b, 0x1c, 0x51, 0x9f, 0x84, 0xfa, 0x57, 0xca, 0x9c, 0xbf, 0xab, 0x70, 0xeb, 0xd4, 0xa7, + 0xcc, 0x95, 0x07, 0xa9, 0x8b, 0x7f, 0x8d, 0x31, 0x65, 0x68, 0x1b, 0xea, 0x81, 0xbf, 0xf0, 0x99, + 0x5d, 0xd9, 0xab, 0x0c, 0x2c, 0x57, 0x2e, 0xd0, 0x0e, 0x34, 0xc8, 0x7c, 0x4e, 0x31, 0xb3, 0xab, + 0x7b, 0x95, 0x41, 0xdb, 0x55, 0x2b, 0xf4, 0x0d, 0x34, 0x29, 0x89, 0xd8, 0xe4, 0xfc, 0xd2, 0xb6, + 0xf6, 0x2a, 0x83, 0xee, 0xc1, 0xc7, 0xc3, 0x3c, 0x9c, 0x86, 0xdc, 0xd3, 0x98, 0x44, 0x6c, 0xc8, + 0xff, 0x3c, 0xbe, 0x74, 0x1b, 0x54, 0xfc, 0x72, 0xbb, 0x73, 0x3f, 0x60, 0x38, 0xb2, 0x6b, 0xd2, + 0xae, 0x5c, 0xa1, 0x63, 0x00, 0x61, 0x97, 0x44, 0x33, 0x1c, 0xd9, 0x75, 0x61, 0x7a, 0x50, 0xc2, + 0xf4, 0x33, 0xae, 0xef, 0xb6, 0xa9, 0xfe, 0x44, 0x5f, 0xc3, 0xa6, 0x84, 0x64, 0x32, 0x25, 0x33, + 0x4c, 0xed, 0xc6, 0x9e, 0x35, 0xe8, 0x1e, 0xdc, 0x91, 0xa6, 0x34, 0xfc, 0x63, 0x09, 0xda, 0x88, + 0xcc, 0xb0, 0xdb, 0x91, 0xea, 0xfc, 0x9b, 0xa2, 0xbb, 0xd0, 0x0e, 0xbd, 0x05, 0xa6, 0x4b, 0x6f, + 0x8a, 0xed, 0xa6, 0x88, 0xf0, 0x6a, 0xc3, 0x09, 0xa1, 0xa5, 0x9d, 0x3b, 0x8f, 0xa1, 0x21, 0x53, + 0x43, 0x1d, 0x68, 0xbe, 0x38, 0xfb, 0xfe, 0xec, 0xd9, 0x8f, 0x67, 0xbd, 0x0d, 0xd4, 0x82, 0xda, + 0xd9, 0xe1, 0x0f, 0x47, 0xbd, 0x0a, 0xba, 0x09, 0x5b, 0xa7, 0x87, 0xe3, 0xe7, 0x13, 0xf7, 0xe8, + 0xf4, 0xe8, 0x70, 0x7c, 0xf4, 0xa4, 0x57, 0x45, 0x5d, 0x80, 0xd1, 0xc9, 0xa1, 0xfb, 0x7c, 0x22, + 0x54, 0x2c, 0xe7, 0x03, 0x68, 0x27, 0x39, 0xa0, 0x26, 0x58, 0x87, 0xe3, 0x91, 0x34, 0xf1, 0xe4, + 0x68, 0x3c, 0xea, 0x55, 0x9c, 0xdf, 0x2b, 0xb0, 0x6d, 0x52, 0x46, 0x97, 0x24, 0xa4, 0x98, 0x73, + 0x36, 0x25, 0x71, 0x98, 0x70, 0x26, 0x16, 0x08, 0x41, 0x2d, 0xc4, 0x6f, 0x35, 0x63, 0xe2, 0x9b, + 0x6b, 0x32, 0xc2, 0xbc, 0x40, 0xb0, 0x65, 0xb9, 0x72, 0x81, 0x3e, 0x87, 0x96, 0x82, 0x82, 0xda, + 0xb5, 0x3d, 0x6b, 0xd0, 0x39, 0xb8, 0x6d, 0x02, 0xa4, 0x3c, 0xba, 0x89, 0x9a, 0x73, 0x0c, 0xbb, + 0xc7, 0x58, 0x47, 0x22, 0xf1, 0xd3, 0x37, 0x88, 0xfb, 0xf5, 0x16, 0x58, 0x04, 0xc3, 0xfd, 0x7a, + 0x0b, 0x8c, 0x6c, 0x68, 0xaa, 0xeb, 0x27, 0xc2, 0xa9, 0xbb, 0x7a, 0xe9, 0x30, 0xb0, 0x57, 0x0d, + 0xa9, 0xbc, 0xf2, 0x2c, 0xdd, 0x83, 0x1a, 0xaf, 0x0c, 0x61, 0xa6, 0x73, 0x80, 0xcc, 0x38, 0x9f, + 0x86, 0x73, 0xe2, 0x0a, 0xb9, 0x49, 0x9d, 0x95, 0xa5, 0xee, 0x24, 0xed, 0x75, 0x44, 0x42, 0x86, + 0x43, 0x76, 0xbd, 0xf8, 0x4f, 0xe1, 0x4e, 0x8e, 0x25, 0x95, 0xc0, 0x3e, 0x34, 0x55, 0x68, 0xc2, + 0x5a, 0x21, 0xae, 0x5a, 0xcb, 0xf9, 0xc7, 0x82, 0xed, 0x17, 0xcb, 0x99, 0xc7, 0xb0, 0x16, 0xad, + 0x09, 0xea, 0x3e, 0xd4, 0x45, 0x87, 0x51, 0x58, 0xdc, 0x94, 0xb6, 0x65, 0x1b, 0x1a, 0xf1, 0xbf, + 0xae, 0x94, 0xa3, 0x87, 0xd0, 0xb8, 0xf0, 0x82, 0x18, 0x53, 0x01, 0x44, 0x82, 0x9a, 0xd2, 0x14, + 0xed, 0xc9, 0x55, 0x1a, 0x68, 0x17, 0x9a, 0xb3, 0xe8, 0x92, 0xf7, 0x17, 0x51, 0x92, 0x2d, 0xb7, + 0x31, 0x8b, 0x2e, 0xdd, 0x38, 0x44, 0x1f, 0xc1, 0xd6, 0xcc, 0xa7, 0xde, 0x79, 0x80, 0x27, 0xaf, + 0x09, 0x79, 0x43, 0x45, 0x55, 0xb6, 0xdc, 0x4d, 0xb5, 0x79, 0xc2, 0xf7, 0x50, 0x9f, 0xdf, 0xa4, + 0x69, 0x84, 0x3d, 0x86, 0xed, 0x86, 0x90, 0x27, 0x6b, 0x8e, 0x21, 0xf3, 0x17, 0x98, 0xc4, 0x4c, + 0x94, 0x92, 0xe5, 0xea, 0x25, 0xfa, 0x10, 0x36, 0x23, 0x4c, 0x31, 0x9b, 0xa8, 0x28, 0x5b, 0xe2, + 0x64, 0x47, 0xec, 0xbd, 0x94, 0x61, 0x21, 0xa8, 0xfd, 0xe6, 0xf9, 0xcc, 0x6e, 0x0b, 0x91, 0xf8, + 0x96, 0xc7, 0x62, 0x8a, 0xf5, 0x31, 0xd0, 0xc7, 0x62, 0x8a, 0xd5, 0xb1, 0x6d, 0xa8, 0xcf, 0x49, + 0x34, 0xc5, 0x76, 0x47, 0xc8, 0xe4, 0x02, 0xed, 0x41, 0x67, 0x86, 0xe9, 0x34, 0xf2, 0x97, 0x8c, + 0x33, 0xba, 0x29, 0x30, 0x4d, 0x6f, 0xf1, 0x3c, 0x68, 0x7c, 0x7e, 0x46, 0x18, 0xa6, 0xf6, 0x96, + 0xcc, 0x43, 0xaf, 0xd1, 0x3d, 0xb8, 0x31, 0x0d, 0xb0, 0x17, 0xc6, 0xcb, 0x09, 0x09, 0x27, 0x73, + 0xcf, 0x0f, 0xec, 0xae, 0x50, 0xd9, 0x52, 0xdb, 0xcf, 0xc2, 0x6f, 0x3d, 0x3f, 0x70, 0x4e, 0xe0, + 0x76, 0x86, 0xca, 0xeb, 0xde, 0x8a, 0xbf, 0xaa, 0xb0, 0xe3, 0x92, 0x20, 0x38, 0xf7, 0xa6, 0x6f, + 0x4a, 0xdc, 0x8b, 0x14, 0x85, 0xd5, 0xf5, 0x14, 0x5a, 0x39, 0x14, 0xa6, 0xae, 0x7a, 0xcd, 0xb8, + 0xea, 0x06, 0xb9, 0xf5, 0x62, 0x72, 0x1b, 0x26, 0xb9, 0x9a, 0xb9, 0x66, 0x8a, 0xb9, 0x84, 0x96, + 0xd6, 0x1a, 0x5a, 0xda, 0xab, 0xb4, 0xe4, 0x40, 0x0f, 0x79, 0xd0, 0x7f, 0x07, 0xbb, 0x2b, 0x78, + 0x5d, 0x17, 0xfc, 0x3f, 0x2c, 0xb8, 0xfd, 0x34, 0xa4, 0xcc, 0x0b, 0x82, 0x0c, 0xf6, 0x49, 0xfd, + 0x55, 0x4a, 0xd7, 0x5f, 0xf5, 0xff, 0xd4, 0x9f, 0x65, 0x90, 0xa7, 0x99, 0xae, 0xa5, 0x98, 0x2e, + 0x55, 0x93, 0x46, 0x27, 0x6c, 0x64, 0x3a, 0x21, 0x7a, 0x1f, 0x40, 0x16, 0x91, 0x30, 0x2e, 0x49, + 0x6a, 0x8b, 0x9d, 0x33, 0xd5, 0xf8, 0x34, 0xaf, 0xad, 0x7c, 0x5e, 0xd3, 0x15, 0x39, 0x80, 0x9e, + 0x8e, 0x67, 0x1a, 0xcd, 0x44, 0x4c, 0x8a, 0xa0, 0xae, 0xda, 0x1f, 0x45, 0x33, 0x1e, 0x55, 0x96, + 0xeb, 0xce, 0xfa, 0x12, 0xdc, 0x34, 0x4b, 0xd0, 0x79, 0x0a, 0x3b, 0x59, 0x4a, 0xae, 0x4b, 0xef, + 0x9f, 0x15, 0xd8, 0x7d, 0x11, 0xfa, 0xb9, 0x04, 0xe7, 0x15, 0xd7, 0x0a, 0xe4, 0xd5, 0x1c, 0xc8, + 0xb7, 0xa1, 0xbe, 0x8c, 0xa3, 0x57, 0x58, 0x51, 0x28, 0x17, 0x69, 0x2c, 0x6b, 0x26, 0x96, 0x19, + 0x34, 0xea, 0x2b, 0x68, 0x38, 0x13, 0xb0, 0x57, 0xa3, 0xbc, 0x66, 0xce, 0x3c, 0xaf, 0xe4, 0x0d, + 0x6d, 0xcb, 0xf7, 0xd2, 0xb9, 0x05, 0x37, 0x8f, 0x31, 0x7b, 0x29, 0x4b, 0x5d, 0x01, 0xe0, 0x1c, + 0x01, 0x4a, 0x6f, 0x5e, 0xf9, 0x53, 0x5b, 0xa6, 0x3f, 0x3d, 0x60, 0x6a, 0x7d, 0xad, 0xe5, 0x7c, + 0x25, 0x6c, 0x9f, 0xf8, 0x94, 0x91, 0xe8, 0x72, 0x1d, 0xb8, 0x3d, 0xb0, 0x16, 0xde, 0x5b, 0xf5, + 0xc4, 0xf2, 0x4f, 0xe7, 0x58, 0x44, 0x90, 0x1c, 0x55, 0x11, 0xa4, 0x07, 0x96, 0x4a, 0xb9, 0x81, + 0xe5, 0x2d, 0xa0, 0xe7, 0x38, 0x99, 0x9d, 0xde, 0xf1, 0xd6, 0x6b, 0x9a, 0xaa, 0x26, 0x4d, 0x36, + 0x34, 0x55, 0x9f, 0x51, 0xc4, 0xea, 0x25, 0xbf, 0xac, 0x4b, 0x2f, 0xf2, 0x82, 0x00, 0x07, 0xea, + 0xd9, 0x4c, 0xd6, 0xce, 0xcf, 0x70, 0xcb, 0xf0, 0xac, 0x72, 0xe0, 0xb9, 0xd2, 0x57, 0xca, 0x33, + 0xff, 0x44, 0x5f, 0x42, 0x43, 0x0e, 0x9f, 0xc2, 0x6f, 0xf7, 0xe0, 0xae, 0x99, 0x93, 0x30, 0x12, + 0x87, 0x6a, 0x5a, 0x75, 0x95, 0xee, 0xc1, 0xbf, 0x2d, 0xe8, 0xea, 0xf1, 0x49, 0x8e, 0xc6, 0xc8, + 0x87, 0xcd, 0xf4, 0x9c, 0x88, 0x1e, 0x14, 0x4f, 0xce, 0x99, 0xf1, 0xbf, 0xff, 0xb0, 0x8c, 0xaa, + 0xcc, 0xc0, 0xd9, 0xf8, 0xac, 0x82, 0x28, 0xf4, 0xb2, 0xe3, 0x1b, 0x7a, 0x94, 0x6f, 0xa3, 0x60, + 0x5e, 0xec, 0x0f, 0xcb, 0xaa, 0x6b, 0xb7, 0xe8, 0x42, 0xdc, 0x27, 0x73, 0xe6, 0x42, 0xef, 0x34, + 0x63, 0x8e, 0x79, 0xfd, 0xfd, 0xd2, 0xfa, 0x89, 0xdf, 0x5f, 0x60, 0xcb, 0x78, 0xd1, 0x51, 0x01, + 0x5a, 0x79, 0x13, 0x5c, 0xff, 0x93, 0x52, 0xba, 0x89, 0xaf, 0x05, 0x74, 0xcd, 0x16, 0x87, 0x0a, + 0x0c, 0xe4, 0xbe, 0x4d, 0xfd, 0x4f, 0xcb, 0x29, 0x27, 0xee, 0x28, 0xf4, 0xb2, 0xfd, 0xa5, 0x88, + 0xc7, 0x82, 0x6e, 0x59, 0xc4, 0x63, 0x51, 0xdb, 0x72, 0x36, 0x90, 0x07, 0x70, 0xd5, 0x5e, 0xd0, + 0xfd, 0x42, 0x42, 0xcc, 0xae, 0xd4, 0x1f, 0xbc, 0x5b, 0x31, 0x71, 0xb1, 0x84, 0x1b, 0x99, 0x49, + 0x00, 0x15, 0x40, 0x93, 0x3f, 0x60, 0xf5, 0x1f, 0x95, 0xd4, 0xce, 0x24, 0xa5, 0x3a, 0xd6, 0x9a, + 0xa4, 0xcc, 0x76, 0xb8, 0x26, 0xa9, 0x4c, 0xf3, 0x73, 0x36, 0x90, 0x0f, 0x5d, 0x37, 0x0e, 0x95, + 0x6b, 0xde, 0x16, 0x50, 0xc1, 0xe9, 0xd5, 0x8e, 0xd7, 0x7f, 0x50, 0x42, 0xf3, 0xaa, 0xbe, 0x1f, + 0xc3, 0x4f, 0x2d, 0xad, 0x7a, 0xde, 0x10, 0xff, 0x39, 0xf8, 0xe2, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x20, 0xcd, 0x9e, 0x3a, 0x27, 0x11, 0x00, 0x00, } From 293fd7882112e414cf7cae02810aca516c7febb7 Mon Sep 17 00:00:00 2001 From: Yusuke KUOKA Date: Fri, 5 Apr 2019 20:50:27 +0900 Subject: [PATCH 430/483] feat: make tiller probeAddr configurable As many people have requested and discussed in #3159. The variable name are kept the same as before. Corresponding command-line flag is named, and description are written, after the existing flag for gRPC. The scope of this change is intentionally limited to the minimum. That is, I have not yet added `--probe=false`, because it shouldn't be a blocker if we can change the port number. Signed-off-by: Yusuke KUOKA --- cmd/tiller/tiller.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index a1141b591f2..f3ba197b505 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -67,7 +67,6 @@ const ( storageConfigMap = "configmap" storageSecret = "secret" - probeAddr = ":44135" traceAddr = ":44136" // defaultMaxHistory sets the maximum number of releases to 0: unlimited @@ -76,6 +75,7 @@ const ( var ( grpcAddr = flag.String("listen", ":44134", "address:port to listen on") + probeAddr = flag.String("probe-listen", ":44135", "address:port to listen on for probes") enableTracing = flag.Bool("trace", false, "enable rpc tracing") store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', or 'secret'") remoteReleaseModules = flag.Bool("experimental-release", false, "enable experimental release modules") @@ -187,7 +187,7 @@ func start() { logger.Printf("Starting Tiller %s (tls=%t)", version.GetVersion(), *tlsEnable || *tlsVerify) logger.Printf("GRPC listening on %s", *grpcAddr) - logger.Printf("Probes listening on %s", probeAddr) + logger.Printf("Probes listening on %s", *probeAddr) logger.Printf("Storage driver is %s", env.Releases.Name()) logger.Printf("Max history per release is %d", *maxHistory) @@ -213,7 +213,7 @@ func start() { goprom.Register(rootServer) addPrometheusHandler(mux) - if err := http.ListenAndServe(probeAddr, mux); err != nil { + if err := http.ListenAndServe(*probeAddr, mux); err != nil { probeErrCh <- err } }() From 2aa41559524f6d170a131eab251735b51fbc452c Mon Sep 17 00:00:00 2001 From: Kenta Iso Date: Sun, 7 Apr 2019 16:10:34 +0900 Subject: [PATCH 431/483] Fix 'THE INCLUDE FUNCTION' in 'Developing Templates' output Signed-off-by: Kenta Iso --- docs/chart_template_guide/named_templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chart_template_guide/named_templates.md b/docs/chart_template_guide/named_templates.md index 08e41d58d65..630b98c34f5 100644 --- a/docs/chart_template_guide/named_templates.md +++ b/docs/chart_template_guide/named_templates.md @@ -215,7 +215,7 @@ data: myvalue: "Hello World" drink: "coffee" food: "pizza" - app_name: mychart +app_name: mychart app_version: "0.1.0+1478129847" ``` From ae48e53e29fcc4703cbe761de01dcf52ffc36a2a Mon Sep 17 00:00:00 2001 From: ialidzhikov Date: Mon, 8 Apr 2019 18:34:54 +0300 Subject: [PATCH 432/483] Update golang version Signed-off-by: ialidzhikov --- .circleci/config.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7bba262a84d..09d49fb8906 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: working_directory: /go/src/k8s.io/helm parallelism: 3 docker: - - image: golang:1.12.1 + - image: golang:1.12.2 environment: PROJECT_NAME: "kubernetes-helm" steps: diff --git a/Makefile b/Makefile index 3584521a4cf..719fd5f0376 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm -DEV_IMAGE ?= golang:1.12.1 +DEV_IMAGE ?= golang:1.12.2 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 From b72265b4f3c539bf543eddfb7ef02c78a1fe8671 Mon Sep 17 00:00:00 2001 From: SataQiu Date: Tue, 9 Apr 2019 18:35:04 +0800 Subject: [PATCH 433/483] refactor: use const code block Signed-off-by: SataQiu --- cmd/helm/search/search.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/helm/search/search.go b/cmd/helm/search/search.go index 04acb869087..a9d0616e951 100644 --- a/cmd/helm/search/search.go +++ b/cmd/helm/search/search.go @@ -33,6 +33,12 @@ import ( "k8s.io/helm/pkg/repo" ) +const ( + sep = "\v" + // verSep is a separator for version fields in map keys. + verSep = "$$" +) + // Result is a search result. // // Score indicates how close it is to match. The higher the score, the longer @@ -49,16 +55,11 @@ type Index struct { charts map[string]*repo.ChartVersion } -const sep = "\v" - // NewIndex creats a new Index. func NewIndex() *Index { return &Index{lines: map[string]string{}, charts: map[string]*repo.ChartVersion{}} } -// verSep is a separator for version fields in map keys. -const verSep = "$$" - // AddRepo adds a repository index to the search index. func (i *Index) AddRepo(rname string, ind *repo.IndexFile, all bool) { ind.SortEntries() From 32d7f1a3fc226c1745a58b51e318b7362bc7a0bf Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Tue, 9 Apr 2019 17:37:51 -0700 Subject: [PATCH 434/483] fix(helm): Fix manifest validation Manifest validation is done by the builder, but it requires that the schema is set before the Stream function is called. Otherwise the StreamVisitor is created without a schema and no validation is done. Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 4568dd34b0c..e1101667deb 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -142,8 +142,8 @@ func (c *Client) BuildUnstructured(namespace string, reader io.Reader) (Result, ContinueOnError(). NamespaceParam(namespace). DefaultNamespace(). - Stream(reader, ""). Schema(c.validator()). + Stream(reader, ""). Flatten(). Do().Infos() return result, scrubValidationError(err) From f506db4b752c5901e13abab84cb431d0cb1937f4 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Wed, 10 Apr 2019 17:08:14 +0300 Subject: [PATCH 435/483] Add --cleanup-on-fail support into --atomic: use CleanupOnFail param in rollback Signed-off-by: Timofey Kirillov --- cmd/helm/upgrade.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 2446f3eb5a1..f07a5c4a730 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -283,17 +283,18 @@ func (u *upgradeCmd) run() error { if u.atomic { fmt.Fprint(u.out, "ROLLING BACK") rollback := &rollbackCmd{ - out: u.out, - client: u.client, - name: u.release, - dryRun: u.dryRun, - recreate: u.recreate, - force: u.force, - timeout: u.timeout, - wait: u.wait, - description: "", - revision: releaseHistory.Releases[0].Version, - disableHooks: u.disableHooks, + out: u.out, + client: u.client, + name: u.release, + dryRun: u.dryRun, + recreate: u.recreate, + force: u.force, + timeout: u.timeout, + wait: u.wait, + description: "", + revision: releaseHistory.Releases[0].Version, + disableHooks: u.disableHooks, + cleanupOnFail: u.cleanupOnFail, } if err := rollback.run(); err != nil { return err From eb457460b14aa18d09ee57c4f971d93cd0352bc5 Mon Sep 17 00:00:00 2001 From: xichengliudui <1693291525@qq.com> Date: Wed, 10 Apr 2019 16:07:09 -0400 Subject: [PATCH 436/483] Using const() defines constants together Signed-off-by: xichengliudui <1693291525@qq.com> --- cmd/helm/inspect.go | 13 ++++++------- pkg/hooks/hooks.go | 16 ++++++++-------- pkg/lint/lint_test.go | 15 ++++++++------- pkg/lint/rules/template_test.go | 9 +++++---- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/cmd/helm/inspect.go b/cmd/helm/inspect.go index 52e681e4813..9330b900f2a 100644 --- a/cmd/helm/inspect.go +++ b/cmd/helm/inspect.go @@ -27,27 +27,26 @@ import ( "k8s.io/helm/pkg/chartutil" ) -const inspectDesc = ` +const ( + inspectDesc = ` This command inspects a chart and displays information. It takes a chart reference ('stable/drupal'), a full path to a directory or packaged chart, or a URL. Inspect prints the contents of the Chart.yaml file and the values.yaml file. ` - -const inspectValuesDesc = ` + inspectValuesDesc = ` This command inspects a chart (directory, file, or URL) and displays the contents of the values.yaml file ` - -const inspectChartDesc = ` + inspectChartDesc = ` This command inspects a chart (directory, file, or URL) and displays the contents of the Charts.yaml file ` - -const readmeChartDesc = ` + readmeChartDesc = ` This command inspects a chart (directory, file, or URL) and displays the contents of the README file ` +) type inspectCmd struct { chartpath string diff --git a/pkg/hooks/hooks.go b/pkg/hooks/hooks.go index 5083672cda8..13a09b08b90 100644 --- a/pkg/hooks/hooks.go +++ b/pkg/hooks/hooks.go @@ -20,14 +20,14 @@ import ( "k8s.io/helm/pkg/proto/hapi/release" ) -// HookAnno is the label name for a hook -const HookAnno = "helm.sh/hook" - -// HookWeightAnno is the label name for a hook weight -const HookWeightAnno = "helm.sh/hook-weight" - -// HookDeleteAnno is the label name for the delete policy for a hook -const HookDeleteAnno = "helm.sh/hook-delete-policy" +const ( + // HookAnno is the label name for a hook + HookAnno = "helm.sh/hook" + // HookWeightAnno is the label name for a hook weight + HookWeightAnno = "helm.sh/hook-weight" + // HookDeleteAnno is the label name for the delete policy for a hook + HookDeleteAnno = "helm.sh/hook-delete-policy" +) // Types of hooks const ( diff --git a/pkg/lint/lint_test.go b/pkg/lint/lint_test.go index 84dfbf508af..8bf5a09274c 100644 --- a/pkg/lint/lint_test.go +++ b/pkg/lint/lint_test.go @@ -26,13 +26,14 @@ import ( var values = []byte{} -const namespace = "testNamespace" -const strict = false - -const badChartDir = "rules/testdata/badchartfile" -const badValuesFileDir = "rules/testdata/badvaluesfile" -const badYamlFileDir = "rules/testdata/albatross" -const goodChartDir = "rules/testdata/goodone" +const ( + namespace = "testNamespace" + strict = false + badChartDir = "rules/testdata/badchartfile" + badValuesFileDir = "rules/testdata/badvaluesfile" + badYamlFileDir = "rules/testdata/albatross" + goodChartDir = "rules/testdata/goodone" +) func TestBadChart(t *testing.T) { m := All(badChartDir, values, namespace, strict).Messages diff --git a/pkg/lint/rules/template_test.go b/pkg/lint/rules/template_test.go index 41a7384e73f..a294d3c573e 100644 --- a/pkg/lint/rules/template_test.go +++ b/pkg/lint/rules/template_test.go @@ -25,7 +25,11 @@ import ( "k8s.io/helm/pkg/lint/support" ) -const templateTestBasedir = "./testdata/albatross" +const ( + strict = false + namespace = "testNamespace" + templateTestBasedir = "./testdata/albatross" +) func TestValidateAllowedExtension(t *testing.T) { var failTest = []string{"/foo", "/test.toml"} @@ -46,9 +50,6 @@ func TestValidateAllowedExtension(t *testing.T) { var values = []byte("nameOverride: ''\nhttpPort: 80") -const namespace = "testNamespace" -const strict = false - func TestTemplateParsing(t *testing.T) { linter := support.Linter{ChartDir: templateTestBasedir} Templates(&linter, values, namespace, strict) From 165e071d4a299f4dc4b84319b16eff057210ebd4 Mon Sep 17 00:00:00 2001 From: xichengliudui <1693291525@qq.com> Date: Thu, 11 Apr 2019 06:45:45 -0400 Subject: [PATCH 437/483] Using const() defines constants together (part:2) Signed-off-by: xichengliudui <1693291525@qq.com> update pull request Signed-off-by: xichengliudui <1693291525@qq.com> --- pkg/helm/fake_test.go | 6 ++++-- pkg/releasetesting/test_suite_test.go | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/helm/fake_test.go b/pkg/helm/fake_test.go index ecb0a28555f..4376742d7b0 100644 --- a/pkg/helm/fake_test.go +++ b/pkg/helm/fake_test.go @@ -26,7 +26,8 @@ import ( rls "k8s.io/helm/pkg/proto/hapi/services" ) -const cmInputTemplate = `kind: ConfigMap +const ( + cmInputTemplate = `kind: ConfigMap apiVersion: v1 metadata: name: example @@ -34,7 +35,7 @@ data: Release: {{.Release | toYaml | indent 4}} ` -const cmOutputTemplate = ` + cmOutputTemplate = ` --- # Source: installChart/templates/cm.yaml kind: ConfigMap @@ -53,6 +54,7 @@ data: seconds: 242085845 ` +) var installChart *chart.Chart diff --git a/pkg/releasetesting/test_suite_test.go b/pkg/releasetesting/test_suite_test.go index 59f12295307..7b856ac3973 100644 --- a/pkg/releasetesting/test_suite_test.go +++ b/pkg/releasetesting/test_suite_test.go @@ -37,7 +37,8 @@ import ( tillerEnv "k8s.io/helm/pkg/tiller/environment" ) -const manifestWithTestSuccessHook = ` +const ( + manifestWithTestSuccessHook = ` apiVersion: v1 kind: Pod metadata: @@ -51,7 +52,7 @@ spec: cmd: fake-command ` -const manifestWithTestFailureHook = ` + manifestWithTestFailureHook = ` apiVersion: v1 kind: Pod metadata: @@ -64,7 +65,7 @@ spec: image: fake-gold-finding-image cmd: fake-gold-finding-command ` -const manifestWithInstallHooks = `apiVersion: v1 + manifestWithInstallHooks = `apiVersion: v1 kind: ConfigMap metadata: name: test-cm @@ -73,6 +74,7 @@ metadata: data: name: value ` +) func TestNewTestSuite(t *testing.T) { rel := releaseStub() From 5edb79df4ce8ff2c59bc0b9ee7885c8fcb1a5a86 Mon Sep 17 00:00:00 2001 From: xichengliudui <1693291525@qq.com> Date: Thu, 11 Apr 2019 06:39:52 -0400 Subject: [PATCH 438/483] Using const() defines constants together (part:1) Signed-off-by: xichengliudui <1693291525@qq.com> update pull request Signed-off-by: xichengliudui <1693291525@qq.com> update pull request Signed-off-by: xichengliudui <1693291525@qq.com> --- pkg/kube/resource_policy.go | 20 +++++++++++--------- pkg/lint/rules/template_test.go | 9 +++++---- pkg/tiller/environment/environment.go | 10 ++++++---- pkg/tiller/release_server.go | 26 ++++++++++++++------------ 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/pkg/kube/resource_policy.go b/pkg/kube/resource_policy.go index 9bce63a7c48..3029a22a59c 100644 --- a/pkg/kube/resource_policy.go +++ b/pkg/kube/resource_policy.go @@ -16,16 +16,18 @@ limitations under the License. package kube -// ResourcePolicyAnno is the annotation name for a resource policy -const ResourcePolicyAnno = "helm.sh/resource-policy" +const ( + // ResourcePolicyAnno is the annotation name for a resource policy + ResourcePolicyAnno = "helm.sh/resource-policy" -// deletePolicy is the resource policy type for delete -// -// This resource policy type allows explicitly opting in to the default -// resource deletion behavior, for example when overriding a chart's -// default annotations. Any other value allows resources to skip being -// deleted during an uninstallRelease action. -const deletePolicy = "delete" + // deletePolicy is the resource policy type for delete + // + // This resource policy type allows explicitly opting in to the default + // resource deletion behavior, for example when overriding a chart's + // default annotations. Any other value allows resources to skip being + // deleted during an uninstallRelease action. + deletePolicy = "delete" +) // ResourcePolicyIsKeep accepts a map of Kubernetes resource annotations and // returns true if the resource should be kept, otherwise false if it is safe diff --git a/pkg/lint/rules/template_test.go b/pkg/lint/rules/template_test.go index 41a7384e73f..a294d3c573e 100644 --- a/pkg/lint/rules/template_test.go +++ b/pkg/lint/rules/template_test.go @@ -25,7 +25,11 @@ import ( "k8s.io/helm/pkg/lint/support" ) -const templateTestBasedir = "./testdata/albatross" +const ( + strict = false + namespace = "testNamespace" + templateTestBasedir = "./testdata/albatross" +) func TestValidateAllowedExtension(t *testing.T) { var failTest = []string{"/foo", "/test.toml"} @@ -46,9 +50,6 @@ func TestValidateAllowedExtension(t *testing.T) { var values = []byte("nameOverride: ''\nhttpPort: 80") -const namespace = "testNamespace" -const strict = false - func TestTemplateParsing(t *testing.T) { linter := support.Linter{ChartDir: templateTestBasedir} Templates(&linter, values, namespace, strict) diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 1325130eeaa..11860a249a3 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -37,11 +37,13 @@ import ( "k8s.io/helm/pkg/storage/driver" ) -// DefaultTillerNamespace is the default namespace for Tiller. -const DefaultTillerNamespace = "kube-system" +const ( + // DefaultTillerNamespace is the default namespace for Tiller. + DefaultTillerNamespace = "kube-system" -// GoTplEngine is the name of the Go template engine, as registered in the EngineYard. -const GoTplEngine = "gotpl" + // GoTplEngine is the name of the Go template engine, as registered in the EngineYard. + GoTplEngine = "gotpl" +) // DefaultEngine points to the engine that the EngineYard should treat as the // default. A chart that does not specify an engine may be run through the diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index d32fd82f66f..d3f69012fb0 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -40,18 +40,20 @@ import ( "k8s.io/helm/pkg/version" ) -// releaseNameMaxLen is the maximum length of a release name. -// -// As of Kubernetes 1.4, the max limit on a name is 63 chars. We reserve 10 for -// charts to add data. Effectively, that gives us 53 chars. -// See https://github.com/kubernetes/helm/issues/1528 -const releaseNameMaxLen = 53 - -// NOTESFILE_SUFFIX that we want to treat special. It goes through the templating engine -// but it's not a yaml file (resource) hence can't have hooks, etc. And the user actually -// wants to see this file after rendering in the status command. However, it must be a suffix -// since there can be filepath in front of it. -const notesFileSuffix = "NOTES.txt" +const ( + // releaseNameMaxLen is the maximum length of a release name. + // + // As of Kubernetes 1.4, the max limit on a name is 63 chars. We reserve 10 for + // charts to add data. Effectively, that gives us 53 chars. + // See https://github.com/kubernetes/helm/issues/1528 + releaseNameMaxLen = 53 + + // NOTESFILE_SUFFIX that we want to treat special. It goes through the templating engine + // but it's not a yaml file (resource) hence can't have hooks, etc. And the user actually + // wants to see this file after rendering in the status command. However, it must be a suffix + // since there can be filepath in front of it. + notesFileSuffix = "NOTES.txt" +) var ( // errMissingChart indicates that a chart was not provided. From 43c4378444995b45b1b6d5a8c6024e7cc652096f Mon Sep 17 00:00:00 2001 From: SataQiu Date: Fri, 12 Apr 2019 16:34:17 +0800 Subject: [PATCH 439/483] cleanup: using const block Signed-off-by: SataQiu --- cmd/helm/installer/options.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/helm/installer/options.go b/cmd/helm/installer/options.go index 186286ec229..00cadac073c 100644 --- a/cmd/helm/installer/options.go +++ b/cmd/helm/installer/options.go @@ -24,7 +24,12 @@ import ( "k8s.io/helm/pkg/version" ) -const defaultImage = "gcr.io/kubernetes-helm/tiller" +const ( + defaultImage = "gcr.io/kubernetes-helm/tiller" + + fmtJSON OutputFormat = "json" + fmtYAML OutputFormat = "yaml" +) // Options control how to install Tiller into a cluster, upgrade, and uninstall Tiller from a cluster. type Options struct { @@ -154,11 +159,6 @@ func (f *OutputFormat) Type() string { return "OutputFormat" } -const ( - fmtJSON OutputFormat = "json" - fmtYAML OutputFormat = "yaml" -) - // Set validates and sets the value of the OutputFormat func (f *OutputFormat) Set(s string) error { for _, of := range []OutputFormat{fmtJSON, fmtYAML} { From 3b3406a20dafb3d151b49341cd993942bffa6386 Mon Sep 17 00:00:00 2001 From: dieutth Date: Tue, 16 Apr 2019 13:32:24 +0200 Subject: [PATCH 440/483] Update install.md *From Script* should be in the same level as other *Installing the Helm Client* options. Signed-off-by: Dieu Tran --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index b9626a43a60..ab8268bcdc0 100755 --- a/docs/install.md +++ b/docs/install.md @@ -60,7 +60,7 @@ The binary can also be installed via [`scoop`](https://scoop.sh) command-line in scoop install helm ``` -## From Script +### From Script Helm now has an installer script that will automatically grab the latest version of the Helm client and [install it locally](https://raw.githubusercontent.com/helm/helm/master/scripts/get). From 9bc1f1c16e27f6bdc2d57ab66b7a6877d3137478 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Tue, 16 Apr 2019 12:59:49 -0700 Subject: [PATCH 441/483] chore(OWNERS): Add hickeyma to OWNERS Signed-off-by: Adam Reese --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 39f8c844837..d1c2b4259f4 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,7 @@ maintainers: - adamreese - bacongobbler + - hickeyma - jascott1 - mattfarina - michelleN From 26bce22e3bab0aef0c6ed4bbd94d0496628a7944 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Tue, 16 Apr 2019 15:42:16 -0700 Subject: [PATCH 442/483] chore: bump up the dependencies of kubernetes and prometheus client Signed-off-by: Tariq Ibrahim --- glide.lock | 23 +++++++++++++---------- glide.yaml | 14 +++++++------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/glide.lock b/glide.lock index eedbd9381c7..5d4a6a9f84e 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 9a8f0b6c906f605bb879fbcdf0c122096f7698fe6a975ec4e6648f2ee85fce3e -updated: 2019-03-26T10:33:38.977361532-07:00 +hash: d92d7faee5c7ecbb241dadcd993e5dd8dfba226739d20d97fabf23168613f3ac +updated: 2019-04-16T15:32:58.609105-07:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -212,9 +212,10 @@ imports: - name: github.com/pkg/errors version: 645ef00459ed84a119197bfb8d8205042c6df63d - name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 + version: 505eaef017263e299324067d40ca2c48f6a2cf50 subpackages: - prometheus + - prometheus/internal - prometheus/promhttp - name: github.com/prometheus/client_model version: fa8ad6fec33561be4280a8f0514318c79d7f6cb6 @@ -376,7 +377,7 @@ imports: - name: gopkg.in/yaml.v2 version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 - name: k8s.io/api - version: 40a48860b5abbba9aa891b02b32da429b08d96a0 + version: 6e4e0e4f393bf5e8bbff570acd13217aa5a770cd subpackages: - admission/v1beta1 - admissionregistration/v1beta1 @@ -417,11 +418,13 @@ imports: - storage/v1alpha1 - storage/v1beta1 - name: k8s.io/apiextensions-apiserver - version: 53c4693659ed354d76121458fb819202dd1635fa + version: 727a075fdec8319bf095330e344b3ccc668abc73 subpackages: + - pkg/apis/apiextensions + - pkg/apis/apiextensions/v1beta1 - pkg/features - name: k8s.io/apimachinery - version: d7deff9243b165ee192f5551710ea4285dcfd615 + version: 6a84e37a896db9780c75367af8d2ed2bb944022e subpackages: - pkg/api/equality - pkg/api/errors @@ -477,7 +480,7 @@ imports: - third_party/forked/golang/netutil - third_party/forked/golang/reflect - name: k8s.io/apiserver - version: 8b27c41bdbb11ff103caa673315e097bf0289171 + version: 1ec86e4da56ce0573788fc12bb3a5530600c0e5d subpackages: - pkg/authentication/authenticator - pkg/authentication/serviceaccount @@ -485,7 +488,7 @@ imports: - pkg/features - pkg/util/feature - name: k8s.io/cli-runtime - version: 2899ed30580fdbc8286718edb4382b529463099d + version: d644b00f3b79346b7627329269bb25f2135f941c subpackages: - pkg/genericclioptions - pkg/kustomize @@ -500,7 +503,7 @@ imports: - pkg/printers - pkg/resource - name: k8s.io/client-go - version: 6ee68ca5fd8355d024d02f9db0b3b667e8357a0f + version: 1a26190bd76a9017e289958b9fba936430aa3704 subpackages: - discovery - discovery/cached/disk @@ -644,7 +647,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: b805719a99126e54bcbc0a3d9ee8a45cd7e85632 + version: 3c949c7d419670cd99fe92f60e6f4d251898bdf2 subpackages: - pkg/api/legacyscheme - pkg/api/service diff --git a/glide.yaml b/glide.yaml index 8600ed0ac38..19024aecfa8 100644 --- a/glide.yaml +++ b/glide.yaml @@ -48,22 +48,22 @@ import: - package: github.com/BurntSushi/toml version: ~0.3.0 - package: github.com/prometheus/client_golang - version: 0.8.0 + version: 0.9.2 - package: github.com/grpc-ecosystem/go-grpc-prometheus - package: k8s.io/kubernetes version: release-1.14 - package: k8s.io/client-go - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: k8s.io/api - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: k8s.io/apimachinery - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: k8s.io/apiserver - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: k8s.io/cli-runtime - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: k8s.io/apiextensions-apiserver - version: kubernetes-1.14.0 + version: kubernetes-1.14.1 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 From bb4f1ebea1077a2572a65d942c5d40339b46aabb Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Wed, 17 Apr 2019 09:48:11 -0400 Subject: [PATCH 443/483] Moving nebril to emeritus status due to inactivity Note, he has been emailed regarding the move including an offer to re-engage. He has not taken this up. The governance has a 3 months of inactivity clause that causes maintainers to fall off. This period has been long exceeded per metrics measured in devstats. Signed-off-by: Matt Farina --- OWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OWNERS b/OWNERS index d1c2b4259f4..df847ab37a5 100644 --- a/OWNERS +++ b/OWNERS @@ -5,7 +5,6 @@ maintainers: - jascott1 - mattfarina - michelleN - - nebril - prydonius - SlickNik - technosophos @@ -27,6 +26,7 @@ reviewers: - viglesiasce emeritus: - migmartri + - nebril - seh - vaikas-google - rimusz From e48a3be64af498c2a8891ca9244741f5ea1d26cc Mon Sep 17 00:00:00 2001 From: SataQiu Date: Thu, 18 Apr 2019 10:51:34 +0800 Subject: [PATCH 444/483] define port 44134 as a constant Signed-off-by: SataQiu --- cmd/helm/installer/install.go | 5 +++-- cmd/tiller/tiller.go | 2 +- pkg/helm/portforwarder/portforwarder.go | 4 ++-- pkg/tiller/environment/environment.go | 3 +++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index d6d24eec476..04f9f9b19a0 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -36,6 +36,7 @@ import ( "k8s.io/helm/pkg/version" "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/tiller/environment" ) // Install uses Kubernetes client to install Tiller. @@ -226,7 +227,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Image: opts.SelectImage(), ImagePullPolicy: opts.pullPolicy(), Ports: []v1.ContainerPort{ - {ContainerPort: 44134, Name: "tiller"}, + {ContainerPort: environment.DefaultTillerPort, Name: "tiller"}, {ContainerPort: 44135, Name: "http"}, }, Env: []v1.EnvVar{ @@ -341,7 +342,7 @@ func generateService(namespace string) *v1.Service { Ports: []v1.ServicePort{ { Name: "tiller", - Port: 44134, + Port: environment.DefaultTillerPort, TargetPort: intstr.FromString("tiller"), }, }, diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index f3ba197b505..f961d687183 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -74,7 +74,7 @@ const ( ) var ( - grpcAddr = flag.String("listen", ":44134", "address:port to listen on") + grpcAddr = flag.String("listen", fmt.Sprintf(":%v", environment.DefaultTillerPort), "address:port to listen on") probeAddr = flag.String("probe-listen", ":44135", "address:port to listen on for probes") enableTracing = flag.Bool("trace", false, "enable rpc tracing") store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', or 'secret'") diff --git a/pkg/helm/portforwarder/portforwarder.go b/pkg/helm/portforwarder/portforwarder.go index e962eef7fa9..0b04478f513 100644 --- a/pkg/helm/portforwarder/portforwarder.go +++ b/pkg/helm/portforwarder/portforwarder.go @@ -27,6 +27,7 @@ import ( "k8s.io/client-go/rest" "k8s.io/helm/pkg/kube" + "k8s.io/helm/pkg/tiller/environment" ) var ( @@ -39,8 +40,7 @@ func New(namespace string, client kubernetes.Interface, config *rest.Config) (*k if err != nil { return nil, err } - const tillerPort = 44134 - t := kube.NewTunnel(client.CoreV1().RESTClient(), config, namespace, podName, tillerPort) + t := kube.NewTunnel(client.CoreV1().RESTClient(), config, namespace, podName, environment.DefaultTillerPort) return t, t.ForwardPort() } diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 28d4843a35e..b237c53ccc7 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -41,6 +41,9 @@ const ( // DefaultTillerNamespace is the default namespace for Tiller. DefaultTillerNamespace = "kube-system" + // DefaultTillerPort defines the default port tiller listen on for client traffic + DefaultTillerPort = 44134 + // GoTplEngine is the name of the Go template engine, as registered in the EngineYard. GoTplEngine = "gotpl" ) From 06fbc720e775b1ec4fe8db47d98fc404fdbaad52 Mon Sep 17 00:00:00 2001 From: SataQiu Date: Thu, 18 Apr 2019 14:14:32 +0800 Subject: [PATCH 445/483] refactor: using tiller probe port constant Signed-off-by: SataQiu --- cmd/helm/installer/install.go | 6 +++--- cmd/tiller/tiller.go | 2 +- pkg/tiller/environment/environment.go | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go index 04f9f9b19a0..5c3369c7d48 100644 --- a/cmd/helm/installer/install.go +++ b/cmd/helm/installer/install.go @@ -228,7 +228,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { ImagePullPolicy: opts.pullPolicy(), Ports: []v1.ContainerPort{ {ContainerPort: environment.DefaultTillerPort, Name: "tiller"}, - {ContainerPort: 44135, Name: "http"}, + {ContainerPort: environment.DefaultTillerProbePort, Name: "http"}, }, Env: []v1.EnvVar{ {Name: "TILLER_NAMESPACE", Value: opts.Namespace}, @@ -238,7 +238,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ Path: "/liveness", - Port: intstr.FromInt(44135), + Port: intstr.FromInt(environment.DefaultTillerProbePort), }, }, InitialDelaySeconds: 1, @@ -248,7 +248,7 @@ func generateDeployment(opts *Options) (*v1beta1.Deployment, error) { Handler: v1.Handler{ HTTPGet: &v1.HTTPGetAction{ Path: "/readiness", - Port: intstr.FromInt(44135), + Port: intstr.FromInt(environment.DefaultTillerProbePort), }, }, InitialDelaySeconds: 1, diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index f961d687183..ba26cc238d1 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -75,7 +75,7 @@ const ( var ( grpcAddr = flag.String("listen", fmt.Sprintf(":%v", environment.DefaultTillerPort), "address:port to listen on") - probeAddr = flag.String("probe-listen", ":44135", "address:port to listen on for probes") + probeAddr = flag.String("probe-listen", fmt.Sprintf(":%v", environment.DefaultTillerProbePort), "address:port to listen on for probes") enableTracing = flag.Bool("trace", false, "enable rpc tracing") store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', or 'secret'") remoteReleaseModules = flag.Bool("experimental-release", false, "enable experimental release modules") diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index b237c53ccc7..21c23d42162 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -44,6 +44,9 @@ const ( // DefaultTillerPort defines the default port tiller listen on for client traffic DefaultTillerPort = 44134 + // DefaultTillerProbePort defines the default port to listen on for probes + DefaultTillerProbePort = 44135 + // GoTplEngine is the name of the Go template engine, as registered in the EngineYard. GoTplEngine = "gotpl" ) From d0f12eae210d20bd18723f88455fd44eb3fa2ffa Mon Sep 17 00:00:00 2001 From: Alan Carson Date: Fri, 19 Apr 2019 12:50:41 +0100 Subject: [PATCH 446/483] Added Cloudsmith to Additional Tools Hi! This PR adds a link to [Cloudsmith](https://cloudsmith.io), which is a package management service SaaS. It's commercial, but it's completely free for open-source and it has generous free tiers otherwise. It has first-class support for Helm (and many other package formats, such as npm, Docker etc), plus org/teams management, granular access controls, private repositories, repository-specific entitlements, a worldwide content distribution network, webhooks, access logs, etc. Thank you. :) Full disclosure: I work at Cloudsmith. \o/ Signed-off-by: Alan Carson --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index a8e49417240..3f8c73d4aee 100644 --- a/docs/related.md +++ b/docs/related.md @@ -68,6 +68,7 @@ Tools layered on top of Helm or Tiller. - [Armada](https://github.com/att-comdev/armada) - Manage prefixed releases throughout various Kubernetes namespaces, and removes completed jobs for complex deployments. Used by the [Openstack-Helm](https://github.com/openstack/openstack-helm) team. - [ChartMuseum](https://github.com/chartmuseum/chartmuseum) - Helm Chart Repository with support for Amazon S3 and Google Cloud Storage - [Chartify](https://github.com/appscode/chartify) - Generate Helm charts from existing Kubernetes resources. +- [Cloudsmith](https://cloudsmith.io/l/helm-repository/) - Fully managed SaaS offering private Helm Chart Repositories - [Codefresh](https://codefresh.io) - Kubernetes native CI/CD and management platform with UI dashboards for managing Helm charts and releases - [Cog](https://github.com/ohaiwalt/cog-helm) - Helm chart to deploy Cog on Kubernetes - [Drone.io Helm Plugin](http://plugins.drone.io/ipedrazas/drone-helm/) - Run Helm inside of the Drone CI/CD system From f602c2328d8de5b2f466f56a95d1b371ab2de3bf Mon Sep 17 00:00:00 2001 From: Evan Vetere Date: Fri, 19 Apr 2019 18:35:28 -0400 Subject: [PATCH 447/483] tone down the enthusiasm fix for unit tests Signed-off-by: Evan Vetere --- cmd/helm/init.go | 1 - cmd/helm/repo_update.go | 2 +- cmd/helm/rollback.go | 2 +- cmd/helm/rollback_test.go | 8 ++++---- cmd/helm/upgrade.go | 2 +- cmd/helm/upgrade_test.go | 20 ++++++++++---------- docs/charts.md | 2 +- docs/rbac.md | 1 - docs/using_helm.md | 2 +- pkg/downloader/manager.go | 2 +- 10 files changed, 20 insertions(+), 22 deletions(-) diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 682189f84f0..145abdc8765 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -310,7 +310,6 @@ func (i *initCmd) run() error { "$ helm init --tiller-image gcr.io/kubernetes-helm/tiller:v2.8.2\n\n") } - fmt.Fprintln(i.out, "Happy Helming!") return nil } diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 2628b7f2f7c..592ad4b7d9b 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -125,6 +125,6 @@ func updateCharts(repos []*repo.ChartRepository, out io.Writer, home helmpath.Ho return errors.New("Update Failed. Check log for details") } - fmt.Fprintln(out, "Update Complete. ⎈ Happy Helming! ⎈") + fmt.Fprintln(out, "Update Complete.") return nil } diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 4cffd43d530..95a2b2c8c89 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -112,7 +112,7 @@ func (r *rollbackCmd) run() error { return prettyError(err) } - fmt.Fprintf(r.out, "Rollback was a success! Happy Helming!\n") + fmt.Fprintf(r.out, "Rollback was a success.\n") return nil } diff --git a/cmd/helm/rollback_test.go b/cmd/helm/rollback_test.go index a98a4096af0..5d97dca4bc9 100644 --- a/cmd/helm/rollback_test.go +++ b/cmd/helm/rollback_test.go @@ -31,25 +31,25 @@ func TestRollbackCmd(t *testing.T) { { name: "rollback a release", args: []string{"funny-honey", "1"}, - expected: "Rollback was a success! Happy Helming!", + expected: "Rollback was a success.", }, { name: "rollback a release with timeout", args: []string{"funny-honey", "1"}, flags: []string{"--timeout", "120"}, - expected: "Rollback was a success! Happy Helming!", + expected: "Rollback was a success.", }, { name: "rollback a release with wait", args: []string{"funny-honey", "1"}, flags: []string{"--wait"}, - expected: "Rollback was a success! Happy Helming!", + expected: "Rollback was a success.", }, { name: "rollback a release with description", args: []string{"funny-honey", "1"}, flags: []string{"--description", "foo"}, - expected: "Rollback was a success! Happy Helming!", + expected: "Rollback was a success.", }, { name: "rollback a release without revision", diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index f07a5c4a730..683b1f54de8 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -307,7 +307,7 @@ func (u *upgradeCmd) run() error { printRelease(u.out, resp.Release) } - fmt.Fprintf(u.out, "Release %q has been upgraded. Happy Helming!\n", u.release) + fmt.Fprintf(u.out, "Release %q has been upgraded.\n", u.release) // Print the status like status command does status, err := u.client.ReleaseStatus(u.release) diff --git a/cmd/helm/upgrade_test.go b/cmd/helm/upgrade_test.go index c2b1b4ea6ed..433f3bd2ca6 100644 --- a/cmd/helm/upgrade_test.go +++ b/cmd/helm/upgrade_test.go @@ -96,7 +96,7 @@ func TestUpgradeCmd(t *testing.T) { name: "upgrade a release", args: []string{"funny-bunny", chartPath}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 2, Chart: ch}), - expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"funny-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 2, Chart: ch})}, }, { @@ -104,7 +104,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"funny-bunny", chartPath}, flags: []string{"--timeout", "120"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 3, Chart: ch2}), - expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"funny-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 3, Chart: ch2})}, }, { @@ -112,7 +112,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"funny-bunny", chartPath}, flags: []string{"--reset-values", "true"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 4, Chart: ch2}), - expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"funny-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 4, Chart: ch2})}, }, { @@ -120,7 +120,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"funny-bunny", chartPath}, flags: []string{"--reuse-values", "true"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 5, Chart: ch2}), - expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"funny-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 5, Chart: ch2})}, }, { @@ -128,7 +128,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"funny-bunny", chartPath}, flags: []string{"--atomic"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 6, Chart: ch}), - expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"funny-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "funny-bunny", Version: 6, Chart: ch})}, }, { @@ -136,7 +136,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"zany-bunny", chartPath}, flags: []string{"-i"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "zany-bunny", Version: 1, Chart: ch}), - expected: "Release \"zany-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"zany-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "zany-bunny", Version: 1, Chart: ch})}, }, { @@ -144,7 +144,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"crazy-bunny", chartPath}, flags: []string{"-i", "--timeout", "120"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch}), - expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"crazy-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch})}, }, { @@ -152,7 +152,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"crazy-bunny", chartPath}, flags: []string{"-i", "--description", "foo"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch, Description: "foo"}), - expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"crazy-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 1, Chart: ch, Description: "foo"})}, }, { @@ -160,7 +160,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"crazy-bunny", chartPath}, flags: []string{"--wait"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2}), - expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"crazy-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2})}, }, { @@ -168,7 +168,7 @@ func TestUpgradeCmd(t *testing.T) { args: []string{"crazy-bunny", chartPath}, flags: []string{"--description", "foo"}, resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2}), - expected: "Release \"crazy-bunny\" has been upgraded. Happy Helming!\n", + expected: "Release \"crazy-bunny\" has been upgraded.\n", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "crazy-bunny", Version: 2, Chart: ch2, Description: "foo"})}, }, { diff --git a/docs/charts.md b/docs/charts.md index 6137898c2ab..ed2e2f9eb33 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -191,7 +191,7 @@ Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository ...Successfully got an update from the "example" chart repository ...Successfully got an update from the "another" chart repository -Update Complete. Happy Helming! +Update Complete. Saving 2 charts Downloading apache from repo http://example.com/charts Downloading mysql from repo http://another.example.com/charts diff --git a/docs/rbac.md b/docs/rbac.md index d53edda49dc..9d4531ffe0b 100644 --- a/docs/rbac.md +++ b/docs/rbac.md @@ -106,7 +106,6 @@ $ helm init --service-account tiller --tiller-namespace tiller-world $HELM_HOME has been configured at /Users/awesome-user/.helm. Tiller (the Helm server side component) has been installed into your Kubernetes Cluster. -Happy Helming! $ helm install nginx --tiller-namespace tiller-world --namespace tiller-world NAME: wayfaring-yak diff --git a/docs/using_helm.md b/docs/using_helm.md index faf3cc20fdb..ad693472e76 100755 --- a/docs/using_helm.md +++ b/docs/using_helm.md @@ -359,7 +359,7 @@ update things that have changed since the last release. ```console $ helm upgrade -f panda.yaml happy-panda stable/mariadb Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/k8s.io/helm/mariadb-0.3.0.tgz -happy-panda has been upgraded. Happy Helming! +happy-panda has been upgraded. Last Deployed: Wed Sep 28 12:47:54 2016 Namespace: default Status: DEPLOYED diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 372940880b2..970bd9546db 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -465,7 +465,7 @@ func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error { }(r) } wg.Wait() - fmt.Fprintln(out, "Update Complete. ⎈Happy Helming!⎈") + fmt.Fprintln(out, "Update Complete.") return nil } From 290a9fca18de9defeb3bff9e728bb1f603a8269a Mon Sep 17 00:00:00 2001 From: Panic Stevenson Date: Sat, 20 Apr 2019 18:22:21 -0500 Subject: [PATCH 448/483] Update hapi.version Description in Protobuf README Signed-off-by: Panic Stevenson --- _proto/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_proto/README.md b/_proto/README.md index 7704572ebd5..f43c1e11e5c 100644 --- a/_proto/README.md +++ b/_proto/README.md @@ -7,4 +7,4 @@ Packages - `hapi.release` Information about installed charts (Releases) such as metadata about when they were installed, their status, and how they were configured. - `hapi.services.rudder` Definition for the ReleaseModuleService used by Tiller to manipulate releases on a given node - `hapi.services.tiller` Definition of the ReleaseService provided by Tiller and used by Helm clients to manipulate releases cluster wide. - - `hapi.version` Version meta-data used by tiller to express it's version + - `hapi.version` Version metadata used by Tiller to express its version From a602d70842e63f761e13777095b89edb163367e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Lafarge?= Date: Wed, 27 Feb 2019 14:30:12 +0100 Subject: [PATCH 449/483] [storage] Add an SQL storage driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commits adds the possibility to back Tiller (or the future Tiller-less Helm CLI) with any SQL database (only postgres has been tested so far) to store release information. The main motivation for this commit was to use a storage backend that would allow releases larger that 1MB in size (ConfigMap or Secret drivers don't, because of limits on value size in the underlying etcd key-value store). Signed-off-by: Étienne Lafarge Co-authored-by: Elliot Maincourt (@emaincourt) Co-authored-by: Paul Borensztein (@commit-master) --- cmd/tiller/tiller.go | 40 +++- docs/install.md | 34 +++- docs/sql-storage.md | 89 +++++++++ glide.lock | 16 ++ glide.yaml | 19 +- pkg/storage/driver/mock_test.go | 16 ++ pkg/storage/driver/sql.go | 322 ++++++++++++++++++++++++++++++ pkg/storage/driver/sql_test.go | 344 ++++++++++++++++++++++++++++++++ 8 files changed, 858 insertions(+), 22 deletions(-) create mode 100644 docs/sql-storage.md create mode 100644 pkg/storage/driver/sql.go create mode 100644 pkg/storage/driver/sql_test.go diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index ba26cc238d1..a2ef2764b99 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -66,6 +66,7 @@ const ( storageMemory = "memory" storageConfigMap = "configmap" storageSecret = "secret" + storageSQL = "sql" traceAddr = ":44136" @@ -74,18 +75,23 @@ const ( ) var ( - grpcAddr = flag.String("listen", fmt.Sprintf(":%v", environment.DefaultTillerPort), "address:port to listen on") - probeAddr = flag.String("probe-listen", fmt.Sprintf(":%v", environment.DefaultTillerProbePort), "address:port to listen on for probes") - enableTracing = flag.Bool("trace", false, "enable rpc tracing") - store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', or 'secret'") + grpcAddr = flag.String("listen", fmt.Sprintf(":%v", environment.DefaultTillerPort), "address:port to listen on") + probeAddr = flag.String("probe-listen", fmt.Sprintf(":%v", environment.DefaultTillerProbePort), "address:port to listen on for probes") + enableTracing = flag.Bool("trace", false, "enable rpc tracing") + store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', 'sql' or 'secret'") + + sqlDialect = flag.String("sql-dialect", "postgres", "SQL dialect to use (only postgres is supported for now") + sqlConnectionString = flag.String("sql-connection-string", "", "SQL connection string to use") + remoteReleaseModules = flag.Bool("experimental-release", false, "enable experimental release modules") - tlsEnable = flag.Bool("tls", tlsEnableEnvVarDefault(), "enable TLS") - tlsVerify = flag.Bool("tls-verify", tlsVerifyEnvVarDefault(), "enable TLS and verify remote certificate") - keyFile = flag.String("tls-key", tlsDefaultsFromEnv("tls-key"), "path to TLS private key file") - certFile = flag.String("tls-cert", tlsDefaultsFromEnv("tls-cert"), "path to TLS certificate file") - caCertFile = flag.String("tls-ca-cert", tlsDefaultsFromEnv("tls-ca-cert"), "trust certificates signed by this CA") - maxHistory = flag.Int("history-max", historyMaxFromEnv(), "maximum number of releases kept in release history, with 0 meaning no limit") - printVersion = flag.Bool("version", false, "print the version number") + + tlsEnable = flag.Bool("tls", tlsEnableEnvVarDefault(), "enable TLS") + tlsVerify = flag.Bool("tls-verify", tlsVerifyEnvVarDefault(), "enable TLS and verify remote certificate") + keyFile = flag.String("tls-key", tlsDefaultsFromEnv("tls-key"), "path to TLS private key file") + certFile = flag.String("tls-cert", tlsDefaultsFromEnv("tls-cert"), "path to TLS certificate file") + caCertFile = flag.String("tls-ca-cert", tlsDefaultsFromEnv("tls-ca-cert"), "trust certificates signed by this CA") + maxHistory = flag.Int("history-max", historyMaxFromEnv(), "maximum number of releases kept in release history, with 0 meaning no limit") + printVersion = flag.Bool("version", false, "print the version number") // rootServer is the root gRPC server. // @@ -143,6 +149,18 @@ func start() { env.Releases = storage.Init(secrets) env.Releases.Log = newLogger("storage").Printf + case storageSQL: + sqlDriver, err := driver.NewSQL( + *sqlDialect, + *sqlConnectionString, + newLogger("storage/driver").Printf, + ) + if err != nil { + logger.Fatalf("Cannot initialize SQL storage driver: %v", err) + } + + env.Releases = storage.Init(sqlDriver) + env.Releases.Log = newLogger("storage").Printf } if *maxHistory > 0 { diff --git a/docs/install.md b/docs/install.md index ab8268bcdc0..9a3bc33f05b 100755 --- a/docs/install.md +++ b/docs/install.md @@ -353,10 +353,13 @@ in JSON format. ### Storage backends By default, `tiller` stores release information in `ConfigMaps` in the namespace -where it is running. As of Helm 2.7.0, there is now a beta storage backend that +where it is running. + +#### Secret storage backend +As of Helm 2.7.0, there is now a beta storage backend that uses `Secrets` for storing release information. This was added for additional -security in protecting charts in conjunction with the release of `Secret` -encryption in Kubernetes. +security in protecting charts in conjunction with the release of `Secret` +encryption in Kubernetes. To enable the secrets backend, you'll need to init Tiller with the following options: @@ -369,6 +372,31 @@ Currently, if you want to switch from the default backend to the secrets backend, you'll have to do the migration for this on your own. When this backend graduates from beta, there will be a more official path of migration +#### SQL storage backend +As of Helm 2.14.0 there is now a beta SQL storage backend that stores release +information in an SQL database (only postgres has been tested so far). + +Using such a storage backend is particularly useful if your release information +weighs more than 1MB (in which case, it can't be stored in ConfigMaps/Secrets +because of internal limits in Kubernetes' underlying etcd key-value store). + +To enable the SQL backend, you'll need to [deploy an SQL +database](./sql-storage.md) and init Tiller with the following options: + +```shell +helm init \ + --override \ + 'spec.template.spec.containers[0].args'='{--storage=sql,--sql-dialect=postgres,--sql-connection-string=postgresql://tiller-postgres:5432/helm?user=helm&password=changemeforgodssake&sslmode=disable}' +``` + +**PRODUCTION NOTES**: it's recommended to change the username and password of +the SQL database in production deployments. Enabling SSL is also a good idea. +Last, but not least, perform regular backups/snapshots of your SQL database. + +Currently, if you want to switch from the default backend to the SQL backend, +you'll have to do the migration for this on your own. When this backend +graduates from beta, there will be a more official migration path. + ## Conclusion In most cases, installation is as simple as getting a pre-built `helm` binary diff --git a/docs/sql-storage.md b/docs/sql-storage.md new file mode 100644 index 00000000000..19f7a5eb127 --- /dev/null +++ b/docs/sql-storage.md @@ -0,0 +1,89 @@ +# Store release information in an SQL database + +You may be willing to store release information in an SQL database - in +particular, if your releases weigh more than 1MB and therefore [can't be stored in ConfigMaps or Secrets](https://github.com/helm/helm/issues/1413). + +We recommend using [PostgreSQL](https://www.postgresql.org/). + +This document describes how to deploy `postgres` atop Kubernetes. This being +said, using an out-of-cluster (managed or not) PostreSQL instance is totally +possible as well. + +Here's a Kubernetes manifest you can apply to get a minimal PostreSQL pod +running on your Kubernetes cluster. **Don't forget to change the credentials +and, optionally, enable TLS in production deployments**. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: tiller-postgres + namespace: kube-system +spec: + ports: + - port: 5432 + selector: + app: helm + name: postgres +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: tiller-postgres + namespace: kube-system +spec: + serviceName: tiller-postgres + selector: + matchLabels: + app: helm + name: postgres + replicas: 1 + template: + metadata: + labels: + app: helm + name: postgres + spec: + containers: + - name: postgres + image: postgres:11-alpine + imagePullPolicy: Always + ports: + - containerPort: 5432 + env: + - name: POSTGRES_DB + value: helm + - name: POSTGRES_USER + value: helm + - name: POSTGRES_PASSWORD + value: changemeforgodssake + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + resources: + limits: + memory: 128Mi + requests: + cpu: 50m + memory: 128Mi + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: tiller-postgres-data + volumeClaimTemplates: + - metadata: + name: tiller-postgres-data + spec: + accessModes: ["ReadWriteOnce"] + storageClassName: default + resources: + requests: + storage: 5Gi +``` + +Once postgres is deployed, you'll need to install Tiller using `helm init`, with +a few custom CLI flags: + +```shell +helm init \ + --override \ + 'spec.template.spec.containers[0].args'='{--storage=sql,--sql-dialect=postgres,--sql-connection-string=postgresql://tiller-postgres:5432/helm?user=helm&password=changemeforgodssake&sslmode=disable}' +``` diff --git a/glide.lock b/glide.lock index 5d4a6a9f84e..1a1649e804f 100644 --- a/glide.lock +++ b/glide.lock @@ -173,10 +173,18 @@ imports: version: 9316a62528ac99aaecb4e47eadd6dc8aa6533d58 - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 +- name: github.com/jmoiron/sqlx + version: d161d7a76b5661016ad0b085869f77fd410f3e6a + subpackages: + - reflectx - name: github.com/json-iterator/go version: ab8a2e0c74be9d3be70b3184d9acc634935ded82 - name: github.com/liggitt/tabwriter version: 89fcab3d43de07060e4fd4c1547430ed57e87f24 +- name: github.com/lib/pq + version: 88edab0803230a3898347e77b474f8c1820a1f20 + subpackages: + - oid - name: github.com/mailru/easyjson version: 2f5df55504ebc322e4d52d34df6a1f5b503bf26d subpackages: @@ -235,6 +243,10 @@ imports: version: 8a290539e2e8629dbc4e6bad948158f790ec31f4 - name: github.com/PuerkitoBio/urlesc version: 5bd2802263f21d8788851d5305584c82a5c75d7e +- name: github.com/rubenv/sql-migrate + version: 1007f53448d75fe14190968f5de4d95ed63ebb83 + subpackages: + - sqlparse - name: github.com/russross/blackfriday version: 300106c228d52c8941d4b3de6054a6062a86dda3 - name: github.com/shurcooL/sanitized_anchor_name @@ -366,6 +378,8 @@ imports: - stats - status - tap +- name: gopkg.in/gorp.v1 + version: 6a667da9c028871f98598d85413e3fc4c6daa52e - name: gopkg.in/inf.v0 version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4 - name: gopkg.in/square/go-jose.v2 @@ -807,6 +821,8 @@ imports: subpackages: - sortorder testImports: +- name: github.com/DATA-DOG/go-sqlmock + version: 472e287dbafe67e526a3797165b64cb14f34705a - name: github.com/pmezard/go-difflib version: 5d4384ee4fb2527b0a1256a821ebfc92f91efefc subpackages: diff --git a/glide.yaml b/glide.yaml index 19024aecfa8..5e6026077b4 100644 --- a/glide.yaml +++ b/glide.yaml @@ -2,11 +2,10 @@ package: k8s.io/helm import: - package: golang.org/x/net subpackages: - - context + - context - package: golang.org/x/sync subpackages: - semaphore - # This is temporary and can probably be removed the next time gRPC is updated - package: golang.org/x/sys version: b90733256f2e882e81d52f9126de08df5615afd9 subpackages: @@ -17,7 +16,6 @@ import: - package: github.com/spf13/pflag version: ~1.0.1 - package: github.com/Masterminds/vcs - # Pin version of mergo that is compatible with both sprig and Kubernetes - package: github.com/imdario/mergo version: v0.3.5 - package: github.com/Masterminds/sprig @@ -30,9 +28,9 @@ import: - package: github.com/golang/protobuf version: 1.2.0 subpackages: - - proto - - ptypes/any - - ptypes/timestamp + - proto + - ptypes/any + - ptypes/timestamp - package: google.golang.org/grpc version: 1.18.0 - package: github.com/gosuri/uitable @@ -40,8 +38,8 @@ import: version: ^4.0.0 - package: golang.org/x/crypto subpackages: - - openpgp - - ssh/terminal + - openpgp + - ssh/terminal - package: github.com/gobwas/glob version: ^0.2.1 - package: github.com/evanphx/json-patch @@ -66,9 +64,14 @@ import: version: kubernetes-1.14.1 - package: github.com/cyphar/filepath-securejoin version: ^0.2.1 + - package: github.com/jmoiron/sqlx + version: ^1.2.0 + - package: github.com/rubenv/sql-migrate testImports: - package: github.com/stretchr/testify version: ^1.1.4 subpackages: - assert + - package: github.com/DATA-DOG/go-sqlmock + version: ^1.3.2 diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 363d9dd5dc5..d012aaafe71 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -20,6 +20,8 @@ import ( "fmt" "testing" + sqlmock "github.com/DATA-DOG/go-sqlmock" + "github.com/jmoiron/sqlx" "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -221,3 +223,17 @@ func (mock *MockSecretsInterface) Delete(name string, opts *metav1.DeleteOptions delete(mock.objects, name) return nil } + +// newTestFixtureSQL mocks the SQL database (for testing purposes) +func newTestFixtureSQL(t *testing.T, releases ...*rspb.Release) (*SQL, sqlmock.Sqlmock) { + sqlDB, mock, err := sqlmock.New() + if err != nil { + t.Fatalf("error when opening stub database connection: %v", err) + } + + sqlxDB := sqlx.NewDb(sqlDB, "sqlmock") + return &SQL{ + db: sqlxDB, + Log: func(_ string, _ ...interface{}) {}, + }, mock +} diff --git a/pkg/storage/driver/sql.go b/pkg/storage/driver/sql.go new file mode 100644 index 00000000000..3b34385771c --- /dev/null +++ b/pkg/storage/driver/sql.go @@ -0,0 +1,322 @@ +/* +Copyright The Helm Authors. + +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 driver + +import ( + "fmt" + "sort" + "strings" + "time" + + "github.com/jmoiron/sqlx" + migrate "github.com/rubenv/sql-migrate" + + // Import pq for potgres dialect + _ "github.com/lib/pq" + + rspb "k8s.io/helm/pkg/proto/hapi/release" + storageerrors "k8s.io/helm/pkg/storage/errors" +) + +var _ Driver = (*SQL)(nil) + +var labelMap = map[string]string{ + "MODIFIED_AT": "modified_at", + "CREATED_AT": "created_at", + "VERSION": "version", + "STATUS": "status", + "OWNER": "owner", + "NAME": "name", +} + +// SQLDriverName is the string name of this driver. +const SQLDriverName = "SQL" + +// SQL is the sql storage driver implementation. +type SQL struct { + db *sqlx.DB + Log func(string, ...interface{}) +} + +// Name returns the name of the driver. +func (s *SQL) Name() string { + return SQLDriverName +} + +func (s *SQL) ensureDBSetup() error { + // Populate the database with the relations we need if they don't exist yet + migrations := &migrate.MemoryMigrationSource{ + Migrations: []*migrate.Migration{ + { + Id: "init", + Up: []string{ + ` + CREATE TABLE releases ( + key VARCHAR(67) PRIMARY KEY, + body TEXT NOT NULL, + + name VARCHAR(64) NOT NULL, + version INTEGER NOT NULL, + status TEXT NOT NULL, + owner TEXT NOT NULL, + created_at INTEGER NOT NULL, + modified_at INTEGER NOT NULL DEFAULT 0 + ); + + CREATE INDEX ON releases (key); + CREATE INDEX ON releases (version); + CREATE INDEX ON releases (status); + CREATE INDEX ON releases (owner); + CREATE INDEX ON releases (created_at); + CREATE INDEX ON releases (modified_at); + `, + }, + Down: []string{ + ` + DROP TABLE releases; + `, + }, + }, + }, + } + + _, err := migrate.Exec(s.db.DB, "postgres", migrations, migrate.Up) + return err +} + +// Release describes a Helm release +type Release struct { + Key string `db:"key"` + Body string `db:"body"` + + Name string `db:"name"` + Version int `db:"version"` + Status string `db:"status"` + Owner string `db:"owner"` + CreatedAt int `db:"created_at"` + ModifiedAt int `db:"modified_at"` +} + +// NewSQL initializes a new memory driver. +func NewSQL(dialect, connectionString string, logger func(string, ...interface{})) (*SQL, error) { + db, err := sqlx.Connect(dialect, connectionString) + if err != nil { + return nil, err + } + + driver := &SQL{ + db: db, + Log: logger, + } + + if err := driver.ensureDBSetup(); err != nil { + return nil, err + } + + return driver, nil +} + +// Get returns the release named by key. +func (s *SQL) Get(key string) (*rspb.Release, error) { + var record Release + // Get will return an error if the result is empty + err := s.db.Get(&record, "SELECT body FROM releases WHERE key = $1", key) + if err != nil { + s.Log("got SQL error when getting release %s: %v", key, err) + return nil, storageerrors.ErrReleaseNotFound(key) + } + + release, err := decodeRelease(record.Body) + if err != nil { + s.Log("get: failed to decode data %q: %v", key, err) + return nil, err + } + + return release, nil +} + +// List returns the list of all releases such that filter(release) == true +func (s *SQL) List(filter func(*rspb.Release) bool) ([]*rspb.Release, error) { + var records = []Release{} + if err := s.db.Select(&records, "SELECT body FROM releases WHERE owner = 'TILLER'"); err != nil { + s.Log("list: failed to list: %v", err) + return nil, err + } + + var releases []*rspb.Release + for _, record := range records { + release, err := decodeRelease(record.Body) + if err != nil { + s.Log("list: failed to decode release: %v: %v", record, err) + continue + } + if filter(release) { + releases = append(releases, release) + } + } + + return releases, nil +} + +// Query returns the set of releases that match the provided set of labels. +func (s *SQL) Query(labels map[string]string) ([]*rspb.Release, error) { + var sqlFilterKeys []string + sqlFilter := map[string]interface{}{} + for key, val := range labels { + // Build a slice of where filters e.g + // labels = map[string]string{ "foo": "foo", "bar": "bar" } + // []string{ "foo=?", "bar=?" } + if dbField, ok := labelMap[key]; ok { + sqlFilterKeys = append(sqlFilterKeys, strings.Join([]string{dbField, "=:", dbField}, "")) + sqlFilter[dbField] = val + } else { + s.Log("unknown label %s", key) + return nil, fmt.Errorf("unknow label %s", key) + } + } + sort.Strings(sqlFilterKeys) + + // Build our query + query := strings.Join([]string{ + "SELECT body FROM releases", + "WHERE", + strings.Join(sqlFilterKeys, " AND "), + }, " ") + + rows, err := s.db.NamedQuery(query, sqlFilter) + if err != nil { + s.Log("failed to query with labels: %v", err) + return nil, err + } + + var releases []*rspb.Release + for rows.Next() { + var record Release + if err = rows.StructScan(&record); err != nil { + s.Log("failed to scan record %q: %v", record, err) + return nil, err + } + + release, err := decodeRelease(record.Body) + if err != nil { + s.Log("failed to decode release: %v", err) + continue + } + releases = append(releases, release) + } + + if len(releases) == 0 { + return nil, storageerrors.ErrReleaseNotFound(labels["NAME"]) + } + + return releases, nil +} + +// Create creates a new release. +func (s *SQL) Create(key string, rls *rspb.Release) error { + body, err := encodeRelease(rls) + if err != nil { + s.Log("failed to encode release: %v", err) + return err + } + + transaction, err := s.db.Beginx() + if err != nil { + s.Log("failed to start SQL transaction: %v", err) + return fmt.Errorf("error beginning transaction: %v", err) + } + + if _, err := transaction.NamedExec("INSERT INTO releases (key, body, name, version, status, owner, created_at) VALUES (:key, :body, :name, :version, :status, :owner, :created_at)", + &Release{ + Key: key, + Body: body, + + Name: rls.Name, + Version: int(rls.Version), + Status: rspb.Status_Code_name[int32(rls.Info.Status.Code)], + Owner: "TILLER", + CreatedAt: int(time.Now().Unix()), + }, + ); err != nil { + defer transaction.Rollback() + var record Release + if err := transaction.Get(&record, "SELECT key FROM releases WHERE key = ?", key); err == nil { + s.Log("release %s already exists", key) + return storageerrors.ErrReleaseExists(key) + } + + s.Log("failed to store release %s in SQL database: %v", key, err) + return err + } + defer transaction.Commit() + + return nil +} + +// Update updates a release. +func (s *SQL) Update(key string, rls *rspb.Release) error { + body, err := encodeRelease(rls) + if err != nil { + s.Log("failed to encode release: %v", err) + return err + } + + if _, err := s.db.NamedExec("UPDATE releases SET body=:body, name=:name, version=:version, status=:status, owner=:owner, modified_at=:modified_at WHERE key=:key", + &Release{ + Key: key, + Body: body, + + Name: rls.Name, + Version: int(rls.Version), + Status: rspb.Status_Code_name[int32(rls.Info.Status.Code)], + Owner: "TILLER", + ModifiedAt: int(time.Now().Unix()), + }, + ); err != nil { + s.Log("failed to update release %s in SQL database: %v", key, err) + return err + } + + return nil +} + +// Delete deletes a release or returns ErrReleaseNotFound. +func (s *SQL) Delete(key string) (*rspb.Release, error) { + transaction, err := s.db.Beginx() + if err != nil { + s.Log("failed to start SQL transaction: %v", err) + return nil, fmt.Errorf("error beginning transaction: %v", err) + } + + var record Release + err = transaction.Get(&record, "SELECT body FROM releases WHERE key = $1", key) + if err != nil { + s.Log("release %s not found: %v", key, err) + return nil, storageerrors.ErrReleaseNotFound(key) + } + + release, err := decodeRelease(record.Body) + if err != nil { + s.Log("failed to decode release %s: %v", key, err) + transaction.Rollback() + return nil, err + } + defer transaction.Commit() + + _, err = transaction.Exec("DELETE FROM releases WHERE key = $1", key) + return release, err +} diff --git a/pkg/storage/driver/sql_test.go b/pkg/storage/driver/sql_test.go new file mode 100644 index 00000000000..4d669c1b591 --- /dev/null +++ b/pkg/storage/driver/sql_test.go @@ -0,0 +1,344 @@ +/* +Copyright The Helm Authors. + +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 driver + +import ( + "fmt" + "reflect" + "regexp" + "testing" + "time" + + sqlmock "github.com/DATA-DOG/go-sqlmock" + rspb "k8s.io/helm/pkg/proto/hapi/release" +) + +func TestSQLName(t *testing.T) { + sqlDriver, _ := newTestFixtureSQL(t) + if sqlDriver.Name() != SQLDriverName { + t.Errorf("Expected name to be %q, got %q", SQLDriverName, sqlDriver.Name()) + } +} + +func TestSQLGet(t *testing.T) { + vers := int32(1) + name := "smug-pigeon" + namespace := "default" + key := testKey(name, vers) + rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) + + body, _ := encodeRelease(rel) + + sqlDriver, mock := newTestFixtureSQL(t) + mock. + ExpectQuery("SELECT body FROM releases WHERE key = ?"). + WithArgs(key). + WillReturnRows( + mock.NewRows([]string{ + "body", + }).AddRow( + body, + ), + ).RowsWillBeClosed() + + got, err := sqlDriver.Get(key) + if err != nil { + t.Fatalf("Failed to get release: %v", err) + } + + if !reflect.DeepEqual(rel, got) { + t.Errorf("Expected release {%q}, got {%q}", rel, got) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSQLList(t *testing.T) { + body1, _ := encodeRelease(releaseStub("key-1", 1, "default", rspb.Status_DELETED)) + body2, _ := encodeRelease(releaseStub("key-2", 1, "default", rspb.Status_DELETED)) + body3, _ := encodeRelease(releaseStub("key-3", 1, "default", rspb.Status_DEPLOYED)) + body4, _ := encodeRelease(releaseStub("key-4", 1, "default", rspb.Status_DEPLOYED)) + body5, _ := encodeRelease(releaseStub("key-5", 1, "default", rspb.Status_SUPERSEDED)) + body6, _ := encodeRelease(releaseStub("key-6", 1, "default", rspb.Status_SUPERSEDED)) + + sqlDriver, mock := newTestFixtureSQL(t) + + for i := 0; i < 3; i++ { + mock. + ExpectQuery("SELECT body FROM releases WHERE owner = 'TILLER'"). + WillReturnRows( + mock.NewRows([]string{ + "body", + }). + AddRow(body1). + AddRow(body2). + AddRow(body3). + AddRow(body4). + AddRow(body5). + AddRow(body6), + ).RowsWillBeClosed() + } + + // list all deleted releases + del, err := sqlDriver.List(func(rel *rspb.Release) bool { + return rel.Info.Status.Code == rspb.Status_DELETED + }) + // check + if err != nil { + t.Errorf("Failed to list deleted: %v", err) + } + if len(del) != 2 { + t.Errorf("Expected 2 deleted, got %d:\n%v\n", len(del), del) + } + + // list all deployed releases + dpl, err := sqlDriver.List(func(rel *rspb.Release) bool { + return rel.Info.Status.Code == rspb.Status_DEPLOYED + }) + // check + if err != nil { + t.Errorf("Failed to list deployed: %v", err) + } + if len(dpl) != 2 { + t.Errorf("Expected 2 deployed, got %d:\n%v\n", len(dpl), dpl) + } + + // list all superseded releases + ssd, err := sqlDriver.List(func(rel *rspb.Release) bool { + return rel.Info.Status.Code == rspb.Status_SUPERSEDED + }) + // check + if err != nil { + t.Errorf("Failed to list superseded: %v", err) + } + if len(ssd) != 2 { + t.Errorf("Expected 2 superseded, got %d:\n%v\n", len(ssd), ssd) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSqlCreate(t *testing.T) { + vers := int32(1) + name := "smug-pigeon" + namespace := "default" + key := testKey(name, vers) + rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) + + sqlDriver, mock := newTestFixtureSQL(t) + body, _ := encodeRelease(rel) + + mock.ExpectBegin() + mock. + ExpectExec(regexp.QuoteMeta("INSERT INTO releases (key, body, name, version, status, owner, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)")). + WithArgs(key, body, rel.Name, int(rel.Version), rspb.Status_Code_name[int32(rel.Info.Status.Code)], "TILLER", int(time.Now().Unix())). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + + if err := sqlDriver.Create(key, rel); err != nil { + t.Fatalf("failed to create release with key %q: %v", key, err) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSqlCreateAlreadyExists(t *testing.T) { + vers := int32(1) + name := "smug-pigeon" + namespace := "default" + key := testKey(name, vers) + rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) + + sqlDriver, mock := newTestFixtureSQL(t) + body, _ := encodeRelease(rel) + + // Insert fails (primary key already exists) + mock.ExpectBegin() + mock. + ExpectExec(regexp.QuoteMeta("INSERT INTO releases (key, body, name, version, status, owner, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)")). + WithArgs(key, body, rel.Name, int(rel.Version), rspb.Status_Code_name[int32(rel.Info.Status.Code)], "TILLER", int(time.Now().Unix())). + WillReturnError(fmt.Errorf("dialect dependent SQL error")) + + // Let's check that we do make sure the error is due to a release already existing + mock. + ExpectQuery(regexp.QuoteMeta("SELECT key FROM releases WHERE key = ?")). + WithArgs(key). + WillReturnRows( + mock.NewRows([]string{ + "body", + }).AddRow( + body, + ), + ).RowsWillBeClosed() + mock.ExpectRollback() + + if err := sqlDriver.Create(key, rel); err == nil { + t.Fatalf("failed to create release with key %q: %v", key, err) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSqlUpdate(t *testing.T) { + vers := int32(1) + name := "smug-pigeon" + namespace := "default" + key := testKey(name, vers) + rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) + + sqlDriver, mock := newTestFixtureSQL(t) + body, _ := encodeRelease(rel) + + mock. + ExpectExec(regexp.QuoteMeta("UPDATE releases SET body=?, name=?, version=?, status=?, owner=?, modified_at=? WHERE key=?")). + WithArgs(body, rel.Name, int(rel.Version), rspb.Status_Code_name[int32(rel.Info.Status.Code)], "TILLER", int(time.Now().Unix()), key). + WillReturnResult(sqlmock.NewResult(0, 1)) + + if err := sqlDriver.Update(key, rel); err != nil { + t.Fatalf("failed to update release with key %q: %v", key, err) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSqlQuery(t *testing.T) { + // Reflect actual use cases in ../storage.go + labelSetDeployed := map[string]string{ + "NAME": "smug-pigeon", + "OWNER": "TILLER", + "STATUS": "DEPLOYED", + } + labelSetAll := map[string]string{ + "NAME": "smug-pigeon", + "OWNER": "TILLER", + } + + supersededRelease := releaseStub("smug-pigeon", 1, "default", rspb.Status_SUPERSEDED) + supersededReleaseBody, _ := encodeRelease(supersededRelease) + deployedRelease := releaseStub("smug-pigeon", 2, "default", rspb.Status_DEPLOYED) + deployedReleaseBody, _ := encodeRelease(deployedRelease) + + // Let's actually start our test + sqlDriver, mock := newTestFixtureSQL(t) + + mock. + ExpectQuery(regexp.QuoteMeta("SELECT body FROM releases WHERE name=? AND owner=? AND status=?")). + WithArgs("smug-pigeon", "TILLER", "DEPLOYED"). + WillReturnRows( + mock.NewRows([]string{ + "body", + }).AddRow( + deployedReleaseBody, + ), + ).RowsWillBeClosed() + + mock. + ExpectQuery(regexp.QuoteMeta("SELECT body FROM releases WHERE name=? AND owner=?")). + WithArgs("smug-pigeon", "TILLER"). + WillReturnRows( + mock.NewRows([]string{ + "body", + }).AddRow( + supersededReleaseBody, + ).AddRow( + deployedReleaseBody, + ), + ).RowsWillBeClosed() + + results, err := sqlDriver.Query(labelSetDeployed) + if err != nil { + t.Fatalf("failed to query for deployed smug-pigeon release: %v", err) + } + + for _, res := range results { + if !reflect.DeepEqual(res, deployedRelease) { + t.Errorf("Expected release {%q}, got {%q}", deployedRelease, res) + } + } + + results, err = sqlDriver.Query(labelSetAll) + if err != nil { + t.Fatalf("failed to query release history for smug-pigeon: %v", err) + } + + if len(results) != 2 { + t.Errorf("expected a resultset of size 2, got %d", len(results)) + } + + for _, res := range results { + if !reflect.DeepEqual(res, deployedRelease) && !reflect.DeepEqual(res, supersededRelease) { + t.Errorf("Expected release {%q} or {%q}, got {%q}", deployedRelease, supersededRelease, res) + } + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} + +func TestSqlDelete(t *testing.T) { + vers := int32(1) + name := "smug-pigeon" + namespace := "default" + key := testKey(name, vers) + rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) + + body, _ := encodeRelease(rel) + + sqlDriver, mock := newTestFixtureSQL(t) + + mock.ExpectBegin() + mock. + ExpectQuery("SELECT body FROM releases WHERE key = ?"). + WithArgs(key). + WillReturnRows( + mock.NewRows([]string{ + "body", + }).AddRow( + body, + ), + ).RowsWillBeClosed() + + mock. + ExpectExec(regexp.QuoteMeta("DELETE FROM releases WHERE key = $1")). + WithArgs(key). + WillReturnResult(sqlmock.NewResult(0, 1)) + mock.ExpectCommit() + + deletedRelease, err := sqlDriver.Delete(key) + if err != nil { + t.Fatalf("failed to delete release with key %q: %v", key, err) + } + + if !reflect.DeepEqual(rel, deletedRelease) { + t.Errorf("Expected release {%q}, got {%q}", rel, deletedRelease) + } + + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("sql expectations weren't met: %v", err) + } +} From 6c396880ade35ac6c47149bf2159e929de737423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Lafarge?= Date: Sat, 2 Mar 2019 11:56:40 +0100 Subject: [PATCH 450/483] [pr-review] Lighten docs & validate SQL dialect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Étienne Lafarge --- docs/install.md | 6 +-- docs/sql-storage.md | 89 --------------------------------------- pkg/storage/driver/sql.go | 8 ++++ 3 files changed, 11 insertions(+), 92 deletions(-) delete mode 100644 docs/sql-storage.md diff --git a/docs/install.md b/docs/install.md index 9a3bc33f05b..db653999505 100755 --- a/docs/install.md +++ b/docs/install.md @@ -380,13 +380,13 @@ Using such a storage backend is particularly useful if your release information weighs more than 1MB (in which case, it can't be stored in ConfigMaps/Secrets because of internal limits in Kubernetes' underlying etcd key-value store). -To enable the SQL backend, you'll need to [deploy an SQL -database](./sql-storage.md) and init Tiller with the following options: +To enable the SQL backend, you'll need to deploy a SQL database and init Tiller +with the following options: ```shell helm init \ --override \ - 'spec.template.spec.containers[0].args'='{--storage=sql,--sql-dialect=postgres,--sql-connection-string=postgresql://tiller-postgres:5432/helm?user=helm&password=changemeforgodssake&sslmode=disable}' + 'spec.template.spec.containers[0].args'='{--storage=sql,--sql-dialect=postgres,--sql-connection-string=postgresql://tiller-postgres:5432/helm?user=helm&password=changeme}' ``` **PRODUCTION NOTES**: it's recommended to change the username and password of diff --git a/docs/sql-storage.md b/docs/sql-storage.md deleted file mode 100644 index 19f7a5eb127..00000000000 --- a/docs/sql-storage.md +++ /dev/null @@ -1,89 +0,0 @@ -# Store release information in an SQL database - -You may be willing to store release information in an SQL database - in -particular, if your releases weigh more than 1MB and therefore [can't be stored in ConfigMaps or Secrets](https://github.com/helm/helm/issues/1413). - -We recommend using [PostgreSQL](https://www.postgresql.org/). - -This document describes how to deploy `postgres` atop Kubernetes. This being -said, using an out-of-cluster (managed or not) PostreSQL instance is totally -possible as well. - -Here's a Kubernetes manifest you can apply to get a minimal PostreSQL pod -running on your Kubernetes cluster. **Don't forget to change the credentials -and, optionally, enable TLS in production deployments**. - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: tiller-postgres - namespace: kube-system -spec: - ports: - - port: 5432 - selector: - app: helm - name: postgres ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: tiller-postgres - namespace: kube-system -spec: - serviceName: tiller-postgres - selector: - matchLabels: - app: helm - name: postgres - replicas: 1 - template: - metadata: - labels: - app: helm - name: postgres - spec: - containers: - - name: postgres - image: postgres:11-alpine - imagePullPolicy: Always - ports: - - containerPort: 5432 - env: - - name: POSTGRES_DB - value: helm - - name: POSTGRES_USER - value: helm - - name: POSTGRES_PASSWORD - value: changemeforgodssake - - name: PGDATA - value: /var/lib/postgresql/data/pgdata - resources: - limits: - memory: 128Mi - requests: - cpu: 50m - memory: 128Mi - volumeMounts: - - mountPath: /var/lib/postgresql/data - name: tiller-postgres-data - volumeClaimTemplates: - - metadata: - name: tiller-postgres-data - spec: - accessModes: ["ReadWriteOnce"] - storageClassName: default - resources: - requests: - storage: 5Gi -``` - -Once postgres is deployed, you'll need to install Tiller using `helm init`, with -a few custom CLI flags: - -```shell -helm init \ - --override \ - 'spec.template.spec.containers[0].args'='{--storage=sql,--sql-dialect=postgres,--sql-connection-string=postgresql://tiller-postgres:5432/helm?user=helm&password=changemeforgodssake&sslmode=disable}' -``` diff --git a/pkg/storage/driver/sql.go b/pkg/storage/driver/sql.go index 3b34385771c..7849f84b454 100644 --- a/pkg/storage/driver/sql.go +++ b/pkg/storage/driver/sql.go @@ -43,6 +43,10 @@ var labelMap = map[string]string{ "NAME": "name", } +var supportedSQLDialects = map[string]struct{}{ + "postgres": struct{}{}, +} + // SQLDriverName is the string name of this driver. const SQLDriverName = "SQL" @@ -113,6 +117,10 @@ type Release struct { // NewSQL initializes a new memory driver. func NewSQL(dialect, connectionString string, logger func(string, ...interface{})) (*SQL, error) { + if _, ok := supportedSQLDialects[dialect]; !ok { + return nil, fmt.Errorf("%s dialect isn't supported, only \"postgres\" is available for now", dialect) + } + db, err := sqlx.Connect(dialect, connectionString) if err != nil { return nil, err From 13e82d2039a9d69978fa80135e3c76ae734a821a Mon Sep 17 00:00:00 2001 From: Elliot Maincourt Date: Mon, 4 Mar 2019 18:14:41 +0100 Subject: [PATCH 451/483] Clarify our SQL Release binding struct naming and purpose Signed-off-by: Elliot Maincourt --- pkg/storage/driver/sql.go | 68 +++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/pkg/storage/driver/sql.go b/pkg/storage/driver/sql.go index 7849f84b454..d3d49ee22e8 100644 --- a/pkg/storage/driver/sql.go +++ b/pkg/storage/driver/sql.go @@ -69,30 +69,30 @@ func (s *SQL) ensureDBSetup() error { Id: "init", Up: []string{ ` - CREATE TABLE releases ( - key VARCHAR(67) PRIMARY KEY, - body TEXT NOT NULL, - - name VARCHAR(64) NOT NULL, - version INTEGER NOT NULL, - status TEXT NOT NULL, - owner TEXT NOT NULL, - created_at INTEGER NOT NULL, - modified_at INTEGER NOT NULL DEFAULT 0 - ); - - CREATE INDEX ON releases (key); - CREATE INDEX ON releases (version); - CREATE INDEX ON releases (status); - CREATE INDEX ON releases (owner); - CREATE INDEX ON releases (created_at); - CREATE INDEX ON releases (modified_at); - `, + CREATE TABLE releases ( + key VARCHAR(67) PRIMARY KEY, + body TEXT NOT NULL, + + name VARCHAR(64) NOT NULL, + version INTEGER NOT NULL, + status TEXT NOT NULL, + owner TEXT NOT NULL, + created_at INTEGER NOT NULL, + modified_at INTEGER NOT NULL DEFAULT 0 + ); + + CREATE INDEX ON releases (key); + CREATE INDEX ON releases (version); + CREATE INDEX ON releases (status); + CREATE INDEX ON releases (owner); + CREATE INDEX ON releases (created_at); + CREATE INDEX ON releases (modified_at); + `, }, Down: []string{ ` - DROP TABLE releases; - `, + DROP TABLE releases; + `, }, }, }, @@ -102,11 +102,17 @@ func (s *SQL) ensureDBSetup() error { return err } -// Release describes a Helm release -type Release struct { - Key string `db:"key"` +// SQLReleaseWrapper describes how Helm releases are stored in an SQL database +type SQLReleaseWrapper struct { + // The primary key, made of {release-name}.{release-version} + Key string `db:"key"` + + // The rspb.Release body, as a base64-encoded string Body string `db:"body"` + // Release "labels" that can be used as filters in the storage.Query(labels map[string]string) + // we implemented. Note that allowing Helm users to filter against new dimensions will require a + // new migration to be added, and the Create and/or update functions to be updated accordingly. Name string `db:"name"` Version int `db:"version"` Status string `db:"status"` @@ -140,7 +146,7 @@ func NewSQL(dialect, connectionString string, logger func(string, ...interface{} // Get returns the release named by key. func (s *SQL) Get(key string) (*rspb.Release, error) { - var record Release + var record SQLReleaseWrapper // Get will return an error if the result is empty err := s.db.Get(&record, "SELECT body FROM releases WHERE key = $1", key) if err != nil { @@ -159,7 +165,7 @@ func (s *SQL) Get(key string) (*rspb.Release, error) { // List returns the list of all releases such that filter(release) == true func (s *SQL) List(filter func(*rspb.Release) bool) ([]*rspb.Release, error) { - var records = []Release{} + var records = []SQLReleaseWrapper{} if err := s.db.Select(&records, "SELECT body FROM releases WHERE owner = 'TILLER'"); err != nil { s.Log("list: failed to list: %v", err) return nil, err @@ -213,7 +219,7 @@ func (s *SQL) Query(labels map[string]string) ([]*rspb.Release, error) { var releases []*rspb.Release for rows.Next() { - var record Release + var record SQLReleaseWrapper if err = rows.StructScan(&record); err != nil { s.Log("failed to scan record %q: %v", record, err) return nil, err @@ -249,7 +255,7 @@ func (s *SQL) Create(key string, rls *rspb.Release) error { } if _, err := transaction.NamedExec("INSERT INTO releases (key, body, name, version, status, owner, created_at) VALUES (:key, :body, :name, :version, :status, :owner, :created_at)", - &Release{ + &SQLReleaseWrapper{ Key: key, Body: body, @@ -261,7 +267,7 @@ func (s *SQL) Create(key string, rls *rspb.Release) error { }, ); err != nil { defer transaction.Rollback() - var record Release + var record SQLReleaseWrapper if err := transaction.Get(&record, "SELECT key FROM releases WHERE key = ?", key); err == nil { s.Log("release %s already exists", key) return storageerrors.ErrReleaseExists(key) @@ -284,7 +290,7 @@ func (s *SQL) Update(key string, rls *rspb.Release) error { } if _, err := s.db.NamedExec("UPDATE releases SET body=:body, name=:name, version=:version, status=:status, owner=:owner, modified_at=:modified_at WHERE key=:key", - &Release{ + &SQLReleaseWrapper{ Key: key, Body: body, @@ -310,7 +316,7 @@ func (s *SQL) Delete(key string) (*rspb.Release, error) { return nil, fmt.Errorf("error beginning transaction: %v", err) } - var record Release + var record SQLReleaseWrapper err = transaction.Get(&record, "SELECT body FROM releases WHERE key = $1", key) if err != nil { s.Log("release %s not found: %v", key, err) From f4052821c9b89eac9412f1f77b0242879d0400d8 Mon Sep 17 00:00:00 2001 From: Elliot Maincourt Date: Tue, 5 Mar 2019 12:17:32 +0100 Subject: [PATCH 452/483] Fix formatting issue Signed-off-by: Elliot Maincourt --- pkg/storage/driver/sql.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/storage/driver/sql.go b/pkg/storage/driver/sql.go index d3d49ee22e8..46bcccc32f1 100644 --- a/pkg/storage/driver/sql.go +++ b/pkg/storage/driver/sql.go @@ -44,7 +44,7 @@ var labelMap = map[string]string{ } var supportedSQLDialects = map[string]struct{}{ - "postgres": struct{}{}, + "postgres": {}, } // SQLDriverName is the string name of this driver. From 8bc521fd545fc2d43742ba1e602e8ee9165517e2 Mon Sep 17 00:00:00 2001 From: Duffie Cooley Date: Fri, 19 Apr 2019 16:27:34 -0700 Subject: [PATCH 453/483] Updating to use git.io short url I've added an alias to git.io the github url shortening service from git.io/get_helm.sh -> https://raw.githubusercontent.com/helm/helm/master/scripts/get Like this: ``` $ curl -i https://git.io/ -F url=https://raw.githubusercontent.com/helm/helm/master/scripts/get -F code=get_helm.sh HTTP/1.1 201 Created Server: Cowboy Connection: keep-alive Date: Fri, 19 Apr 2019 23:20:39 GMT Status: 201 Created Content-Type: text/html;charset=utf-8 Location: https://git.io/get_helm.sh Content-Length: 62 X-Xss-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Runtime: 0.008310 X-Node: f065811c-e0e8-4384-bf09-9d9d28586c4d X-Revision: 392798d237fc1aa5cd55cada10d2945773e741a8 Strict-Transport-Security: max-age=31536000; includeSubDomains Via: 1.1 vegur ``` I think it's a little easier to remember and use. There is also no way to overwrite or modify alias. Once it's there it's there in perpetuity. Thanks! Signed-off-by: Duffie Cooley --- docs/install.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/install.md b/docs/install.md index ab8268bcdc0..985189b851e 100755 --- a/docs/install.md +++ b/docs/install.md @@ -63,18 +63,18 @@ scoop install helm ### From Script Helm now has an installer script that will automatically grab the latest version -of the Helm client and [install it locally](https://raw.githubusercontent.com/helm/helm/master/scripts/get). +of the Helm client and [install it locally](https://git.io/get_helm.sh). You can fetch that script, and then execute it locally. It's well documented so that you can read through it and understand what it is doing before you run it. ``` -$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh +$ curl -LO https://git.io/get_helm.sh $ chmod 700 get_helm.sh $ ./get_helm.sh ``` -Yes, you can `curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash` that if you want to live on the edge. +Yes, you can `curl -L https://git.io/get_helm.sh | bash` that if you want to live on the edge. ### From Canary Builds From 792af434e6f71d70a752f2fbed9e4550b69eb937 Mon Sep 17 00:00:00 2001 From: Jintao Zhang Date: Tue, 23 Apr 2019 16:49:06 +0800 Subject: [PATCH 454/483] ref(rootfs): remove useless action. Signed-off-by: Jintao Zhang --- rootfs/Dockerfile | 5 ++--- rootfs/Dockerfile.experimental | 5 ++--- rootfs/Dockerfile.rudder | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index f918c4d5198..2aa775a55a7 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.7 +FROM alpine:3.9 -RUN apk update && apk add ca-certificates socat && rm -rf /var/cache/apk/* +RUN apk add --no-cache ca-certificates socat ENV HOME /tmp @@ -24,4 +24,3 @@ COPY tiller /tiller EXPOSE 44134 USER 65534 ENTRYPOINT ["/tiller"] - diff --git a/rootfs/Dockerfile.experimental b/rootfs/Dockerfile.experimental index 61e49ab675b..9c1cab1265a 100644 --- a/rootfs/Dockerfile.experimental +++ b/rootfs/Dockerfile.experimental @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.7 +FROM alpine:3.9 -RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* +RUN apk add --no-cache ca-certificates ENV HOME /tmp @@ -23,4 +23,3 @@ COPY tiller /tiller EXPOSE 44134 USER 65534 ENTRYPOINT ["/tiller", "--experimental-release"] - diff --git a/rootfs/Dockerfile.rudder b/rootfs/Dockerfile.rudder index 61afb8af8b3..87efba401ab 100644 --- a/rootfs/Dockerfile.rudder +++ b/rootfs/Dockerfile.rudder @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM alpine:3.3 +FROM alpine:3.9 -RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* +RUN apk add --no-cache ca-certificates ENV HOME /tmp From 77185d31a95e5e66bb65a082ab0ed5cbf27a6192 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 12 Apr 2019 11:52:32 +0100 Subject: [PATCH 455/483] Fix reset force which hangs Tiller pod removed Closes #5592 Signed-off-by: Martin Hickey --- cmd/helm/reset.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/helm/reset.go b/cmd/helm/reset.go index 887ce34d0a7..8093d3e6985 100644 --- a/cmd/helm/reset.go +++ b/cmd/helm/reset.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "os" + "strings" "github.com/spf13/cobra" @@ -59,7 +60,11 @@ func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { Short: "uninstalls Tiller from a cluster", Long: resetDesc, PreRunE: func(cmd *cobra.Command, args []string) error { - if err := setupConnection(); !d.force && err != nil { + err := setupConnection() + if !d.force && err != nil { + return err + } + if d.force && err != nil && strings.EqualFold(err.Error(), "could not find tiller") { return err } return nil From 0270f2e2b5d75439d8c835969ec8d8d80bb55bcf Mon Sep 17 00:00:00 2001 From: Luis Davim Date: Wed, 6 Mar 2019 12:45:57 +0000 Subject: [PATCH 456/483] Reduce template code duplication. Fixes #5372 Signed-off-by: Luis Davim --- .../testdata/testcharts/alpine/Chart.yaml | 1 + .../testdata/testcharts/novals/Chart.yaml | 1 + .../prerelease/templates/alpine-pod.yaml | 1 - docs/chart_template_guide/variables.md | 3 +- .../examples/alpine/templates/alpine-pod.yaml | 2 +- docs/examples/nginx/templates/configmap.yaml | 1 - docs/examples/nginx/templates/deployment.yaml | 1 - .../nginx/templates/post-install-job.yaml | 1 - .../nginx/templates/pre-install-secret.yaml | 1 - .../nginx/templates/service-test.yaml | 1 - docs/examples/nginx/templates/service.yaml | 1 - pkg/chartutil/create.go | 37 +++++++++---------- .../testdata/albatross/templates/svc.yaml | 1 - 13 files changed, 22 insertions(+), 30 deletions(-) diff --git a/cmd/helm/testdata/testcharts/alpine/Chart.yaml b/cmd/helm/testdata/testcharts/alpine/Chart.yaml index fea865aa55d..feaa1d78fa2 100644 --- a/cmd/helm/testdata/testcharts/alpine/Chart.yaml +++ b/cmd/helm/testdata/testcharts/alpine/Chart.yaml @@ -1,3 +1,4 @@ +appVersion: "3.3" description: Deploy a basic Alpine Linux pod home: https://k8s.io/helm name: alpine diff --git a/cmd/helm/testdata/testcharts/novals/Chart.yaml b/cmd/helm/testdata/testcharts/novals/Chart.yaml index 85f7a5d8332..a1b1a0d5971 100644 --- a/cmd/helm/testdata/testcharts/novals/Chart.yaml +++ b/cmd/helm/testdata/testcharts/novals/Chart.yaml @@ -4,3 +4,4 @@ name: novals sources: - https://github.com/helm/helm version: 0.2.0 +appVersion: 3.3 diff --git a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml index 564429dea03..f569d556ce8 100644 --- a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml +++ b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml @@ -10,7 +10,6 @@ metadata: # The "release" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{.Release.Name | quote }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" annotations: diff --git a/docs/chart_template_guide/variables.md b/docs/chart_template_guide/variables.md index 984b9b4e554..65f754faff6 100644 --- a/docs/chart_template_guide/variables.md +++ b/docs/chart_template_guide/variables.md @@ -114,7 +114,8 @@ metadata: # I cannot reference .Chart.Name, but I can do $.Chart.Name helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}" app.kubernetes.io/instance: "{{ $.Release.Name }}" - app.kubernetes.io/version: {{ .Chart.AppVersion }} + # Value from appVersion in Chart.yaml + app.kubernetes.io/version: "{{ $.Chart.AppVersion }}" app.kubernetes.io/managed-by: "{{ $.Release.Service }}" type: kubernetes.io/tls data: diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml index 2b54811fdab..0f48e40597f 100644 --- a/docs/examples/alpine/templates/alpine-pod.yaml +++ b/docs/examples/alpine/templates/alpine-pod.yaml @@ -10,7 +10,7 @@ metadata: # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{ .Release.Name | quote }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} + app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "alpine.name" . }} diff --git a/docs/examples/nginx/templates/configmap.yaml b/docs/examples/nginx/templates/configmap.yaml index d479920241f..0141cbc698d 100644 --- a/docs/examples/nginx/templates/configmap.yaml +++ b/docs/examples/nginx/templates/configmap.yaml @@ -6,7 +6,6 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} data: diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml index cc4d4ea850a..5bb30f9af3d 100644 --- a/docs/examples/nginx/templates/deployment.yaml +++ b/docs/examples/nginx/templates/deployment.yaml @@ -14,7 +14,6 @@ metadata: # to all of the Kubernetes resources that were created as part of that # release. app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml index 856782a4d28..3562e6cf5bc 100644 --- a/docs/examples/nginx/templates/post-install-job.yaml +++ b/docs/examples/nginx/templates/post-install-job.yaml @@ -10,7 +10,6 @@ metadata: # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the # Kubernetes resources that were created as part of that release. app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} # This makes it easy to audit chart usage. helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} diff --git a/docs/examples/nginx/templates/pre-install-secret.yaml b/docs/examples/nginx/templates/pre-install-secret.yaml index 40451800d48..07a9504b5ff 100644 --- a/docs/examples/nginx/templates/pre-install-secret.yaml +++ b/docs/examples/nginx/templates/pre-install-secret.yaml @@ -7,7 +7,6 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} # This declares the resource to be a hook. By convention, we also name the diff --git a/docs/examples/nginx/templates/service-test.yaml b/docs/examples/nginx/templates/service-test.yaml index 867f077ee24..ffb37e9f4f2 100644 --- a/docs/examples/nginx/templates/service-test.yaml +++ b/docs/examples/nginx/templates/service-test.yaml @@ -5,7 +5,6 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/name: {{ template "nginx.name" . }} annotations: diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml index e8eb8e51e7d..a12cb0982d4 100644 --- a/docs/examples/nginx/templates/service.yaml +++ b/docs/examples/nginx/templates/service.yaml @@ -10,7 +10,6 @@ metadata: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} name: {{ template "nginx.fullname" . }} spec: # Provides options for the service so chart users have the full choice diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 415e6f97b8c..0d260627eaf 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -134,11 +134,7 @@ kind: Ingress metadata: name: {{ $fullName }} labels: - app.kubernetes.io/name: {{ include ".name" . }} - helm.sh/chart: {{ include ".chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} - app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include ".labels" . | indent 4 }} {{- with .Values.ingress.annotations }} annotations: {{- toYaml . | nindent 4 }} @@ -174,11 +170,7 @@ kind: Deployment metadata: name: {{ include ".fullname" . }} labels: - app.kubernetes.io/name: {{ include ".name" . }} - helm.sh/chart: {{ include ".chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} - app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include ".labels" . | indent 4 }} spec: replicas: {{ .Values.replicaCount }} selector: @@ -228,11 +220,7 @@ kind: Service metadata: name: {{ include ".fullname" . }} labels: - app.kubernetes.io/name: {{ include ".name" . }} - helm.sh/chart: {{ include ".chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} - app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include ".labels" . | indent 4 }} spec: type: {{ .Values.service.type }} ports: @@ -300,6 +288,19 @@ Create chart name and version as used by the chart label. {{- define ".chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} + +{{/* +Common labels +*/}} +{{- define ".labels" -}} +app.kubernetes.io/name: {{ include ".name" . }} +helm.sh/chart: {{ include ".chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- if .Chart.AppVersion -}} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end -}} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} ` const defaultTestConnection = `apiVersion: v1 @@ -307,11 +308,7 @@ kind: Pod metadata: name: "{{ include ".fullname" . }}-test-connection" labels: - app.kubernetes.io/name: {{ include ".name" . }} - helm.sh/chart: {{ include ".chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} - app.kubernetes.io/managed-by: {{ .Release.Service }} +{{ include ".labels" . | indent 4 }} annotations: "helm.sh/hook": test-success spec: diff --git a/pkg/lint/rules/testdata/albatross/templates/svc.yaml b/pkg/lint/rules/testdata/albatross/templates/svc.yaml index a976b4fddea..aea11d83325 100644 --- a/pkg/lint/rules/testdata/albatross/templates/svc.yaml +++ b/pkg/lint/rules/testdata/albatross/templates/svc.yaml @@ -7,7 +7,6 @@ metadata: labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} - app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}" kubeVersion: {{ .Capabilities.KubeVersion.Major }} tillerVersion: {{ .Capabilities.TillerVersion }} From 94adb5bbe01c554486630287fe722e9ee0d578f0 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Wed, 24 Apr 2019 20:07:22 -0700 Subject: [PATCH 457/483] fix(helm): Only validate new manifests Signed-off-by: Morten Torkildsen --- pkg/kube/client.go | 17 +++++++++++++++-- pkg/tiller/environment/environment.go | 17 +++++++++++++++++ pkg/tiller/environment/environment_test.go | 3 +++ pkg/tiller/release_server.go | 3 +-- pkg/tiller/release_server_test.go | 3 +++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index aa025eb0aaa..36467fad5e2 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -141,7 +141,7 @@ func (c *Client) validator() validation.Schema { return schema } -// BuildUnstructured validates for Kubernetes objects and returns unstructured infos. +// BuildUnstructured reads Kubernetes objects and returns unstructured infos. func (c *Client) BuildUnstructured(namespace string, reader io.Reader) (Result, error) { var result Result @@ -150,13 +150,26 @@ func (c *Client) BuildUnstructured(namespace string, reader io.Reader) (Result, ContinueOnError(). NamespaceParam(namespace). DefaultNamespace(). - Schema(c.validator()). Stream(reader, ""). Flatten(). Do().Infos() return result, scrubValidationError(err) } +// Validate reads Kubernetes manifests and validates the content. +func (c *Client) Validate(namespace string, reader io.Reader) error { + _, err := c.NewBuilder(). + Unstructured(). + ContinueOnError(). + NamespaceParam(namespace). + DefaultNamespace(). + Schema(c.validator()). + Stream(reader, ""). + Flatten(). + Do().Infos() + return scrubValidationError(err) +} + // Build validates for Kubernetes objects and returns resource Infos from a io.Reader. func (c *Client) Build(namespace string, reader io.Reader) (Result, error) { var result Result diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 21c23d42162..24b93bfb358 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -147,8 +147,20 @@ type KubeClient interface { UpdateWithOptions(namespace string, originalReader, modifiedReader io.Reader, opts kube.UpdateOptions) error Build(namespace string, reader io.Reader) (kube.Result, error) + + // BuildUnstructured reads a stream of manifests from a reader and turns them into + // info objects. Manifests are not validated against the schema, but it will fail if + // any resoures types are not known by the apiserver. + // + // reader must contain a YAML stream (one or more YAML documents separated by "\n---\n"). BuildUnstructured(namespace string, reader io.Reader) (kube.Result, error) + // Validate reads a stream of manifests from a reader and validates them against + // the schema from the apiserver. It returns an error if any of the manifests does not validate. + // + // reader must contain a YAML stream (one or more YAML documents separated by "\n---\n"). + Validate(namespace string, reader io.Reader) error + // WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase // and returns said phase (PodSucceeded or PodFailed qualify). WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) @@ -214,6 +226,11 @@ func (p *PrintingKubeClient) BuildUnstructured(ns string, reader io.Reader) (kub return []*resource.Info{}, nil } +// Validate implements KubeClient Validate +func (p *PrintingKubeClient) Validate(ns string, reader io.Reader) error { + return nil +} + // WaitAndGetCompletedPodPhase implements KubeClient WaitAndGetCompletedPodPhase. func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { _, err := io.Copy(p.Out, reader) diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 24ff8b88d2c..1c2d5343f81 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -64,6 +64,9 @@ func (k *mockKubeClient) Build(ns string, reader io.Reader) (kube.Result, error) func (k *mockKubeClient) BuildUnstructured(ns string, reader io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } +func (k *mockKubeClient) Validate(ns string, reader io.Reader) error { + return nil +} func (k *mockKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { return v1.PodUnknown, nil } diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 6733035f75f..c5638d20dda 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -436,8 +436,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin func validateManifest(c environment.KubeClient, ns string, manifest []byte) error { r := bytes.NewReader(manifest) - _, err := c.BuildUnstructured(ns, r) - return err + return c.Validate(ns, r) } func validateReleaseName(releaseName string) error { diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 05b41be2092..d70221ed1d6 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -650,6 +650,9 @@ func (kc *mockHooksKubeClient) Build(ns string, reader io.Reader) (kube.Result, func (kc *mockHooksKubeClient) BuildUnstructured(ns string, reader io.Reader) (kube.Result, error) { return []*resource.Info{}, nil } +func (kc *mockHooksKubeClient) Validate(ns string, reader io.Reader) error { + return nil +} func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { return v1.PodUnknown, nil } From d082754b1ad9b93349e572cb6cee1a0e95dc49e5 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Thu, 25 Apr 2019 15:29:09 +0100 Subject: [PATCH 458/483] Fix environment list in helm doc Closes #5344 Signed-off-by: Martin Hickey --- cmd/helm/helm.go | 26 +++++++++++++------------- docs/helm/helm.md | 28 ++++++++++++++-------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index b815568cbd2..d3337404a6e 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -61,19 +61,19 @@ Common actions from this point include: - helm list: list releases of charts Environment: - $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm - $HELM_HOST set an alternative Tiller host. The format is host:port - $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. - $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") - $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") - $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") - $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") - $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") - $HELM_TLS_HOSTNAME the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") - $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for - the passphrase while signing helm charts + +- $HELM_HOME: set an alternative location for Helm files. By default, these are stored in ~/.helm +- $HELM_HOST: set an alternative Tiller host. The format is host:port +- $HELM_NO_PLUGINS: disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. +- $TILLER_NAMESPACE: set an alternative Tiller namespace (default "kube-system") +- $KUBECONFIG: set an alternative Kubernetes configuration file (default "~/.kube/config") +- $HELM_TLS_CA_CERT: path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") +- $HELM_TLS_CERT: path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") +- $HELM_TLS_KEY: path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") +- $HELM_TLS_ENABLE: enable TLS connection between Helm and Tiller (default "false") +- $HELM_TLS_VERIFY: enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") +- $HELM_TLS_HOSTNAME: the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") +- $HELM_KEY_PASSPHRASE: set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for the passphrase while signing helm charts ` diff --git a/docs/helm/helm.md b/docs/helm/helm.md index b00ae91d691..b57be9f9d8e 100644 --- a/docs/helm/helm.md +++ b/docs/helm/helm.md @@ -21,19 +21,19 @@ Common actions from this point include: - helm list: list releases of charts Environment: - $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm - $HELM_HOST set an alternative Tiller host. The format is host:port - $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. - $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") - $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config") - $HELM_TLS_CA_CERT path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") - $HELM_TLS_CERT path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") - $HELM_TLS_KEY path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") - $HELM_TLS_ENABLE enable TLS connection between Helm and Tiller (default "false") - $HELM_TLS_VERIFY enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") - $HELM_TLS_HOSTNAME the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") - $HELM_KEY_PASSPHRASE set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for - the passphrase while signing helm charts + +- $HELM_HOME: set an alternative location for Helm files. By default, these are stored in ~/.helm +- $HELM_HOST: set an alternative Tiller host. The format is host:port +- $HELM_NO_PLUGINS: disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. +- $TILLER_NAMESPACE: set an alternative Tiller namespace (default "kube-system") +- $KUBECONFIG: set an alternative Kubernetes configuration file (default "~/.kube/config") +- $HELM_TLS_CA_CERT: path to TLS CA certificate used to verify the Helm client and Tiller server certificates (default "$HELM_HOME/ca.pem") +- $HELM_TLS_CERT: path to TLS client certificate file for authenticating to Tiller (default "$HELM_HOME/cert.pem") +- $HELM_TLS_KEY: path to TLS client key file for authenticating to Tiller (default "$HELM_HOME/key.pem") +- $HELM_TLS_ENABLE: enable TLS connection between Helm and Tiller (default "false") +- $HELM_TLS_VERIFY: enable TLS connection between Helm and Tiller and verify Tiller server certificate (default "false") +- $HELM_TLS_HOSTNAME: the hostname or IP address used to verify the Tiller server certificate (default "127.0.0.1") +- $HELM_KEY_PASSPHRASE: set HELM_KEY_PASSPHRASE to the passphrase of your PGP private key. If set, you will not be prompted for the passphrase while signing helm charts @@ -79,4 +79,4 @@ Environment: * [helm verify](helm_verify.md) - verify that a chart at the given path has been signed and is valid * [helm version](helm_version.md) - print the client/server version information -###### Auto generated by spf13/cobra on 4-Feb-2019 +###### Auto generated by spf13/cobra on 25-Apr-2019 From 5ba61df4c01f090e886619c7eba9fdd7c52680bb Mon Sep 17 00:00:00 2001 From: Patrick Carey Date: Mon, 29 Apr 2019 10:57:26 +0100 Subject: [PATCH 459/483] Update Masterminds/semver to allow >32bit version numbers Signed-off-by: Patrick Carey --- glide.lock | 8 ++++---- glide.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/glide.lock b/glide.lock index 5d4a6a9f84e..5c567126882 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: d92d7faee5c7ecbb241dadcd993e5dd8dfba226739d20d97fabf23168613f3ac -updated: 2019-04-16T15:32:58.609105-07:00 +hash: 8a007d8993bdffd14a1a2d674848bd085a27b09d7f177fab1dc55783059c4dce +updated: 2019-04-29T12:23:33.902435+01:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -188,7 +188,7 @@ imports: - name: github.com/Masterminds/goutils version: 41ac8693c5c10a92ea1ff5ac3a7f95646f6123b0 - name: github.com/Masterminds/semver - version: 517734cc7d6470c0d07130e40fd40bdeb9bcd3fd + version: c7af12943936e8c39859482e61f0574c2fd7fc75 - name: github.com/Masterminds/sprig version: 9f8fceff796fb9f4e992cd2bece016be0121ab74 - name: github.com/Masterminds/vcs @@ -647,7 +647,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: 3c949c7d419670cd99fe92f60e6f4d251898bdf2 + version: b8f2b772e38a15165a6247256d650e8b04178318 subpackages: - pkg/api/legacyscheme - pkg/api/service diff --git a/glide.yaml b/glide.yaml index 19024aecfa8..aeabbc72494 100644 --- a/glide.yaml +++ b/glide.yaml @@ -24,7 +24,7 @@ import: version: ^2.19.0 - package: github.com/ghodss/yaml - package: github.com/Masterminds/semver - version: ~1.3.1 + version: ~1.4.2 - package: github.com/technosophos/moniker version: ~0.2 - package: github.com/golang/protobuf From 470d92e126968478d4e7a0d96207f102d174d545 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Tue, 30 Apr 2019 11:09:11 +0100 Subject: [PATCH 460/483] Fix scaffold chart label in helper template The 'app.kubernetes.io/version' label was not being rendered as expected. It was appending onto the label before it and also the next label label was appending onto it on the same line. Signed-off-by: Martin Hickey --- pkg/chartutil/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go index 8cb0493f39d..f8e0356e498 100644 --- a/pkg/chartutil/create.go +++ b/pkg/chartutil/create.go @@ -301,9 +301,9 @@ Common labels app.kubernetes.io/name: {{ include ".name" . }} helm.sh/chart: {{ include ".chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Chart.AppVersion -}} +{{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end -}} +{{- end }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end -}} ` From acb759c07911491f6860619ce3037cec03d275a7 Mon Sep 17 00:00:00 2001 From: Jeff Knurek Date: Thu, 21 Mar 2019 16:19:02 +0100 Subject: [PATCH 461/483] feat(helm) add 'get version' to get the chart version Signed-off-by: Jeff Knurek --- cmd/helm/get.go | 1 + cmd/helm/get_version.go | 75 ++++++++++++++++++++++++++++++++++++ cmd/helm/get_version_test.go | 47 ++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 cmd/helm/get_version.go create mode 100644 cmd/helm/get_version_test.go diff --git a/cmd/helm/get.go b/cmd/helm/get.go index 20a4c042f7e..f9ed6fb91e6 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -78,6 +78,7 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { cmd.AddCommand(newGetManifestCmd(nil, out)) cmd.AddCommand(newGetHooksCmd(nil, out)) cmd.AddCommand(newGetNotesCmd(nil, out)) + cmd.AddCommand(newGetVersionCmd(nil, out)) // set defaults from environment settings.InitTLS(f) diff --git a/cmd/helm/get_version.go b/cmd/helm/get_version.go new file mode 100644 index 00000000000..c76c6245d89 --- /dev/null +++ b/cmd/helm/get_version.go @@ -0,0 +1,75 @@ +/* +Copyright The Helm Authors. + +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 main + +import ( + "fmt" + "io" + + "github.com/spf13/cobra" + + "k8s.io/helm/pkg/helm" +) + +var getVersionHelp = "This command fetches the chart version for a given release." + +type getVersionCmd struct { + release string + out io.Writer + client helm.Interface + revision int32 +} + +func newGetVersionCmd(client helm.Interface, out io.Writer) *cobra.Command { + get := &getVersionCmd{ + out: out, + client: client, + } + cmd := &cobra.Command{ + Use: "version [flags] RELEASE_NAME", + Short: "download the chart version for a named release", + Long: getVersionHelp, + PreRunE: func(_ *cobra.Command, _ []string) error { return setupConnection() }, + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return errReleaseRequired + } + get.release = args[0] + get.client = ensureHelmClient(get.client) + return get.run() + }, + } + + f := cmd.Flags() + settings.AddFlagsTLS(f) + f.Int32Var(&get.revision, "revision", 0, "get the named release with revision") + + // set defaults from environment + settings.InitTLS(f) + + return cmd +} + +// getVersion implements 'helm get version' +func (g *getVersionCmd) run() error { + res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.revision)) + if err != nil { + return prettyError(err) + } + fmt.Fprintln(g.out, res.Release.Chart.Metadata.Version) + return nil +} diff --git a/cmd/helm/get_version_test.go b/cmd/helm/get_version_test.go new file mode 100644 index 00000000000..81c9cdfd92f --- /dev/null +++ b/cmd/helm/get_version_test.go @@ -0,0 +1,47 @@ +/* +Copyright The Helm Authors. + +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 main + +import ( + "io" + "testing" + + "github.com/spf13/cobra" + + "k8s.io/helm/pkg/helm" + "k8s.io/helm/pkg/proto/hapi/release" +) + +func TestGetVersion(t *testing.T) { + tests := []releaseCase{ + { + name: "get chart version of release", + args: []string{"kodiak"}, + expected: "0.1.0-beta.1", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "kodiak"}), + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "kodiak"})}, + }, + { + name: "get version without args", + args: []string{}, + err: true, + }, + } + runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { + return newGetVersionCmd(c, out) + }) +} From 6c760297c04aa7eac6cb47829ac6fc7b01c4b3f9 Mon Sep 17 00:00:00 2001 From: Jeff Knurek Date: Thu, 21 Mar 2019 16:40:38 +0100 Subject: [PATCH 462/483] DOCS: ci failed and taught me how the docs get autogenerated Signed-off-by: Jeff Knurek --- docs/helm/helm_get.md | 3 ++- docs/helm/helm_get_version.md | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 docs/helm/helm_get_version.md diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index 3b99c93d55d..e113db53f06 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -53,5 +53,6 @@ helm get [flags] RELEASE_NAME * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release * [helm get notes](helm_get_notes.md) - displays the notes of the named release * [helm get values](helm_get_values.md) - download the values file for a named release +* [helm get version](helm_get_version.md) - download the chart version for a named release -###### Auto generated by spf13/cobra on 1-Sep-2018 +###### Auto generated by spf13/cobra on 21-Mar-2019 diff --git a/docs/helm/helm_get_version.md b/docs/helm/helm_get_version.md new file mode 100644 index 00000000000..36695e4648c --- /dev/null +++ b/docs/helm/helm_get_version.md @@ -0,0 +1,42 @@ +## helm get version + +download the chart version for a named release + +### Synopsis + +This command fetches the chart version for a given release. + +``` +helm get version [flags] RELEASE_NAME +``` + +### Options + +``` + -h, --help help for version + --revision int32 get the named release with revision + --tls enable TLS for request + --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") + --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") + --tls-hostname string the server name used to verify the hostname on the returned certificates from the server + --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") + --tls-verify enable TLS for request and verify remote +``` + +### Options inherited from parent commands + +``` + --debug enable verbose output + --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") + --host string address of Tiller. Overrides $HELM_HOST + --kube-context string name of the kubeconfig context to use + --kubeconfig string absolute path to the kubeconfig file to use + --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) + --tiller-namespace string namespace of Tiller (default "kube-system") +``` + +### SEE ALSO + +* [helm get](helm_get.md) - download a named release + +###### Auto generated by spf13/cobra on 21-Mar-2019 From 0a3ebb816b76ae2425ec2a8ceb242b0660db9c53 Mon Sep 17 00:00:00 2001 From: Jeff Knurek Date: Mon, 25 Mar 2019 14:21:55 +0100 Subject: [PATCH 463/483] feat(helm) add '--template' option to 'helm get' for custom formatting Signed-off-by: Jeff Knurek --- cmd/helm/get.go | 15 +++++--- cmd/helm/get_test.go | 7 ++++ cmd/helm/get_version.go | 75 ------------------------------------ cmd/helm/get_version_test.go | 47 ---------------------- cmd/helm/printer.go | 2 +- docs/helm/helm_get.md | 4 +- 6 files changed, 20 insertions(+), 130 deletions(-) delete mode 100644 cmd/helm/get_version.go delete mode 100644 cmd/helm/get_version_test.go diff --git a/cmd/helm/get.go b/cmd/helm/get.go index f9ed6fb91e6..6829122b747 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -41,10 +41,11 @@ chart, the supplied values, and the generated manifest file. var errReleaseRequired = errors.New("release name is required") type getCmd struct { - release string - out io.Writer - client helm.Interface - version int32 + release string + out io.Writer + client helm.Interface + version int32 + template string } func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { @@ -73,12 +74,12 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { f := cmd.Flags() settings.AddFlagsTLS(f) f.Int32Var(&get.version, "revision", 0, "get the named release with revision") + f.StringVar(&get.template, "template", "", "go template for formatting the output, eg: {{.Release.Name}}") cmd.AddCommand(newGetValuesCmd(nil, out)) cmd.AddCommand(newGetManifestCmd(nil, out)) cmd.AddCommand(newGetHooksCmd(nil, out)) cmd.AddCommand(newGetNotesCmd(nil, out)) - cmd.AddCommand(newGetVersionCmd(nil, out)) // set defaults from environment settings.InitTLS(f) @@ -92,5 +93,9 @@ func (g *getCmd) run() error { if err != nil { return prettyError(err) } + + if g.template != "" { + return tpl(g.template, res, g.out) + } return printRelease(g.out, res.Release) } diff --git a/cmd/helm/get_test.go b/cmd/helm/get_test.go index cb230a8a508..d83c85e1e2b 100644 --- a/cmd/helm/get_test.go +++ b/cmd/helm/get_test.go @@ -35,6 +35,13 @@ func TestGetCmd(t *testing.T) { expected: "REVISION: 1\nRELEASED: (.*)\nCHART: foo-0.1.0-beta.1\nUSER-SUPPLIED VALUES:\nname: \"value\"\nCOMPUTED VALUES:\nname: value\n\nHOOKS:\n---\n# pre-install-hook\n" + helm.MockHookTemplate + "\nMANIFEST:", rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"})}, }, + { + name: "get with a formatted release", + resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "elevated-turkey"}), + args: []string{"elevated-turkey", "--template", "{{.Release.Chart.Metadata.Version}}"}, + expected: "0.1.0-beta.1", + rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "elevated-turkey"})}, + }, { name: "get requires release name arg", err: true, diff --git a/cmd/helm/get_version.go b/cmd/helm/get_version.go deleted file mode 100644 index c76c6245d89..00000000000 --- a/cmd/helm/get_version.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright The Helm Authors. - -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 main - -import ( - "fmt" - "io" - - "github.com/spf13/cobra" - - "k8s.io/helm/pkg/helm" -) - -var getVersionHelp = "This command fetches the chart version for a given release." - -type getVersionCmd struct { - release string - out io.Writer - client helm.Interface - revision int32 -} - -func newGetVersionCmd(client helm.Interface, out io.Writer) *cobra.Command { - get := &getVersionCmd{ - out: out, - client: client, - } - cmd := &cobra.Command{ - Use: "version [flags] RELEASE_NAME", - Short: "download the chart version for a named release", - Long: getVersionHelp, - PreRunE: func(_ *cobra.Command, _ []string) error { return setupConnection() }, - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return errReleaseRequired - } - get.release = args[0] - get.client = ensureHelmClient(get.client) - return get.run() - }, - } - - f := cmd.Flags() - settings.AddFlagsTLS(f) - f.Int32Var(&get.revision, "revision", 0, "get the named release with revision") - - // set defaults from environment - settings.InitTLS(f) - - return cmd -} - -// getVersion implements 'helm get version' -func (g *getVersionCmd) run() error { - res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.revision)) - if err != nil { - return prettyError(err) - } - fmt.Fprintln(g.out, res.Release.Chart.Metadata.Version) - return nil -} diff --git a/cmd/helm/get_version_test.go b/cmd/helm/get_version_test.go deleted file mode 100644 index 81c9cdfd92f..00000000000 --- a/cmd/helm/get_version_test.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright The Helm Authors. - -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 main - -import ( - "io" - "testing" - - "github.com/spf13/cobra" - - "k8s.io/helm/pkg/helm" - "k8s.io/helm/pkg/proto/hapi/release" -) - -func TestGetVersion(t *testing.T) { - tests := []releaseCase{ - { - name: "get chart version of release", - args: []string{"kodiak"}, - expected: "0.1.0-beta.1", - resp: helm.ReleaseMock(&helm.MockReleaseOptions{Name: "kodiak"}), - rels: []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "kodiak"})}, - }, - { - name: "get version without args", - args: []string{}, - err: true, - }, - } - runReleaseCases(t, tests, func(c *helm.FakeClient, out io.Writer) *cobra.Command { - return newGetVersionCmd(c, out) - }) -} diff --git a/cmd/helm/printer.go b/cmd/helm/printer.go index e98b71c64b8..2f42bdab0a0 100644 --- a/cmd/helm/printer.go +++ b/cmd/helm/printer.go @@ -66,7 +66,7 @@ func printRelease(out io.Writer, rel *release.Release) error { return tpl(printReleaseTemplate, data, out) } -func tpl(t string, vals map[string]interface{}, out io.Writer) error { +func tpl(t string, vals interface{}, out io.Writer) error { tt, err := template.New("_").Parse(t) if err != nil { return err diff --git a/docs/helm/helm_get.md b/docs/helm/helm_get.md index e113db53f06..3ce0ff191f3 100644 --- a/docs/helm/helm_get.md +++ b/docs/helm/helm_get.md @@ -26,6 +26,7 @@ helm get [flags] RELEASE_NAME ``` -h, --help help for get --revision int32 get the named release with revision + --template string go template for formatting the output, eg: {{.Release.Name}} --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") @@ -53,6 +54,5 @@ helm get [flags] RELEASE_NAME * [helm get manifest](helm_get_manifest.md) - download the manifest for a named release * [helm get notes](helm_get_notes.md) - displays the notes of the named release * [helm get values](helm_get_values.md) - download the values file for a named release -* [helm get version](helm_get_version.md) - download the chart version for a named release -###### Auto generated by spf13/cobra on 21-Mar-2019 +###### Auto generated by spf13/cobra on 25-Mar-2019 From 072cd6af37bb9856aaabebe02b7489cd18a80293 Mon Sep 17 00:00:00 2001 From: Morten Torkildsen Date: Thu, 2 May 2019 11:32:01 -0700 Subject: [PATCH 464/483] fix(helm): Regenerate go types from proto Signed-off-by: Morten Torkildsen --- cmd/helm/version.go | 2 +- pkg/proto/hapi/chart/chart.pb.go | 65 +- pkg/proto/hapi/chart/config.pb.go | 77 +- pkg/proto/hapi/chart/metadata.pb.go | 115 ++- pkg/proto/hapi/chart/template.pb.go | 44 +- pkg/proto/hapi/release/hook.pb.go | 81 ++- pkg/proto/hapi/release/info.pb.go | 58 +- pkg/proto/hapi/release/release.pb.go | 63 +- pkg/proto/hapi/release/status.pb.go | 52 +- pkg/proto/hapi/release/test_run.pb.go | 62 +- pkg/proto/hapi/release/test_suite.pb.go | 54 +- pkg/proto/hapi/rudder/rudder.pb.go | 530 ++++++++++---- pkg/proto/hapi/services/tiller.pb.go | 891 ++++++++++++++++++------ pkg/proto/hapi/version/version.pb.go | 49 +- pkg/storage/driver/cfgmaps_test.go | 7 +- pkg/storage/driver/mock_test.go | 10 + pkg/storage/driver/secrets_test.go | 7 +- pkg/version/version_test.go | 12 +- 18 files changed, 1599 insertions(+), 580 deletions(-) diff --git a/cmd/helm/version.go b/cmd/helm/version.go index a803a990bac..a5360ea362c 100644 --- a/cmd/helm/version.go +++ b/cmd/helm/version.go @@ -151,5 +151,5 @@ func formatVersion(v *pb.Version, short bool) string { if short && v.GitCommit != "" { return fmt.Sprintf("%s+g%s", v.SemVer, v.GitCommit[:7]) } - return fmt.Sprintf("%#v", v) + return fmt.Sprintf("&version.Version{SemVer:\"%s\", GitCommit:\"%s\", GitTreeState:\"%s\"}", v.SemVer, v.GitCommit, v.GitTreeState) } diff --git a/pkg/proto/hapi/chart/chart.pb.go b/pkg/proto/hapi/chart/chart.pb.go index a884ed552ee..f54c717fb7e 100644 --- a/pkg/proto/hapi/chart/chart.pb.go +++ b/pkg/proto/hapi/chart/chart.pb.go @@ -1,29 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: hapi/chart/chart.proto -/* -Package chart is a generated protocol buffer package. - -It is generated from these files: - hapi/chart/chart.proto - hapi/chart/config.proto - hapi/chart/metadata.proto - hapi/chart/template.proto - -It has these top-level messages: - Chart - Config - Value - Maintainer - Metadata - Template -*/ package chart import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/any" +import any "github.com/golang/protobuf/ptypes/any" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -40,22 +23,44 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package // optionally parameterizable templates, and zero or more charts (dependencies). type Chart struct { // Contents of the Chartfile. - Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"` + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` // Templates for this chart. - Templates []*Template `protobuf:"bytes,2,rep,name=templates" json:"templates,omitempty"` + Templates []*Template `protobuf:"bytes,2,rep,name=templates,proto3" json:"templates,omitempty"` // Charts that this chart depends on. - Dependencies []*Chart `protobuf:"bytes,3,rep,name=dependencies" json:"dependencies,omitempty"` + Dependencies []*Chart `protobuf:"bytes,3,rep,name=dependencies,proto3" json:"dependencies,omitempty"` // Default config for this template. - Values *Config `protobuf:"bytes,4,opt,name=values" json:"values,omitempty"` + Values *Config `protobuf:"bytes,4,opt,name=values,proto3" json:"values,omitempty"` // Miscellaneous files in a chart archive, // e.g. README, LICENSE, etc. - Files []*google_protobuf.Any `protobuf:"bytes,5,rep,name=files" json:"files,omitempty"` + Files []*any.Any `protobuf:"bytes,5,rep,name=files,proto3" json:"files,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Chart) Reset() { *m = Chart{} } +func (m *Chart) String() string { return proto.CompactTextString(m) } +func (*Chart) ProtoMessage() {} +func (*Chart) Descriptor() ([]byte, []int) { + return fileDescriptor_chart_829b474cf208a7f0, []int{0} +} +func (m *Chart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Chart.Unmarshal(m, b) +} +func (m *Chart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Chart.Marshal(b, m, deterministic) +} +func (dst *Chart) XXX_Merge(src proto.Message) { + xxx_messageInfo_Chart.Merge(dst, src) +} +func (m *Chart) XXX_Size() int { + return xxx_messageInfo_Chart.Size(m) +} +func (m *Chart) XXX_DiscardUnknown() { + xxx_messageInfo_Chart.DiscardUnknown(m) } -func (m *Chart) Reset() { *m = Chart{} } -func (m *Chart) String() string { return proto.CompactTextString(m) } -func (*Chart) ProtoMessage() {} -func (*Chart) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_Chart proto.InternalMessageInfo func (m *Chart) GetMetadata() *Metadata { if m != nil { @@ -85,7 +90,7 @@ func (m *Chart) GetValues() *Config { return nil } -func (m *Chart) GetFiles() []*google_protobuf.Any { +func (m *Chart) GetFiles() []*any.Any { if m != nil { return m.Files } @@ -96,9 +101,9 @@ func init() { proto.RegisterType((*Chart)(nil), "hapi.chart.Chart") } -func init() { proto.RegisterFile("hapi/chart/chart.proto", fileDescriptor0) } +func init() { proto.RegisterFile("hapi/chart/chart.proto", fileDescriptor_chart_829b474cf208a7f0) } -var fileDescriptor0 = []byte{ +var fileDescriptor_chart_829b474cf208a7f0 = []byte{ // 242 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xb1, 0x4e, 0xc3, 0x30, 0x10, 0x86, 0x15, 0x4a, 0x0a, 0x1c, 0x2c, 0x58, 0x08, 0x4c, 0xa7, 0x8a, 0x09, 0x75, 0x70, 0x50, diff --git a/pkg/proto/hapi/chart/config.pb.go b/pkg/proto/hapi/chart/config.pb.go index 30c652700a1..fce589b148c 100644 --- a/pkg/proto/hapi/chart/config.pb.go +++ b/pkg/proto/hapi/chart/config.pb.go @@ -12,16 +12,44 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + // Config supplies values to the parametrizable templates of a chart. type Config struct { - Raw string `protobuf:"bytes,1,opt,name=raw" json:"raw,omitempty"` - Values map[string]*Value `protobuf:"bytes,2,rep,name=values" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Raw string `protobuf:"bytes,1,opt,name=raw,proto3" json:"raw,omitempty"` + Values map[string]*Value `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Config) Reset() { *m = Config{} } +func (m *Config) String() string { return proto.CompactTextString(m) } +func (*Config) ProtoMessage() {} +func (*Config) Descriptor() ([]byte, []int) { + return fileDescriptor_config_332ead17c4feed84, []int{0} +} +func (m *Config) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Config.Unmarshal(m, b) +} +func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Config.Marshal(b, m, deterministic) +} +func (dst *Config) XXX_Merge(src proto.Message) { + xxx_messageInfo_Config.Merge(dst, src) +} +func (m *Config) XXX_Size() int { + return xxx_messageInfo_Config.Size(m) +} +func (m *Config) XXX_DiscardUnknown() { + xxx_messageInfo_Config.DiscardUnknown(m) } -func (m *Config) Reset() { *m = Config{} } -func (m *Config) String() string { return proto.CompactTextString(m) } -func (*Config) ProtoMessage() {} -func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } +var xxx_messageInfo_Config proto.InternalMessageInfo func (m *Config) GetRaw() string { if m != nil { @@ -39,13 +67,35 @@ func (m *Config) GetValues() map[string]*Value { // Value describes a configuration value as a string. type Value struct { - Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Value) Reset() { *m = Value{} } +func (m *Value) String() string { return proto.CompactTextString(m) } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { + return fileDescriptor_config_332ead17c4feed84, []int{1} +} +func (m *Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Value.Unmarshal(m, b) +} +func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Value.Marshal(b, m, deterministic) +} +func (dst *Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Value.Merge(dst, src) +} +func (m *Value) XXX_Size() int { + return xxx_messageInfo_Value.Size(m) +} +func (m *Value) XXX_DiscardUnknown() { + xxx_messageInfo_Value.DiscardUnknown(m) } -func (m *Value) Reset() { *m = Value{} } -func (m *Value) String() string { return proto.CompactTextString(m) } -func (*Value) ProtoMessage() {} -func (*Value) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} } +var xxx_messageInfo_Value proto.InternalMessageInfo func (m *Value) GetValue() string { if m != nil { @@ -56,12 +106,13 @@ func (m *Value) GetValue() string { func init() { proto.RegisterType((*Config)(nil), "hapi.chart.Config") + proto.RegisterMapType((map[string]*Value)(nil), "hapi.chart.Config.ValuesEntry") proto.RegisterType((*Value)(nil), "hapi.chart.Value") } -func init() { proto.RegisterFile("hapi/chart/config.proto", fileDescriptor1) } +func init() { proto.RegisterFile("hapi/chart/config.proto", fileDescriptor_config_332ead17c4feed84) } -var fileDescriptor1 = []byte{ +var fileDescriptor_config_332ead17c4feed84 = []byte{ // 182 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xcf, 0x48, 0x2c, 0xc8, 0xd4, 0x4f, 0xce, 0x48, 0x2c, 0x2a, 0xd1, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x2b, 0x28, diff --git a/pkg/proto/hapi/chart/metadata.pb.go b/pkg/proto/hapi/chart/metadata.pb.go index 9daeaa9e565..ebf59fd9f7a 100644 --- a/pkg/proto/hapi/chart/metadata.pb.go +++ b/pkg/proto/hapi/chart/metadata.pb.go @@ -12,6 +12,12 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + type Metadata_Engine int32 const ( @@ -31,22 +37,46 @@ var Metadata_Engine_value = map[string]int32{ func (x Metadata_Engine) String() string { return proto.EnumName(Metadata_Engine_name, int32(x)) } -func (Metadata_Engine) EnumDescriptor() ([]byte, []int) { return fileDescriptor2, []int{1, 0} } +func (Metadata_Engine) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_metadata_d6c714c73a051dcb, []int{1, 0} +} // Maintainer describes a Chart maintainer. type Maintainer struct { // Name is a user name or organization name - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Email is an optional email address to contact the named maintainer - Email string `protobuf:"bytes,2,opt,name=email" json:"email,omitempty"` + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` // Url is an optional URL to an address for the named maintainer - Url string `protobuf:"bytes,3,opt,name=url" json:"url,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Maintainer) Reset() { *m = Maintainer{} } +func (m *Maintainer) String() string { return proto.CompactTextString(m) } +func (*Maintainer) ProtoMessage() {} +func (*Maintainer) Descriptor() ([]byte, []int) { + return fileDescriptor_metadata_d6c714c73a051dcb, []int{0} +} +func (m *Maintainer) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Maintainer.Unmarshal(m, b) +} +func (m *Maintainer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Maintainer.Marshal(b, m, deterministic) +} +func (dst *Maintainer) XXX_Merge(src proto.Message) { + xxx_messageInfo_Maintainer.Merge(dst, src) +} +func (m *Maintainer) XXX_Size() int { + return xxx_messageInfo_Maintainer.Size(m) +} +func (m *Maintainer) XXX_DiscardUnknown() { + xxx_messageInfo_Maintainer.DiscardUnknown(m) } -func (m *Maintainer) Reset() { *m = Maintainer{} } -func (m *Maintainer) String() string { return proto.CompactTextString(m) } -func (*Maintainer) ProtoMessage() {} -func (*Maintainer) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} } +var xxx_messageInfo_Maintainer proto.InternalMessageInfo func (m *Maintainer) GetName() string { if m != nil { @@ -74,47 +104,69 @@ func (m *Maintainer) GetUrl() string { // Spec: https://k8s.io/helm/blob/master/docs/design/chart_format.md#the-chart-file type Metadata struct { // The name of the chart - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The URL to a relevant project page, git repo, or contact person - Home string `protobuf:"bytes,2,opt,name=home" json:"home,omitempty"` + Home string `protobuf:"bytes,2,opt,name=home,proto3" json:"home,omitempty"` // Source is the URL to the source code of this chart - Sources []string `protobuf:"bytes,3,rep,name=sources" json:"sources,omitempty"` + Sources []string `protobuf:"bytes,3,rep,name=sources,proto3" json:"sources,omitempty"` // A SemVer 2 conformant version string of the chart - Version string `protobuf:"bytes,4,opt,name=version" json:"version,omitempty"` + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` // A one-sentence description of the chart - Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` // A list of string keywords - Keywords []string `protobuf:"bytes,6,rep,name=keywords" json:"keywords,omitempty"` + Keywords []string `protobuf:"bytes,6,rep,name=keywords,proto3" json:"keywords,omitempty"` // A list of name and URL/email address combinations for the maintainer(s) - Maintainers []*Maintainer `protobuf:"bytes,7,rep,name=maintainers" json:"maintainers,omitempty"` + Maintainers []*Maintainer `protobuf:"bytes,7,rep,name=maintainers,proto3" json:"maintainers,omitempty"` // The name of the template engine to use. Defaults to 'gotpl'. - Engine string `protobuf:"bytes,8,opt,name=engine" json:"engine,omitempty"` + Engine string `protobuf:"bytes,8,opt,name=engine,proto3" json:"engine,omitempty"` // The URL to an icon file. - Icon string `protobuf:"bytes,9,opt,name=icon" json:"icon,omitempty"` + Icon string `protobuf:"bytes,9,opt,name=icon,proto3" json:"icon,omitempty"` // The API Version of this chart. - ApiVersion string `protobuf:"bytes,10,opt,name=apiVersion" json:"apiVersion,omitempty"` + ApiVersion string `protobuf:"bytes,10,opt,name=apiVersion,proto3" json:"apiVersion,omitempty"` // The condition to check to enable chart - Condition string `protobuf:"bytes,11,opt,name=condition" json:"condition,omitempty"` + Condition string `protobuf:"bytes,11,opt,name=condition,proto3" json:"condition,omitempty"` // The tags to check to enable chart - Tags string `protobuf:"bytes,12,opt,name=tags" json:"tags,omitempty"` + Tags string `protobuf:"bytes,12,opt,name=tags,proto3" json:"tags,omitempty"` // The version of the application enclosed inside of this chart. - AppVersion string `protobuf:"bytes,13,opt,name=appVersion" json:"appVersion,omitempty"` + AppVersion string `protobuf:"bytes,13,opt,name=appVersion,proto3" json:"appVersion,omitempty"` // Whether or not this chart is deprecated - Deprecated bool `protobuf:"varint,14,opt,name=deprecated" json:"deprecated,omitempty"` + Deprecated bool `protobuf:"varint,14,opt,name=deprecated,proto3" json:"deprecated,omitempty"` // TillerVersion is a SemVer constraints on what version of Tiller is required. // See SemVer ranges here: https://github.com/Masterminds/semver#basic-comparisons - TillerVersion string `protobuf:"bytes,15,opt,name=tillerVersion" json:"tillerVersion,omitempty"` + TillerVersion string `protobuf:"bytes,15,opt,name=tillerVersion,proto3" json:"tillerVersion,omitempty"` // Annotations are additional mappings uninterpreted by Tiller, // made available for inspection by other applications. - Annotations map[string]string `protobuf:"bytes,16,rep,name=annotations" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Annotations map[string]string `protobuf:"bytes,16,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // KubeVersion is a SemVer constraint specifying the version of Kubernetes required. - KubeVersion string `protobuf:"bytes,17,opt,name=kubeVersion" json:"kubeVersion,omitempty"` + KubeVersion string `protobuf:"bytes,17,opt,name=kubeVersion,proto3" json:"kubeVersion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { + return fileDescriptor_metadata_d6c714c73a051dcb, []int{1} +} +func (m *Metadata) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metadata.Unmarshal(m, b) +} +func (m *Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metadata.Marshal(b, m, deterministic) +} +func (dst *Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metadata.Merge(dst, src) +} +func (m *Metadata) XXX_Size() int { + return xxx_messageInfo_Metadata.Size(m) +} +func (m *Metadata) XXX_DiscardUnknown() { + xxx_messageInfo_Metadata.DiscardUnknown(m) } -func (m *Metadata) Reset() { *m = Metadata{} } -func (m *Metadata) String() string { return proto.CompactTextString(m) } -func (*Metadata) ProtoMessage() {} -func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{1} } +var xxx_messageInfo_Metadata proto.InternalMessageInfo func (m *Metadata) GetName() string { if m != nil { @@ -238,12 +290,13 @@ func (m *Metadata) GetKubeVersion() string { func init() { proto.RegisterType((*Maintainer)(nil), "hapi.chart.Maintainer") proto.RegisterType((*Metadata)(nil), "hapi.chart.Metadata") + proto.RegisterMapType((map[string]string)(nil), "hapi.chart.Metadata.AnnotationsEntry") proto.RegisterEnum("hapi.chart.Metadata_Engine", Metadata_Engine_name, Metadata_Engine_value) } -func init() { proto.RegisterFile("hapi/chart/metadata.proto", fileDescriptor2) } +func init() { proto.RegisterFile("hapi/chart/metadata.proto", fileDescriptor_metadata_d6c714c73a051dcb) } -var fileDescriptor2 = []byte{ +var fileDescriptor_metadata_d6c714c73a051dcb = []byte{ // 435 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x5d, 0x6b, 0xd4, 0x40, 0x14, 0x35, 0xcd, 0x66, 0x77, 0x73, 0x63, 0x35, 0x0e, 0x52, 0xc6, 0x22, 0x12, 0x16, 0x85, 0x7d, diff --git a/pkg/proto/hapi/chart/template.pb.go b/pkg/proto/hapi/chart/template.pb.go index 439aec5a8fd..4b77dddd0d1 100644 --- a/pkg/proto/hapi/chart/template.pb.go +++ b/pkg/proto/hapi/chart/template.pb.go @@ -12,21 +12,49 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + // Template represents a template as a name/value pair. // // By convention, name is a relative path within the scope of the chart's // base directory. type Template struct { // Name is the path-like name of the template. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Data is the template as byte data. - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Template) Reset() { *m = Template{} } +func (m *Template) String() string { return proto.CompactTextString(m) } +func (*Template) ProtoMessage() {} +func (*Template) Descriptor() ([]byte, []int) { + return fileDescriptor_template_051845a7e9227d35, []int{0} +} +func (m *Template) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Template.Unmarshal(m, b) +} +func (m *Template) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Template.Marshal(b, m, deterministic) +} +func (dst *Template) XXX_Merge(src proto.Message) { + xxx_messageInfo_Template.Merge(dst, src) +} +func (m *Template) XXX_Size() int { + return xxx_messageInfo_Template.Size(m) +} +func (m *Template) XXX_DiscardUnknown() { + xxx_messageInfo_Template.DiscardUnknown(m) } -func (m *Template) Reset() { *m = Template{} } -func (m *Template) String() string { return proto.CompactTextString(m) } -func (*Template) ProtoMessage() {} -func (*Template) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{0} } +var xxx_messageInfo_Template proto.InternalMessageInfo func (m *Template) GetName() string { if m != nil { @@ -46,9 +74,9 @@ func init() { proto.RegisterType((*Template)(nil), "hapi.chart.Template") } -func init() { proto.RegisterFile("hapi/chart/template.proto", fileDescriptor3) } +func init() { proto.RegisterFile("hapi/chart/template.proto", fileDescriptor_template_051845a7e9227d35) } -var fileDescriptor3 = []byte{ +var fileDescriptor_template_051845a7e9227d35 = []byte{ // 107 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0x48, 0x2c, 0xc8, 0xd4, 0x4f, 0xce, 0x48, 0x2c, 0x2a, 0xd1, 0x2f, 0x49, 0xcd, 0x2d, 0xc8, 0x49, 0x2c, 0x49, 0xd5, diff --git a/pkg/proto/hapi/release/hook.pb.go b/pkg/proto/hapi/release/hook.pb.go index 0a44165c830..bec2049b627 100644 --- a/pkg/proto/hapi/release/hook.pb.go +++ b/pkg/proto/hapi/release/hook.pb.go @@ -1,31 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: hapi/release/hook.proto -/* -Package release is a generated protocol buffer package. - -It is generated from these files: - hapi/release/hook.proto - hapi/release/info.proto - hapi/release/release.proto - hapi/release/status.proto - hapi/release/test_run.proto - hapi/release/test_suite.proto - -It has these top-level messages: - Hook - Info - Release - Status - TestRun - TestSuite -*/ package release import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/timestamp" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -87,7 +68,9 @@ var Hook_Event_value = map[string]int32{ func (x Hook_Event) String() string { return proto.EnumName(Hook_Event_name, int32(x)) } -func (Hook_Event) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } +func (Hook_Event) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_hook_8076b1a80af16030, []int{0, 0} +} type Hook_DeletePolicy int32 @@ -111,31 +94,55 @@ var Hook_DeletePolicy_value = map[string]int32{ func (x Hook_DeletePolicy) String() string { return proto.EnumName(Hook_DeletePolicy_name, int32(x)) } -func (Hook_DeletePolicy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 1} } +func (Hook_DeletePolicy) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_hook_8076b1a80af16030, []int{0, 1} +} // Hook defines a hook object. type Hook struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Kind is the Kubernetes kind. - Kind string `protobuf:"bytes,2,opt,name=kind" json:"kind,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` // Path is the chart-relative path to the template. - Path string `protobuf:"bytes,3,opt,name=path" json:"path,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Manifest is the manifest contents. - Manifest string `protobuf:"bytes,4,opt,name=manifest" json:"manifest,omitempty"` + Manifest string `protobuf:"bytes,4,opt,name=manifest,proto3" json:"manifest,omitempty"` // Events are the events that this hook fires on. - Events []Hook_Event `protobuf:"varint,5,rep,packed,name=events,enum=hapi.release.Hook_Event" json:"events,omitempty"` + Events []Hook_Event `protobuf:"varint,5,rep,packed,name=events,proto3,enum=hapi.release.Hook_Event" json:"events,omitempty"` // LastRun indicates the date/time this was last run. - LastRun *google_protobuf.Timestamp `protobuf:"bytes,6,opt,name=last_run,json=lastRun" json:"last_run,omitempty"` + LastRun *timestamp.Timestamp `protobuf:"bytes,6,opt,name=last_run,json=lastRun,proto3" json:"last_run,omitempty"` // Weight indicates the sort order for execution among similar Hook type - Weight int32 `protobuf:"varint,7,opt,name=weight" json:"weight,omitempty"` + Weight int32 `protobuf:"varint,7,opt,name=weight,proto3" json:"weight,omitempty"` // DeletePolicies are the policies that indicate when to delete the hook - DeletePolicies []Hook_DeletePolicy `protobuf:"varint,8,rep,packed,name=delete_policies,json=deletePolicies,enum=hapi.release.Hook_DeletePolicy" json:"delete_policies,omitempty"` + DeletePolicies []Hook_DeletePolicy `protobuf:"varint,8,rep,packed,name=delete_policies,json=deletePolicies,proto3,enum=hapi.release.Hook_DeletePolicy" json:"delete_policies,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Hook) Reset() { *m = Hook{} } +func (m *Hook) String() string { return proto.CompactTextString(m) } +func (*Hook) ProtoMessage() {} +func (*Hook) Descriptor() ([]byte, []int) { + return fileDescriptor_hook_8076b1a80af16030, []int{0} +} +func (m *Hook) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Hook.Unmarshal(m, b) +} +func (m *Hook) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Hook.Marshal(b, m, deterministic) +} +func (dst *Hook) XXX_Merge(src proto.Message) { + xxx_messageInfo_Hook.Merge(dst, src) +} +func (m *Hook) XXX_Size() int { + return xxx_messageInfo_Hook.Size(m) +} +func (m *Hook) XXX_DiscardUnknown() { + xxx_messageInfo_Hook.DiscardUnknown(m) } -func (m *Hook) Reset() { *m = Hook{} } -func (m *Hook) String() string { return proto.CompactTextString(m) } -func (*Hook) ProtoMessage() {} -func (*Hook) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_Hook proto.InternalMessageInfo func (m *Hook) GetName() string { if m != nil { @@ -172,7 +179,7 @@ func (m *Hook) GetEvents() []Hook_Event { return nil } -func (m *Hook) GetLastRun() *google_protobuf.Timestamp { +func (m *Hook) GetLastRun() *timestamp.Timestamp { if m != nil { return m.LastRun } @@ -199,9 +206,9 @@ func init() { proto.RegisterEnum("hapi.release.Hook_DeletePolicy", Hook_DeletePolicy_name, Hook_DeletePolicy_value) } -func init() { proto.RegisterFile("hapi/release/hook.proto", fileDescriptor0) } +func init() { proto.RegisterFile("hapi/release/hook.proto", fileDescriptor_hook_8076b1a80af16030) } -var fileDescriptor0 = []byte{ +var fileDescriptor_hook_8076b1a80af16030 = []byte{ // 453 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0x51, 0x8f, 0x9a, 0x40, 0x10, 0x80, 0x8f, 0x53, 0x41, 0x47, 0xcf, 0xdb, 0x6e, 0x9a, 0x76, 0xe3, 0xcb, 0x19, 0x9f, 0x7c, diff --git a/pkg/proto/hapi/release/info.pb.go b/pkg/proto/hapi/release/info.pb.go index 7a7ccdd7467..5ce2845a6eb 100644 --- a/pkg/proto/hapi/release/info.pb.go +++ b/pkg/proto/hapi/release/info.pb.go @@ -6,28 +6,56 @@ package release import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/timestamp" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + // Info describes release information. type Info struct { - Status *Status `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"` - FirstDeployed *google_protobuf.Timestamp `protobuf:"bytes,2,opt,name=first_deployed,json=firstDeployed" json:"first_deployed,omitempty"` - LastDeployed *google_protobuf.Timestamp `protobuf:"bytes,3,opt,name=last_deployed,json=lastDeployed" json:"last_deployed,omitempty"` + Status *Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + FirstDeployed *timestamp.Timestamp `protobuf:"bytes,2,opt,name=first_deployed,json=firstDeployed,proto3" json:"first_deployed,omitempty"` + LastDeployed *timestamp.Timestamp `protobuf:"bytes,3,opt,name=last_deployed,json=lastDeployed,proto3" json:"last_deployed,omitempty"` // Deleted tracks when this object was deleted. - Deleted *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=deleted" json:"deleted,omitempty"` + Deleted *timestamp.Timestamp `protobuf:"bytes,4,opt,name=deleted,proto3" json:"deleted,omitempty"` // Description is human-friendly "log entry" about this release. - Description string `protobuf:"bytes,5,opt,name=Description" json:"Description,omitempty"` + Description string `protobuf:"bytes,5,opt,name=Description,proto3" json:"Description,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Info) Reset() { *m = Info{} } +func (m *Info) String() string { return proto.CompactTextString(m) } +func (*Info) ProtoMessage() {} +func (*Info) Descriptor() ([]byte, []int) { + return fileDescriptor_info_1c62b71ed76c67c1, []int{0} +} +func (m *Info) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Info.Unmarshal(m, b) +} +func (m *Info) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Info.Marshal(b, m, deterministic) +} +func (dst *Info) XXX_Merge(src proto.Message) { + xxx_messageInfo_Info.Merge(dst, src) +} +func (m *Info) XXX_Size() int { + return xxx_messageInfo_Info.Size(m) +} +func (m *Info) XXX_DiscardUnknown() { + xxx_messageInfo_Info.DiscardUnknown(m) } -func (m *Info) Reset() { *m = Info{} } -func (m *Info) String() string { return proto.CompactTextString(m) } -func (*Info) ProtoMessage() {} -func (*Info) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } +var xxx_messageInfo_Info proto.InternalMessageInfo func (m *Info) GetStatus() *Status { if m != nil { @@ -36,21 +64,21 @@ func (m *Info) GetStatus() *Status { return nil } -func (m *Info) GetFirstDeployed() *google_protobuf.Timestamp { +func (m *Info) GetFirstDeployed() *timestamp.Timestamp { if m != nil { return m.FirstDeployed } return nil } -func (m *Info) GetLastDeployed() *google_protobuf.Timestamp { +func (m *Info) GetLastDeployed() *timestamp.Timestamp { if m != nil { return m.LastDeployed } return nil } -func (m *Info) GetDeleted() *google_protobuf.Timestamp { +func (m *Info) GetDeleted() *timestamp.Timestamp { if m != nil { return m.Deleted } @@ -68,9 +96,9 @@ func init() { proto.RegisterType((*Info)(nil), "hapi.release.Info") } -func init() { proto.RegisterFile("hapi/release/info.proto", fileDescriptor1) } +func init() { proto.RegisterFile("hapi/release/info.proto", fileDescriptor_info_1c62b71ed76c67c1) } -var fileDescriptor1 = []byte{ +var fileDescriptor_info_1c62b71ed76c67c1 = []byte{ // 235 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0x31, 0x4f, 0xc3, 0x30, 0x10, 0x85, 0x95, 0x52, 0x5a, 0xd5, 0x6d, 0x19, 0x2c, 0x24, 0x42, 0x16, 0x22, 0xa6, 0x0e, 0xc8, diff --git a/pkg/proto/hapi/release/release.pb.go b/pkg/proto/hapi/release/release.pb.go index 511b543d790..e9578f00a78 100644 --- a/pkg/proto/hapi/release/release.pb.go +++ b/pkg/proto/hapi/release/release.pb.go @@ -6,40 +6,67 @@ package release import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import hapi_chart "k8s.io/helm/pkg/proto/hapi/chart" -import hapi_chart3 "k8s.io/helm/pkg/proto/hapi/chart" +import chart "k8s.io/helm/pkg/proto/hapi/chart" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + // Release describes a deployment of a chart, together with the chart // and the variables used to deploy that chart. type Release struct { // Name is the name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Info provides information about a release - Info *Info `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` // Chart is the chart that was released. - Chart *hapi_chart3.Chart `protobuf:"bytes,3,opt,name=chart" json:"chart,omitempty"` + Chart *chart.Chart `protobuf:"bytes,3,opt,name=chart,proto3" json:"chart,omitempty"` // Config is the set of extra Values added to the chart. // These values override the default values inside of the chart. - Config *hapi_chart.Config `protobuf:"bytes,4,opt,name=config" json:"config,omitempty"` + Config *chart.Config `protobuf:"bytes,4,opt,name=config,proto3" json:"config,omitempty"` // Manifest is the string representation of the rendered template. - Manifest string `protobuf:"bytes,5,opt,name=manifest" json:"manifest,omitempty"` + Manifest string `protobuf:"bytes,5,opt,name=manifest,proto3" json:"manifest,omitempty"` // Hooks are all of the hooks declared for this release. - Hooks []*Hook `protobuf:"bytes,6,rep,name=hooks" json:"hooks,omitempty"` + Hooks []*Hook `protobuf:"bytes,6,rep,name=hooks,proto3" json:"hooks,omitempty"` // Version is an int32 which represents the version of the release. - Version int32 `protobuf:"varint,7,opt,name=version" json:"version,omitempty"` + Version int32 `protobuf:"varint,7,opt,name=version,proto3" json:"version,omitempty"` // Namespace is the kubernetes namespace of the release. - Namespace string `protobuf:"bytes,8,opt,name=namespace" json:"namespace,omitempty"` + Namespace string `protobuf:"bytes,8,opt,name=namespace,proto3" json:"namespace,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Release) Reset() { *m = Release{} } +func (m *Release) String() string { return proto.CompactTextString(m) } +func (*Release) ProtoMessage() {} +func (*Release) Descriptor() ([]byte, []int) { + return fileDescriptor_release_4bea5d16ba219619, []int{0} +} +func (m *Release) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Release.Unmarshal(m, b) +} +func (m *Release) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Release.Marshal(b, m, deterministic) +} +func (dst *Release) XXX_Merge(src proto.Message) { + xxx_messageInfo_Release.Merge(dst, src) +} +func (m *Release) XXX_Size() int { + return xxx_messageInfo_Release.Size(m) +} +func (m *Release) XXX_DiscardUnknown() { + xxx_messageInfo_Release.DiscardUnknown(m) } -func (m *Release) Reset() { *m = Release{} } -func (m *Release) String() string { return proto.CompactTextString(m) } -func (*Release) ProtoMessage() {} -func (*Release) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} } +var xxx_messageInfo_Release proto.InternalMessageInfo func (m *Release) GetName() string { if m != nil { @@ -55,14 +82,14 @@ func (m *Release) GetInfo() *Info { return nil } -func (m *Release) GetChart() *hapi_chart3.Chart { +func (m *Release) GetChart() *chart.Chart { if m != nil { return m.Chart } return nil } -func (m *Release) GetConfig() *hapi_chart.Config { +func (m *Release) GetConfig() *chart.Config { if m != nil { return m.Config } @@ -101,9 +128,9 @@ func init() { proto.RegisterType((*Release)(nil), "hapi.release.Release") } -func init() { proto.RegisterFile("hapi/release/release.proto", fileDescriptor2) } +func init() { proto.RegisterFile("hapi/release/release.proto", fileDescriptor_release_4bea5d16ba219619) } -var fileDescriptor2 = []byte{ +var fileDescriptor_release_4bea5d16ba219619 = []byte{ // 256 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xbf, 0x4e, 0xc3, 0x40, 0x0c, 0xc6, 0x95, 0x36, 0x7f, 0x1a, 0xc3, 0x82, 0x07, 0xb0, 0x22, 0x86, 0x88, 0x01, 0x22, 0x86, diff --git a/pkg/proto/hapi/release/status.pb.go b/pkg/proto/hapi/release/status.pb.go index bc75e64b2c2..c5ed5920278 100644 --- a/pkg/proto/hapi/release/status.pb.go +++ b/pkg/proto/hapi/release/status.pb.go @@ -13,6 +13,12 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + type Status_Code int32 const ( @@ -62,23 +68,47 @@ var Status_Code_value = map[string]int32{ func (x Status_Code) String() string { return proto.EnumName(Status_Code_name, int32(x)) } -func (Status_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor3, []int{0, 0} } +func (Status_Code) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_status_933517e5a50981ed, []int{0, 0} +} // Status defines the status of a release. type Status struct { - Code Status_Code `protobuf:"varint,1,opt,name=code,enum=hapi.release.Status_Code" json:"code,omitempty"` + Code Status_Code `protobuf:"varint,1,opt,name=code,proto3,enum=hapi.release.Status_Code" json:"code,omitempty"` // Cluster resources as kubectl would print them. - Resources string `protobuf:"bytes,3,opt,name=resources" json:"resources,omitempty"` + Resources string `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"` // Contains the rendered templates/NOTES.txt if available - Notes string `protobuf:"bytes,4,opt,name=notes" json:"notes,omitempty"` + Notes string `protobuf:"bytes,4,opt,name=notes,proto3" json:"notes,omitempty"` // LastTestSuiteRun provides results on the last test run on a release - LastTestSuiteRun *TestSuite `protobuf:"bytes,5,opt,name=last_test_suite_run,json=lastTestSuiteRun" json:"last_test_suite_run,omitempty"` + LastTestSuiteRun *TestSuite `protobuf:"bytes,5,opt,name=last_test_suite_run,json=lastTestSuiteRun,proto3" json:"last_test_suite_run,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { + return fileDescriptor_status_933517e5a50981ed, []int{0} +} +func (m *Status) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Status.Unmarshal(m, b) +} +func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Status.Marshal(b, m, deterministic) +} +func (dst *Status) XXX_Merge(src proto.Message) { + xxx_messageInfo_Status.Merge(dst, src) +} +func (m *Status) XXX_Size() int { + return xxx_messageInfo_Status.Size(m) +} +func (m *Status) XXX_DiscardUnknown() { + xxx_messageInfo_Status.DiscardUnknown(m) } -func (m *Status) Reset() { *m = Status{} } -func (m *Status) String() string { return proto.CompactTextString(m) } -func (*Status) ProtoMessage() {} -func (*Status) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{0} } +var xxx_messageInfo_Status proto.InternalMessageInfo func (m *Status) GetCode() Status_Code { if m != nil { @@ -113,9 +143,9 @@ func init() { proto.RegisterEnum("hapi.release.Status_Code", Status_Code_name, Status_Code_value) } -func init() { proto.RegisterFile("hapi/release/status.proto", fileDescriptor3) } +func init() { proto.RegisterFile("hapi/release/status.proto", fileDescriptor_status_933517e5a50981ed) } -var fileDescriptor3 = []byte{ +var fileDescriptor_status_933517e5a50981ed = []byte{ // 333 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0xd1, 0x6e, 0xa2, 0x40, 0x14, 0x86, 0x17, 0x45, 0xd4, 0xa3, 0x71, 0x27, 0xa3, 0xc9, 0xa2, 0xd9, 0x4d, 0x8c, 0x57, 0xde, diff --git a/pkg/proto/hapi/release/test_run.pb.go b/pkg/proto/hapi/release/test_run.pb.go index 4d39d17c2b8..f43be231d0e 100644 --- a/pkg/proto/hapi/release/test_run.pb.go +++ b/pkg/proto/hapi/release/test_run.pb.go @@ -6,13 +6,19 @@ package release import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/timestamp" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + type TestRun_Status int32 const ( @@ -38,20 +44,44 @@ var TestRun_Status_value = map[string]int32{ func (x TestRun_Status) String() string { return proto.EnumName(TestRun_Status_name, int32(x)) } -func (TestRun_Status) EnumDescriptor() ([]byte, []int) { return fileDescriptor4, []int{0, 0} } +func (TestRun_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_test_run_31b133e40c63664e, []int{0, 0} +} type TestRun struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Status TestRun_Status `protobuf:"varint,2,opt,name=status,enum=hapi.release.TestRun_Status" json:"status,omitempty"` - Info string `protobuf:"bytes,3,opt,name=info" json:"info,omitempty"` - StartedAt *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=started_at,json=startedAt" json:"started_at,omitempty"` - CompletedAt *google_protobuf.Timestamp `protobuf:"bytes,5,opt,name=completed_at,json=completedAt" json:"completed_at,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status TestRun_Status `protobuf:"varint,2,opt,name=status,proto3,enum=hapi.release.TestRun_Status" json:"status,omitempty"` + Info string `protobuf:"bytes,3,opt,name=info,proto3" json:"info,omitempty"` + StartedAt *timestamp.Timestamp `protobuf:"bytes,4,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + CompletedAt *timestamp.Timestamp `protobuf:"bytes,5,opt,name=completed_at,json=completedAt,proto3" json:"completed_at,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *TestRun) Reset() { *m = TestRun{} } -func (m *TestRun) String() string { return proto.CompactTextString(m) } -func (*TestRun) ProtoMessage() {} -func (*TestRun) Descriptor() ([]byte, []int) { return fileDescriptor4, []int{0} } +func (m *TestRun) Reset() { *m = TestRun{} } +func (m *TestRun) String() string { return proto.CompactTextString(m) } +func (*TestRun) ProtoMessage() {} +func (*TestRun) Descriptor() ([]byte, []int) { + return fileDescriptor_test_run_31b133e40c63664e, []int{0} +} +func (m *TestRun) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestRun.Unmarshal(m, b) +} +func (m *TestRun) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestRun.Marshal(b, m, deterministic) +} +func (dst *TestRun) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestRun.Merge(dst, src) +} +func (m *TestRun) XXX_Size() int { + return xxx_messageInfo_TestRun.Size(m) +} +func (m *TestRun) XXX_DiscardUnknown() { + xxx_messageInfo_TestRun.DiscardUnknown(m) +} + +var xxx_messageInfo_TestRun proto.InternalMessageInfo func (m *TestRun) GetName() string { if m != nil { @@ -74,14 +104,14 @@ func (m *TestRun) GetInfo() string { return "" } -func (m *TestRun) GetStartedAt() *google_protobuf.Timestamp { +func (m *TestRun) GetStartedAt() *timestamp.Timestamp { if m != nil { return m.StartedAt } return nil } -func (m *TestRun) GetCompletedAt() *google_protobuf.Timestamp { +func (m *TestRun) GetCompletedAt() *timestamp.Timestamp { if m != nil { return m.CompletedAt } @@ -93,9 +123,11 @@ func init() { proto.RegisterEnum("hapi.release.TestRun_Status", TestRun_Status_name, TestRun_Status_value) } -func init() { proto.RegisterFile("hapi/release/test_run.proto", fileDescriptor4) } +func init() { + proto.RegisterFile("hapi/release/test_run.proto", fileDescriptor_test_run_31b133e40c63664e) +} -var fileDescriptor4 = []byte{ +var fileDescriptor_test_run_31b133e40c63664e = []byte{ // 274 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0xc1, 0x4b, 0xfb, 0x30, 0x1c, 0xc5, 0x7f, 0xe9, 0xf6, 0x6b, 0x69, 0x3a, 0xa4, 0xe4, 0x54, 0xa6, 0x60, 0xd9, 0xa9, 0xa7, diff --git a/pkg/proto/hapi/release/test_suite.pb.go b/pkg/proto/hapi/release/test_suite.pb.go index b7fa261476d..d2cf3a9793f 100644 --- a/pkg/proto/hapi/release/test_suite.pb.go +++ b/pkg/proto/hapi/release/test_suite.pb.go @@ -6,36 +6,64 @@ package release import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/timestamp" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + // TestSuite comprises of the last run of the pre-defined test suite of a release version type TestSuite struct { // StartedAt indicates the date/time this test suite was kicked off - StartedAt *google_protobuf.Timestamp `protobuf:"bytes,1,opt,name=started_at,json=startedAt" json:"started_at,omitempty"` + StartedAt *timestamp.Timestamp `protobuf:"bytes,1,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` // CompletedAt indicates the date/time this test suite was completed - CompletedAt *google_protobuf.Timestamp `protobuf:"bytes,2,opt,name=completed_at,json=completedAt" json:"completed_at,omitempty"` + CompletedAt *timestamp.Timestamp `protobuf:"bytes,2,opt,name=completed_at,json=completedAt,proto3" json:"completed_at,omitempty"` // Results are the results of each segment of the test - Results []*TestRun `protobuf:"bytes,3,rep,name=results" json:"results,omitempty"` + Results []*TestRun `protobuf:"bytes,3,rep,name=results,proto3" json:"results,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TestSuite) Reset() { *m = TestSuite{} } +func (m *TestSuite) String() string { return proto.CompactTextString(m) } +func (*TestSuite) ProtoMessage() {} +func (*TestSuite) Descriptor() ([]byte, []int) { + return fileDescriptor_test_suite_06a0016f2c6417b8, []int{0} +} +func (m *TestSuite) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestSuite.Unmarshal(m, b) +} +func (m *TestSuite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestSuite.Marshal(b, m, deterministic) +} +func (dst *TestSuite) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestSuite.Merge(dst, src) +} +func (m *TestSuite) XXX_Size() int { + return xxx_messageInfo_TestSuite.Size(m) +} +func (m *TestSuite) XXX_DiscardUnknown() { + xxx_messageInfo_TestSuite.DiscardUnknown(m) } -func (m *TestSuite) Reset() { *m = TestSuite{} } -func (m *TestSuite) String() string { return proto.CompactTextString(m) } -func (*TestSuite) ProtoMessage() {} -func (*TestSuite) Descriptor() ([]byte, []int) { return fileDescriptor5, []int{0} } +var xxx_messageInfo_TestSuite proto.InternalMessageInfo -func (m *TestSuite) GetStartedAt() *google_protobuf.Timestamp { +func (m *TestSuite) GetStartedAt() *timestamp.Timestamp { if m != nil { return m.StartedAt } return nil } -func (m *TestSuite) GetCompletedAt() *google_protobuf.Timestamp { +func (m *TestSuite) GetCompletedAt() *timestamp.Timestamp { if m != nil { return m.CompletedAt } @@ -53,9 +81,11 @@ func init() { proto.RegisterType((*TestSuite)(nil), "hapi.release.TestSuite") } -func init() { proto.RegisterFile("hapi/release/test_suite.proto", fileDescriptor5) } +func init() { + proto.RegisterFile("hapi/release/test_suite.proto", fileDescriptor_test_suite_06a0016f2c6417b8) +} -var fileDescriptor5 = []byte{ +var fileDescriptor_test_suite_06a0016f2c6417b8 = []byte{ // 207 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0xc1, 0x4a, 0x86, 0x40, 0x14, 0x85, 0x31, 0x21, 0x71, 0x74, 0x35, 0x10, 0x88, 0x11, 0x49, 0x2b, 0x57, 0x33, 0x60, 0xab, diff --git a/pkg/proto/hapi/rudder/rudder.pb.go b/pkg/proto/hapi/rudder/rudder.pb.go index 3a0de7746e1..d594836c4fe 100644 --- a/pkg/proto/hapi/rudder/rudder.pb.go +++ b/pkg/proto/hapi/rudder/rudder.pb.go @@ -1,34 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: hapi/rudder/rudder.proto -/* -Package rudder is a generated protocol buffer package. - -It is generated from these files: - hapi/rudder/rudder.proto - -It has these top-level messages: - Result - VersionReleaseRequest - VersionReleaseResponse - InstallReleaseRequest - InstallReleaseResponse - DeleteReleaseRequest - DeleteReleaseResponse - UpgradeReleaseRequest - UpgradeReleaseResponse - RollbackReleaseRequest - RollbackReleaseResponse - ReleaseStatusRequest - ReleaseStatusResponse -*/ package rudder import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import hapi_release3 "k8s.io/helm/pkg/proto/hapi/release" -import hapi_release5 "k8s.io/helm/pkg/proto/hapi/release" +import release "k8s.io/helm/pkg/proto/hapi/release" import ( context "golang.org/x/net/context" @@ -75,17 +53,41 @@ var Result_Status_value = map[string]int32{ func (x Result_Status) String() string { return proto.EnumName(Result_Status_name, int32(x)) } -func (Result_Status) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } +func (Result_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{0, 0} +} type Result struct { - Info string `protobuf:"bytes,1,opt,name=info" json:"info,omitempty"` - Log []string `protobuf:"bytes,2,rep,name=log" json:"log,omitempty"` + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + Log []string `protobuf:"bytes,2,rep,name=log,proto3" json:"log,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Result) Reset() { *m = Result{} } +func (m *Result) String() string { return proto.CompactTextString(m) } +func (*Result) ProtoMessage() {} +func (*Result) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{0} +} +func (m *Result) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Result.Unmarshal(m, b) +} +func (m *Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Result.Marshal(b, m, deterministic) +} +func (dst *Result) XXX_Merge(src proto.Message) { + xxx_messageInfo_Result.Merge(dst, src) +} +func (m *Result) XXX_Size() int { + return xxx_messageInfo_Result.Size(m) +} +func (m *Result) XXX_DiscardUnknown() { + xxx_messageInfo_Result.DiscardUnknown(m) } -func (m *Result) Reset() { *m = Result{} } -func (m *Result) String() string { return proto.CompactTextString(m) } -func (*Result) ProtoMessage() {} -func (*Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_Result proto.InternalMessageInfo func (m *Result) GetInfo() string { if m != nil { @@ -102,22 +104,66 @@ func (m *Result) GetLog() []string { } type VersionReleaseRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *VersionReleaseRequest) Reset() { *m = VersionReleaseRequest{} } +func (m *VersionReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*VersionReleaseRequest) ProtoMessage() {} +func (*VersionReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{1} +} +func (m *VersionReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_VersionReleaseRequest.Unmarshal(m, b) +} +func (m *VersionReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_VersionReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *VersionReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_VersionReleaseRequest.Merge(dst, src) +} +func (m *VersionReleaseRequest) XXX_Size() int { + return xxx_messageInfo_VersionReleaseRequest.Size(m) +} +func (m *VersionReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_VersionReleaseRequest.DiscardUnknown(m) } -func (m *VersionReleaseRequest) Reset() { *m = VersionReleaseRequest{} } -func (m *VersionReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*VersionReleaseRequest) ProtoMessage() {} -func (*VersionReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +var xxx_messageInfo_VersionReleaseRequest proto.InternalMessageInfo type VersionReleaseResponse struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Version string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *VersionReleaseResponse) Reset() { *m = VersionReleaseResponse{} } +func (m *VersionReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*VersionReleaseResponse) ProtoMessage() {} +func (*VersionReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{2} +} +func (m *VersionReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_VersionReleaseResponse.Unmarshal(m, b) +} +func (m *VersionReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_VersionReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *VersionReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_VersionReleaseResponse.Merge(dst, src) +} +func (m *VersionReleaseResponse) XXX_Size() int { + return xxx_messageInfo_VersionReleaseResponse.Size(m) +} +func (m *VersionReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_VersionReleaseResponse.DiscardUnknown(m) } -func (m *VersionReleaseResponse) Reset() { *m = VersionReleaseResponse{} } -func (m *VersionReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*VersionReleaseResponse) ProtoMessage() {} -func (*VersionReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +var xxx_messageInfo_VersionReleaseResponse proto.InternalMessageInfo func (m *VersionReleaseResponse) GetName() string { if m != nil { @@ -134,15 +180,37 @@ func (m *VersionReleaseResponse) GetVersion() string { } type InstallReleaseRequest struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } -func (m *InstallReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*InstallReleaseRequest) ProtoMessage() {} -func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } +func (m *InstallReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*InstallReleaseRequest) ProtoMessage() {} +func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{3} +} +func (m *InstallReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InstallReleaseRequest.Unmarshal(m, b) +} +func (m *InstallReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InstallReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *InstallReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InstallReleaseRequest.Merge(dst, src) +} +func (m *InstallReleaseRequest) XXX_Size() int { + return xxx_messageInfo_InstallReleaseRequest.Size(m) +} +func (m *InstallReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_InstallReleaseRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_InstallReleaseRequest proto.InternalMessageInfo -func (m *InstallReleaseRequest) GetRelease() *hapi_release5.Release { +func (m *InstallReleaseRequest) GetRelease() *release.Release { if m != nil { return m.Release } @@ -150,16 +218,38 @@ func (m *InstallReleaseRequest) GetRelease() *hapi_release5.Release { } type InstallReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` - Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + Result *Result `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} } +func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*InstallReleaseResponse) ProtoMessage() {} +func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{4} +} +func (m *InstallReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InstallReleaseResponse.Unmarshal(m, b) +} +func (m *InstallReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InstallReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *InstallReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_InstallReleaseResponse.Merge(dst, src) +} +func (m *InstallReleaseResponse) XXX_Size() int { + return xxx_messageInfo_InstallReleaseResponse.Size(m) +} +func (m *InstallReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_InstallReleaseResponse.DiscardUnknown(m) } -func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} } -func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*InstallReleaseResponse) ProtoMessage() {} -func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +var xxx_messageInfo_InstallReleaseResponse proto.InternalMessageInfo -func (m *InstallReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *InstallReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -174,15 +264,37 @@ func (m *InstallReleaseResponse) GetResult() *Result { } type DeleteReleaseRequest struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *DeleteReleaseRequest) Reset() { *m = DeleteReleaseRequest{} } -func (m *DeleteReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteReleaseRequest) ProtoMessage() {} -func (*DeleteReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (m *DeleteReleaseRequest) Reset() { *m = DeleteReleaseRequest{} } +func (m *DeleteReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteReleaseRequest) ProtoMessage() {} +func (*DeleteReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{5} +} +func (m *DeleteReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeleteReleaseRequest.Unmarshal(m, b) +} +func (m *DeleteReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeleteReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *DeleteReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteReleaseRequest.Merge(dst, src) +} +func (m *DeleteReleaseRequest) XXX_Size() int { + return xxx_messageInfo_DeleteReleaseRequest.Size(m) +} +func (m *DeleteReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeleteReleaseRequest.DiscardUnknown(m) +} -func (m *DeleteReleaseRequest) GetRelease() *hapi_release5.Release { +var xxx_messageInfo_DeleteReleaseRequest proto.InternalMessageInfo + +func (m *DeleteReleaseRequest) GetRelease() *release.Release { if m != nil { return m.Release } @@ -190,16 +302,38 @@ func (m *DeleteReleaseRequest) GetRelease() *hapi_release5.Release { } type DeleteReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` - Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + Result *Result `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeleteReleaseResponse) Reset() { *m = DeleteReleaseResponse{} } +func (m *DeleteReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteReleaseResponse) ProtoMessage() {} +func (*DeleteReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{6} +} +func (m *DeleteReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DeleteReleaseResponse.Unmarshal(m, b) +} +func (m *DeleteReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DeleteReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *DeleteReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeleteReleaseResponse.Merge(dst, src) +} +func (m *DeleteReleaseResponse) XXX_Size() int { + return xxx_messageInfo_DeleteReleaseResponse.Size(m) +} +func (m *DeleteReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DeleteReleaseResponse.DiscardUnknown(m) } -func (m *DeleteReleaseResponse) Reset() { *m = DeleteReleaseResponse{} } -func (m *DeleteReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*DeleteReleaseResponse) ProtoMessage() {} -func (*DeleteReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +var xxx_messageInfo_DeleteReleaseResponse proto.InternalMessageInfo -func (m *DeleteReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *DeleteReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -214,28 +348,50 @@ func (m *DeleteReleaseResponse) GetResult() *Result { } type UpgradeReleaseRequest struct { - Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` - Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` - Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` - Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` - Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` - Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` - CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail" json:"CleanupOnFail,omitempty"` + Current *release.Release `protobuf:"bytes,1,opt,name=current,proto3" json:"current,omitempty"` + Target *release.Release `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + Timeout int64 `protobuf:"varint,3,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + Wait bool `protobuf:"varint,4,opt,name=Wait,proto3" json:"Wait,omitempty"` + Recreate bool `protobuf:"varint,5,opt,name=Recreate,proto3" json:"Recreate,omitempty"` + Force bool `protobuf:"varint,6,opt,name=Force,proto3" json:"Force,omitempty"` + CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail,proto3" json:"CleanupOnFail,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpgradeReleaseRequest) Reset() { *m = UpgradeReleaseRequest{} } +func (m *UpgradeReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*UpgradeReleaseRequest) ProtoMessage() {} +func (*UpgradeReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{7} +} +func (m *UpgradeReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UpgradeReleaseRequest.Unmarshal(m, b) +} +func (m *UpgradeReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UpgradeReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *UpgradeReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpgradeReleaseRequest.Merge(dst, src) +} +func (m *UpgradeReleaseRequest) XXX_Size() int { + return xxx_messageInfo_UpgradeReleaseRequest.Size(m) +} +func (m *UpgradeReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_UpgradeReleaseRequest.DiscardUnknown(m) } -func (m *UpgradeReleaseRequest) Reset() { *m = UpgradeReleaseRequest{} } -func (m *UpgradeReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*UpgradeReleaseRequest) ProtoMessage() {} -func (*UpgradeReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +var xxx_messageInfo_UpgradeReleaseRequest proto.InternalMessageInfo -func (m *UpgradeReleaseRequest) GetCurrent() *hapi_release5.Release { +func (m *UpgradeReleaseRequest) GetCurrent() *release.Release { if m != nil { return m.Current } return nil } -func (m *UpgradeReleaseRequest) GetTarget() *hapi_release5.Release { +func (m *UpgradeReleaseRequest) GetTarget() *release.Release { if m != nil { return m.Target } @@ -278,16 +434,38 @@ func (m *UpgradeReleaseRequest) GetCleanupOnFail() bool { } type UpgradeReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` - Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + Result *Result `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpgradeReleaseResponse) Reset() { *m = UpgradeReleaseResponse{} } +func (m *UpgradeReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*UpgradeReleaseResponse) ProtoMessage() {} +func (*UpgradeReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{8} +} +func (m *UpgradeReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UpgradeReleaseResponse.Unmarshal(m, b) +} +func (m *UpgradeReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UpgradeReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *UpgradeReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpgradeReleaseResponse.Merge(dst, src) +} +func (m *UpgradeReleaseResponse) XXX_Size() int { + return xxx_messageInfo_UpgradeReleaseResponse.Size(m) +} +func (m *UpgradeReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_UpgradeReleaseResponse.DiscardUnknown(m) } -func (m *UpgradeReleaseResponse) Reset() { *m = UpgradeReleaseResponse{} } -func (m *UpgradeReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*UpgradeReleaseResponse) ProtoMessage() {} -func (*UpgradeReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +var xxx_messageInfo_UpgradeReleaseResponse proto.InternalMessageInfo -func (m *UpgradeReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *UpgradeReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -302,28 +480,50 @@ func (m *UpgradeReleaseResponse) GetResult() *Result { } type RollbackReleaseRequest struct { - Current *hapi_release5.Release `protobuf:"bytes,1,opt,name=current" json:"current,omitempty"` - Target *hapi_release5.Release `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` - Timeout int64 `protobuf:"varint,3,opt,name=Timeout" json:"Timeout,omitempty"` - Wait bool `protobuf:"varint,4,opt,name=Wait" json:"Wait,omitempty"` - Recreate bool `protobuf:"varint,5,opt,name=Recreate" json:"Recreate,omitempty"` - Force bool `protobuf:"varint,6,opt,name=Force" json:"Force,omitempty"` - CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail" json:"CleanupOnFail,omitempty"` + Current *release.Release `protobuf:"bytes,1,opt,name=current,proto3" json:"current,omitempty"` + Target *release.Release `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + Timeout int64 `protobuf:"varint,3,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + Wait bool `protobuf:"varint,4,opt,name=Wait,proto3" json:"Wait,omitempty"` + Recreate bool `protobuf:"varint,5,opt,name=Recreate,proto3" json:"Recreate,omitempty"` + Force bool `protobuf:"varint,6,opt,name=Force,proto3" json:"Force,omitempty"` + CleanupOnFail bool `protobuf:"varint,7,opt,name=CleanupOnFail,proto3" json:"CleanupOnFail,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } +func (m *RollbackReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*RollbackReleaseRequest) ProtoMessage() {} +func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{9} +} +func (m *RollbackReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RollbackReleaseRequest.Unmarshal(m, b) +} +func (m *RollbackReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RollbackReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *RollbackReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RollbackReleaseRequest.Merge(dst, src) +} +func (m *RollbackReleaseRequest) XXX_Size() int { + return xxx_messageInfo_RollbackReleaseRequest.Size(m) +} +func (m *RollbackReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RollbackReleaseRequest.DiscardUnknown(m) } -func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } -func (m *RollbackReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*RollbackReleaseRequest) ProtoMessage() {} -func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +var xxx_messageInfo_RollbackReleaseRequest proto.InternalMessageInfo -func (m *RollbackReleaseRequest) GetCurrent() *hapi_release5.Release { +func (m *RollbackReleaseRequest) GetCurrent() *release.Release { if m != nil { return m.Current } return nil } -func (m *RollbackReleaseRequest) GetTarget() *hapi_release5.Release { +func (m *RollbackReleaseRequest) GetTarget() *release.Release { if m != nil { return m.Target } @@ -366,16 +566,38 @@ func (m *RollbackReleaseRequest) GetCleanupOnFail() bool { } type RollbackReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` - Result *Result `protobuf:"bytes,2,opt,name=result" json:"result,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + Result *Result `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RollbackReleaseResponse) Reset() { *m = RollbackReleaseResponse{} } -func (m *RollbackReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*RollbackReleaseResponse) ProtoMessage() {} -func (*RollbackReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (m *RollbackReleaseResponse) Reset() { *m = RollbackReleaseResponse{} } +func (m *RollbackReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*RollbackReleaseResponse) ProtoMessage() {} +func (*RollbackReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{10} +} +func (m *RollbackReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RollbackReleaseResponse.Unmarshal(m, b) +} +func (m *RollbackReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RollbackReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *RollbackReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RollbackReleaseResponse.Merge(dst, src) +} +func (m *RollbackReleaseResponse) XXX_Size() int { + return xxx_messageInfo_RollbackReleaseResponse.Size(m) +} +func (m *RollbackReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RollbackReleaseResponse.DiscardUnknown(m) +} -func (m *RollbackReleaseResponse) GetRelease() *hapi_release5.Release { +var xxx_messageInfo_RollbackReleaseResponse proto.InternalMessageInfo + +func (m *RollbackReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -390,15 +612,37 @@ func (m *RollbackReleaseResponse) GetResult() *Result { } type ReleaseStatusRequest struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ReleaseStatusRequest) Reset() { *m = ReleaseStatusRequest{} } -func (m *ReleaseStatusRequest) String() string { return proto.CompactTextString(m) } -func (*ReleaseStatusRequest) ProtoMessage() {} -func (*ReleaseStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (m *ReleaseStatusRequest) Reset() { *m = ReleaseStatusRequest{} } +func (m *ReleaseStatusRequest) String() string { return proto.CompactTextString(m) } +func (*ReleaseStatusRequest) ProtoMessage() {} +func (*ReleaseStatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{11} +} +func (m *ReleaseStatusRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReleaseStatusRequest.Unmarshal(m, b) +} +func (m *ReleaseStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReleaseStatusRequest.Marshal(b, m, deterministic) +} +func (dst *ReleaseStatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReleaseStatusRequest.Merge(dst, src) +} +func (m *ReleaseStatusRequest) XXX_Size() int { + return xxx_messageInfo_ReleaseStatusRequest.Size(m) +} +func (m *ReleaseStatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ReleaseStatusRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ReleaseStatusRequest proto.InternalMessageInfo -func (m *ReleaseStatusRequest) GetRelease() *hapi_release5.Release { +func (m *ReleaseStatusRequest) GetRelease() *release.Release { if m != nil { return m.Release } @@ -406,23 +650,45 @@ func (m *ReleaseStatusRequest) GetRelease() *hapi_release5.Release { } type ReleaseStatusResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` - Info *hapi_release3.Info `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + Info *release.Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ReleaseStatusResponse) Reset() { *m = ReleaseStatusResponse{} } -func (m *ReleaseStatusResponse) String() string { return proto.CompactTextString(m) } -func (*ReleaseStatusResponse) ProtoMessage() {} -func (*ReleaseStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (m *ReleaseStatusResponse) Reset() { *m = ReleaseStatusResponse{} } +func (m *ReleaseStatusResponse) String() string { return proto.CompactTextString(m) } +func (*ReleaseStatusResponse) ProtoMessage() {} +func (*ReleaseStatusResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_rudder_dd8cdbe38a210d28, []int{12} +} +func (m *ReleaseStatusResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ReleaseStatusResponse.Unmarshal(m, b) +} +func (m *ReleaseStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ReleaseStatusResponse.Marshal(b, m, deterministic) +} +func (dst *ReleaseStatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReleaseStatusResponse.Merge(dst, src) +} +func (m *ReleaseStatusResponse) XXX_Size() int { + return xxx_messageInfo_ReleaseStatusResponse.Size(m) +} +func (m *ReleaseStatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ReleaseStatusResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ReleaseStatusResponse proto.InternalMessageInfo -func (m *ReleaseStatusResponse) GetRelease() *hapi_release5.Release { +func (m *ReleaseStatusResponse) GetRelease() *release.Release { if m != nil { return m.Release } return nil } -func (m *ReleaseStatusResponse) GetInfo() *hapi_release3.Info { +func (m *ReleaseStatusResponse) GetInfo() *release.Info { if m != nil { return m.Info } @@ -454,8 +720,9 @@ var _ grpc.ClientConn // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 -// Client API for ReleaseModuleService service - +// ReleaseModuleServiceClient is the client API for ReleaseModuleService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ReleaseModuleServiceClient interface { Version(ctx context.Context, in *VersionReleaseRequest, opts ...grpc.CallOption) (*VersionReleaseResponse, error) // InstallRelease requests installation of a chart as a new release. @@ -480,7 +747,7 @@ func NewReleaseModuleServiceClient(cc *grpc.ClientConn) ReleaseModuleServiceClie func (c *releaseModuleServiceClient) Version(ctx context.Context, in *VersionReleaseRequest, opts ...grpc.CallOption) (*VersionReleaseResponse, error) { out := new(VersionReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/Version", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/Version", in, out, opts...) if err != nil { return nil, err } @@ -489,7 +756,7 @@ func (c *releaseModuleServiceClient) Version(ctx context.Context, in *VersionRel func (c *releaseModuleServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) { out := new(InstallReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/InstallRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/InstallRelease", in, out, opts...) if err != nil { return nil, err } @@ -498,7 +765,7 @@ func (c *releaseModuleServiceClient) InstallRelease(ctx context.Context, in *Ins func (c *releaseModuleServiceClient) DeleteRelease(ctx context.Context, in *DeleteReleaseRequest, opts ...grpc.CallOption) (*DeleteReleaseResponse, error) { out := new(DeleteReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/DeleteRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/DeleteRelease", in, out, opts...) if err != nil { return nil, err } @@ -507,7 +774,7 @@ func (c *releaseModuleServiceClient) DeleteRelease(ctx context.Context, in *Dele func (c *releaseModuleServiceClient) RollbackRelease(ctx context.Context, in *RollbackReleaseRequest, opts ...grpc.CallOption) (*RollbackReleaseResponse, error) { out := new(RollbackReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/RollbackRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/RollbackRelease", in, out, opts...) if err != nil { return nil, err } @@ -516,7 +783,7 @@ func (c *releaseModuleServiceClient) RollbackRelease(ctx context.Context, in *Ro func (c *releaseModuleServiceClient) UpgradeRelease(ctx context.Context, in *UpgradeReleaseRequest, opts ...grpc.CallOption) (*UpgradeReleaseResponse, error) { out := new(UpgradeReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/UpgradeRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/UpgradeRelease", in, out, opts...) if err != nil { return nil, err } @@ -525,15 +792,14 @@ func (c *releaseModuleServiceClient) UpgradeRelease(ctx context.Context, in *Upg func (c *releaseModuleServiceClient) ReleaseStatus(ctx context.Context, in *ReleaseStatusRequest, opts ...grpc.CallOption) (*ReleaseStatusResponse, error) { out := new(ReleaseStatusResponse) - err := grpc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/ReleaseStatus", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.rudder.ReleaseModuleService/ReleaseStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } -// Server API for ReleaseModuleService service - +// ReleaseModuleServiceServer is the server API for ReleaseModuleService service. type ReleaseModuleServiceServer interface { Version(context.Context, *VersionReleaseRequest) (*VersionReleaseResponse, error) // InstallRelease requests installation of a chart as a new release. @@ -693,9 +959,9 @@ var _ReleaseModuleService_serviceDesc = grpc.ServiceDesc{ Metadata: "hapi/rudder/rudder.proto", } -func init() { proto.RegisterFile("hapi/rudder/rudder.proto", fileDescriptor0) } +func init() { proto.RegisterFile("hapi/rudder/rudder.proto", fileDescriptor_rudder_dd8cdbe38a210d28) } -var fileDescriptor0 = []byte{ +var fileDescriptor_rudder_dd8cdbe38a210d28 = []byte{ // 615 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x56, 0x4d, 0x6f, 0xd3, 0x40, 0x10, 0x8d, 0x9b, 0xc6, 0x69, 0xa6, 0x2a, 0x44, 0xab, 0xba, 0xb5, 0x2c, 0x0e, 0x91, 0x85, 0x50, diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index ab6e573e5ab..894d2eb0322 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -1,47 +1,14 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: hapi/services/tiller.proto -/* -Package services is a generated protocol buffer package. - -It is generated from these files: - hapi/services/tiller.proto - -It has these top-level messages: - ListReleasesRequest - ListSort - ListReleasesResponse - GetReleaseStatusRequest - GetReleaseStatusResponse - GetReleaseContentRequest - GetReleaseContentResponse - UpdateReleaseRequest - UpdateReleaseResponse - RollbackReleaseRequest - RollbackReleaseResponse - InstallReleaseRequest - InstallReleaseResponse - UninstallReleaseRequest - UninstallReleaseResponse - GetVersionRequest - GetVersionResponse - GetHistoryRequest - GetHistoryResponse - TestReleaseRequest - TestReleaseResponse -*/ package services import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" -import hapi_chart3 "k8s.io/helm/pkg/proto/hapi/chart" -import hapi_chart "k8s.io/helm/pkg/proto/hapi/chart" -import hapi_release5 "k8s.io/helm/pkg/proto/hapi/release" -import hapi_release4 "k8s.io/helm/pkg/proto/hapi/release" -import hapi_release1 "k8s.io/helm/pkg/proto/hapi/release" -import hapi_release3 "k8s.io/helm/pkg/proto/hapi/release" -import hapi_version "k8s.io/helm/pkg/proto/hapi/version" +import chart "k8s.io/helm/pkg/proto/hapi/chart" +import release "k8s.io/helm/pkg/proto/hapi/release" +import version "k8s.io/helm/pkg/proto/hapi/version" import ( context "golang.org/x/net/context" @@ -85,7 +52,9 @@ var ListSort_SortBy_value = map[string]int32{ func (x ListSort_SortBy) String() string { return proto.EnumName(ListSort_SortBy_name, int32(x)) } -func (ListSort_SortBy) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} } +func (ListSort_SortBy) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{1, 0} +} // SortOrder defines sort orders to augment sorting operations. type ListSort_SortOrder int32 @@ -107,7 +76,9 @@ var ListSort_SortOrder_value = map[string]int32{ func (x ListSort_SortOrder) String() string { return proto.EnumName(ListSort_SortOrder_name, int32(x)) } -func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 1} } +func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{1, 1} +} // ListReleasesRequest requests a list of releases. // @@ -116,30 +87,52 @@ func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescript // Releases can be sorted according to a few pre-determined sort strategies. type ListReleasesRequest struct { // Limit is the maximum number of releases to be returned. - Limit int64 `protobuf:"varint,1,opt,name=limit" json:"limit,omitempty"` + Limit int64 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` // Offset is the last release name that was seen. The next listing // operation will start with the name after this one. // Example: If list one returns albert, bernie, carl, and sets 'next: dennis'. // dennis is the offset. Supplying 'dennis' for the next request should // cause the next batch to return a set of results starting with 'dennis'. - Offset string `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"` + Offset string `protobuf:"bytes,2,opt,name=offset,proto3" json:"offset,omitempty"` // SortBy is the sort field that the ListReleases server should sort data before returning. - SortBy ListSort_SortBy `protobuf:"varint,3,opt,name=sort_by,json=sortBy,enum=hapi.services.tiller.ListSort_SortBy" json:"sort_by,omitempty"` + SortBy ListSort_SortBy `protobuf:"varint,3,opt,name=sort_by,json=sortBy,proto3,enum=hapi.services.tiller.ListSort_SortBy" json:"sort_by,omitempty"` // Filter is a regular expression used to filter which releases should be listed. // // Anything that matches the regexp will be included in the results. - Filter string `protobuf:"bytes,4,opt,name=filter" json:"filter,omitempty"` + Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"` // SortOrder is the ordering directive used for sorting. - SortOrder ListSort_SortOrder `protobuf:"varint,5,opt,name=sort_order,json=sortOrder,enum=hapi.services.tiller.ListSort_SortOrder" json:"sort_order,omitempty"` - StatusCodes []hapi_release3.Status_Code `protobuf:"varint,6,rep,packed,name=status_codes,json=statusCodes,enum=hapi.release.Status_Code" json:"status_codes,omitempty"` + SortOrder ListSort_SortOrder `protobuf:"varint,5,opt,name=sort_order,json=sortOrder,proto3,enum=hapi.services.tiller.ListSort_SortOrder" json:"sort_order,omitempty"` + StatusCodes []release.Status_Code `protobuf:"varint,6,rep,packed,name=status_codes,json=statusCodes,proto3,enum=hapi.release.Status_Code" json:"status_codes,omitempty"` // Namespace is the filter to select releases only from a specific namespace. - Namespace string `protobuf:"bytes,7,opt,name=namespace" json:"namespace,omitempty"` + Namespace string `protobuf:"bytes,7,opt,name=namespace,proto3" json:"namespace,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } +func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } +func (*ListReleasesRequest) ProtoMessage() {} +func (*ListReleasesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{0} +} +func (m *ListReleasesRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListReleasesRequest.Unmarshal(m, b) +} +func (m *ListReleasesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListReleasesRequest.Marshal(b, m, deterministic) +} +func (dst *ListReleasesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReleasesRequest.Merge(dst, src) +} +func (m *ListReleasesRequest) XXX_Size() int { + return xxx_messageInfo_ListReleasesRequest.Size(m) +} +func (m *ListReleasesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListReleasesRequest.DiscardUnknown(m) } -func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } -func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } -func (*ListReleasesRequest) ProtoMessage() {} -func (*ListReleasesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_ListReleasesRequest proto.InternalMessageInfo func (m *ListReleasesRequest) GetLimit() int64 { if m != nil { @@ -176,7 +169,7 @@ func (m *ListReleasesRequest) GetSortOrder() ListSort_SortOrder { return ListSort_ASC } -func (m *ListReleasesRequest) GetStatusCodes() []hapi_release3.Status_Code { +func (m *ListReleasesRequest) GetStatusCodes() []release.Status_Code { if m != nil { return m.StatusCodes } @@ -192,30 +185,74 @@ func (m *ListReleasesRequest) GetNamespace() string { // ListSort defines sorting fields on a release list. type ListSort struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ListSort) Reset() { *m = ListSort{} } -func (m *ListSort) String() string { return proto.CompactTextString(m) } -func (*ListSort) ProtoMessage() {} -func (*ListSort) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (m *ListSort) Reset() { *m = ListSort{} } +func (m *ListSort) String() string { return proto.CompactTextString(m) } +func (*ListSort) ProtoMessage() {} +func (*ListSort) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{1} +} +func (m *ListSort) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListSort.Unmarshal(m, b) +} +func (m *ListSort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListSort.Marshal(b, m, deterministic) +} +func (dst *ListSort) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSort.Merge(dst, src) +} +func (m *ListSort) XXX_Size() int { + return xxx_messageInfo_ListSort.Size(m) +} +func (m *ListSort) XXX_DiscardUnknown() { + xxx_messageInfo_ListSort.DiscardUnknown(m) +} + +var xxx_messageInfo_ListSort proto.InternalMessageInfo // ListReleasesResponse is a list of releases. type ListReleasesResponse struct { // Count is the expected total number of releases to be returned. - Count int64 `protobuf:"varint,1,opt,name=count" json:"count,omitempty"` + Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` // Next is the name of the next release. If this is other than an empty // string, it means there are more results. - Next string `protobuf:"bytes,2,opt,name=next" json:"next,omitempty"` + Next string `protobuf:"bytes,2,opt,name=next,proto3" json:"next,omitempty"` // Total is the total number of queryable releases. - Total int64 `protobuf:"varint,3,opt,name=total" json:"total,omitempty"` + Total int64 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"` // Releases is the list of found release objects. - Releases []*hapi_release5.Release `protobuf:"bytes,4,rep,name=releases" json:"releases,omitempty"` + Releases []*release.Release `protobuf:"bytes,4,rep,name=releases,proto3" json:"releases,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } +func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } +func (*ListReleasesResponse) ProtoMessage() {} +func (*ListReleasesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{2} +} +func (m *ListReleasesResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListReleasesResponse.Unmarshal(m, b) +} +func (m *ListReleasesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListReleasesResponse.Marshal(b, m, deterministic) +} +func (dst *ListReleasesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReleasesResponse.Merge(dst, src) +} +func (m *ListReleasesResponse) XXX_Size() int { + return xxx_messageInfo_ListReleasesResponse.Size(m) +} +func (m *ListReleasesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ListReleasesResponse.DiscardUnknown(m) } -func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } -func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } -func (*ListReleasesResponse) ProtoMessage() {} -func (*ListReleasesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +var xxx_messageInfo_ListReleasesResponse proto.InternalMessageInfo func (m *ListReleasesResponse) GetCount() int64 { if m != nil { @@ -238,7 +275,7 @@ func (m *ListReleasesResponse) GetTotal() int64 { return 0 } -func (m *ListReleasesResponse) GetReleases() []*hapi_release5.Release { +func (m *ListReleasesResponse) GetReleases() []*release.Release { if m != nil { return m.Releases } @@ -248,15 +285,37 @@ func (m *ListReleasesResponse) GetReleases() []*hapi_release5.Release { // GetReleaseStatusRequest is a request to get the status of a release. type GetReleaseStatusRequest struct { // Name is the name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Version is the version of the release - Version int32 `protobuf:"varint,2,opt,name=version" json:"version,omitempty"` + Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetReleaseStatusRequest) Reset() { *m = GetReleaseStatusRequest{} } -func (m *GetReleaseStatusRequest) String() string { return proto.CompactTextString(m) } -func (*GetReleaseStatusRequest) ProtoMessage() {} -func (*GetReleaseStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (m *GetReleaseStatusRequest) Reset() { *m = GetReleaseStatusRequest{} } +func (m *GetReleaseStatusRequest) String() string { return proto.CompactTextString(m) } +func (*GetReleaseStatusRequest) ProtoMessage() {} +func (*GetReleaseStatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{3} +} +func (m *GetReleaseStatusRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReleaseStatusRequest.Unmarshal(m, b) +} +func (m *GetReleaseStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReleaseStatusRequest.Marshal(b, m, deterministic) +} +func (dst *GetReleaseStatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReleaseStatusRequest.Merge(dst, src) +} +func (m *GetReleaseStatusRequest) XXX_Size() int { + return xxx_messageInfo_GetReleaseStatusRequest.Size(m) +} +func (m *GetReleaseStatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetReleaseStatusRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetReleaseStatusRequest proto.InternalMessageInfo func (m *GetReleaseStatusRequest) GetName() string { if m != nil { @@ -275,17 +334,39 @@ func (m *GetReleaseStatusRequest) GetVersion() int32 { // GetReleaseStatusResponse is the response indicating the status of the named release. type GetReleaseStatusResponse struct { // Name is the name of the release. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Info contains information about the release. - Info *hapi_release4.Info `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` + Info *release.Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` // Namespace the release was released into - Namespace string `protobuf:"bytes,3,opt,name=namespace" json:"namespace,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetReleaseStatusResponse) Reset() { *m = GetReleaseStatusResponse{} } -func (m *GetReleaseStatusResponse) String() string { return proto.CompactTextString(m) } -func (*GetReleaseStatusResponse) ProtoMessage() {} -func (*GetReleaseStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (m *GetReleaseStatusResponse) Reset() { *m = GetReleaseStatusResponse{} } +func (m *GetReleaseStatusResponse) String() string { return proto.CompactTextString(m) } +func (*GetReleaseStatusResponse) ProtoMessage() {} +func (*GetReleaseStatusResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{4} +} +func (m *GetReleaseStatusResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReleaseStatusResponse.Unmarshal(m, b) +} +func (m *GetReleaseStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReleaseStatusResponse.Marshal(b, m, deterministic) +} +func (dst *GetReleaseStatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReleaseStatusResponse.Merge(dst, src) +} +func (m *GetReleaseStatusResponse) XXX_Size() int { + return xxx_messageInfo_GetReleaseStatusResponse.Size(m) +} +func (m *GetReleaseStatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetReleaseStatusResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetReleaseStatusResponse proto.InternalMessageInfo func (m *GetReleaseStatusResponse) GetName() string { if m != nil { @@ -294,7 +375,7 @@ func (m *GetReleaseStatusResponse) GetName() string { return "" } -func (m *GetReleaseStatusResponse) GetInfo() *hapi_release4.Info { +func (m *GetReleaseStatusResponse) GetInfo() *release.Info { if m != nil { return m.Info } @@ -311,15 +392,37 @@ func (m *GetReleaseStatusResponse) GetNamespace() string { // GetReleaseContentRequest is a request to get the contents of a release. type GetReleaseContentRequest struct { // The name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Version is the version of the release - Version int32 `protobuf:"varint,2,opt,name=version" json:"version,omitempty"` + Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetReleaseContentRequest) Reset() { *m = GetReleaseContentRequest{} } +func (m *GetReleaseContentRequest) String() string { return proto.CompactTextString(m) } +func (*GetReleaseContentRequest) ProtoMessage() {} +func (*GetReleaseContentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{5} +} +func (m *GetReleaseContentRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReleaseContentRequest.Unmarshal(m, b) +} +func (m *GetReleaseContentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReleaseContentRequest.Marshal(b, m, deterministic) +} +func (dst *GetReleaseContentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReleaseContentRequest.Merge(dst, src) +} +func (m *GetReleaseContentRequest) XXX_Size() int { + return xxx_messageInfo_GetReleaseContentRequest.Size(m) +} +func (m *GetReleaseContentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetReleaseContentRequest.DiscardUnknown(m) } -func (m *GetReleaseContentRequest) Reset() { *m = GetReleaseContentRequest{} } -func (m *GetReleaseContentRequest) String() string { return proto.CompactTextString(m) } -func (*GetReleaseContentRequest) ProtoMessage() {} -func (*GetReleaseContentRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +var xxx_messageInfo_GetReleaseContentRequest proto.InternalMessageInfo func (m *GetReleaseContentRequest) GetName() string { if m != nil { @@ -338,15 +441,37 @@ func (m *GetReleaseContentRequest) GetVersion() int32 { // GetReleaseContentResponse is a response containing the contents of a release. type GetReleaseContentResponse struct { // The release content - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetReleaseContentResponse) Reset() { *m = GetReleaseContentResponse{} } -func (m *GetReleaseContentResponse) String() string { return proto.CompactTextString(m) } -func (*GetReleaseContentResponse) ProtoMessage() {} -func (*GetReleaseContentResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (m *GetReleaseContentResponse) Reset() { *m = GetReleaseContentResponse{} } +func (m *GetReleaseContentResponse) String() string { return proto.CompactTextString(m) } +func (*GetReleaseContentResponse) ProtoMessage() {} +func (*GetReleaseContentResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{6} +} +func (m *GetReleaseContentResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetReleaseContentResponse.Unmarshal(m, b) +} +func (m *GetReleaseContentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetReleaseContentResponse.Marshal(b, m, deterministic) +} +func (dst *GetReleaseContentResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetReleaseContentResponse.Merge(dst, src) +} +func (m *GetReleaseContentResponse) XXX_Size() int { + return xxx_messageInfo_GetReleaseContentResponse.Size(m) +} +func (m *GetReleaseContentResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetReleaseContentResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetReleaseContentResponse proto.InternalMessageInfo -func (m *GetReleaseContentResponse) GetRelease() *hapi_release5.Release { +func (m *GetReleaseContentResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -356,41 +481,63 @@ func (m *GetReleaseContentResponse) GetRelease() *hapi_release5.Release { // UpdateReleaseRequest updates a release. type UpdateReleaseRequest struct { // The name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Chart is the protobuf representation of a chart. - Chart *hapi_chart3.Chart `protobuf:"bytes,2,opt,name=chart" json:"chart,omitempty"` + Chart *chart.Chart `protobuf:"bytes,2,opt,name=chart,proto3" json:"chart,omitempty"` // Values is a string containing (unparsed) YAML values. - Values *hapi_chart.Config `protobuf:"bytes,3,opt,name=values" json:"values,omitempty"` + Values *chart.Config `protobuf:"bytes,3,opt,name=values,proto3" json:"values,omitempty"` // dry_run, if true, will run through the release logic, but neither create - DryRun bool `protobuf:"varint,4,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + DryRun bool `protobuf:"varint,4,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"` // DisableHooks causes the server to skip running any hooks for the upgrade. - DisableHooks bool `protobuf:"varint,5,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` + DisableHooks bool `protobuf:"varint,5,opt,name=disable_hooks,json=disableHooks,proto3" json:"disable_hooks,omitempty"` // Performs pods restart for resources if applicable - Recreate bool `protobuf:"varint,6,opt,name=recreate" json:"recreate,omitempty"` + Recreate bool `protobuf:"varint,6,opt,name=recreate,proto3" json:"recreate,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. - Timeout int64 `protobuf:"varint,7,opt,name=timeout" json:"timeout,omitempty"` + Timeout int64 `protobuf:"varint,7,opt,name=timeout,proto3" json:"timeout,omitempty"` // ResetValues will cause Tiller to ignore stored values, resetting to default values. - ResetValues bool `protobuf:"varint,8,opt,name=reset_values,json=resetValues" json:"reset_values,omitempty"` + ResetValues bool `protobuf:"varint,8,opt,name=reset_values,json=resetValues,proto3" json:"reset_values,omitempty"` // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // before marking the release as successful. It will wait for as long as timeout - Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` + Wait bool `protobuf:"varint,9,opt,name=wait,proto3" json:"wait,omitempty"` // ReuseValues will cause Tiller to reuse the values from the last release. // This is ignored if reset_values is set. - ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues" json:"reuse_values,omitempty"` + ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues,proto3" json:"reuse_values,omitempty"` // Force resource update through delete/recreate if needed. - Force bool `protobuf:"varint,11,opt,name=force" json:"force,omitempty"` + Force bool `protobuf:"varint,11,opt,name=force,proto3" json:"force,omitempty"` // Description, if set, will set the description for the updated release - Description string `protobuf:"bytes,12,opt,name=description" json:"description,omitempty"` + Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` // Render subchart notes if enabled - SubNotes bool `protobuf:"varint,13,opt,name=subNotes" json:"subNotes,omitempty"` + SubNotes bool `protobuf:"varint,13,opt,name=subNotes,proto3" json:"subNotes,omitempty"` // Allow deletion of new resources created in this update when update failed - CleanupOnFail bool `protobuf:"varint,14,opt,name=cleanup_on_fail,json=cleanupOnFail" json:"cleanup_on_fail,omitempty"` + CleanupOnFail bool `protobuf:"varint,14,opt,name=cleanup_on_fail,json=cleanupOnFail,proto3" json:"cleanup_on_fail,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } +func (m *UpdateReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*UpdateReleaseRequest) ProtoMessage() {} +func (*UpdateReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{7} +} +func (m *UpdateReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UpdateReleaseRequest.Unmarshal(m, b) +} +func (m *UpdateReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UpdateReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *UpdateReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateReleaseRequest.Merge(dst, src) +} +func (m *UpdateReleaseRequest) XXX_Size() int { + return xxx_messageInfo_UpdateReleaseRequest.Size(m) +} +func (m *UpdateReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_UpdateReleaseRequest.DiscardUnknown(m) } -func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } -func (m *UpdateReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateReleaseRequest) ProtoMessage() {} -func (*UpdateReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +var xxx_messageInfo_UpdateReleaseRequest proto.InternalMessageInfo func (m *UpdateReleaseRequest) GetName() string { if m != nil { @@ -399,14 +546,14 @@ func (m *UpdateReleaseRequest) GetName() string { return "" } -func (m *UpdateReleaseRequest) GetChart() *hapi_chart3.Chart { +func (m *UpdateReleaseRequest) GetChart() *chart.Chart { if m != nil { return m.Chart } return nil } -func (m *UpdateReleaseRequest) GetValues() *hapi_chart.Config { +func (m *UpdateReleaseRequest) GetValues() *chart.Config { if m != nil { return m.Values } @@ -492,15 +639,37 @@ func (m *UpdateReleaseRequest) GetCleanupOnFail() bool { // UpdateReleaseResponse is the response to an update request. type UpdateReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpdateReleaseResponse) Reset() { *m = UpdateReleaseResponse{} } +func (m *UpdateReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*UpdateReleaseResponse) ProtoMessage() {} +func (*UpdateReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{8} +} +func (m *UpdateReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UpdateReleaseResponse.Unmarshal(m, b) +} +func (m *UpdateReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UpdateReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *UpdateReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateReleaseResponse.Merge(dst, src) +} +func (m *UpdateReleaseResponse) XXX_Size() int { + return xxx_messageInfo_UpdateReleaseResponse.Size(m) +} +func (m *UpdateReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_UpdateReleaseResponse.DiscardUnknown(m) } -func (m *UpdateReleaseResponse) Reset() { *m = UpdateReleaseResponse{} } -func (m *UpdateReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*UpdateReleaseResponse) ProtoMessage() {} -func (*UpdateReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +var xxx_messageInfo_UpdateReleaseResponse proto.InternalMessageInfo -func (m *UpdateReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *UpdateReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -509,32 +678,54 @@ func (m *UpdateReleaseResponse) GetRelease() *hapi_release5.Release { type RollbackReleaseRequest struct { // The name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // dry_run, if true, will run through the release logic but no create - DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"` // DisableHooks causes the server to skip running any hooks for the rollback - DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` + DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks,proto3" json:"disable_hooks,omitempty"` // Version is the version of the release to deploy. - Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"` + Version int32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` // Performs pods restart for resources if applicable - Recreate bool `protobuf:"varint,5,opt,name=recreate" json:"recreate,omitempty"` + Recreate bool `protobuf:"varint,5,opt,name=recreate,proto3" json:"recreate,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. - Timeout int64 `protobuf:"varint,6,opt,name=timeout" json:"timeout,omitempty"` + Timeout int64 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // before marking the release as successful. It will wait for as long as timeout - Wait bool `protobuf:"varint,7,opt,name=wait" json:"wait,omitempty"` + Wait bool `protobuf:"varint,7,opt,name=wait,proto3" json:"wait,omitempty"` // Force resource update through delete/recreate if needed. - Force bool `protobuf:"varint,8,opt,name=force" json:"force,omitempty"` + Force bool `protobuf:"varint,8,opt,name=force,proto3" json:"force,omitempty"` // Description, if set, will set the description for the rollback - Description string `protobuf:"bytes,9,opt,name=description" json:"description,omitempty"` + Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"` // Allow deletion of new resources created in this rollback when rollback failed - CleanupOnFail bool `protobuf:"varint,10,opt,name=cleanup_on_fail,json=cleanupOnFail" json:"cleanup_on_fail,omitempty"` + CleanupOnFail bool `protobuf:"varint,10,opt,name=cleanup_on_fail,json=cleanupOnFail,proto3" json:"cleanup_on_fail,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } -func (m *RollbackReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*RollbackReleaseRequest) ProtoMessage() {} -func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } +func (m *RollbackReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*RollbackReleaseRequest) ProtoMessage() {} +func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{9} +} +func (m *RollbackReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RollbackReleaseRequest.Unmarshal(m, b) +} +func (m *RollbackReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RollbackReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *RollbackReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RollbackReleaseRequest.Merge(dst, src) +} +func (m *RollbackReleaseRequest) XXX_Size() int { + return xxx_messageInfo_RollbackReleaseRequest.Size(m) +} +func (m *RollbackReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RollbackReleaseRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RollbackReleaseRequest proto.InternalMessageInfo func (m *RollbackReleaseRequest) GetName() string { if m != nil { @@ -608,15 +799,37 @@ func (m *RollbackReleaseRequest) GetCleanupOnFail() bool { // RollbackReleaseResponse is the response to an update request. type RollbackReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RollbackReleaseResponse) Reset() { *m = RollbackReleaseResponse{} } +func (m *RollbackReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*RollbackReleaseResponse) ProtoMessage() {} +func (*RollbackReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{10} +} +func (m *RollbackReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RollbackReleaseResponse.Unmarshal(m, b) +} +func (m *RollbackReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RollbackReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *RollbackReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RollbackReleaseResponse.Merge(dst, src) +} +func (m *RollbackReleaseResponse) XXX_Size() int { + return xxx_messageInfo_RollbackReleaseResponse.Size(m) +} +func (m *RollbackReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RollbackReleaseResponse.DiscardUnknown(m) } -func (m *RollbackReleaseResponse) Reset() { *m = RollbackReleaseResponse{} } -func (m *RollbackReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*RollbackReleaseResponse) ProtoMessage() {} -func (*RollbackReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +var xxx_messageInfo_RollbackReleaseResponse proto.InternalMessageInfo -func (m *RollbackReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *RollbackReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -626,47 +839,69 @@ func (m *RollbackReleaseResponse) GetRelease() *hapi_release5.Release { // InstallReleaseRequest is the request for an installation of a chart. type InstallReleaseRequest struct { // Chart is the protobuf representation of a chart. - Chart *hapi_chart3.Chart `protobuf:"bytes,1,opt,name=chart" json:"chart,omitempty"` + Chart *chart.Chart `protobuf:"bytes,1,opt,name=chart,proto3" json:"chart,omitempty"` // Values is a string containing (unparsed) YAML values. - Values *hapi_chart.Config `protobuf:"bytes,2,opt,name=values" json:"values,omitempty"` + Values *chart.Config `protobuf:"bytes,2,opt,name=values,proto3" json:"values,omitempty"` // DryRun, if true, will run through the release logic, but neither create // a release object nor deploy to Kubernetes. The release object returned // in the response will be fake. - DryRun bool `protobuf:"varint,3,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + DryRun bool `protobuf:"varint,3,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"` // Name is the candidate release name. This must be unique to the // namespace, otherwise the server will return an error. If it is not // supplied, the server will autogenerate one. - Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` // DisableHooks causes the server to skip running any hooks for the install. - DisableHooks bool `protobuf:"varint,5,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` + DisableHooks bool `protobuf:"varint,5,opt,name=disable_hooks,json=disableHooks,proto3" json:"disable_hooks,omitempty"` // Namespace is the kubernetes namespace of the release. - Namespace string `protobuf:"bytes,6,opt,name=namespace" json:"namespace,omitempty"` + Namespace string `protobuf:"bytes,6,opt,name=namespace,proto3" json:"namespace,omitempty"` // Reuse_name requests that Tiller re-uses a name, instead of erroring out. - ReuseName bool `protobuf:"varint,7,opt,name=reuse_name,json=reuseName" json:"reuse_name,omitempty"` + ReuseName bool `protobuf:"varint,7,opt,name=reuse_name,json=reuseName,proto3" json:"reuse_name,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. - Timeout int64 `protobuf:"varint,8,opt,name=timeout" json:"timeout,omitempty"` + Timeout int64 `protobuf:"varint,8,opt,name=timeout,proto3" json:"timeout,omitempty"` // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // before marking the release as successful. It will wait for as long as timeout - Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` - DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook" json:"disable_crd_hook,omitempty"` + Wait bool `protobuf:"varint,9,opt,name=wait,proto3" json:"wait,omitempty"` + DisableCrdHook bool `protobuf:"varint,10,opt,name=disable_crd_hook,json=disableCrdHook,proto3" json:"disable_crd_hook,omitempty"` // Description, if set, will set the description for the installed release - Description string `protobuf:"bytes,11,opt,name=description" json:"description,omitempty"` - SubNotes bool `protobuf:"varint,12,opt,name=subNotes" json:"subNotes,omitempty"` + Description string `protobuf:"bytes,11,opt,name=description,proto3" json:"description,omitempty"` + SubNotes bool `protobuf:"varint,12,opt,name=subNotes,proto3" json:"subNotes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } +func (m *InstallReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*InstallReleaseRequest) ProtoMessage() {} +func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{11} +} +func (m *InstallReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InstallReleaseRequest.Unmarshal(m, b) +} +func (m *InstallReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InstallReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *InstallReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InstallReleaseRequest.Merge(dst, src) +} +func (m *InstallReleaseRequest) XXX_Size() int { + return xxx_messageInfo_InstallReleaseRequest.Size(m) +} +func (m *InstallReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_InstallReleaseRequest.DiscardUnknown(m) } -func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } -func (m *InstallReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*InstallReleaseRequest) ProtoMessage() {} -func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +var xxx_messageInfo_InstallReleaseRequest proto.InternalMessageInfo -func (m *InstallReleaseRequest) GetChart() *hapi_chart3.Chart { +func (m *InstallReleaseRequest) GetChart() *chart.Chart { if m != nil { return m.Chart } return nil } -func (m *InstallReleaseRequest) GetValues() *hapi_chart.Config { +func (m *InstallReleaseRequest) GetValues() *chart.Config { if m != nil { return m.Values } @@ -745,15 +980,37 @@ func (m *InstallReleaseRequest) GetSubNotes() bool { // InstallReleaseResponse is the response from a release installation. type InstallReleaseResponse struct { - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} } -func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*InstallReleaseResponse) ProtoMessage() {} -func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} } +func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*InstallReleaseResponse) ProtoMessage() {} +func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{12} +} +func (m *InstallReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_InstallReleaseResponse.Unmarshal(m, b) +} +func (m *InstallReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_InstallReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *InstallReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_InstallReleaseResponse.Merge(dst, src) +} +func (m *InstallReleaseResponse) XXX_Size() int { + return xxx_messageInfo_InstallReleaseResponse.Size(m) +} +func (m *InstallReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_InstallReleaseResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_InstallReleaseResponse proto.InternalMessageInfo -func (m *InstallReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *InstallReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -763,21 +1020,43 @@ func (m *InstallReleaseResponse) GetRelease() *hapi_release5.Release { // UninstallReleaseRequest represents a request to uninstall a named release. type UninstallReleaseRequest struct { // Name is the name of the release to delete. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // DisableHooks causes the server to skip running any hooks for the uninstall. - DisableHooks bool `protobuf:"varint,2,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` + DisableHooks bool `protobuf:"varint,2,opt,name=disable_hooks,json=disableHooks,proto3" json:"disable_hooks,omitempty"` // Purge removes the release from the store and make its name free for later use. - Purge bool `protobuf:"varint,3,opt,name=purge" json:"purge,omitempty"` + Purge bool `protobuf:"varint,3,opt,name=purge,proto3" json:"purge,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. - Timeout int64 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` + Timeout int64 `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"` // Description, if set, will set the description for the uninstalled release - Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest{} } +func (m *UninstallReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*UninstallReleaseRequest) ProtoMessage() {} +func (*UninstallReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{13} +} +func (m *UninstallReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninstallReleaseRequest.Unmarshal(m, b) +} +func (m *UninstallReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninstallReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *UninstallReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninstallReleaseRequest.Merge(dst, src) +} +func (m *UninstallReleaseRequest) XXX_Size() int { + return xxx_messageInfo_UninstallReleaseRequest.Size(m) +} +func (m *UninstallReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_UninstallReleaseRequest.DiscardUnknown(m) } -func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest{} } -func (m *UninstallReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*UninstallReleaseRequest) ProtoMessage() {} -func (*UninstallReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } +var xxx_messageInfo_UninstallReleaseRequest proto.InternalMessageInfo func (m *UninstallReleaseRequest) GetName() string { if m != nil { @@ -817,17 +1096,39 @@ func (m *UninstallReleaseRequest) GetDescription() string { // UninstallReleaseResponse represents a successful response to an uninstall request. type UninstallReleaseResponse struct { // Release is the release that was marked deleted. - Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` + Release *release.Release `protobuf:"bytes,1,opt,name=release,proto3" json:"release,omitempty"` // Info is an uninstall message - Info string `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *UninstallReleaseResponse) Reset() { *m = UninstallReleaseResponse{} } -func (m *UninstallReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*UninstallReleaseResponse) ProtoMessage() {} -func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } +func (m *UninstallReleaseResponse) Reset() { *m = UninstallReleaseResponse{} } +func (m *UninstallReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*UninstallReleaseResponse) ProtoMessage() {} +func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{14} +} +func (m *UninstallReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninstallReleaseResponse.Unmarshal(m, b) +} +func (m *UninstallReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninstallReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *UninstallReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninstallReleaseResponse.Merge(dst, src) +} +func (m *UninstallReleaseResponse) XXX_Size() int { + return xxx_messageInfo_UninstallReleaseResponse.Size(m) +} +func (m *UninstallReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_UninstallReleaseResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_UninstallReleaseResponse proto.InternalMessageInfo -func (m *UninstallReleaseResponse) GetRelease() *hapi_release5.Release { +func (m *UninstallReleaseResponse) GetRelease() *release.Release { if m != nil { return m.Release } @@ -843,23 +1144,67 @@ func (m *UninstallReleaseResponse) GetInfo() string { // GetVersionRequest requests for version information. type GetVersionRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetVersionRequest) Reset() { *m = GetVersionRequest{} } +func (m *GetVersionRequest) String() string { return proto.CompactTextString(m) } +func (*GetVersionRequest) ProtoMessage() {} +func (*GetVersionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{15} +} +func (m *GetVersionRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetVersionRequest.Unmarshal(m, b) +} +func (m *GetVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetVersionRequest.Marshal(b, m, deterministic) +} +func (dst *GetVersionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetVersionRequest.Merge(dst, src) +} +func (m *GetVersionRequest) XXX_Size() int { + return xxx_messageInfo_GetVersionRequest.Size(m) +} +func (m *GetVersionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetVersionRequest.DiscardUnknown(m) } -func (m *GetVersionRequest) Reset() { *m = GetVersionRequest{} } -func (m *GetVersionRequest) String() string { return proto.CompactTextString(m) } -func (*GetVersionRequest) ProtoMessage() {} -func (*GetVersionRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } +var xxx_messageInfo_GetVersionRequest proto.InternalMessageInfo type GetVersionResponse struct { - Version *hapi_version.Version `protobuf:"bytes,1,opt,name=Version" json:"Version,omitempty"` + Version *version.Version `protobuf:"bytes,1,opt,name=Version,proto3" json:"Version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetVersionResponse) Reset() { *m = GetVersionResponse{} } -func (m *GetVersionResponse) String() string { return proto.CompactTextString(m) } -func (*GetVersionResponse) ProtoMessage() {} -func (*GetVersionResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } +func (m *GetVersionResponse) Reset() { *m = GetVersionResponse{} } +func (m *GetVersionResponse) String() string { return proto.CompactTextString(m) } +func (*GetVersionResponse) ProtoMessage() {} +func (*GetVersionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{16} +} +func (m *GetVersionResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetVersionResponse.Unmarshal(m, b) +} +func (m *GetVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetVersionResponse.Marshal(b, m, deterministic) +} +func (dst *GetVersionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetVersionResponse.Merge(dst, src) +} +func (m *GetVersionResponse) XXX_Size() int { + return xxx_messageInfo_GetVersionResponse.Size(m) +} +func (m *GetVersionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetVersionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetVersionResponse proto.InternalMessageInfo -func (m *GetVersionResponse) GetVersion() *hapi_version.Version { +func (m *GetVersionResponse) GetVersion() *version.Version { if m != nil { return m.Version } @@ -869,15 +1214,37 @@ func (m *GetVersionResponse) GetVersion() *hapi_version.Version { // GetHistoryRequest requests a release's history. type GetHistoryRequest struct { // The name of the release. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The maximum number of releases to include. - Max int32 `protobuf:"varint,2,opt,name=max" json:"max,omitempty"` + Max int32 `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetHistoryRequest) Reset() { *m = GetHistoryRequest{} } -func (m *GetHistoryRequest) String() string { return proto.CompactTextString(m) } -func (*GetHistoryRequest) ProtoMessage() {} -func (*GetHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } +func (m *GetHistoryRequest) Reset() { *m = GetHistoryRequest{} } +func (m *GetHistoryRequest) String() string { return proto.CompactTextString(m) } +func (*GetHistoryRequest) ProtoMessage() {} +func (*GetHistoryRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{17} +} +func (m *GetHistoryRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetHistoryRequest.Unmarshal(m, b) +} +func (m *GetHistoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetHistoryRequest.Marshal(b, m, deterministic) +} +func (dst *GetHistoryRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetHistoryRequest.Merge(dst, src) +} +func (m *GetHistoryRequest) XXX_Size() int { + return xxx_messageInfo_GetHistoryRequest.Size(m) +} +func (m *GetHistoryRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetHistoryRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetHistoryRequest proto.InternalMessageInfo func (m *GetHistoryRequest) GetName() string { if m != nil { @@ -895,15 +1262,37 @@ func (m *GetHistoryRequest) GetMax() int32 { // GetHistoryResponse is received in response to a GetHistory rpc. type GetHistoryResponse struct { - Releases []*hapi_release5.Release `protobuf:"bytes,1,rep,name=releases" json:"releases,omitempty"` + Releases []*release.Release `protobuf:"bytes,1,rep,name=releases,proto3" json:"releases,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetHistoryResponse) Reset() { *m = GetHistoryResponse{} } +func (m *GetHistoryResponse) String() string { return proto.CompactTextString(m) } +func (*GetHistoryResponse) ProtoMessage() {} +func (*GetHistoryResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{18} +} +func (m *GetHistoryResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetHistoryResponse.Unmarshal(m, b) +} +func (m *GetHistoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetHistoryResponse.Marshal(b, m, deterministic) +} +func (dst *GetHistoryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetHistoryResponse.Merge(dst, src) +} +func (m *GetHistoryResponse) XXX_Size() int { + return xxx_messageInfo_GetHistoryResponse.Size(m) +} +func (m *GetHistoryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetHistoryResponse.DiscardUnknown(m) } -func (m *GetHistoryResponse) Reset() { *m = GetHistoryResponse{} } -func (m *GetHistoryResponse) String() string { return proto.CompactTextString(m) } -func (*GetHistoryResponse) ProtoMessage() {} -func (*GetHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +var xxx_messageInfo_GetHistoryResponse proto.InternalMessageInfo -func (m *GetHistoryResponse) GetReleases() []*hapi_release5.Release { +func (m *GetHistoryResponse) GetReleases() []*release.Release { if m != nil { return m.Releases } @@ -913,19 +1302,41 @@ func (m *GetHistoryResponse) GetReleases() []*hapi_release5.Release { // TestReleaseRequest is a request to get the status of a release. type TestReleaseRequest struct { // Name is the name of the release - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // timeout specifies the max amount of time any kubernetes client command can run. - Timeout int64 `protobuf:"varint,2,opt,name=timeout" json:"timeout,omitempty"` + Timeout int64 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` // cleanup specifies whether or not to attempt pod deletion after test completes - Cleanup bool `protobuf:"varint,3,opt,name=cleanup" json:"cleanup,omitempty"` + Cleanup bool `protobuf:"varint,3,opt,name=cleanup,proto3" json:"cleanup,omitempty"` // parallel specifies whether or not to run test pods in parallel - Parallel bool `protobuf:"varint,4,opt,name=parallel" json:"parallel,omitempty"` + Parallel bool `protobuf:"varint,4,opt,name=parallel,proto3" json:"parallel,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} } +func (m *TestReleaseRequest) String() string { return proto.CompactTextString(m) } +func (*TestReleaseRequest) ProtoMessage() {} +func (*TestReleaseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{19} +} +func (m *TestReleaseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestReleaseRequest.Unmarshal(m, b) +} +func (m *TestReleaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestReleaseRequest.Marshal(b, m, deterministic) +} +func (dst *TestReleaseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestReleaseRequest.Merge(dst, src) +} +func (m *TestReleaseRequest) XXX_Size() int { + return xxx_messageInfo_TestReleaseRequest.Size(m) +} +func (m *TestReleaseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TestReleaseRequest.DiscardUnknown(m) } -func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} } -func (m *TestReleaseRequest) String() string { return proto.CompactTextString(m) } -func (*TestReleaseRequest) ProtoMessage() {} -func (*TestReleaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +var xxx_messageInfo_TestReleaseRequest proto.InternalMessageInfo func (m *TestReleaseRequest) GetName() string { if m != nil { @@ -957,14 +1368,36 @@ func (m *TestReleaseRequest) GetParallel() bool { // TestReleaseResponse represents a message from executing a test type TestReleaseResponse struct { - Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` - Status hapi_release1.TestRun_Status `protobuf:"varint,2,opt,name=status,enum=hapi.release.TestRun_Status" json:"status,omitempty"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status release.TestRun_Status `protobuf:"varint,2,opt,name=status,proto3,enum=hapi.release.TestRun_Status" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *TestReleaseResponse) Reset() { *m = TestReleaseResponse{} } -func (m *TestReleaseResponse) String() string { return proto.CompactTextString(m) } -func (*TestReleaseResponse) ProtoMessage() {} -func (*TestReleaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } +func (m *TestReleaseResponse) Reset() { *m = TestReleaseResponse{} } +func (m *TestReleaseResponse) String() string { return proto.CompactTextString(m) } +func (*TestReleaseResponse) ProtoMessage() {} +func (*TestReleaseResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tiller_bb72ee4a42494734, []int{20} +} +func (m *TestReleaseResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_TestReleaseResponse.Unmarshal(m, b) +} +func (m *TestReleaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_TestReleaseResponse.Marshal(b, m, deterministic) +} +func (dst *TestReleaseResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestReleaseResponse.Merge(dst, src) +} +func (m *TestReleaseResponse) XXX_Size() int { + return xxx_messageInfo_TestReleaseResponse.Size(m) +} +func (m *TestReleaseResponse) XXX_DiscardUnknown() { + xxx_messageInfo_TestReleaseResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_TestReleaseResponse proto.InternalMessageInfo func (m *TestReleaseResponse) GetMsg() string { if m != nil { @@ -973,11 +1406,11 @@ func (m *TestReleaseResponse) GetMsg() string { return "" } -func (m *TestReleaseResponse) GetStatus() hapi_release1.TestRun_Status { +func (m *TestReleaseResponse) GetStatus() release.TestRun_Status { if m != nil { return m.Status } - return hapi_release1.TestRun_UNKNOWN + return release.TestRun_UNKNOWN } func init() { @@ -1014,8 +1447,9 @@ var _ grpc.ClientConn // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 -// Client API for ReleaseService service - +// ReleaseServiceClient is the client API for ReleaseService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ReleaseServiceClient interface { // ListReleases retrieves release history. // TODO: Allow filtering the set of releases by @@ -1051,7 +1485,7 @@ func NewReleaseServiceClient(cc *grpc.ClientConn) ReleaseServiceClient { } func (c *releaseServiceClient) ListReleases(ctx context.Context, in *ListReleasesRequest, opts ...grpc.CallOption) (ReleaseService_ListReleasesClient, error) { - stream, err := grpc.NewClientStream(ctx, &_ReleaseService_serviceDesc.Streams[0], c.cc, "/hapi.services.tiller.ReleaseService/ListReleases", opts...) + stream, err := c.cc.NewStream(ctx, &_ReleaseService_serviceDesc.Streams[0], "/hapi.services.tiller.ReleaseService/ListReleases", opts...) if err != nil { return nil, err } @@ -1084,7 +1518,7 @@ func (x *releaseServiceListReleasesClient) Recv() (*ListReleasesResponse, error) func (c *releaseServiceClient) GetReleaseStatus(ctx context.Context, in *GetReleaseStatusRequest, opts ...grpc.CallOption) (*GetReleaseStatusResponse, error) { out := new(GetReleaseStatusResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetReleaseStatus", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetReleaseStatus", in, out, opts...) if err != nil { return nil, err } @@ -1093,7 +1527,7 @@ func (c *releaseServiceClient) GetReleaseStatus(ctx context.Context, in *GetRele func (c *releaseServiceClient) GetReleaseContent(ctx context.Context, in *GetReleaseContentRequest, opts ...grpc.CallOption) (*GetReleaseContentResponse, error) { out := new(GetReleaseContentResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetReleaseContent", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetReleaseContent", in, out, opts...) if err != nil { return nil, err } @@ -1102,7 +1536,7 @@ func (c *releaseServiceClient) GetReleaseContent(ctx context.Context, in *GetRel func (c *releaseServiceClient) UpdateRelease(ctx context.Context, in *UpdateReleaseRequest, opts ...grpc.CallOption) (*UpdateReleaseResponse, error) { out := new(UpdateReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/UpdateRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/UpdateRelease", in, out, opts...) if err != nil { return nil, err } @@ -1111,7 +1545,7 @@ func (c *releaseServiceClient) UpdateRelease(ctx context.Context, in *UpdateRele func (c *releaseServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) { out := new(InstallReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/InstallRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/InstallRelease", in, out, opts...) if err != nil { return nil, err } @@ -1120,7 +1554,7 @@ func (c *releaseServiceClient) InstallRelease(ctx context.Context, in *InstallRe func (c *releaseServiceClient) UninstallRelease(ctx context.Context, in *UninstallReleaseRequest, opts ...grpc.CallOption) (*UninstallReleaseResponse, error) { out := new(UninstallReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/UninstallRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/UninstallRelease", in, out, opts...) if err != nil { return nil, err } @@ -1129,7 +1563,7 @@ func (c *releaseServiceClient) UninstallRelease(ctx context.Context, in *Uninsta func (c *releaseServiceClient) GetVersion(ctx context.Context, in *GetVersionRequest, opts ...grpc.CallOption) (*GetVersionResponse, error) { out := new(GetVersionResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetVersion", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetVersion", in, out, opts...) if err != nil { return nil, err } @@ -1138,7 +1572,7 @@ func (c *releaseServiceClient) GetVersion(ctx context.Context, in *GetVersionReq func (c *releaseServiceClient) RollbackRelease(ctx context.Context, in *RollbackReleaseRequest, opts ...grpc.CallOption) (*RollbackReleaseResponse, error) { out := new(RollbackReleaseResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/RollbackRelease", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/RollbackRelease", in, out, opts...) if err != nil { return nil, err } @@ -1147,7 +1581,7 @@ func (c *releaseServiceClient) RollbackRelease(ctx context.Context, in *Rollback func (c *releaseServiceClient) GetHistory(ctx context.Context, in *GetHistoryRequest, opts ...grpc.CallOption) (*GetHistoryResponse, error) { out := new(GetHistoryResponse) - err := grpc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetHistory", in, out, c.cc, opts...) + err := c.cc.Invoke(ctx, "/hapi.services.tiller.ReleaseService/GetHistory", in, out, opts...) if err != nil { return nil, err } @@ -1155,7 +1589,7 @@ func (c *releaseServiceClient) GetHistory(ctx context.Context, in *GetHistoryReq } func (c *releaseServiceClient) RunReleaseTest(ctx context.Context, in *TestReleaseRequest, opts ...grpc.CallOption) (ReleaseService_RunReleaseTestClient, error) { - stream, err := grpc.NewClientStream(ctx, &_ReleaseService_serviceDesc.Streams[1], c.cc, "/hapi.services.tiller.ReleaseService/RunReleaseTest", opts...) + stream, err := c.cc.NewStream(ctx, &_ReleaseService_serviceDesc.Streams[1], "/hapi.services.tiller.ReleaseService/RunReleaseTest", opts...) if err != nil { return nil, err } @@ -1186,8 +1620,7 @@ func (x *releaseServiceRunReleaseTestClient) Recv() (*TestReleaseResponse, error return m, nil } -// Server API for ReleaseService service - +// ReleaseServiceServer is the server API for ReleaseService service. type ReleaseServiceServer interface { // ListReleases retrieves release history. // TODO: Allow filtering the set of releases by @@ -1456,9 +1889,9 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ Metadata: "hapi/services/tiller.proto", } -func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } +func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor_tiller_bb72ee4a42494734) } -var fileDescriptor0 = []byte{ +var fileDescriptor_tiller_bb72ee4a42494734 = []byte{ // 1337 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x72, 0xdb, 0x44, 0x14, 0x8e, 0x2d, 0xff, 0x1e, 0x27, 0xae, 0xbb, 0x4d, 0x13, 0xd5, 0x14, 0x26, 0x88, 0xa1, 0x75, diff --git a/pkg/proto/hapi/version/version.pb.go b/pkg/proto/hapi/version/version.pb.go index 13c8568f053..869bb3a5f3e 100644 --- a/pkg/proto/hapi/version/version.pb.go +++ b/pkg/proto/hapi/version/version.pb.go @@ -1,15 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: hapi/version/version.proto -/* -Package version is a generated protocol buffer package. - -It is generated from these files: - hapi/version/version.proto - -It has these top-level messages: - Version -*/ package version import proto "github.com/golang/protobuf/proto" @@ -29,15 +20,37 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type Version struct { // Sem ver string for the version - SemVer string `protobuf:"bytes,1,opt,name=sem_ver,json=semVer" json:"sem_ver,omitempty"` - GitCommit string `protobuf:"bytes,2,opt,name=git_commit,json=gitCommit" json:"git_commit,omitempty"` - GitTreeState string `protobuf:"bytes,3,opt,name=git_tree_state,json=gitTreeState" json:"git_tree_state,omitempty"` + SemVer string `protobuf:"bytes,1,opt,name=sem_ver,json=semVer,proto3" json:"sem_ver,omitempty"` + GitCommit string `protobuf:"bytes,2,opt,name=git_commit,json=gitCommit,proto3" json:"git_commit,omitempty"` + GitTreeState string `protobuf:"bytes,3,opt,name=git_tree_state,json=gitTreeState,proto3" json:"git_tree_state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { + return fileDescriptor_version_227db6d1d83f2c17, []int{0} +} +func (m *Version) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Version.Unmarshal(m, b) +} +func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Version.Marshal(b, m, deterministic) +} +func (dst *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(dst, src) +} +func (m *Version) XXX_Size() int { + return xxx_messageInfo_Version.Size(m) +} +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) } -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +var xxx_messageInfo_Version proto.InternalMessageInfo func (m *Version) GetSemVer() string { if m != nil { @@ -64,9 +77,9 @@ func init() { proto.RegisterType((*Version)(nil), "hapi.version.Version") } -func init() { proto.RegisterFile("hapi/version/version.proto", fileDescriptor0) } +func init() { proto.RegisterFile("hapi/version/version.proto", fileDescriptor_version_227db6d1d83f2c17) } -var fileDescriptor0 = []byte{ +var fileDescriptor_version_227db6d1d83f2c17 = []byte{ // 151 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xca, 0x48, 0x2c, 0xc8, 0xd4, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0x83, 0xd1, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, diff --git a/pkg/storage/driver/cfgmaps_test.go b/pkg/storage/driver/cfgmaps_test.go index d2e5e942ef0..1c8ed665267 100644 --- a/pkg/storage/driver/cfgmaps_test.go +++ b/pkg/storage/driver/cfgmaps_test.go @@ -15,7 +15,6 @@ package driver import ( "encoding/base64" - "reflect" "testing" "github.com/gogo/protobuf/proto" @@ -46,7 +45,7 @@ func TestConfigMapGet(t *testing.T) { t.Fatalf("Failed to get release: %s", err) } // compare fetched release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } @@ -78,7 +77,7 @@ func TestUNcompressedConfigMapGet(t *testing.T) { t.Fatalf("Failed to get release: %s", err) } // compare fetched release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } @@ -151,7 +150,7 @@ func TestConfigMapCreate(t *testing.T) { } // compare created release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 363d9dd5dc5..0d55497e792 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -38,6 +38,16 @@ func releaseStub(name string, vers int32, namespace string, code rspb.Status_Cod } } +func shallowReleaseEqual(r1 *rspb.Release, r2 *rspb.Release) bool { + if r1.Name != r2.Name || + r1.Namespace != r2.Namespace || + r1.Version != r2.Version || + r1.Manifest != r2.Manifest { + return false + } + return true +} + func testKey(name string, vers int32) string { return fmt.Sprintf("%s.v%d", name, vers) } diff --git a/pkg/storage/driver/secrets_test.go b/pkg/storage/driver/secrets_test.go index 0d7d1ad8391..3c6c1675d6b 100644 --- a/pkg/storage/driver/secrets_test.go +++ b/pkg/storage/driver/secrets_test.go @@ -15,7 +15,6 @@ package driver import ( "encoding/base64" - "reflect" "testing" "github.com/gogo/protobuf/proto" @@ -46,7 +45,7 @@ func TestSecretGet(t *testing.T) { t.Fatalf("Failed to get release: %s", err) } // compare fetched release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } @@ -78,7 +77,7 @@ func TestUNcompressedSecretGet(t *testing.T) { t.Fatalf("Failed to get release: %s", err) } // compare fetched release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } @@ -151,7 +150,7 @@ func TestSecretCreate(t *testing.T) { } // compare created release with original - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected {%q}, got {%q}", rel, got) } } diff --git a/pkg/version/version_test.go b/pkg/version/version_test.go index eba57353360..315e3c9feae 100644 --- a/pkg/version/version_test.go +++ b/pkg/version/version_test.go @@ -39,9 +39,17 @@ func TestGetVersionProto(t *testing.T) { BuildMetadata = tt.buildMetadata GitCommit = tt.gitCommit GitTreeState = tt.gitTreeState - if versionProto := GetVersionProto(); *versionProto != tt.expected { - t.Errorf("expected Semver(%s), GitCommit(%s) and GitTreeState(%s) to be %v", tt.expected, tt.gitCommit, tt.gitTreeState, *versionProto) + if versionProto := GetVersionProto(); !versionEqual(*versionProto, tt.expected) { + t.Errorf("expected Semver(%s+%s), GitCommit(%s) and GitTreeState(%s) to be %v", tt.version, tt.buildMetadata, tt.gitCommit, tt.gitTreeState, *versionProto) } } +} +func versionEqual(v1 version.Version, v2 version.Version) bool { + if v1.SemVer != v2.SemVer || + v1.GitCommit != v2.GitCommit || + v1.GitTreeState != v2.GitTreeState { + return false + } + return true } From d45095263e47221d0f28c9dc49da18073fcc5b5f Mon Sep 17 00:00:00 2001 From: Jeff Knurek Date: Fri, 3 May 2019 09:31:53 +0200 Subject: [PATCH 465/483] remove obsolete doc file Signed-off-by: Jeff Knurek --- docs/helm/helm_get_version.md | 42 ----------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 docs/helm/helm_get_version.md diff --git a/docs/helm/helm_get_version.md b/docs/helm/helm_get_version.md deleted file mode 100644 index 36695e4648c..00000000000 --- a/docs/helm/helm_get_version.md +++ /dev/null @@ -1,42 +0,0 @@ -## helm get version - -download the chart version for a named release - -### Synopsis - -This command fetches the chart version for a given release. - -``` -helm get version [flags] RELEASE_NAME -``` - -### Options - -``` - -h, --help help for version - --revision int32 get the named release with revision - --tls enable TLS for request - --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") - --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") - --tls-hostname string the server name used to verify the hostname on the returned certificates from the server - --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") - --tls-verify enable TLS for request and verify remote -``` - -### Options inherited from parent commands - -``` - --debug enable verbose output - --home string location of your Helm config. Overrides $HELM_HOME (default "~/.helm") - --host string address of Tiller. Overrides $HELM_HOST - --kube-context string name of the kubeconfig context to use - --kubeconfig string absolute path to the kubeconfig file to use - --tiller-connection-timeout int the duration (in seconds) Helm will wait to establish a connection to tiller (default 300) - --tiller-namespace string namespace of Tiller (default "kube-system") -``` - -### SEE ALSO - -* [helm get](helm_get.md) - download a named release - -###### Auto generated by spf13/cobra on 21-Mar-2019 From 86b970600be20d80039ea79380b894442f2bde31 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Fri, 3 May 2019 14:23:09 -0700 Subject: [PATCH 466/483] add errcheck for Digest method in sign.go Signed-off-by: Tariq Ibrahim --- pkg/provenance/sign.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/provenance/sign.go b/pkg/provenance/sign.go index 5e23c2dda68..5a7626424b9 100644 --- a/pkg/provenance/sign.go +++ b/pkg/provenance/sign.go @@ -404,6 +404,8 @@ func DigestFile(filename string) (string, error) { // Helm uses SHA256 as its default hash for all non-cryptographic applications. func Digest(in io.Reader) (string, error) { hash := crypto.SHA256.New() - io.Copy(hash, in) + if _, err := io.Copy(hash, in); err != nil { + return "", nil + } return hex.EncodeToString(hash.Sum(nil)), nil } From 2ed42013c41e0ed192fa8f0095550097bacda63a Mon Sep 17 00:00:00 2001 From: Joshua Bussdieker Date: Fri, 26 Apr 2019 14:27:41 -0700 Subject: [PATCH 467/483] Add docs for configuring SSL using Terraform. Signed-off-by: Joshua Bussdieker --- docs/tiller_ssl.md | 2 + docs/tiller_ssl_terraform.md | 311 +++++++++++++++++++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 docs/tiller_ssl_terraform.md diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 3d64635aec3..5bb7a55c642 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -42,6 +42,8 @@ on getting ready within a small amount of time. For production configurations, we urge readers to read [the official documentation](https://www.openssl.org) and consult other resources. +Alternatively you can use Terraform to quickly create all the necessary certificates: [Generating Certificate Authorities and Certificates using Terraform](tiller_ssl_terraform.md). + ### Generate a Certificate Authority The simplest way to generate a certificate authority is to run two commands: diff --git a/docs/tiller_ssl_terraform.md b/docs/tiller_ssl_terraform.md new file mode 100644 index 00000000000..40591e36fb0 --- /dev/null +++ b/docs/tiller_ssl_terraform.md @@ -0,0 +1,311 @@ +# Generating Certificate Authorities and Certificates using Terraform + +It's possible to create all the necessary keys and certificates to secure Helm using +Terraform. Simply create the following file and apply it using `terraform`. + +## tiller_certs.tf + +```terraform +# Generate the Tiller CA key +resource "tls_private_key" "ca" { + algorithm = "RSA" + rsa_bits = 4096 +} + +# Generate a self signed CA certificate +resource "tls_self_signed_cert" "ca" { + key_algorithm = "${tls_private_key.ca.algorithm}" + private_key_pem = "${tls_private_key.ca.private_key_pem}" + is_ca_certificate = true + validity_period_hours = 87600 + early_renewal_hours = 8760 + + allowed_uses = [ + "v3_ca", + ] + + subject { + organization = "Tiller CA" + } +} + +# Write the CA key to file +resource "local_file" "ca_key" { + content = "${tls_private_key.ca.private_key_pem}" + filename = "${path.module}/ca.key.pem" +} + +# Write the CA cert to file +resource "local_file" "ca_cert" { + content = "${tls_self_signed_cert.ca.cert_pem}" + filename = "${path.module}/ca.cert.pem" +} + +# Generate the Tiller Server key +resource "tls_private_key" "tiller" { + algorithm = "RSA" + rsa_bits = 4096 +} + +# Generate a signing request for the Tiller Server certificate +resource "tls_cert_request" "tiller" { + key_algorithm = "${tls_private_key.tiller.algorithm}" + private_key_pem = "${tls_private_key.tiller.private_key_pem}" + + ip_addresses = [ + "127.0.0.1", + ] + + subject { + organization = "Tiller Server" + } +} + +# Write the Tiller Server key to file +resource "local_file" "tiller_key" { + content = "${tls_private_key.tiller.private_key_pem}" + filename = "${path.module}/tiller.key.pem" +} + +# Write the Tiller Server cert to file +resource "local_file" "tiller_cert" { + content = "${tls_locally_signed_cert.tiller.cert_pem}" + filename = "${path.module}/tiller.cert.pem" +} + +# Sign the Tiller Server certificate signing request +resource "tls_locally_signed_cert" "tiller" { + cert_request_pem = "${tls_cert_request.tiller.cert_request_pem}" + ca_key_algorithm = "${tls_private_key.ca.algorithm}" + ca_private_key_pem = "${tls_private_key.ca.private_key_pem}" + ca_cert_pem = "${tls_self_signed_cert.ca.cert_pem}" + validity_period_hours = 87600 + allowed_uses = [] +} + +# Generate a key for the Helm Client +resource "tls_private_key" "helm" { + algorithm = "RSA" + rsa_bits = 4096 +} + +# Generate a signing request for the Helm Client certificate +resource "tls_cert_request" "helm" { + key_algorithm = "${tls_private_key.helm.algorithm}" + private_key_pem = "${tls_private_key.helm.private_key_pem}" + + subject { + organization = "Helm Client" + } +} + +# Sign the Helm Client certificate signing request +resource "tls_locally_signed_cert" "helm" { + cert_request_pem = "${tls_cert_request.helm.cert_request_pem}" + ca_key_algorithm = "${tls_private_key.ca.algorithm}" + ca_private_key_pem = "${tls_private_key.ca.private_key_pem}" + ca_cert_pem = "${tls_self_signed_cert.ca.cert_pem}" + validity_period_hours = 87600 + allowed_uses = [] +} + +# Write the Helm Client key to file +resource "local_file" "helm_key" { + content = "${tls_private_key.helm.private_key_pem}" + filename = "${path.module}/helm.key.pem" +} + +# Write the Helm Client cert to file +resource "local_file" "helm_cert" { + content = "${tls_locally_signed_cert.helm.cert_pem}" + filename = "${path.module}/helm.cert.pem" +} +``` + +Now simply run Terraform init and apply: + +```console +$ terraform init + +Initializing provider plugins... +- Checking for available provider plugins on https://releases.hashicorp.com... +- Downloading plugin for provider "tls" (2.0.0)... +- Downloading plugin for provider "local" (1.2.1)... + +The following providers do not have any version constraints in configuration, +so the latest version was installed. + +To prevent automatic upgrades to new major versions that may contain breaking +changes, it is recommended to add version = "..." constraints to the +corresponding provider blocks in configuration, with the constraint strings +suggested below. + +* provider.local: version = "~> 1.2" +* provider.tls: version = "~> 2.0" + +Terraform has been successfully initialized! + +You may now begin working with Terraform. Try running "terraform plan" to see +any changes that are required for your infrastructure. All Terraform commands +should now work. + +If you ever set or change modules or backend configuration for Terraform, +rerun this command to reinitialize your working directory. If you forget, other +commands will detect it and remind you to do so if necessary. +``` + +```console +$ terraform apply + +An execution plan has been generated and is shown below. +Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + + local_file.ca_cert + id: + content: "${tls_self_signed_cert.ca.cert_pem}" + filename: "/home/user/ca.cert.pem" + + + local_file.ca_key + id: + content: "${tls_private_key.ca.private_key_pem}" + filename: "/home/user/ca.key.pem" + + + local_file.helm_cert + id: + content: "${tls_locally_signed_cert.helm.cert_pem}" + filename: "/home/user/helm.cert.pem" + + + local_file.helm_key + id: + content: "${tls_private_key.helm.private_key_pem}" + filename: "/home/user/helm.key.pem" + + + local_file.tiller_cert + id: + content: "${tls_locally_signed_cert.tiller.cert_pem}" + filename: "/home/user/tiller.cert.pem" + + + local_file.tiller_key + id: + content: "${tls_private_key.tiller.private_key_pem}" + filename: "/home/user/tiller.key.pem" + + + tls_cert_request.helm + id: + cert_request_pem: + key_algorithm: "RSA" + private_key_pem: "088d7282d5fd07c60edbb06a0391bbfef9ed0752" + subject.#: "1" + subject.0.organization: "Helm Client" + + + tls_cert_request.tiller + id: + cert_request_pem: + ip_addresses.#: "1" + ip_addresses.0: "127.0.0.1" + key_algorithm: "RSA" + private_key_pem: "ce4d1f657394357cb9df6394e1749953ede611c0" + subject.#: "1" + subject.0.organization: "Tiller Server" + + + tls_locally_signed_cert.helm + id: + ca_cert_pem: "67c5245fc6ca7f0c9c84221a0286253194dbb985" + ca_key_algorithm: "RSA" + ca_private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" + cert_pem: + cert_request_pem: "e9cbcf1529e9b4532c56ae91defc2c387fbdef94" + early_renewal_hours: "0" + validity_end_time: + validity_period_hours: "87600" + validity_start_time: + + + tls_locally_signed_cert.tiller + id: + ca_cert_pem: "67c5245fc6ca7f0c9c84221a0286253194dbb985" + ca_key_algorithm: "RSA" + ca_private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" + cert_pem: + cert_request_pem: "c7444562da59395a93599d2b6693dee3d39a6469" + early_renewal_hours: "0" + validity_end_time: + validity_period_hours: "87600" + validity_start_time: + + + tls_private_key.ca + id: + algorithm: "RSA" + ecdsa_curve: "P224" + private_key_pem: + public_key_fingerprint_md5: + public_key_openssh: + public_key_pem: + rsa_bits: "4096" + + + tls_private_key.helm + id: + algorithm: "RSA" + ecdsa_curve: "P224" + private_key_pem: + public_key_fingerprint_md5: + public_key_openssh: + public_key_pem: + rsa_bits: "4096" + + + tls_private_key.tiller + id: + algorithm: "RSA" + ecdsa_curve: "P224" + private_key_pem: + public_key_fingerprint_md5: + public_key_openssh: + public_key_pem: + rsa_bits: "4096" + + + tls_self_signed_cert.ca + id: + allowed_uses.#: "1" + allowed_uses.0: "v3_ca" + cert_pem: + early_renewal_hours: "8760" + is_ca_certificate: "true" + key_algorithm: "RSA" + private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" + subject.#: "1" + subject.0.organization: "Tiller CA" + validity_end_time: + validity_period_hours: "87600" + validity_start_time: + + +Plan: 14 to add, 0 to change, 0 to destroy. + +Do you want to perform these actions? + Terraform will perform the actions described above. + Only 'yes' will be accepted to approve. + + Enter a value: yes + +... + +Apply complete! Resources: 14 added, 0 changed, 0 destroyed. +``` + +At this point, the important files for us are these: + +``` +# The CA. Make sure the key is kept secret. +ca.cert.pem +ca.key.pem +# The Helm client files +helm.cert.pem +helm.key.pem +# The Tiller server files. +tiller.cert.pem +tiller.key.pem +``` + +Now we're ready to move on to the next steps here: [TLS/SSL for Helm and Tiller - Creating a Custom Tiller Installation](tiller_ssl.md#creating-a-custom-tiller-installation) From aff106f97f075854c66995f597799c374df50c29 Mon Sep 17 00:00:00 2001 From: Joshua Bussdieker Date: Sun, 5 May 2019 17:53:55 -0700 Subject: [PATCH 468/483] Update to reflect location of docs Signed-off-by: Joshua Bussdieker --- docs/tiller_ssl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index 5bb7a55c642..d6f207f1b34 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -42,7 +42,7 @@ on getting ready within a small amount of time. For production configurations, we urge readers to read [the official documentation](https://www.openssl.org) and consult other resources. -Alternatively you can use Terraform to quickly create all the necessary certificates: [Generating Certificate Authorities and Certificates using Terraform](tiller_ssl_terraform.md). +There are other alternative ways to generating SSL CAs in addition to `openssl`, for example Terraform. They are not documented here but you can find links to these alternative means in Related Projects and Documentation. ### Generate a Certificate Authority From 422f0929b404a4587f396895c589992b9860ff27 Mon Sep 17 00:00:00 2001 From: Joshua Bussdieker Date: Sun, 5 May 2019 18:02:32 -0700 Subject: [PATCH 469/483] Move actual docs to another repo and update related docs list Signed-off-by: Joshua Bussdieker --- docs/related.md | 1 + docs/tiller_ssl_terraform.md | 311 ----------------------------------- 2 files changed, 1 insertion(+), 311 deletions(-) delete mode 100644 docs/tiller_ssl_terraform.md diff --git a/docs/related.md b/docs/related.md index 3f8c73d4aee..4a38e68f1e1 100644 --- a/docs/related.md +++ b/docs/related.md @@ -19,6 +19,7 @@ or [pull request](https://github.com/helm/helm/pulls). - [Writing a Helm Chart](https://www.influxdata.com/packaged-kubernetes-deployments-writing-helm-chart/) - [A basic walk through Kubernetes Helm](https://github.com/muffin87/helm-tutorial) - [Tillerless Helm v2](https://rimusz.net/tillerless-helm/) +- [Generating Certificate Authorities and Certificates using Terraform](https://github.com/jbussdieker/tiller-ssl-terraform) ## Video, Audio, and Podcast diff --git a/docs/tiller_ssl_terraform.md b/docs/tiller_ssl_terraform.md deleted file mode 100644 index 40591e36fb0..00000000000 --- a/docs/tiller_ssl_terraform.md +++ /dev/null @@ -1,311 +0,0 @@ -# Generating Certificate Authorities and Certificates using Terraform - -It's possible to create all the necessary keys and certificates to secure Helm using -Terraform. Simply create the following file and apply it using `terraform`. - -## tiller_certs.tf - -```terraform -# Generate the Tiller CA key -resource "tls_private_key" "ca" { - algorithm = "RSA" - rsa_bits = 4096 -} - -# Generate a self signed CA certificate -resource "tls_self_signed_cert" "ca" { - key_algorithm = "${tls_private_key.ca.algorithm}" - private_key_pem = "${tls_private_key.ca.private_key_pem}" - is_ca_certificate = true - validity_period_hours = 87600 - early_renewal_hours = 8760 - - allowed_uses = [ - "v3_ca", - ] - - subject { - organization = "Tiller CA" - } -} - -# Write the CA key to file -resource "local_file" "ca_key" { - content = "${tls_private_key.ca.private_key_pem}" - filename = "${path.module}/ca.key.pem" -} - -# Write the CA cert to file -resource "local_file" "ca_cert" { - content = "${tls_self_signed_cert.ca.cert_pem}" - filename = "${path.module}/ca.cert.pem" -} - -# Generate the Tiller Server key -resource "tls_private_key" "tiller" { - algorithm = "RSA" - rsa_bits = 4096 -} - -# Generate a signing request for the Tiller Server certificate -resource "tls_cert_request" "tiller" { - key_algorithm = "${tls_private_key.tiller.algorithm}" - private_key_pem = "${tls_private_key.tiller.private_key_pem}" - - ip_addresses = [ - "127.0.0.1", - ] - - subject { - organization = "Tiller Server" - } -} - -# Write the Tiller Server key to file -resource "local_file" "tiller_key" { - content = "${tls_private_key.tiller.private_key_pem}" - filename = "${path.module}/tiller.key.pem" -} - -# Write the Tiller Server cert to file -resource "local_file" "tiller_cert" { - content = "${tls_locally_signed_cert.tiller.cert_pem}" - filename = "${path.module}/tiller.cert.pem" -} - -# Sign the Tiller Server certificate signing request -resource "tls_locally_signed_cert" "tiller" { - cert_request_pem = "${tls_cert_request.tiller.cert_request_pem}" - ca_key_algorithm = "${tls_private_key.ca.algorithm}" - ca_private_key_pem = "${tls_private_key.ca.private_key_pem}" - ca_cert_pem = "${tls_self_signed_cert.ca.cert_pem}" - validity_period_hours = 87600 - allowed_uses = [] -} - -# Generate a key for the Helm Client -resource "tls_private_key" "helm" { - algorithm = "RSA" - rsa_bits = 4096 -} - -# Generate a signing request for the Helm Client certificate -resource "tls_cert_request" "helm" { - key_algorithm = "${tls_private_key.helm.algorithm}" - private_key_pem = "${tls_private_key.helm.private_key_pem}" - - subject { - organization = "Helm Client" - } -} - -# Sign the Helm Client certificate signing request -resource "tls_locally_signed_cert" "helm" { - cert_request_pem = "${tls_cert_request.helm.cert_request_pem}" - ca_key_algorithm = "${tls_private_key.ca.algorithm}" - ca_private_key_pem = "${tls_private_key.ca.private_key_pem}" - ca_cert_pem = "${tls_self_signed_cert.ca.cert_pem}" - validity_period_hours = 87600 - allowed_uses = [] -} - -# Write the Helm Client key to file -resource "local_file" "helm_key" { - content = "${tls_private_key.helm.private_key_pem}" - filename = "${path.module}/helm.key.pem" -} - -# Write the Helm Client cert to file -resource "local_file" "helm_cert" { - content = "${tls_locally_signed_cert.helm.cert_pem}" - filename = "${path.module}/helm.cert.pem" -} -``` - -Now simply run Terraform init and apply: - -```console -$ terraform init - -Initializing provider plugins... -- Checking for available provider plugins on https://releases.hashicorp.com... -- Downloading plugin for provider "tls" (2.0.0)... -- Downloading plugin for provider "local" (1.2.1)... - -The following providers do not have any version constraints in configuration, -so the latest version was installed. - -To prevent automatic upgrades to new major versions that may contain breaking -changes, it is recommended to add version = "..." constraints to the -corresponding provider blocks in configuration, with the constraint strings -suggested below. - -* provider.local: version = "~> 1.2" -* provider.tls: version = "~> 2.0" - -Terraform has been successfully initialized! - -You may now begin working with Terraform. Try running "terraform plan" to see -any changes that are required for your infrastructure. All Terraform commands -should now work. - -If you ever set or change modules or backend configuration for Terraform, -rerun this command to reinitialize your working directory. If you forget, other -commands will detect it and remind you to do so if necessary. -``` - -```console -$ terraform apply - -An execution plan has been generated and is shown below. -Resource actions are indicated with the following symbols: - + create - -Terraform will perform the following actions: - - + local_file.ca_cert - id: - content: "${tls_self_signed_cert.ca.cert_pem}" - filename: "/home/user/ca.cert.pem" - - + local_file.ca_key - id: - content: "${tls_private_key.ca.private_key_pem}" - filename: "/home/user/ca.key.pem" - - + local_file.helm_cert - id: - content: "${tls_locally_signed_cert.helm.cert_pem}" - filename: "/home/user/helm.cert.pem" - - + local_file.helm_key - id: - content: "${tls_private_key.helm.private_key_pem}" - filename: "/home/user/helm.key.pem" - - + local_file.tiller_cert - id: - content: "${tls_locally_signed_cert.tiller.cert_pem}" - filename: "/home/user/tiller.cert.pem" - - + local_file.tiller_key - id: - content: "${tls_private_key.tiller.private_key_pem}" - filename: "/home/user/tiller.key.pem" - - + tls_cert_request.helm - id: - cert_request_pem: - key_algorithm: "RSA" - private_key_pem: "088d7282d5fd07c60edbb06a0391bbfef9ed0752" - subject.#: "1" - subject.0.organization: "Helm Client" - - + tls_cert_request.tiller - id: - cert_request_pem: - ip_addresses.#: "1" - ip_addresses.0: "127.0.0.1" - key_algorithm: "RSA" - private_key_pem: "ce4d1f657394357cb9df6394e1749953ede611c0" - subject.#: "1" - subject.0.organization: "Tiller Server" - - + tls_locally_signed_cert.helm - id: - ca_cert_pem: "67c5245fc6ca7f0c9c84221a0286253194dbb985" - ca_key_algorithm: "RSA" - ca_private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" - cert_pem: - cert_request_pem: "e9cbcf1529e9b4532c56ae91defc2c387fbdef94" - early_renewal_hours: "0" - validity_end_time: - validity_period_hours: "87600" - validity_start_time: - - + tls_locally_signed_cert.tiller - id: - ca_cert_pem: "67c5245fc6ca7f0c9c84221a0286253194dbb985" - ca_key_algorithm: "RSA" - ca_private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" - cert_pem: - cert_request_pem: "c7444562da59395a93599d2b6693dee3d39a6469" - early_renewal_hours: "0" - validity_end_time: - validity_period_hours: "87600" - validity_start_time: - - + tls_private_key.ca - id: - algorithm: "RSA" - ecdsa_curve: "P224" - private_key_pem: - public_key_fingerprint_md5: - public_key_openssh: - public_key_pem: - rsa_bits: "4096" - - + tls_private_key.helm - id: - algorithm: "RSA" - ecdsa_curve: "P224" - private_key_pem: - public_key_fingerprint_md5: - public_key_openssh: - public_key_pem: - rsa_bits: "4096" - - + tls_private_key.tiller - id: - algorithm: "RSA" - ecdsa_curve: "P224" - private_key_pem: - public_key_fingerprint_md5: - public_key_openssh: - public_key_pem: - rsa_bits: "4096" - - + tls_self_signed_cert.ca - id: - allowed_uses.#: "1" - allowed_uses.0: "v3_ca" - cert_pem: - early_renewal_hours: "8760" - is_ca_certificate: "true" - key_algorithm: "RSA" - private_key_pem: "6c435a4a25d847452106d0271104a386d269ae6b" - subject.#: "1" - subject.0.organization: "Tiller CA" - validity_end_time: - validity_period_hours: "87600" - validity_start_time: - - -Plan: 14 to add, 0 to change, 0 to destroy. - -Do you want to perform these actions? - Terraform will perform the actions described above. - Only 'yes' will be accepted to approve. - - Enter a value: yes - -... - -Apply complete! Resources: 14 added, 0 changed, 0 destroyed. -``` - -At this point, the important files for us are these: - -``` -# The CA. Make sure the key is kept secret. -ca.cert.pem -ca.key.pem -# The Helm client files -helm.cert.pem -helm.key.pem -# The Tiller server files. -tiller.cert.pem -tiller.key.pem -``` - -Now we're ready to move on to the next steps here: [TLS/SSL for Helm and Tiller - Creating a Custom Tiller Installation](tiller_ssl.md#creating-a-custom-tiller-installation) From 51c99b125224093802def010a48d763ffab5b6df Mon Sep 17 00:00:00 2001 From: Joshua Bussdieker Date: Tue, 7 May 2019 03:36:56 -0700 Subject: [PATCH 470/483] Fix missing link Signed-off-by: Joshua Bussdieker --- docs/tiller_ssl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tiller_ssl.md b/docs/tiller_ssl.md index d6f207f1b34..3705723fa27 100644 --- a/docs/tiller_ssl.md +++ b/docs/tiller_ssl.md @@ -42,7 +42,7 @@ on getting ready within a small amount of time. For production configurations, we urge readers to read [the official documentation](https://www.openssl.org) and consult other resources. -There are other alternative ways to generating SSL CAs in addition to `openssl`, for example Terraform. They are not documented here but you can find links to these alternative means in Related Projects and Documentation. +There are other alternative ways to generating SSL CAs in addition to `openssl`, for example Terraform. They are not documented here but you can find links to these alternative means in [Related Projects and Documentation](https://helm.sh/docs/related/). ### Generate a Certificate Authority From b5582f03e6a0332f8b8957198345280f37481600 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Tue, 7 May 2019 10:43:42 -0400 Subject: [PATCH 471/483] Pinning k8s to a specific release The other Kubernetes dependencies, such as client-go and apimachinery, are pinned to 1.14.1 but Kubernetes itself was tracking the tip of the 1.14 release branch and picking up changes between releases. This change pins Kubernetes to the same version as the other parts of it. Signed-off-by: Matt Farina --- glide.lock | 6 +++--- glide.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/glide.lock b/glide.lock index 5c567126882..f485ddc1219 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 8a007d8993bdffd14a1a2d674848bd085a27b09d7f177fab1dc55783059c4dce -updated: 2019-04-29T12:23:33.902435+01:00 +hash: 7571b58bbda7d85993d2b737b50d0c52f5fadce0c63e7fac064bc0a99faaefab +updated: 2019-05-07T10:43:27.329085-04:00 imports: - name: cloud.google.com/go version: 3b1ae45394a234c385be014e9a488f2bb6eef821 @@ -647,7 +647,7 @@ imports: - pkg/util/proto/testing - pkg/util/proto/validation - name: k8s.io/kubernetes - version: b8f2b772e38a15165a6247256d650e8b04178318 + version: b7394102d6ef778017f2ca4046abbaa23b88c290 subpackages: - pkg/api/legacyscheme - pkg/api/service diff --git a/glide.yaml b/glide.yaml index aeabbc72494..488030fa725 100644 --- a/glide.yaml +++ b/glide.yaml @@ -51,7 +51,7 @@ import: version: 0.9.2 - package: github.com/grpc-ecosystem/go-grpc-prometheus - package: k8s.io/kubernetes - version: release-1.14 + version: v1.14.1 - package: k8s.io/client-go version: kubernetes-1.14.1 - package: k8s.io/api From 965b78433b2f8967d12c59d12745088219a688aa Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Wed, 8 May 2019 10:10:34 -0400 Subject: [PATCH 472/483] Updating OWERS to remove outdated reviewers and to reflect current case Two changes in this: 1. Remove the reviewers. These are from when Helm was under Kubernetes and used its tools. That is no longer the case so this section has no use. 2. List fibonacci1729 with the maintainers. He has been a maintainer a long time. The original listing had to do with department locations within Deis rather than his work. He has been a maintainer since before Helm was a CNCF project. Fixes #5685 Signed-off-by: Matt Farina --- OWNERS | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/OWNERS b/OWNERS index df847ab37a5..fcc3606c205 100644 --- a/OWNERS +++ b/OWNERS @@ -1,24 +1,11 @@ maintainers: - - adamreese - - bacongobbler - - hickeyma - - jascott1 - - mattfarina - - michelleN - - prydonius - - SlickNik - - technosophos - - thomastaylor312 - - viglesiasce -reviewers: - adamreese - bacongobbler - fibonacci1729 + - hickeyma - jascott1 - mattfarina - michelleN - - migmartri - - nebril - prydonius - SlickNik - technosophos From 4bd361746cd7c7bf9644571a903e96ad2f14f1b0 Mon Sep 17 00:00:00 2001 From: Tariq Ibrahim Date: Fri, 3 May 2019 10:08:34 -0700 Subject: [PATCH 473/483] use the latest patch release version of golang Signed-off-by: Tariq Ibrahim --- .circleci/config.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 09d49fb8906..14c0507466f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: working_directory: /go/src/k8s.io/helm parallelism: 3 docker: - - image: golang:1.12.2 + - image: golang:1.12.5 environment: PROJECT_NAME: "kubernetes-helm" steps: diff --git a/Makefile b/Makefile index 719fd5f0376..1b5932db817 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ DOCKER_REGISTRY ?= gcr.io IMAGE_PREFIX ?= kubernetes-helm -DEV_IMAGE ?= golang:1.12.2 +DEV_IMAGE ?= golang:1.12.5 SHORT_NAME ?= tiller SHORT_NAME_RUDDER ?= rudder TARGETS ?= darwin/amd64 linux/amd64 linux/386 linux/arm linux/arm64 linux/ppc64le linux/s390x windows/amd64 From 85b5dcad31c6af0b4916909bdb4c7b92035badb6 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Thu, 9 May 2019 11:15:01 -0500 Subject: [PATCH 474/483] Add ProGet as a Helm chart repository host. Signed-off-by: Ben Lubar --- docs/chart_repository.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/chart_repository.md b/docs/chart_repository.md index e3bbe3c7d20..c0b3d0609c1 100644 --- a/docs/chart_repository.md +++ b/docs/chart_repository.md @@ -182,6 +182,10 @@ Charts repository hosts its charts, so you may want to take a You can also set up chart repositories using JFrog Artifactory. Read more about chart repositories with JFrog Artifactory [here](https://www.jfrog.com/confluence/display/RTF/Helm+Chart+Repositories) +### ProGet + +Helm chart repositories are supported by ProGet. For more information, visit the [Helm repository documentation](https://inedo.com/support/documentation/proget/feeds/helm) on the Inedo website. + ### Github Pages example In a similar way you can create charts repository using GitHub Pages. From e6d5fc933b81093050459397f011673ca83c508c Mon Sep 17 00:00:00 2001 From: Jon Huhn Date: Thu, 9 May 2019 11:19:51 -0500 Subject: [PATCH 475/483] Fix typo Signed-off-by: Jon Huhn --- cmd/helm/lint.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/lint.go b/cmd/helm/lint.go index d0159d34b09..746f946f226 100644 --- a/cmd/helm/lint.go +++ b/cmd/helm/lint.go @@ -166,7 +166,7 @@ func lintChart(path string, vals []byte, namespace string, strict bool) (support chartPath = path } - // Guard: Error out of this is not a chart. + // Guard: Error out if this is not a chart. if _, err := os.Stat(filepath.Join(chartPath, "Chart.yaml")); err != nil { return linter, errLintNoChart } From 5be3af65a2a90a2fee07cfcc1d619c2dcc9ba37b Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 9 May 2019 10:15:05 -0700 Subject: [PATCH 476/483] bump version to v2.14 (cherry picked from commit 2420009a75c56bba5cf77e8975f26fceb736e68a) Signed-off-by: Matthew Fisher --- pkg/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/version/version.go b/pkg/version/version.go index 692167b83b1..d32f09c4a8f 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -26,7 +26,7 @@ var ( // Increment major number for new feature additions and behavioral changes. // Increment minor number for bug fixes and performance enhancements. // Increment patch number for critical fixes to existing releases. - Version = "v2.12" + Version = "v2.14" // BuildMetadata is extra build time data BuildMetadata = "unreleased" From ae0d4b151b621a2f12a9b89e75a868349a6fc80f Mon Sep 17 00:00:00 2001 From: Matthew Fisher Date: Thu, 9 May 2019 14:55:17 -0700 Subject: [PATCH 477/483] fix(pkg/storage/driver): use shallowReleaseEqual() Signed-off-by: Matthew Fisher --- pkg/storage/driver/sql_test.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/storage/driver/sql_test.go b/pkg/storage/driver/sql_test.go index 4d669c1b591..b6aa0858807 100644 --- a/pkg/storage/driver/sql_test.go +++ b/pkg/storage/driver/sql_test.go @@ -18,7 +18,6 @@ package driver import ( "fmt" - "reflect" "regexp" "testing" "time" @@ -41,7 +40,10 @@ func TestSQLGet(t *testing.T) { key := testKey(name, vers) rel := releaseStub(name, vers, namespace, rspb.Status_DEPLOYED) - body, _ := encodeRelease(rel) + body, err := encodeRelease(rel) + if err != nil { + t.Fatal(err) + } sqlDriver, mock := newTestFixtureSQL(t) mock. @@ -60,7 +62,7 @@ func TestSQLGet(t *testing.T) { t.Fatalf("Failed to get release: %v", err) } - if !reflect.DeepEqual(rel, got) { + if !shallowReleaseEqual(rel, got) { t.Errorf("Expected release {%q}, got {%q}", rel, got) } @@ -275,7 +277,7 @@ func TestSqlQuery(t *testing.T) { } for _, res := range results { - if !reflect.DeepEqual(res, deployedRelease) { + if !shallowReleaseEqual(res, deployedRelease) { t.Errorf("Expected release {%q}, got {%q}", deployedRelease, res) } } @@ -290,7 +292,7 @@ func TestSqlQuery(t *testing.T) { } for _, res := range results { - if !reflect.DeepEqual(res, deployedRelease) && !reflect.DeepEqual(res, supersededRelease) { + if !shallowReleaseEqual(res, deployedRelease) && !shallowReleaseEqual(res, supersededRelease) { t.Errorf("Expected release {%q} or {%q}, got {%q}", deployedRelease, supersededRelease, res) } } @@ -334,7 +336,7 @@ func TestSqlDelete(t *testing.T) { t.Fatalf("failed to delete release with key %q: %v", key, err) } - if !reflect.DeepEqual(rel, deletedRelease) { + if !shallowReleaseEqual(rel, deletedRelease) { t.Errorf("Expected release {%q}, got {%q}", rel, deletedRelease) } From e1b993bae8444ca73b48e7a2fd51cae1f5ace2a3 Mon Sep 17 00:00:00 2001 From: Jon Huhn Date: Thu, 9 May 2019 19:07:32 -0500 Subject: [PATCH 478/483] Fix typo Signed-off-by: Jon Huhn --- cmd/helm/lint.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/helm/lint.go b/cmd/helm/lint.go index 746f946f226..79fd7a21973 100644 --- a/cmd/helm/lint.go +++ b/cmd/helm/lint.go @@ -177,7 +177,7 @@ func lintChart(path string, vals []byte, namespace string, strict bool) (support // vals merges values from files specified via -f/--values and // directly via --set or --set-string or --set-file, marshaling them to YAML // -// This func is implemented intentionally and separately from the `vals` func for the `install` and `upgrade` comammdsn. +// This func is implemented intentionally and separately from the `vals` func for the `install` and `upgrade` commands. // Compared to the alternative func, this func lacks the parameters for tls opts - ca key, cert, and ca cert. // That's because this command, `lint`, is explicitly forbidden from making server connections. func (l *lintCmd) vals() ([]byte, error) { From c4ac3833c592bddf66fccd6b475f4f690b5206c9 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 10 May 2019 12:49:15 +0100 Subject: [PATCH 479/483] Update release checklist with bumping release version Signed-off-by: Martin Hickey --- docs/release_checklist.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index bddb50ffb61..4847d83fe4f 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -147,6 +147,24 @@ git add . git commit -m "bump version to $RELEASE_CANDIDATE_NAME" ``` +This will update it for the $RELEASE_BRANCH_NAME only. You will also need to pull +this change into the master branch for when the next release is being created. + +```shell +# get the last commit id i.e. commit to bump the version +git log --format="%H" -n 1 + +# create new branch off master +git checkout master +git checkout -b bump-version- + +# cherry pick the commit using id from first command +git cherry-pick -x + +# commit the change +git push upstream bump-version- +``` + ## 3. Commit and Push the Release Branch In order for others to start testing, we can now push the release branch From 3b3c8c4ab62ac6411ecffb9b7f63f4b733246b37 Mon Sep 17 00:00:00 2001 From: Martin Hickey Date: Fri, 10 May 2019 15:47:37 +0100 Subject: [PATCH 480/483] Change command to push to origin remote Update review comment: - https://github.com/helm/helm/pull/5712#pullrequestreview-236124918 Signed-off-by: Martin Hickey --- docs/release_checklist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_checklist.md b/docs/release_checklist.md index 4847d83fe4f..86745783031 100644 --- a/docs/release_checklist.md +++ b/docs/release_checklist.md @@ -162,7 +162,7 @@ git checkout -b bump-version- git cherry-pick -x # commit the change -git push upstream bump-version- +git push origin bump-version- ``` ## 3. Commit and Push the Release Branch From 08fe2a6209bf2f3673f7568e2df6ecce7a9009cc Mon Sep 17 00:00:00 2001 From: Paulo Martins Date: Tue, 14 May 2019 16:35:31 +0100 Subject: [PATCH 481/483] Add helm-ssm plugin Signed-off-by: Paulo Martins --- docs/related.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/related.md b/docs/related.md index 4a38e68f1e1..be16ea22fa8 100644 --- a/docs/related.md +++ b/docs/related.md @@ -51,6 +51,7 @@ or [pull request](https://github.com/helm/helm/pulls). - [helm-plugin-utils](https://github.com/maorfr/helm-plugin-utils) - Utility functions to be used within Helm plugins - [helm-restore](https://github.com/maorfr/helm-restore) - Plugin to restore a deployed release to its original state - [helm-secrets](https://github.com/futuresimple/helm-secrets) - Plugin to manage and store secrets safely +- [helm-ssm](https://github.com/codacy/helm-ssm) - Plugin to inject values coming from AWS SSM parameters on the `values.yaml` file - [helm-stop](https://github.com/IBM/helm-stop) - Plugin for stopping a release pods - [helm-template](https://github.com/technosophos/helm-template) - Debug/render templates client-side - [helm-tiller](https://github.com/adamreese/helm-tiller) - Additional commands to work with Tiller From d4053b38cde3f103b088c802c40a0437bbb21002 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Tue, 14 May 2019 14:12:47 -0400 Subject: [PATCH 482/483] Adding lint check for apiVersion which is a required field Fixes #5727 Signed-off-by: Matt Farina --- pkg/lint/lint_test.go | 10 +++++++--- pkg/lint/rules/chartfile.go | 13 +++++++++++++ pkg/lint/rules/chartfile_test.go | 14 +++++++++----- pkg/lint/rules/testdata/albatross/Chart.yaml | 1 + pkg/lint/rules/testdata/badvaluesfile/Chart.yaml | 1 + pkg/lint/rules/testdata/goodone/Chart.yaml | 1 + 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/pkg/lint/lint_test.go b/pkg/lint/lint_test.go index 8bf5a09274c..7204f36b9b0 100644 --- a/pkg/lint/lint_test.go +++ b/pkg/lint/lint_test.go @@ -37,12 +37,12 @@ const ( func TestBadChart(t *testing.T) { m := All(badChartDir, values, namespace, strict).Messages - if len(m) != 5 { + if len(m) != 6 { t.Errorf("Number of errors %v", len(m)) t.Errorf("All didn't fail with expected errors, got %#v", m) } // There should be one INFO, 2 WARNINGs and one ERROR messages, check for them - var i, w, e, e2, e3 bool + var i, w, e, e2, e3, e4 bool for _, msg := range m { if msg.Severity == support.InfoSev { if strings.Contains(msg.Err.Error(), "icon is recommended") { @@ -64,9 +64,13 @@ func TestBadChart(t *testing.T) { if strings.Contains(msg.Err.Error(), "directory name (badchartfile) and chart name () must be the same") { e3 = true } + + if strings.Contains(msg.Err.Error(), "apiVersion is required") { + e4 = true + } } } - if !e || !e2 || !e3 || !w || !i { + if !e || !e2 || !e3 || !e4 || !w || !i { t.Errorf("Didn't find all the expected errors, got %#v", m) } } diff --git a/pkg/lint/rules/chartfile.go b/pkg/lint/rules/chartfile.go index 95ee38f0b14..8ef33d0c5f9 100644 --- a/pkg/lint/rules/chartfile.go +++ b/pkg/lint/rules/chartfile.go @@ -51,6 +51,7 @@ func Chartfile(linter *support.Linter) { linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartNameDirMatch(linter.ChartDir, chartFile)) // Chart metadata + linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartApiVersion(chartFile)) linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartVersion(chartFile)) linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartEngine(chartFile)) linter.RunLinterRule(support.ErrorSev, chartFileName, validateChartMaintainer(chartFile)) @@ -96,6 +97,18 @@ func validateChartNameDirMatch(chartDir string, cf *chart.Metadata) error { return nil } +func validateChartApiVersion(cf *chart.Metadata) error { + if cf.ApiVersion == "" { + return errors.New("apiVersion is required") + } + + if cf.ApiVersion != "v1" { + return fmt.Errorf("apiVersion '%s' is not valid. The value must be \"v1\"", cf.ApiVersion) + } + + return nil +} + func validateChartVersion(cf *chart.Metadata) error { if cf.Version == "" { return errors.New("version is required") diff --git a/pkg/lint/rules/chartfile_test.go b/pkg/lint/rules/chartfile_test.go index 2422a2d1057..a44129acfb9 100644 --- a/pkg/lint/rules/chartfile_test.go +++ b/pkg/lint/rules/chartfile_test.go @@ -236,8 +236,8 @@ func TestChartfile(t *testing.T) { Chartfile(&linter) msgs := linter.Messages - if len(msgs) != 4 { - t.Errorf("Expected 3 errors, got %d", len(msgs)) + if len(msgs) != 5 { + t.Errorf("Expected 4 errors, got %d", len(msgs)) } if !strings.Contains(msgs[0].Err.Error(), "name is required") { @@ -248,12 +248,16 @@ func TestChartfile(t *testing.T) { t.Errorf("Unexpected message 1: %s", msgs[1].Err) } - if !strings.Contains(msgs[2].Err.Error(), "version 0.0.0 is less than or equal to 0") { + if !strings.Contains(msgs[2].Err.Error(), "apiVersion is required") { t.Errorf("Unexpected message 2: %s", msgs[2].Err) } - if !strings.Contains(msgs[3].Err.Error(), "icon is recommended") { - t.Errorf("Unexpected message 3: %s", msgs[3].Err) + if !strings.Contains(msgs[3].Err.Error(), "version 0.0.0 is less than or equal to 0") { + t.Errorf("Unexpected message 3: %s", msgs[2].Err) + } + + if !strings.Contains(msgs[4].Err.Error(), "icon is recommended") { + t.Errorf("Unexpected message 4: %s", msgs[3].Err) } } diff --git a/pkg/lint/rules/testdata/albatross/Chart.yaml b/pkg/lint/rules/testdata/albatross/Chart.yaml index c108fa5e5a0..21124acfc66 100644 --- a/pkg/lint/rules/testdata/albatross/Chart.yaml +++ b/pkg/lint/rules/testdata/albatross/Chart.yaml @@ -1,3 +1,4 @@ +apiVersion: v1 name: albatross description: testing chart version: 199.44.12345-Alpha.1+cafe009 diff --git a/pkg/lint/rules/testdata/badvaluesfile/Chart.yaml b/pkg/lint/rules/testdata/badvaluesfile/Chart.yaml index bed845249cb..632919d0333 100644 --- a/pkg/lint/rules/testdata/badvaluesfile/Chart.yaml +++ b/pkg/lint/rules/testdata/badvaluesfile/Chart.yaml @@ -1,3 +1,4 @@ +apiVersion: v1 name: badvaluesfile description: A Helm chart for Kubernetes version: 0.0.1 diff --git a/pkg/lint/rules/testdata/goodone/Chart.yaml b/pkg/lint/rules/testdata/goodone/Chart.yaml index de05463ca51..cb7a4bf20c0 100644 --- a/pkg/lint/rules/testdata/goodone/Chart.yaml +++ b/pkg/lint/rules/testdata/goodone/Chart.yaml @@ -1,3 +1,4 @@ +apiVersion: v1 name: goodone description: good testing chart version: 199.44.12345-Alpha.1+cafe009 From 7e05489792f59b5ed674161c1a378b41450b1e3d Mon Sep 17 00:00:00 2001 From: Pierre Gaxatte <30696904+pgaxatte@users.noreply.github.com> Date: Thu, 16 May 2019 11:06:06 +0200 Subject: [PATCH 483/483] Add missing test hooks in the list of annotations Adds `test-success` and `test-failure` hooks to the list of annotations. Signed-off-by: Pierre Gaxatte <30696904+pgaxatte@users.noreply.github.com> --- docs/charts_hooks.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/charts_hooks.md b/docs/charts_hooks.md index 3044414c328..9fb08d67601 100644 --- a/docs/charts_hooks.md +++ b/docs/charts_hooks.md @@ -49,6 +49,10 @@ The following hooks are defined: have been modified. - crd-install: Adds CRD resources before any other checks are run. This is used only on CRD definitions that are used by other manifests in the chart. +- test-success: Executes when running `helm test` and expects the pod to + return successfully (return code == 0). +- test-failure: Executes when running `helm test` and expects the pod to + fail (return code != 0). ## Hooks and the Release Lifecycle