|
|
@ -20,21 +20,22 @@ import (
|
|
|
|
"bytes"
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"io"
|
|
|
|
|
|
|
|
"regexp"
|
|
|
|
"strconv"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
|
|
|
|
google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
|
|
|
|
|
|
|
|
"github.com/graymeta/stow"
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
|
|
|
kberrs "k8s.io/kubernetes/pkg/api/errors"
|
|
|
|
kberrs "k8s.io/kubernetes/pkg/api/errors"
|
|
|
|
|
|
|
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
|
|
|
kblabels "k8s.io/kubernetes/pkg/labels"
|
|
|
|
kblabels "k8s.io/kubernetes/pkg/labels"
|
|
|
|
"k8s.io/kubernetes/pkg/util/validation"
|
|
|
|
"k8s.io/kubernetes/pkg/util/validation"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/graymeta/stow"
|
|
|
|
|
|
|
|
rapi "k8s.io/helm/api"
|
|
|
|
rapi "k8s.io/helm/api"
|
|
|
|
"k8s.io/helm/client/clientset"
|
|
|
|
"k8s.io/helm/client/clientset"
|
|
|
|
rspb "k8s.io/helm/pkg/proto/hapi/release"
|
|
|
|
rspb "k8s.io/helm/pkg/proto/hapi/release"
|
|
|
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var _ Driver = (*Releases)(nil)
|
|
|
|
var _ Driver = (*Releases)(nil)
|
|
|
@ -73,7 +74,7 @@ func (releases *Releases) Name() string {
|
|
|
|
// or error if not found.
|
|
|
|
// or error if not found.
|
|
|
|
func (releases *Releases) Get(key string) (*rspb.Release, error) {
|
|
|
|
func (releases *Releases) Get(key string) (*rspb.Release, error) {
|
|
|
|
// fetch the release holding the release named by key
|
|
|
|
// 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 err != nil {
|
|
|
|
if kberrs.IsNotFound(err) {
|
|
|
|
if kberrs.IsNotFound(err) {
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
|
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())))
|
|
|
|
lbs.set("CREATED_AT", strconv.Itoa(int(time.Now().Unix())))
|
|
|
|
|
|
|
|
|
|
|
|
// create a new release to hold the release
|
|
|
|
// create a new release to hold the release
|
|
|
|
obj, err := newReleasesObject(key, rls, lbs)
|
|
|
|
obj, err := newReleasesObject(toTPRSafeKey(key), rls, lbs)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
logerrf(err, "create: failed to encode release %q", rls.Name)
|
|
|
|
logerrf(err, "create: failed to encode release %q", rls.Name)
|
|
|
|
return err
|
|
|
|
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())))
|
|
|
|
lbs.set("MODIFIED_AT", strconv.Itoa(int(time.Now().Unix())))
|
|
|
|
|
|
|
|
|
|
|
|
// create a new release object to hold the release
|
|
|
|
// 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 {
|
|
|
|
if err != nil {
|
|
|
|
logerrf(err, "update: failed to encode release %q", rls.Name)
|
|
|
|
logerrf(err, "update: failed to encode release %q", rls.Name)
|
|
|
|
return err
|
|
|
|
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.
|
|
|
|
// Delete deletes the Release holding the release named by key.
|
|
|
|
func (releases *Releases) Delete(key string) (rls *rspb.Release, err error) {
|
|
|
|
func (releases *Releases) Delete(key string) (rls *rspb.Release, err error) {
|
|
|
|
// fetch the release to check existence
|
|
|
|
// 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) {
|
|
|
|
if kberrs.IsNotFound(err) {
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
|
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)
|
|
|
|
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
|
|
|
|
// readAll reads from r until an error or EOF and returns the data it read
|
|
|
|
// from the internal buffer allocated with a specified capacity.
|
|
|
|
// from the internal buffer allocated with a specified capacity.
|
|
|
|
func readAll(r io.Reader, capacity int64) (b []byte, err error) {
|
|
|
|
func readAll(r io.Reader, capacity int64) (b []byte, err error) {
|
|
|
|