func (s *releaseServer) uniqName(start string) (string, error) { // If a name is supplied, we check to see if that name is taken. Right now, // we fail if it is already taken. We could instead fall-thru and allow // an automatically generated name, but this seems to violate the principle // of least surprise. if start != "" { if _, err := s.env.Releases.Read(start); err == storage.ErrNotFound { return start, nil } return "", fmt.Errorf("a release named %q already exists", start) } maxTries := 5 for i := 0; i < maxTries; i++ { namer := moniker.New() name := namer.NameSep("-") if _, err := s.env.Releases.Read(name); err == storage.ErrNotFound { return name, nil } log.Printf("info: Name %q is taken. Searching again.", name) } log.Printf("warning: No available release names found after %d tries", maxTries) return "ERROR", errors.New("no available release name found") }
func (s *releaseServer) uniqName(start string, reuse bool) (string, error) { // If a name is supplied, we check to see if that name is taken. If not, it // is granted. If reuse is true and a deleted release with that name exists, // we re-grant it. Otherwise, an error is returned. if start != "" { if len(start) > releaseNameMaxLen { return "", fmt.Errorf("release name %q exceeds max length of %d", start, releaseNameMaxLen) } h, err := s.env.Releases.History(start) if err != nil || len(h) < 1 { return start, nil } relutil.Reverse(h, relutil.SortByRevision) 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. log.Printf("reusing name %q", start) return start, nil } else if reuse { return "", errors.New("cannot re-use a name that is still in use") } return "", fmt.Errorf("a release named %q already exists", start) } maxTries := 5 for i := 0; i < maxTries; i++ { namer := moniker.New() name := namer.NameSep("-") if len(name) > releaseNameMaxLen { name = name[:releaseNameMaxLen] } if _, err := s.env.Releases.Get(name, 1); err == driver.ErrReleaseNotFound { return name, nil } log.Printf("info: Name %q is taken. Searching again.", name) } log.Printf("warning: No available release names found after %d tries", maxTries) return "ERROR", errors.New("no available release name found") }