diff --git a/cmd/helm/get.go b/cmd/helm/get.go index a2eb1d137fd41bb702cfef053306f5c62f8eac74..8c899eb370b49116662faf2834ff4a36c6422921 100644 --- a/cmd/helm/get.go +++ b/cmd/helm/get.go @@ -81,9 +81,9 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command { // getCmd is the command that implements 'helm get' func (g *getCmd) run() error { - res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.version)) + res, err := g.client.ReleaseContent(g.release, g.version) if err != nil { return prettyError(err) } - return printRelease(g.out, res.Release) + return printRelease(g.out, res) } diff --git a/cmd/helm/get_hooks.go b/cmd/helm/get_hooks.go index 1b6f2f8fef5648355a1afb99901cf62e7ec49c39..9da290682c8369d0942dd694113f99b8dff7c6e9 100644 --- a/cmd/helm/get_hooks.go +++ b/cmd/helm/get_hooks.go @@ -62,13 +62,13 @@ func newGetHooksCmd(client helm.Interface, out io.Writer) *cobra.Command { } func (g *getHooksCmd) run() error { - res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.version)) + res, err := g.client.ReleaseContent(g.release, g.version) if err != nil { fmt.Fprintln(g.out, g.release) return prettyError(err) } - for _, hook := range res.Release.Hooks { + for _, hook := range res.Hooks { fmt.Fprintf(g.out, "---\n# %s\n%s", hook.Name, hook.Manifest) } return nil diff --git a/cmd/helm/get_manifest.go b/cmd/helm/get_manifest.go index c01febfb45ab45bd372ece73651f73d203f50c9f..96f754936d216e1af3f8f03b7537405be8ee8e81 100644 --- a/cmd/helm/get_manifest.go +++ b/cmd/helm/get_manifest.go @@ -66,10 +66,10 @@ func newGetManifestCmd(client helm.Interface, out io.Writer) *cobra.Command { // getManifest implements 'helm get manifest' func (g *getManifestCmd) run() error { - res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.version)) + res, err := g.client.ReleaseContent(g.release, g.version) if err != nil { return prettyError(err) } - fmt.Fprintln(g.out, res.Release.Manifest) + fmt.Fprintln(g.out, res.Manifest) return nil } diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index b6ce648e519d83f901f503d33112b74935168e60..98e6290c2ffd16966e8f31fed4849203680997d3 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -65,14 +65,14 @@ func newGetValuesCmd(client helm.Interface, out io.Writer) *cobra.Command { // getValues implements 'helm get values' func (g *getValuesCmd) run() error { - res, err := g.client.ReleaseContent(g.release, helm.ContentReleaseVersion(g.version)) + res, err := g.client.ReleaseContent(g.release, g.version) if err != nil { return prettyError(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) + cfg, err := chartutil.CoalesceValues(res.Chart, res.Config) if err != nil { return err } @@ -84,6 +84,6 @@ func (g *getValuesCmd) run() error { return nil } - fmt.Fprintln(g.out, res.Release.Config.Raw) + fmt.Fprintln(g.out, res.Config.Raw) return nil } diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 05ed1c6fd90895215edf96a844998e207ab491c6..106976564f9d30e7902e6894919a035d6f922f07 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -27,9 +27,13 @@ import ( "google.golang.org/grpc/keepalive" healthpb "google.golang.org/grpc/health/grpc_health_v1" + "k8s.io/helm/pkg/chartutil" "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/storage" + "k8s.io/helm/pkg/storage/driver" ) // maxMsgSize use 20MB as the default message size limit. @@ -38,12 +42,14 @@ const maxMsgSize = 1024 * 1024 * 20 // Client manages client side of the Helm-Tiller protocol. type Client struct { - opts options + opts options + store *storage.Storage } // NewClient creates a new client. func NewClient(opts ...Option) *Client { var c Client + c.store = storage.Init(driver.NewMemory()) // set some sane defaults c.Option(ConnectTimeout(5)) return c.Option(opts...) @@ -127,11 +133,11 @@ func (h *Client) DeleteRelease(rlsName string, opts ...DeleteOption) (*rls.Unins if reqOpts.dryRun { // In the dry run case, just see if the release exists - r, err := h.ReleaseContent(rlsName) + r, err := h.ReleaseContent(rlsName, 0) if err != nil { return &rls.UninstallReleaseResponse{}, err } - return &rls.UninstallReleaseResponse{Release: r.Release}, nil + return &rls.UninstallReleaseResponse{Release: r}, nil } req := &reqOpts.uninstallReq @@ -234,21 +240,11 @@ func (h *Client) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetRe } // ReleaseContent returns the configuration for a given release. -func (h *Client) ReleaseContent(rlsName string, opts ...ContentOption) (*rls.GetReleaseContentResponse, error) { - reqOpts := h.opts - for _, opt := range opts { - opt(&reqOpts) - } - req := &reqOpts.contentReq - req.Name = rlsName - ctx := NewContext() - - if reqOpts.before != nil { - if err := reqOpts.before(ctx, req); err != nil { - return nil, err - } +func (c *Client) ReleaseContent(name string, version int32) (*release.Release, error) { + if version <= 0 { + return c.store.Last(name) } - return h.content(ctx, req) + return c.store.Get(name, version) } // ReleaseHistory returns a release's revision history. diff --git a/pkg/helm/fake.go b/pkg/helm/fake.go index 4adcd8c87bdd0b352d06526a5a7eacf40de52d50..6dfa2833f32aa94a1757c7e48d3a038c02928fcb 100644 --- a/pkg/helm/fake.go +++ b/pkg/helm/fake.go @@ -106,12 +106,12 @@ 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) { // Check to see if the release already exists. - rel, err := c.ReleaseContent(rlsName, nil) + rel, err := c.ReleaseContent(rlsName, 0) if err != nil { return nil, err } - return &rls.UpdateReleaseResponse{Release: rel.Release}, nil + return &rls.UpdateReleaseResponse{Release: rel}, nil } // RollbackRelease returns nil, nil @@ -134,15 +134,13 @@ func (c *FakeClient) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.G } // ReleaseContent returns the configuration for the matching release name in the fake release client. -func (c *FakeClient) ReleaseContent(rlsName string, opts ...ContentOption) (resp *rls.GetReleaseContentResponse, err error) { +func (c *FakeClient) ReleaseContent(rlsName string, version int32) (*release.Release, error) { for _, rel := range c.Rels { if rel.Name == rlsName { - return &rls.GetReleaseContentResponse{ - Release: rel, - }, nil + return rel, nil } } - return resp, fmt.Errorf("No such release: %s", rlsName) + return nil, fmt.Errorf("No such release: %s", rlsName) } // ReleaseHistory returns a release's revision history. diff --git a/pkg/helm/helm_test.go b/pkg/helm/helm_test.go index 2b0436581d79bfb2489871860d4f0cd59033b9e7..5fae8214178855434cf08146e143d8920fe7cf2f 100644 --- a/pkg/helm/helm_test.go +++ b/pkg/helm/helm_test.go @@ -317,6 +317,7 @@ func TestReleaseStatus_VerifyOptions(t *testing.T) { // Verify each ContentOption is applied to a GetReleaseContentRequest correctly. func TestReleaseContent_VerifyOptions(t *testing.T) { + t.Skip("refactoring out") // Options testdata var releaseName = "test" var revision = int32(2) @@ -340,7 +341,7 @@ func TestReleaseContent_VerifyOptions(t *testing.T) { }) client := NewClient(b4c) - if _, err := client.ReleaseContent(releaseName, ContentReleaseVersion(revision)); err != errSkip { + if _, err := client.ReleaseContent(releaseName, revision); err != errSkip { t.Fatalf("did not expect error but got (%v)\n``", err) } diff --git a/pkg/helm/interface.go b/pkg/helm/interface.go index 08aa7564cc31f9f7eaf21d62bc65ecfa0b7d2dec..33f56700601243369089c1d4a0cd2081bc401c1c 100644 --- a/pkg/helm/interface.go +++ b/pkg/helm/interface.go @@ -18,6 +18,7 @@ package helm import ( "k8s.io/helm/pkg/proto/hapi/chart" + "k8s.io/helm/pkg/proto/hapi/release" rls "k8s.io/helm/pkg/proto/hapi/services" ) @@ -31,7 +32,7 @@ type Interface interface { UpdateRelease(rlsName, chStr string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) UpdateReleaseFromChart(rlsName string, chart *chart.Chart, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) - ReleaseContent(rlsName string, opts ...ContentOption) (*rls.GetReleaseContentResponse, error) + ReleaseContent(rlsName string, version int32) (*release.Release, error) ReleaseHistory(rlsName string, opts ...HistoryOption) (*rls.GetHistoryResponse, error) RunReleaseTest(rlsName string, opts ...ReleaseTestOption) (<-chan *rls.TestReleaseResponse, <-chan error) }