diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 0f375dd79..5129d5f97 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -220,7 +220,7 @@ func (i *installCmd) run() error { } // Print the status like status command does - status, err := i.client.ReleaseStatus(rel.Name) + status, err := i.client.ReleaseStatus(rel.Name, rel.Namespace) if err != nil { return prettyError(err) } diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index ee7b17515..df4eabeb0 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -36,6 +36,7 @@ second is a revision (version) number. To see revision numbers, run type rollbackCmd struct { name string + namespace string revision int32 dryRun bool recreate bool @@ -76,6 +77,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.StringVar(&rollback.namespace, "namespace", "default", "namespace of the release") f.BoolVar(&rollback.recreate, "recreate-pods", false, "performs pods restart for the resource if applicable") 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)") @@ -86,6 +88,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command { func (r *rollbackCmd) run() error { _, err := r.client.RollbackRelease( r.name, + r.namespace, helm.RollbackDryRun(r.dryRun), helm.RollbackRecreate(r.recreate), helm.RollbackDisableHooks(r.disableHooks), diff --git a/cmd/helm/status.go b/cmd/helm/status.go index 92d4e3768..33631c60e 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -33,6 +33,7 @@ This command shows the status of a named release. type statusCmd struct { release string + namespace string out io.Writer client helm.Interface version int32 @@ -62,12 +63,13 @@ 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().StringVar(&status.namespace, "namespace", "default", "namespace of the release") return cmd } func (s *statusCmd) run() error { - res, err := s.client.ReleaseStatus(s.release, helm.StatusReleaseVersion(s.version)) + res, err := s.client.ReleaseStatus(s.release, s.namespace, helm.StatusReleaseVersion(s.version)) if err != nil { return prettyError(err) } diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 6d9ac1faa..aa4a88f71 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -152,6 +152,7 @@ func (u *upgradeCmd) run() error { resp, err := u.client.UpdateRelease( u.release, chartPath, + u.namespace, helm.UpdateValueOverrides(rawVals), helm.UpgradeDryRun(u.dryRun), helm.UpgradeRecreate(u.recreate), @@ -168,7 +169,7 @@ func (u *upgradeCmd) run() error { fmt.Fprintf(u.out, "Release %q has been upgraded. Happy Helming!\n", u.release) // Print the status like status command does - status, err := u.client.ReleaseStatus(u.release) + status, err := u.client.ReleaseStatus(u.release, u.namespace) if err != nil { return prettyError(err) } diff --git a/pkg/helm/client.go b/pkg/helm/client.go index de812fa93..f0bcd1456 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -32,15 +32,16 @@ import ( "k8s.io/kubernetes/pkg/client/restclient" rest "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" - "strconv" "math/rand" + "strconv" "time" ) // Client manages client side of the helm-tiller protocol func init() { - rand.Seed(time.Now().UnixNano()) + rand.Seed(time.Now().UnixNano()) } + type Client struct { opts options } @@ -137,7 +138,7 @@ func (h *Client) DeleteRelease(rlsName string, namespace string, opts ...DeleteO } // UpdateRelease updates a release to a new/different chart -func (h *Client) UpdateRelease(rlsName string, chstr string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) { +func (h *Client) UpdateRelease(rlsName string, chstr string,namespace string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) { // load the chart to update chart, err := chartutil.Load(chstr) if err != nil { @@ -161,7 +162,7 @@ func (h *Client) UpdateRelease(rlsName string, chstr string, opts ...UpdateOptio return nil, err } } - return h.update(ctx, req) + return h.update(ctx, namespace, req) } // GetVersion returns the server version @@ -181,7 +182,7 @@ func (h *Client) GetVersion(opts ...VersionOption) (*rls.GetVersionResponse, err } // RollbackRelease rolls back a release to the previous version -func (h *Client) RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) { +func (h *Client) RollbackRelease(rlsName string,namespace string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) { for _, opt := range opts { opt(&h.opts) } @@ -196,11 +197,11 @@ func (h *Client) RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.R return nil, err } } - return h.rollback(ctx, req) + return h.rollback(ctx, namespace, req) } // ReleaseStatus returns the given release's status. -func (h *Client) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) { +func (h *Client) ReleaseStatus(rlsName string, namespace string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) { for _, opt := range opts { opt(&h.opts) } @@ -213,7 +214,7 @@ func (h *Client) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetRe return nil, err } } - return h.status(ctx, req) + return h.status(ctx, namespace, req) } // ReleaseContent returns the configuration for a given release. @@ -303,19 +304,20 @@ func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (* } // Executes tiller.UninstallRelease RPC. -func (h *Client) delete(ctx context.Context,namespace string, req *rls.UninstallReleaseRequest) (*rls.UninstallReleaseResponse, error) { - c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) - if err != nil { - return nil, err - } - defer c.Close() - - rlc := rls.NewReleaseServiceClient(c) - return rlc.UninstallRelease(ctx, req) +func (h *Client) delete(ctx context.Context, namespace string, req *rls.UninstallReleaseRequest) (*rls.UninstallReleaseResponse, error) { + c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) + if err != nil { + return nil, err + } + defer c.Close() + + rlc := rls.NewReleaseServiceClient(c) + return rlc.UninstallRelease(ctx, req) resp := &rls.UninstallReleaseResponse{} client, err := getRESTClient() // TODO handle response - err = client.RESTClient().Delete().Namespace(namespace).Resource("releases").Name(req.Name).Do().Error() // TODO handle namespace + release := new(hapi.Release) + err = client.RESTClient().Delete().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) if err != nil { return resp, err } @@ -323,7 +325,7 @@ func (h *Client) delete(ctx context.Context,namespace string, req *rls.Uninstall } // Executes tiller.UpdateRelease RPC. -func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rls.UpdateReleaseResponse, error) { +func (h *Client) update(ctx context.Context,namespace string, req *rls.UpdateReleaseRequest) (*rls.UpdateReleaseResponse, error) { /* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) if err != nil { return nil, err @@ -336,7 +338,7 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl client, err := getRESTClient() // get the release release := new(hapi.Release) - err = client.RESTClient().Get().Namespace("default").Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace + err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace if err != nil { return resp, err } @@ -346,9 +348,10 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl release.Spec.Recreate = req.Recreate release.Spec.Timeout = req.Timeout release.Spec.Chart.Inline = req.Chart + release.Spec.Version = release.Spec.Version // update the release updatedRelease := new(hapi.Release) - err = client.RESTClient().Put().Namespace(release.Namespace).Resource("releases").Name(release.Name).Body(release).Do().Into(updatedRelease) + err = client.RESTClient().Put().Namespace(namespace).Resource("releases").Name(release.Name).Body(release).Do().Into(updatedRelease) if err != nil { return resp, err } @@ -365,7 +368,7 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl } // Executes tiller.RollbackRelease RPC. -func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) (*rls.RollbackReleaseResponse, error) { +func (h *Client) rollback(ctx context.Context, namespace string, req *rls.RollbackReleaseRequest) (*rls.RollbackReleaseResponse, error) { /* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) if err != nil { return nil, err @@ -381,12 +384,14 @@ func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) } client, err := clientset.NewForConfig(config) event, err := makeEventForRollBack(req) + event.ObjectMeta.Namespace = namespace + event.InvolvedObject.Namespace = namespace event.InvolvedObject.Name = (req.Name + "-v" + strconv.Itoa(int(req.Version))) event.ObjectMeta.Name = event.InvolvedObject.Name + "-" + RandStringRunes(5) if err != nil { return resp, err } - _, err = client.Core().Events("default").Create(event) // TODO namespace + _, err = client.Core().Events(namespace).Create(event) // TODO namespace if err != nil { return resp, err } @@ -395,35 +400,35 @@ func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) } // Executes tiller.GetReleaseStatus RPC. -func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) (*rls.GetReleaseStatusResponse, error) { -/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) - if err != nil { - return nil, err - } - defer c.Close() +func (h *Client) status(ctx context.Context, namespace string, req *rls.GetReleaseStatusRequest) (*rls.GetReleaseStatusResponse, error) { + /* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure()) + if err != nil { + return nil, err + } + defer c.Close() - rlc := rls.NewReleaseServiceClient(c) - return rlc.GetReleaseStatus(ctx, req)*/ + rlc := rls.NewReleaseServiceClient(c) + return rlc.GetReleaseStatus(ctx, req)*/ resp := &rls.GetReleaseStatusResponse{} client, err := getRESTClient() if err != nil { return resp, err } release := new(hapi.Release) - err = client.RESTClient().Get().Namespace("default").Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace + err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace if err != nil { return resp, err } v := release.Spec.Version releaseVersion := new(hapi.ReleaseVersion) name := req.Name + "-v" + strconv.Itoa(int(v)) - duration :=time.Duration(5) * time.Second - for i:=0;i<=10;i++ { + duration := time.Duration(5) * time.Second + for i := 0; i <= 10; i++ { time.Sleep(duration) - err = client.RESTClient().Get().Namespace("default").Resource("releaseversions").Name(name).Do().Into(releaseVersion) // TODO handle namespace + err = client.RESTClient().Get().Namespace(namespace).Resource("releaseversions").Name(name).Do().Into(releaseVersion) // TODO handle namespace if err != nil { continue - }else { + } else { break } } @@ -434,7 +439,7 @@ func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) ( resp.Namespace = release.Namespace resp.Info = new(rs.Info) resp.Info.Status = releaseVersion.Status.Status -/* *resp.Info.FirstDeployed = releaseVersion.Status.FirstDeployed //TODO + /* *resp.Info.FirstDeployed = releaseVersion.Status.FirstDeployed //TODO *resp.Info.LastDeployed = releaseVersion.Status.LastDeployed *resp.Info.Deleted = releaseVersion.Status.Deleted*/ return resp, nil @@ -546,12 +551,8 @@ func makeEventForRollBack(req *rls.RollbackReleaseRequest) (*api.Event, error) { return &api.Event{}, err } event := &api.Event{ - ObjectMeta: api.ObjectMeta{ - Namespace: "default", //TODO handle namespace - }, InvolvedObject: api.ObjectReference{ Kind: "release", - Namespace: "default", //TODO handle namespace }, Reason: "releaseRollback", Message: string(message), @@ -561,13 +562,12 @@ func makeEventForRollBack(req *rls.RollbackReleaseRequest) (*api.Event, error) { return event, nil } - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") func RandStringRunes(n int) string { - b := make([]rune, n) - for i := range b { - b[i] = letterRunes[rand.Intn(len(letterRunes))] - } - return string(b) -} \ No newline at end of file + b := make([]rune, n) + for i := range b { + b[i] = letterRunes[rand.Intn(len(letterRunes))] + } + return string(b) +} diff --git a/pkg/helm/interface.go b/pkg/helm/interface.go index a4e3d0601..cf711b2e4 100644 --- a/pkg/helm/interface.go +++ b/pkg/helm/interface.go @@ -25,9 +25,9 @@ type Interface interface { ListReleases(opts ...ReleaseListOption) (*rls.ListReleasesResponse, error) InstallRelease(chStr, namespace string, opts ...InstallOption) (*rls.InstallReleaseResponse, error) DeleteRelease(rlsName string, namespace string, opts ...DeleteOption) (*rls.UninstallReleaseResponse, error) - ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) - UpdateRelease(rlsName, chStr string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) - RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) + ReleaseStatus(rlsName string, namespace string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) + UpdateRelease(rlsName, chStr string, namespace string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) + RollbackRelease(rlsName string, namespace string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) ReleaseContent(rlsName string, opts ...ContentOption) (*rls.GetReleaseContentResponse, error) ReleaseHistory(rlsName string, opts ...HistoryOption) (*rls.GetHistoryResponse, error) GetVersion(opts ...VersionOption) (*rls.GetVersionResponse, error)