From 41f4a70965720d195c4c9fad9fbfa5dbd1a80236 Mon Sep 17 00:00:00 2001 From: tamal Date: Wed, 22 Mar 2017 09:59:57 -0700 Subject: [PATCH] Convert release key into TPR safe key --- client/clientset/codec.go | 5 +++-- pkg/storage/driver/releases.go | 26 ++++++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/client/clientset/codec.go b/client/clientset/codec.go index 0dd5056f6..fd4e12afa 100644 --- a/client/clientset/codec.go +++ b/client/clientset/codec.go @@ -3,17 +3,18 @@ package clientset import ( "encoding/json" "io" + "log" "net/url" "reflect" "strings" "github.com/ghodss/yaml" - aci "k8s.io/helm/api" "k8s.io/kubernetes/pkg/api" schema "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" kubejson "k8s.io/kubernetes/pkg/runtime/serializer/json" - "log" + + aci "k8s.io/helm/api" ) // TODO(@sadlil): Find a better way to replace ExtendedCodec to encode and decode objects. diff --git a/pkg/storage/driver/releases.go b/pkg/storage/driver/releases.go index 9bf5ebb5d..86b92a58e 100644 --- a/pkg/storage/driver/releases.go +++ b/pkg/storage/driver/releases.go @@ -20,21 +20,22 @@ import ( "bytes" "fmt" "io" + "regexp" "strconv" "strings" "time" google_protobuf "github.com/golang/protobuf/ptypes/timestamp" + "github.com/graymeta/stow" "k8s.io/kubernetes/pkg/api" kberrs "k8s.io/kubernetes/pkg/api/errors" + "k8s.io/kubernetes/pkg/api/unversioned" kblabels "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/util/validation" - "github.com/graymeta/stow" rapi "k8s.io/helm/api" "k8s.io/helm/client/clientset" rspb "k8s.io/helm/pkg/proto/hapi/release" - "k8s.io/kubernetes/pkg/api/unversioned" ) var _ Driver = (*Releases)(nil) @@ -73,7 +74,7 @@ func (releases *Releases) Name() string { // or error if not found. func (releases *Releases) Get(key string) (*rspb.Release, error) { // fetch the release holding the release named by key - obj, err := releases.impl.Get(key) + obj, err := releases.impl.Get(toTPRSafeKey(key)) if err != nil { if kberrs.IsNotFound(err) { return nil, ErrReleaseNotFound @@ -180,7 +181,7 @@ func (releases *Releases) Create(key string, rls *rspb.Release) error { lbs.set("CREATED_AT", strconv.Itoa(int(time.Now().Unix()))) // create a new release to hold the release - obj, err := newReleasesObject(key, rls, lbs) + obj, err := newReleasesObject(toTPRSafeKey(key), rls, lbs) if err != nil { logerrf(err, "create: failed to encode release %q", rls.Name) return err @@ -213,7 +214,7 @@ func (releases *Releases) Update(key string, rls *rspb.Release) error { lbs.set("MODIFIED_AT", strconv.Itoa(int(time.Now().Unix()))) // create a new release object to hold the release - obj, err := newReleasesObject(key, rls, lbs) + obj, err := newReleasesObject(toTPRSafeKey(key), rls, lbs) if err != nil { logerrf(err, "update: failed to encode release %q", rls.Name) return err @@ -236,7 +237,7 @@ func (releases *Releases) Update(key string, rls *rspb.Release) error { // Delete deletes the Release holding the release named by key. func (releases *Releases) Delete(key string) (rls *rspb.Release, err error) { // fetch the release to check existence - if rls, err = releases.Get(key); err != nil { + if rls, err = releases.Get(toTPRSafeKey(key)); err != nil { if kberrs.IsNotFound(err) { return nil, ErrReleaseNotFound } @@ -317,6 +318,19 @@ func (releases *Releases) getReleaseData(rls *rapi.Release) (string, error) { return "", fmt.Errorf("Missing release data for %v", rls.Name) } +var ( + protoRegex = regexp.MustCompile(`^[a-z0-9][-a-z0-9]*.v[0-9]+$`) +) + +func toTPRSafeKey(key string) string { + if protoRegex.MatchString(key) { + i := strings.LastIndex(key, ".v") + return key[:i] + "-" + key[i+1:] + } else { + return key + } +} + // readAll reads from r until an error or EOF and returns the data it read // from the internal buffer allocated with a specified capacity. func readAll(r io.Reader, capacity int64) (b []byte, err error) {