|
|
@ -32,8 +32,8 @@ import (
|
|
|
|
"k8s.io/kubernetes/pkg/client/restclient"
|
|
|
|
"k8s.io/kubernetes/pkg/client/restclient"
|
|
|
|
rest "k8s.io/kubernetes/pkg/client/restclient"
|
|
|
|
rest "k8s.io/kubernetes/pkg/client/restclient"
|
|
|
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
|
|
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"math/rand"
|
|
|
|
"math/rand"
|
|
|
|
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -41,6 +41,7 @@ import (
|
|
|
|
func init() {
|
|
|
|
func init() {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type Client struct {
|
|
|
|
type Client struct {
|
|
|
|
opts options
|
|
|
|
opts options
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -137,7 +138,7 @@ func (h *Client) DeleteRelease(rlsName string, namespace string, opts ...DeleteO
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// UpdateRelease updates a release to a new/different chart
|
|
|
|
// UpdateRelease updates a release to a new/different chart
|
|
|
|
func (h *Client) UpdateRelease(rlsName string, chstr string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) {
|
|
|
|
func (h *Client) UpdateRelease(rlsName string, chstr string,namespace string, opts ...UpdateOption) (*rls.UpdateReleaseResponse, error) {
|
|
|
|
// load the chart to update
|
|
|
|
// load the chart to update
|
|
|
|
chart, err := chartutil.Load(chstr)
|
|
|
|
chart, err := chartutil.Load(chstr)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
@ -161,7 +162,7 @@ func (h *Client) UpdateRelease(rlsName string, chstr string, opts ...UpdateOptio
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return h.update(ctx, req)
|
|
|
|
return h.update(ctx, namespace, req)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetVersion returns the server version
|
|
|
|
// GetVersion returns the server version
|
|
|
@ -181,7 +182,7 @@ func (h *Client) GetVersion(opts ...VersionOption) (*rls.GetVersionResponse, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// RollbackRelease rolls back a release to the previous version
|
|
|
|
// RollbackRelease rolls back a release to the previous version
|
|
|
|
func (h *Client) RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) {
|
|
|
|
func (h *Client) RollbackRelease(rlsName string,namespace string, opts ...RollbackOption) (*rls.RollbackReleaseResponse, error) {
|
|
|
|
for _, opt := range opts {
|
|
|
|
for _, opt := range opts {
|
|
|
|
opt(&h.opts)
|
|
|
|
opt(&h.opts)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -196,11 +197,11 @@ func (h *Client) RollbackRelease(rlsName string, opts ...RollbackOption) (*rls.R
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return h.rollback(ctx, req)
|
|
|
|
return h.rollback(ctx, namespace, req)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ReleaseStatus returns the given release's status.
|
|
|
|
// ReleaseStatus returns the given release's status.
|
|
|
|
func (h *Client) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) {
|
|
|
|
func (h *Client) ReleaseStatus(rlsName string, namespace string, opts ...StatusOption) (*rls.GetReleaseStatusResponse, error) {
|
|
|
|
for _, opt := range opts {
|
|
|
|
for _, opt := range opts {
|
|
|
|
opt(&h.opts)
|
|
|
|
opt(&h.opts)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -213,7 +214,7 @@ func (h *Client) ReleaseStatus(rlsName string, opts ...StatusOption) (*rls.GetRe
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return h.status(ctx, req)
|
|
|
|
return h.status(ctx, namespace, req)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ReleaseContent returns the configuration for a given release.
|
|
|
|
// ReleaseContent returns the configuration for a given release.
|
|
|
@ -315,7 +316,8 @@ func (h *Client) delete(ctx context.Context,namespace string, req *rls.Uninstall
|
|
|
|
resp := &rls.UninstallReleaseResponse{}
|
|
|
|
resp := &rls.UninstallReleaseResponse{}
|
|
|
|
client, err := getRESTClient()
|
|
|
|
client, err := getRESTClient()
|
|
|
|
// TODO handle response
|
|
|
|
// TODO handle response
|
|
|
|
err = client.RESTClient().Delete().Namespace(namespace).Resource("releases").Name(req.Name).Do().Error() // TODO handle namespace
|
|
|
|
release := new(hapi.Release)
|
|
|
|
|
|
|
|
err = client.RESTClient().Delete().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -323,7 +325,7 @@ func (h *Client) delete(ctx context.Context,namespace string, req *rls.Uninstall
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Executes tiller.UpdateRelease RPC.
|
|
|
|
// Executes tiller.UpdateRelease RPC.
|
|
|
|
func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rls.UpdateReleaseResponse, error) {
|
|
|
|
func (h *Client) update(ctx context.Context,namespace string, req *rls.UpdateReleaseRequest) (*rls.UpdateReleaseResponse, error) {
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
@ -336,7 +338,7 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl
|
|
|
|
client, err := getRESTClient()
|
|
|
|
client, err := getRESTClient()
|
|
|
|
// get the release
|
|
|
|
// get the release
|
|
|
|
release := new(hapi.Release)
|
|
|
|
release := new(hapi.Release)
|
|
|
|
err = client.RESTClient().Get().Namespace("default").Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace
|
|
|
|
err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -346,9 +348,10 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl
|
|
|
|
release.Spec.Recreate = req.Recreate
|
|
|
|
release.Spec.Recreate = req.Recreate
|
|
|
|
release.Spec.Timeout = req.Timeout
|
|
|
|
release.Spec.Timeout = req.Timeout
|
|
|
|
release.Spec.Chart.Inline = req.Chart
|
|
|
|
release.Spec.Chart.Inline = req.Chart
|
|
|
|
|
|
|
|
release.Spec.Version = release.Spec.Version
|
|
|
|
// update the release
|
|
|
|
// update the release
|
|
|
|
updatedRelease := new(hapi.Release)
|
|
|
|
updatedRelease := new(hapi.Release)
|
|
|
|
err = client.RESTClient().Put().Namespace(release.Namespace).Resource("releases").Name(release.Name).Body(release).Do().Into(updatedRelease)
|
|
|
|
err = client.RESTClient().Put().Namespace(namespace).Resource("releases").Name(release.Name).Body(release).Do().Into(updatedRelease)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -365,7 +368,7 @@ func (h *Client) update(ctx context.Context, req *rls.UpdateReleaseRequest) (*rl
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Executes tiller.RollbackRelease RPC.
|
|
|
|
// Executes tiller.RollbackRelease RPC.
|
|
|
|
func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest) (*rls.RollbackReleaseResponse, error) {
|
|
|
|
func (h *Client) rollback(ctx context.Context, namespace string, req *rls.RollbackReleaseRequest) (*rls.RollbackReleaseResponse, error) {
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
@ -381,12 +384,14 @@ func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
client, err := clientset.NewForConfig(config)
|
|
|
|
client, err := clientset.NewForConfig(config)
|
|
|
|
event, err := makeEventForRollBack(req)
|
|
|
|
event, err := makeEventForRollBack(req)
|
|
|
|
|
|
|
|
event.ObjectMeta.Namespace = namespace
|
|
|
|
|
|
|
|
event.InvolvedObject.Namespace = namespace
|
|
|
|
event.InvolvedObject.Name = (req.Name + "-v" + strconv.Itoa(int(req.Version)))
|
|
|
|
event.InvolvedObject.Name = (req.Name + "-v" + strconv.Itoa(int(req.Version)))
|
|
|
|
event.ObjectMeta.Name = event.InvolvedObject.Name + "-" + RandStringRunes(5)
|
|
|
|
event.ObjectMeta.Name = event.InvolvedObject.Name + "-" + RandStringRunes(5)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_, err = client.Core().Events("default").Create(event) // TODO namespace
|
|
|
|
_, err = client.Core().Events(namespace).Create(event) // TODO namespace
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -395,7 +400,7 @@ func (h *Client) rollback(ctx context.Context, req *rls.RollbackReleaseRequest)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Executes tiller.GetReleaseStatus RPC.
|
|
|
|
// Executes tiller.GetReleaseStatus RPC.
|
|
|
|
func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) (*rls.GetReleaseStatusResponse, error) {
|
|
|
|
func (h *Client) status(ctx context.Context, namespace string, req *rls.GetReleaseStatusRequest) (*rls.GetReleaseStatusResponse, error) {
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
/* c, err := grpc.Dial(h.opts.host, grpc.WithInsecure())
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
@ -410,7 +415,7 @@ func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) (
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
release := new(hapi.Release)
|
|
|
|
release := new(hapi.Release)
|
|
|
|
err = client.RESTClient().Get().Namespace("default").Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace
|
|
|
|
err = client.RESTClient().Get().Namespace(namespace).Resource("releases").Name(req.Name).Do().Into(release) // TODO handle namespace
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return resp, err
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -420,7 +425,7 @@ func (h *Client) status(ctx context.Context, req *rls.GetReleaseStatusRequest) (
|
|
|
|
duration := time.Duration(5) * time.Second
|
|
|
|
duration := time.Duration(5) * time.Second
|
|
|
|
for i := 0; i <= 10; i++ {
|
|
|
|
for i := 0; i <= 10; i++ {
|
|
|
|
time.Sleep(duration)
|
|
|
|
time.Sleep(duration)
|
|
|
|
err = client.RESTClient().Get().Namespace("default").Resource("releaseversions").Name(name).Do().Into(releaseVersion) // TODO handle namespace
|
|
|
|
err = client.RESTClient().Get().Namespace(namespace).Resource("releaseversions").Name(name).Do().Into(releaseVersion) // TODO handle namespace
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -546,12 +551,8 @@ func makeEventForRollBack(req *rls.RollbackReleaseRequest) (*api.Event, error) {
|
|
|
|
return &api.Event{}, err
|
|
|
|
return &api.Event{}, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
event := &api.Event{
|
|
|
|
event := &api.Event{
|
|
|
|
ObjectMeta: api.ObjectMeta{
|
|
|
|
|
|
|
|
Namespace: "default", //TODO handle namespace
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
InvolvedObject: api.ObjectReference{
|
|
|
|
InvolvedObject: api.ObjectReference{
|
|
|
|
Kind: "release",
|
|
|
|
Kind: "release",
|
|
|
|
Namespace: "default", //TODO handle namespace
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Reason: "releaseRollback",
|
|
|
|
Reason: "releaseRollback",
|
|
|
|
Message: string(message),
|
|
|
|
Message: string(message),
|
|
|
@ -561,7 +562,6 @@ func makeEventForRollBack(req *rls.RollbackReleaseRequest) (*api.Event, error) {
|
|
|
|
return event, nil
|
|
|
|
return event, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
|
|
|
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
|
|
|
|
|
|
|
|
|
|
|
func RandStringRunes(n int) string {
|
|
|
|
func RandStringRunes(n int) string {
|
|
|
|