From b5f7d90bafcae113d9b5833f482326f4df94b788 Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Tue, 6 Dec 2016 12:10:17 +0300 Subject: [PATCH 1/3] Adding pod restarting while upgrading release * Added pod restarting for - ReplicationController - DaemonSet - PetSet --- pkg/kube/client.go | 60 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index e76ed5180..ac188a794 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -39,6 +39,11 @@ import ( "k8s.io/kubernetes/pkg/util/strategicpatch" "k8s.io/kubernetes/pkg/util/yaml" "k8s.io/kubernetes/pkg/watch" + "k8s.io/kubernetes/pkg/labels" + "k8s.io/kubernetes/pkg/fields" + "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/apis/apps/v1alpha1" + "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found. @@ -216,7 +221,7 @@ func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) return err } - if err := updateResource(info, currentObj); err != nil { + if err := updateResource(c, info, currentObj); err != nil { if alreadyExistErr, ok := err.(ErrAlreadyExists); ok { log.Printf(alreadyExistErr.errorMsg) } else { @@ -312,7 +317,7 @@ func deleteResource(info *resource.Info) error { return resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name) } -func updateResource(target *resource.Info, currentObj runtime.Object) error { +func updateResource(c *Client, target *resource.Info, currentObj runtime.Object) error { encoder := api.Codecs.LegacyCodec(registered.EnabledVersions()...) originalSerialization, err := runtime.Encode(encoder, currentObj) @@ -347,9 +352,60 @@ func updateResource(target *resource.Info, currentObj runtime.Object) error { // send patch to server helper := resource.NewHelper(target.Client, target.Mapping) _, err = helper.Patch(target.Namespace, target.Name, api.StrategicMergePatchType, patch) + + if err != nil { + return err + } + + kind := target.Mapping.GroupVersionKind.Kind + + client, _ := c.Client() + switch kind { + case "ReplicationController": + rc := currentObj.(*v1.ReplicationController) + err = restartPods(client, target.Namespace, rc.Spec.Selector) + case "DaemonSet": + daemonSet := currentObj.(*v1beta1.DaemonSet) + err = restartPods(client, target.Namespace, daemonSet.Spec.Selector.MatchLabels) + case "PetSet": + petSet := currentObj.(*v1alpha1.PetSet) + err = restartPods(client, target.Namespace, petSet.Spec.Selector.MatchLabels) + } + return err } + +func restartPods(client *unversioned.Client, namespace string, selector map[string]string) error { + pods, err := client.Pods(namespace).List(api.ListOptions{ + FieldSelector: fields.Everything(), + LabelSelector: labels.Set(selector).AsSelector(), + }) + + if err != nil { + return err + } + + // Restart pods + for _, pod := range pods.Items { + log.Printf("Restarting pod: %v/%v", pod.Namespace, pod.Name) + + // Delete each pod for get them restarted with changed spec. + err := client.Pods(pod.Namespace).Delete(pod.Name, &api.DeleteOptions{ + Preconditions: &api.Preconditions{ + UID: &pod.UID, + }, + }) + + if err != nil { + return err + } + } + + return nil +} + + func watchUntilReady(info *resource.Info) error { w, err := resource.NewHelper(info.Client, info.Mapping).WatchSingle(info.Namespace, info.Name, info.ResourceVersion) if err != nil { From 045b158c3d634d915c1f659e5a18c6631a1993a3 Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Wed, 7 Dec 2016 11:39:04 +0300 Subject: [PATCH 2/3] Introducing flag for restarting pods during release upgrade/rollback * Added pod restart for ReplicaSet * Added --restart flag for helm CLI for upgrade/rollback commands * By default, restart is false --- _proto/hapi/services/tiller.proto | 4 ++++ cmd/helm/rollback.go | 3 +++ cmd/helm/upgrade.go | 3 +++ pkg/helm/client.go | 1 + pkg/helm/option.go | 16 ++++++++++++++++ pkg/kube/client.go | 19 ++++++++++++------- pkg/proto/hapi/services/tiller.pb.go | 4 ++++ pkg/tiller/environment/environment.go | 2 +- pkg/tiller/release_server.go | 10 +++++----- 9 files changed, 49 insertions(+), 13 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index d3fd05337..e6074e0cd 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -188,6 +188,8 @@ message UpdateReleaseRequest { bool dry_run = 4; // DisableHooks causes the server to skip running any hooks for the upgrade. bool disable_hooks = 5; + // Performs pods restart for resources if applicable + bool restart = 6; } // UpdateReleaseResponse is the response to an update request. @@ -204,6 +206,8 @@ message RollbackReleaseRequest { bool disable_hooks = 3; // Version is the version of the release to deploy. int32 version = 4; + // Performs pods restart for resources if applicable + bool restart = 5; } // RollbackReleaseResponse is the response to an update request. diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 4159db388..bd46d6665 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -35,6 +35,7 @@ type rollbackCmd struct { name string revision int32 dryRun bool + restart bool disableHooks bool out io.Writer client helm.Interface @@ -71,6 +72,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { f := cmd.Flags() f.BoolVar(&rollback.dryRun, "dry-run", false, "simulate a rollback") + f.BoolVar(&rollback.restart, "restart", false, "performs pods restart for the resource if applicable") f.BoolVar(&rollback.disableHooks, "no-hooks", false, "prevent hooks from running during rollback") return cmd @@ -80,6 +82,7 @@ func (r *rollbackCmd) run() error { _, err := r.client.RollbackRelease( r.name, helm.RollbackDryRun(r.dryRun), + helm.RollbackRestart(r.restart), helm.RollbackDisableHooks(r.disableHooks), helm.RollbackVersion(r.revision), ) diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 950c48c71..856a65f49 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -48,6 +48,7 @@ type upgradeCmd struct { out io.Writer client helm.Interface dryRun bool + restart bool disableHooks bool valuesFile string values string @@ -86,6 +87,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command { f := cmd.Flags() f.StringVarP(&upgrade.valuesFile, "values", "f", "", "path to a values YAML file") f.BoolVar(&upgrade.dryRun, "dry-run", false, "simulate an upgrade") + f.BoolVar(&upgrade.restart, "restart", false, "performs pods restart for the resource if applicable") f.StringVar(&upgrade.values, "set", "", "set values on the command line. Separate values with commas: key1=val1,key2=val2") 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") @@ -143,6 +145,7 @@ func (u *upgradeCmd) run() error { chartPath, helm.UpdateValueOverrides(rawVals), helm.UpgradeDryRun(u.dryRun), + helm.UpgradeRestart(u.restart), helm.UpgradeDisableHooks(u.disableHooks)) if err != nil { return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 5ae781328..bb1793bb5 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -133,6 +133,7 @@ func (h *Client) UpdateRelease(rlsName string, chstr string, opts ...UpdateOptio req.DryRun = h.opts.dryRun req.Name = rlsName req.DisableHooks = h.opts.disableHooks + req.Restart = h.opts.restart ctx := NewContext() if h.opts.before != nil { diff --git a/pkg/helm/option.go b/pkg/helm/option.go index a445e8643..8e0f3651d 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -40,6 +40,8 @@ type options struct { dryRun bool // if set, re-use an existing name reuseName bool + // + restart bool // if set, skip running hooks disableHooks bool // name of release @@ -212,6 +214,13 @@ func RollbackDryRun(dry bool) RollbackOption { } } +// RollbackDryRun will (if true) execute a rollback as a dry run. +func RollbackRestart(restart bool) RollbackOption { + return func(opts *options) { + opts.restart = restart + } +} + // RollbackVersion sets the version of the release to deploy. func RollbackVersion(ver int32) RollbackOption { return func(opts *options) { @@ -233,6 +242,13 @@ func UpgradeDryRun(dry bool) UpdateOption { } } +// UpgradeDryRun will (if true) execute an upgrade as a dry run. +func UpgradeRestart(restart bool) UpdateOption { + return func(opts *options) { + opts.restart = restart + } +} + // ContentOption allows setting optional attributes when // performing a GetReleaseContent tiller rpc. type ContentOption func(*options) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index ac188a794..aaedd6165 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -180,7 +180,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // not present in the target configuration // // Namespace will set the namespaces -func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) error { +func (c *Client) Update(namespace string, currentReader, targetReader io.Reader, restart bool) error { currentInfos, err := c.newBuilder(namespace, currentReader).Do().Infos() if err != nil { return fmt.Errorf("failed decoding reader into objects: %s", err) @@ -221,7 +221,7 @@ func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) return err } - if err := updateResource(c, info, currentObj); err != nil { + if err := updateResource(c, info, currentObj, restart); err != nil { if alreadyExistErr, ok := err.(ErrAlreadyExists); ok { log.Printf(alreadyExistErr.errorMsg) } else { @@ -317,7 +317,7 @@ func deleteResource(info *resource.Info) error { return resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name) } -func updateResource(c *Client, target *resource.Info, currentObj runtime.Object) error { +func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, restart bool) error { encoder := api.Codecs.LegacyCodec(registered.EnabledVersions()...) originalSerialization, err := runtime.Encode(encoder, currentObj) @@ -357,10 +357,11 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object) return err } - kind := target.Mapping.GroupVersionKind.Kind + if restart { + kind := target.Mapping.GroupVersionKind.Kind - client, _ := c.Client() - switch kind { + client, _ := c.Client() + switch kind { case "ReplicationController": rc := currentObj.(*v1.ReplicationController) err = restartPods(client, target.Namespace, rc.Spec.Selector) @@ -370,7 +371,11 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object) case "PetSet": petSet := currentObj.(*v1alpha1.PetSet) err = restartPods(client, target.Namespace, petSet.Spec.Selector.MatchLabels) - } + case "ReplicaSet": + replicaSet := currentObj.(*v1beta1.ReplicaSet) + err = restartPods(client, target.Namespace, replicaSet.Spec.Selector.MatchLabels) + } + } return err } diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 074418600..f056aa0c6 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -246,6 +246,8 @@ type UpdateReleaseRequest struct { DryRun bool `protobuf:"varint,4,opt,name=dry_run,json=dryRun" 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"` + // Performs pods restart for resources if applicable + Restart bool `protobuf:"varint,6,opt,name=restart,json=restart" json:"restart,omitempty"` } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } @@ -293,6 +295,8 @@ type RollbackReleaseRequest struct { DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` // Version is the version of the release to deploy. Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"` + // Performs pods restart for resources if applicable + Restart bool `protobuf:"varint,5,opt,name=restart,json=restart" json:"restart,omitempty"` } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 72fd510be..050af68af 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -133,7 +133,7 @@ type KubeClient interface { // // reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n"). - Update(namespace string, originalReader, modifiedReader io.Reader) error + Update(namespace string, originalReader, modifiedReader io.Reader, restart bool) error // APIClient gets a raw API client for Kubernetes. APIClient() (unversioned.Interface, error) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index abf8a30ff..10f5c77bf 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -331,7 +331,7 @@ func (s *ReleaseServer) performUpdate(originalRelease, updatedRelease *release.R } } - if err := s.performKubeUpdate(originalRelease, updatedRelease); err != nil { + if err := s.performKubeUpdate(originalRelease, updatedRelease, req.Restart); err != nil { log.Printf("warning: Release Upgrade %q failed: %s", updatedRelease.Name, err) originalRelease.Info.Status.Code = release.Status_SUPERSEDED updatedRelease.Info.Status.Code = release.Status_FAILED @@ -463,7 +463,7 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R } } - if err := s.performKubeUpdate(currentRelease, targetRelease); err != nil { + if err := s.performKubeUpdate(currentRelease, targetRelease, req.Restart); err != nil { log.Printf("warning: Release Rollback %q failed: %s", targetRelease.Name, err) currentRelease.Info.Status.Code = release.Status_SUPERSEDED targetRelease.Info.Status.Code = release.Status_FAILED @@ -487,11 +487,11 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R return res, nil } -func (s *ReleaseServer) performKubeUpdate(currentRelease, targetRelease *release.Release) error { +func (s *ReleaseServer) performKubeUpdate(currentRelease, targetRelease *release.Release, restart bool) error { kubeCli := s.env.KubeClient current := bytes.NewBufferString(currentRelease.Manifest) target := bytes.NewBufferString(targetRelease.Manifest) - return kubeCli.Update(targetRelease.Namespace, current, target) + return kubeCli.Update(targetRelease.Namespace, current, target, restart) } // prepareRollback finds the previous release and prepares a new release object with @@ -820,7 +820,7 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install // so as to append to the old release's history r.Version = old.Version + 1 - if err := s.performKubeUpdate(old, r); err != nil { + if err := s.performKubeUpdate(old, r, false); err != nil { log.Printf("warning: Release replace %q failed: %s", r.Name, err) old.Info.Status.Code = release.Status_SUPERSEDED r.Info.Status.Code = release.Status_FAILED From ea6328c7ce44e86d392ad23b8c4dfdfe4e11a21e Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Tue, 13 Dec 2016 10:56:56 +0300 Subject: [PATCH 3/3] Reformatting changes * Run gofmt on all changed files so they formatted properly now --- _proto/hapi/services/tiller.proto | 4 +- cmd/helm/rollback.go | 2 +- pkg/helm/option.go | 4 +- pkg/kube/client.go | 104 +++++++++++++-------------- pkg/proto/hapi/services/tiller.pb.go | 6 +- 5 files changed, 59 insertions(+), 61 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index e6074e0cd..9f9f7ba2a 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -206,8 +206,8 @@ message RollbackReleaseRequest { bool disable_hooks = 3; // Version is the version of the release to deploy. int32 version = 4; - // Performs pods restart for resources if applicable - bool restart = 5; + // Performs pods restart for resources if applicable + bool restart = 5; } // RollbackReleaseResponse is the response to an update request. diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index bd46d6665..151cc94ef 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -35,7 +35,7 @@ type rollbackCmd struct { name string revision int32 dryRun bool - restart bool + restart bool disableHooks bool out io.Writer client helm.Interface diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 8e0f3651d..f8c7b198c 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -40,8 +40,8 @@ type options struct { dryRun bool // if set, re-use an existing name reuseName bool - // - restart bool + // if set, performs pod restart during upgrade/rollback + restart bool // if set, skip running hooks disableHooks bool // name of release diff --git a/pkg/kube/client.go b/pkg/kube/client.go index aaedd6165..58f05a2a8 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -28,22 +28,22 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" + "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apimachinery/registered" + "k8s.io/kubernetes/pkg/apis/apps/v1alpha1" "k8s.io/kubernetes/pkg/apis/batch" + "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" + "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/strategicpatch" "k8s.io/kubernetes/pkg/util/yaml" "k8s.io/kubernetes/pkg/watch" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/api/v1" - "k8s.io/kubernetes/pkg/apis/apps/v1alpha1" - "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found. @@ -353,63 +353,61 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, helper := resource.NewHelper(target.Client, target.Mapping) _, err = helper.Patch(target.Namespace, target.Name, api.StrategicMergePatchType, patch) - if err != nil { + if err != nil { return err } - if restart { - kind := target.Mapping.GroupVersionKind.Kind - - client, _ := c.Client() - switch kind { - case "ReplicationController": - rc := currentObj.(*v1.ReplicationController) - err = restartPods(client, target.Namespace, rc.Spec.Selector) - case "DaemonSet": - daemonSet := currentObj.(*v1beta1.DaemonSet) - err = restartPods(client, target.Namespace, daemonSet.Spec.Selector.MatchLabels) - case "PetSet": - petSet := currentObj.(*v1alpha1.PetSet) - err = restartPods(client, target.Namespace, petSet.Spec.Selector.MatchLabels) - case "ReplicaSet": - replicaSet := currentObj.(*v1beta1.ReplicaSet) - err = restartPods(client, target.Namespace, replicaSet.Spec.Selector.MatchLabels) - } - } + if restart { + kind := target.Mapping.GroupVersionKind.Kind + + client, _ := c.Client() + switch kind { + case "ReplicationController": + rc := currentObj.(*v1.ReplicationController) + err = restartPods(client, target.Namespace, rc.Spec.Selector) + case "DaemonSet": + daemonSet := currentObj.(*v1beta1.DaemonSet) + err = restartPods(client, target.Namespace, daemonSet.Spec.Selector.MatchLabels) + case "PetSet": + petSet := currentObj.(*v1alpha1.PetSet) + err = restartPods(client, target.Namespace, petSet.Spec.Selector.MatchLabels) + case "ReplicaSet": + replicaSet := currentObj.(*v1beta1.ReplicaSet) + err = restartPods(client, target.Namespace, replicaSet.Spec.Selector.MatchLabels) + } + } return err } - func restartPods(client *unversioned.Client, namespace string, selector map[string]string) error { - pods, err := client.Pods(namespace).List(api.ListOptions{ - FieldSelector: fields.Everything(), - LabelSelector: labels.Set(selector).AsSelector(), - }) - - if err != nil { - return err - } - - // Restart pods - for _, pod := range pods.Items { - log.Printf("Restarting pod: %v/%v", pod.Namespace, pod.Name) - - // Delete each pod for get them restarted with changed spec. - err := client.Pods(pod.Namespace).Delete(pod.Name, &api.DeleteOptions{ - Preconditions: &api.Preconditions{ - UID: &pod.UID, - }, - }) - - if err != nil { - return err - } - } - - return nil -} + pods, err := client.Pods(namespace).List(api.ListOptions{ + FieldSelector: fields.Everything(), + LabelSelector: labels.Set(selector).AsSelector(), + }) + + if err != nil { + return err + } + // Restart pods + for _, pod := range pods.Items { + log.Printf("Restarting pod: %v/%v", pod.Namespace, pod.Name) + + // Delete each pod for get them restarted with changed spec. + err := client.Pods(pod.Namespace).Delete(pod.Name, &api.DeleteOptions{ + Preconditions: &api.Preconditions{ + UID: &pod.UID, + }, + }) + + if err != nil { + return err + } + } + + return nil +} func watchUntilReady(info *resource.Info) error { w, err := resource.NewHelper(info.Client, info.Mapping).WatchSingle(info.Namespace, info.Name, info.ResourceVersion) diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index f056aa0c6..3fb984580 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -246,8 +246,8 @@ type UpdateReleaseRequest struct { DryRun bool `protobuf:"varint,4,opt,name=dry_run,json=dryRun" 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"` - // Performs pods restart for resources if applicable - Restart bool `protobuf:"varint,6,opt,name=restart,json=restart" json:"restart,omitempty"` + // Performs pods restart for resources if applicable + Restart bool `protobuf:"varint,6,opt,name=restart,json=restart" json:"restart,omitempty"` } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } @@ -296,7 +296,7 @@ type RollbackReleaseRequest struct { // Version is the version of the release to deploy. Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"` // Performs pods restart for resources if applicable - Restart bool `protobuf:"varint,5,opt,name=restart,json=restart" json:"restart,omitempty"` + Restart bool `protobuf:"varint,5,opt,name=restart,json=restart" json:"restart,omitempty"` } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} }