From b6c61600a4479bba545c362d4d2c46297cfab17c Mon Sep 17 00:00:00 2001 From: derailed Date: Thu, 5 Nov 2020 17:15:50 -0700 Subject: [PATCH] fix #929 --- cmd/root.go | 2 +- internal/client/client.go | 29 +++++++++++++++-------------- internal/client/errors.go | 14 ++++++++++++++ internal/dao/pod.go | 4 +--- internal/ui/table.go | 10 +++------- internal/ui/table_test.go | 4 ++-- internal/view/browser.go | 7 +++++-- internal/view/table_int_test.go | 2 +- 8 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 internal/client/errors.go diff --git a/cmd/root.go b/cmd/root.go index 786daec9..e9a9323c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -53,7 +53,7 @@ func init() { if err := flags.Set("stderrthreshold", "fatal"); err != nil { panic(err) } - if err := flags.Set("v", "-1"); err != nil { + if err := flags.Set("v", "0"); err != nil { panic(err) } if err := flags.Set("log_file", config.K9sLogs); err != nil { diff --git a/internal/client/client.go b/internal/client/client.go index df2d2666..f569fb48 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -27,6 +27,7 @@ const ( cacheSize = 100 cacheExpiry = 5 * time.Minute cacheMXAPIKey = "metricsAPI" + serverVersion = "serverVersion" ) var supportedMetricsAPIVersions = []string{"v1beta1"} @@ -58,14 +59,18 @@ func InitConnection(config *Config) (*APIClient, error) { a := APIClient{ config: config, cache: cache.NewLRUExpireCache(cacheSize), + connOK: true, } - a.connOK = true - if err := a.supportsMetricsResources(); err != nil { - a.connOK = false - return nil, err + err := a.supportsMetricsResources() + if err != nil { + log.Error().Err(err).Msgf("Checking metrics-server") } + if errors.Is(err, noMetricServerErr) || errors.Is(err, metricsUnsupportedErr) { + return &a, nil + } + a.connOK = false - return &a, nil + return &a, err } // ConnectionOK returns connection status. @@ -178,8 +183,6 @@ func (a *APIClient) CurrentNamespaceName() (string, error) { return a.config.CurrentNamespaceName() } -const serverVersion = "serverVersion" - // ServerVersion returns the current server version info. func (a *APIClient) ServerVersion() (*version.Info, error) { if v, ok := a.cache.Get(serverVersion); ok { @@ -273,10 +276,8 @@ func (a *APIClient) Config() *Config { // HasMetrics checks if the cluster supports metrics. func (a *APIClient) HasMetrics() bool { - if err := a.supportsMetricsResources(); err != nil { - return false - } - return true + err := a.supportsMetricsResources() + return err == nil } // Dial returns a handle to api server or die. @@ -416,7 +417,7 @@ func (a *APIClient) supportsMetricsResources() error { if supported { return nil } - return errors.New("No metrics-server detected") + return noMetricServerErr } defer func() { @@ -430,7 +431,7 @@ func (a *APIClient) supportsMetricsResources() error { } apiGroups, err := dial.ServerGroups() if err != nil { - log.Warn().Err(err).Msgf("Unable to retrieve server groups") + log.Warn().Err(err).Msgf("Unable to fetch APIGroups") return err } for _, grp := range apiGroups.Groups { @@ -443,7 +444,7 @@ func (a *APIClient) supportsMetricsResources() error { } } - return errors.New("No metrics-server detected") + return metricsUnsupportedErr } func checkMetricsVersion(grp metav1.APIGroup) bool { diff --git a/internal/client/errors.go b/internal/client/errors.go new file mode 100644 index 00000000..ca1ec817 --- /dev/null +++ b/internal/client/errors.go @@ -0,0 +1,14 @@ +package client + +import metricsapi "k8s.io/metrics/pkg/apis/metrics" + +type Error string + +func (e Error) Error() string { + return string(e) +} + +const ( + noMetricServerErr = Error("No metrics-server detected") + metricsUnsupportedErr = Error("No metrics api group " + metricsapi.GroupName + " found on cluster") +) diff --git a/internal/dao/pod.go b/internal/dao/pod.go index b408222c..c3380c1e 100644 --- a/internal/dao/pod.go +++ b/internal/dao/pod.go @@ -87,9 +87,7 @@ func (p *Pod) List(ctx context.Context, ns string) ([]runtime.Object, error) { var pmx *mv1beta1.PodMetricsList if withMx, ok := ctx.Value(internal.KeyWithMetrics).(bool); withMx || !ok { - if pmx, err = client.DialMetrics(p.Client()).FetchPodsMetrics(ctx, ns); err != nil { - log.Debug().Err(err).Msgf("No pods metrics") - } + pmx, _ = client.DialMetrics(p.Client()).FetchPodsMetrics(ctx, ns) } res := make([]runtime.Object, 0, len(oo)) diff --git a/internal/ui/table.go b/internal/ui/table.go index 82e3a3bf..2a60946a 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -71,11 +71,6 @@ func (t *Table) Init(ctx context.Context) { t.SetSelectionChangedFunc(t.selectionChanged) t.SetBackgroundColor(tcell.ColorDefault) t.Select(1, 0) - t.hasMetrics = false - if mx, ok := ctx.Value(internal.KeyHasMetrics).(bool); ok { - t.hasMetrics = mx - } - if cfg, ok := ctx.Value(internal.KeyViewConfig).(*config.CustomView); ok && cfg != nil { cfg.AddListener(t.GVR().String(), t) } @@ -187,11 +182,12 @@ func (t *Table) SetSortCol(name string, asc bool) { } // Update table content. -func (t *Table) Update(data render.TableData) { +func (t *Table) Update(data render.TableData, hasMetrics bool) { t.header = data.Header if t.decorateFn != nil { data = t.decorateFn(data) } + t.hasMetrics = hasMetrics t.doUpdate(t.filtered(data)) t.UpdateTitle() } @@ -334,7 +330,7 @@ func (t *Table) Refresh() { return } // BOZO!! Really want to tell model reload now. Refactor! - t.Update(data) + t.Update(data, t.hasMetrics) } // GetSelectedRow returns the entire selected row. diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index 3b902c1b..5ffa57f1 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -27,7 +27,7 @@ func TestTableUpdate(t *testing.T) { v.Init(makeContext()) data := makeTableData() - v.Update(data) + v.Update(data, false) assert.Equal(t, len(data.RowEvents)+1, v.GetRowCount()) assert.Equal(t, len(data.Header), v.GetColumnCount()) @@ -38,7 +38,7 @@ func TestTableSelection(t *testing.T) { v.Init(makeContext()) m := &mockModel{} v.SetModel(m) - v.Update(m.Peek()) + v.Update(m.Peek(), false) v.SelectRow(1, true) r, ok := v.GetSelectedRow("r1") diff --git a/internal/view/browser.go b/internal/view/browser.go index 14e17461..74fe7e58 100644 --- a/internal/view/browser.go +++ b/internal/view/browser.go @@ -164,7 +164,7 @@ func (b *Browser) BufferActive(state bool, k model.BufferKind) { log.Error().Err(err).Msgf("Refresh failed for %s", b.GVR()) } b.app.QueueUpdateDraw(func() { - b.Update(b.GetModel().Peek()) + b.Update(b.GetModel().Peek(), b.App().Conn().HasMetrics()) if b.GetRowCount() > 1 { b.App().filterHistory.Push(b.CmdBuff().GetText()) } @@ -213,7 +213,7 @@ func (b *Browser) TableDataChanged(data render.TableData) { b.app.QueueUpdateDraw(func() { b.refreshActions() - b.Update(data) + b.Update(data, b.app.Conn().HasMetrics()) }) } @@ -336,6 +336,9 @@ func (b *Browser) editCmd(evt *tcell.EventKey) *tcell.EventKey { if client.IsClusterScoped(ns) { ns = client.AllNamespaces } + if b.GVR().String() == "v1/namespaces" { + ns = n + } if ok, err := b.app.Conn().CanI(ns, b.GVR().String(), []string{"patch"}); !ok || err != nil { b.App().Flash().Err(fmt.Errorf("Current user can't edit resource %s", b.GVR())) return nil diff --git a/internal/view/table_int_test.go b/internal/view/table_int_test.go index 14125846..b6420fad 100644 --- a/internal/view/table_int_test.go +++ b/internal/view/table_int_test.go @@ -57,7 +57,7 @@ func TestTableNew(t *testing.T) { } data.Namespace = "" - v.Update(*data) + v.Update(*data, false) assert.Equal(t, 3, v.GetRowCount()) }