From 5a0705564526bbe5d67a631d46dd632821ae68be Mon Sep 17 00:00:00 2001 From: Vibhav Bobade Date: Mon, 26 Aug 2019 03:12:48 +0530 Subject: [PATCH 1/2] Add IsReachable to /pkg/kube/client to see if connected to the internet Signed-off-by: Vibhav Bobade --- pkg/kube/client.go | 10 ++++++++++ pkg/kube/fake/printer.go | 5 +++++ pkg/kube/interface.go | 3 +++ 3 files changed, 18 insertions(+) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index dbe5e2dae..dc91ff9f8 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -63,6 +63,16 @@ func New(getter genericclioptions.RESTClientGetter) *Client { var nopLogger = func(_ string, _ ...interface{}) {} +// Test connectivity to the Client +func (c *Client) IsReachable() error { + client, _ := c.Factory.KubernetesClientSet() + _, err := client.ServerVersion() + if err != nil { + return errors.New("Kubernetes cluster unreachable") + } + return nil +} + // Create creates Kubernetes resources specified in the resource list. func (c *Client) Create(resources ResourceList) (*Result, error) { c.Log("creating %d resource(s)", len(resources)) diff --git a/pkg/kube/fake/printer.go b/pkg/kube/fake/printer.go index 3d7a81d14..21c67a63c 100644 --- a/pkg/kube/fake/printer.go +++ b/pkg/kube/fake/printer.go @@ -33,6 +33,11 @@ type PrintingKubeClient struct { Out io.Writer } +// isReachable checks if the cluster is reachable +func (p *PrintingKubeClient) IsReachable() error { + return nil +} + // Create prints the values of what would be created with a real KubeClient. func (p *PrintingKubeClient) Create(resources kube.ResourceList) (*kube.Result, error) { _, err := io.Copy(p.Out, bufferize(resources)) diff --git a/pkg/kube/interface.go b/pkg/kube/interface.go index 73dd42835..fc4189cc9 100644 --- a/pkg/kube/interface.go +++ b/pkg/kube/interface.go @@ -56,6 +56,9 @@ type Interface interface { // WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase // and returns said phase (PodSucceeded or PodFailed qualify). WaitAndGetCompletedPodPhase(name string, timeout time.Duration) (v1.PodPhase, error) + + // isReachable checks whether the client is able to connect to the cluster + IsReachable() error } var _ Interface = (*Client)(nil) From d00e32802003e31805d1da317777a0692c744ba7 Mon Sep 17 00:00:00 2001 From: Vibhav Bobade Date: Mon, 26 Aug 2019 03:16:12 +0530 Subject: [PATCH 2/2] Applied check to actions Signed-off-by: Vibhav Bobade --- pkg/action/get.go | 4 ++++ pkg/action/history.go | 4 ++++ pkg/action/install.go | 4 ++++ pkg/action/list.go | 4 ++++ pkg/action/rollback.go | 4 ++++ pkg/action/status.go | 4 ++++ pkg/action/uninstall.go | 4 ++++ 7 files changed, 28 insertions(+) diff --git a/pkg/action/get.go b/pkg/action/get.go index 7b3b0b24e..0690ce0db 100644 --- a/pkg/action/get.go +++ b/pkg/action/get.go @@ -38,5 +38,9 @@ func NewGet(cfg *Configuration) *Get { // Run executes 'helm get' against the given release. func (g *Get) Run(name string) (*release.Release, error) { + if err := g.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + return g.cfg.releaseContent(name, g.Version) } diff --git a/pkg/action/history.go b/pkg/action/history.go index 5b7f028bd..b2933585e 100644 --- a/pkg/action/history.go +++ b/pkg/action/history.go @@ -41,6 +41,10 @@ func NewHistory(cfg *Configuration) *History { // Run executes 'helm history' against the given release. func (h *History) Run(name string) ([]*release.Release, error) { + if err := h.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + if err := validateReleaseName(name); err != nil { return nil, errors.Errorf("release name is invalid: %s", name) } diff --git a/pkg/action/install.go b/pkg/action/install.go index a185667de..1c073be14 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -107,6 +107,10 @@ func NewInstall(cfg *Configuration) *Install { // // If DryRun is set to true, this will prepare the release, but not install it func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release.Release, error) { + if err := i.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + if err := i.availableName(); err != nil { return nil, err } diff --git a/pkg/action/list.go b/pkg/action/list.go index 1d5738d11..f502269c6 100644 --- a/pkg/action/list.go +++ b/pkg/action/list.go @@ -140,6 +140,10 @@ func NewList(cfg *Configuration) *List { // Run executes the list command, returning a set of matches. func (l *List) Run() ([]*release.Release, error) { + if err := l.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + var filter *regexp.Regexp if l.Filter != "" { var err error diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index 08279acf9..46b4e7166 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -50,6 +50,10 @@ func NewRollback(cfg *Configuration) *Rollback { // Run executes 'helm rollback' against the given release. func (r *Rollback) Run(name string) error { + if err := r.cfg.KubeClient.IsReachable(); err != nil { + return err + } + r.cfg.Log("preparing rollback of %s", name) currentRelease, targetRelease, err := r.prepareRollback(name) if err != nil { diff --git a/pkg/action/status.go b/pkg/action/status.go index 6297e28ca..dea9c0351 100644 --- a/pkg/action/status.go +++ b/pkg/action/status.go @@ -39,5 +39,9 @@ func NewStatus(cfg *Configuration) *Status { // Run executes 'helm status' against the given release. func (s *Status) Run(name string) (*release.Release, error) { + if err := s.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + return s.cfg.releaseContent(name, s.Version) } diff --git a/pkg/action/uninstall.go b/pkg/action/uninstall.go index 6dec73e40..4d42403bd 100644 --- a/pkg/action/uninstall.go +++ b/pkg/action/uninstall.go @@ -47,6 +47,10 @@ func NewUninstall(cfg *Configuration) *Uninstall { // Run uninstalls the given release. func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error) { + if err := u.cfg.KubeClient.IsReachable(); err != nil { + return nil, err + } + if u.DryRun { // In the dry run case, just see if the release exists r, err := u.cfg.releaseContent(name, 0)