diff --git a/cmd/helm/install.go b/cmd/helm/install.go index 5129d5f97..ba61176e2 100644 --- a/cmd/helm/install.go +++ b/cmd/helm/install.go @@ -189,8 +189,6 @@ func (i *installCmd) run() error { // Print the final name so the user knows what the final name of the release is. fmt.Printf("FINAL NAME: %s\n", i.name) } - - res, err := i.client.InstallRelease( i.chartPath, i.namespace, diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 093749c2d..d7a2bb74a 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -19,6 +19,7 @@ package helm // import "k8s.io/helm/pkg/helm" import ( "fmt" "github.com/golang/protobuf/ptypes" + "github.com/technosophos/moniker" "golang.org/x/net/context" "google.golang.org/grpc" "gopkg.in/square/go-jose.v1/json" @@ -280,13 +281,33 @@ func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (* rlc := rls.NewReleaseServiceClient(c) return rlc.InstallRelease(ctx, req)*/ resp := &rls.InstallReleaseResponse{} - releaseObj := makeReleaseObject(req) - releaseObj.Spec.Version = 1 - release := new(hapi.Release) + maxTries := 5 + releaseNameMaxLen := 53 + name := req.Name client, err := getRESTClient() if err != nil { return resp, err } + if len(name) == 0 { + for i := 0; i < maxTries; i++ { + namer := moniker.New() + name = namer.NameSep("-") + if len(name) > releaseNameMaxLen { + name = name[:releaseNameMaxLen] + } + rv := name + "-v1" + err = client.RESTClient().Get().Namespace(req.Namespace).Resource("releaseversion").Name(rv).Do().Error() + if err == nil { + fmt.Println("info: Name %q is taken. Searching again.", name) + }else { + break + } + } + } + req.Name = name + releaseObj := makeReleaseObject(req) + releaseObj.Spec.Version = 1 + release := new(hapi.Release) err = client.RESTClient().Post().Namespace(req.Namespace).Resource("releases").Body(releaseObj).Do().Into(release) if err != nil { return resp, err @@ -412,32 +433,40 @@ func (h *Client) rollback(ctx context.Context, namespace string, req *rls.Rollba // Executes tiller.GetReleaseStatus RPC. 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() +/* 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 } + duration := time.Duration(5) * time.Second release := new(hapi.Release) - err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace + for i := 0; i <= 10; i++ { + err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace + if err == nil { + break + } + time.Sleep(duration) + } 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++ { - time.Sleep(duration) err = client.RESTClient().Get().Namespace(namespace).Resource("releaseversions").Name(name).Do().Into(releaseVersion) // TODO handle namespace if err != nil { + time.Sleep(duration) continue } else { break