From e1a5dd510fc030fa1bc532dbcdb9689b1b1df13a Mon Sep 17 00:00:00 2001 From: derailed Date: Wed, 3 Jun 2020 14:50:58 -0600 Subject: [PATCH] fix issue #752 #677 --- README.md | 10 +++++----- internal/color/colorize.go | 6 +++--- internal/dao/cronjob.go | 3 ++- internal/dao/log_item.go | 6 +++--- internal/model/table.go | 9 +++++++++ internal/ui/table_test.go | 1 + internal/ui/types.go | 3 +++ internal/view/alias_test.go | 10 +++++----- internal/view/browser.go | 12 +++++++++++- internal/view/table_int_test.go | 1 + 10 files changed, 43 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index f17f52f7..08df3245 100644 --- a/README.md +++ b/README.md @@ -90,13 +90,13 @@ K9s is available on Linux, macOS and Windows platforms. You can run k9s as a Docker container by mounting your `KUBECONFIG`: ```shell - docker run --rm -it -v $KUBECONFIG:/root/.kube/config derailed/k9s + docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9s ``` For default path it would be: ```shell - docker run --rm -it -v ~/.kube/config:/root/.kube/config derailed/k9s + docker run --rm -it -v ~/.kube/config:/root/.kube/config quay.io/derailed/k9s ``` --- @@ -242,7 +242,7 @@ K9s uses aliases to navigate most K8s resources. > NOTE: This is still in flux and will change while in pre-release stage! ```yaml - # config.yml + # $HOME/.k9s/config.yml k9s: # Represents ui poll intervals. Default 2secs refreshRate: 2 @@ -272,7 +272,7 @@ K9s uses aliases to navigate most K8s resources. currentCluster: minikube # Persists per cluster preferences for favorite namespaces and view. clusters: - cooln: + coolio: namespace: active: coolio favorites: @@ -295,7 +295,7 @@ K9s uses aliases to navigate most K8s resources. memory: 100Mi # The IP Address to use when launching a port-forward. portForwardAddress: 1.2.3.4 - minikube: + kind: namespace: active: all favorites: diff --git a/internal/color/colorize.go b/internal/color/colorize.go index a8f84fc9..93bcccc5 100644 --- a/internal/color/colorize.go +++ b/internal/color/colorize.go @@ -35,8 +35,8 @@ func Colorize(s string, c Paint) string { return fmt.Sprintf(colorFmt, c, s) } -// AnsiColorize colors a string. -func AnsiColorize(s string, c int) string { +// ANSIColorize colors a string. +func ANSIColorize(s string, c int) string { return fmt.Sprintf(ansiColorFmt, c, s) } @@ -56,5 +56,5 @@ func Highlight(bb []byte, ii []int, c int) []byte { } func colorizeByte(b byte, color int) []byte { - return []byte(AnsiColorize(string(b), color)) + return []byte(ANSIColorize(string(b), color)) } diff --git a/internal/dao/cronjob.go b/internal/dao/cronjob.go index 001c73dd..81a1a54b 100644 --- a/internal/dao/cronjob.go +++ b/internal/dao/cronjob.go @@ -42,8 +42,9 @@ func (c *CronJob) Run(path string) error { // BOZO!! Factory resource?? ctx, cancel := context.WithTimeout(context.Background(), client.CallTimeout) defer cancel() - o, err := c.Factory.Get("batch/v1/cronjobs", path, true, labels.Everything()) + o, err := c.Factory.Get("batch/v1beta1/cronjobs", path, true, labels.Everything()) if err != nil { + return err } diff --git a/internal/dao/log_item.go b/internal/dao/log_item.go index 070ff4b9..1ff1bc28 100644 --- a/internal/dao/log_item.go +++ b/internal/dao/log_item.go @@ -78,15 +78,15 @@ func (l *LogItem) IsEmpty() bool { func (l *LogItem) Render(c int, showTime bool) []byte { bb := make([]byte, 0, 30+len(l.Bytes)+len(l.Info())) if showTime { - bb = append(bb, color.AnsiColorize(fmt.Sprintf("%-30s ", l.Timestamp), 106)...) + bb = append(bb, color.ANSIColorize(fmt.Sprintf("%-30s ", l.Timestamp), 106)...) } if l.Pod != "" { - bb = append(bb, []byte(color.AnsiColorize(l.Pod, c))...) + bb = append(bb, []byte(color.ANSIColorize(l.Pod, c))...) bb = append(bb, ':') } if !l.SingleContainer && l.Container != "" { - bb = append(bb, []byte(color.AnsiColorize(l.Container, c))...) + bb = append(bb, []byte(color.ANSIColorize(l.Container, c))...) bb = append(bb, ' ') } bb = append(bb, []byte(tview.Escape(string(l.Bytes)))...) diff --git a/internal/model/table.go b/internal/model/table.go index 318ae2ba..e557f9aa 100644 --- a/internal/model/table.go +++ b/internal/model/table.go @@ -37,6 +37,7 @@ type Table struct { refreshRate time.Duration instance string mx sync.RWMutex + labelFilter string } // NewTable returns a new table model. @@ -48,6 +49,11 @@ func NewTable(gvr client.GVR) *Table { } } +// SetLabelFilter sets the labels filter. +func (t *Table) SetLabelFilter(f string) { + t.labelFilter = f +} + // SetInstance sets a single entry table. func (t *Table) SetInstance(path string) { t.instance = path @@ -228,6 +234,9 @@ func (t *Table) list(ctx context.Context, a dao.Accessor) ([]runtime.Object, err func (t *Table) reconcile(ctx context.Context) error { meta := t.resourceMeta() + if t.labelFilter != "" { + ctx = context.WithValue(ctx, internal.KeyLabels, t.labelFilter) + } var ( oo []runtime.Object err error diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index b0765916..0fa8a387 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -62,6 +62,7 @@ type mockModel struct{} var _ ui.Tabular = &mockModel{} func (t *mockModel) SetInstance(string) {} +func (t *mockModel) SetLabelFilter(string) {} func (t *mockModel) Empty() bool { return false } func (t *mockModel) HasMetrics() bool { return true } func (t *mockModel) Peek() render.TableData { return makeTableData() } diff --git a/internal/ui/types.go b/internal/ui/types.go index 48794d4a..76b8bc2c 100644 --- a/internal/ui/types.go +++ b/internal/ui/types.go @@ -55,6 +55,9 @@ type Tabular interface { // SetInstance sets parent resource path. SetInstance(string) + // SetLabelFilter sets the label filter. + SetLabelFilter(string) + // Empty returns true if model has no data. Empty() bool diff --git a/internal/view/alias_test.go b/internal/view/alias_test.go index 3ff7ad4c..0bf89270 100644 --- a/internal/view/alias_test.go +++ b/internal/view/alias_test.go @@ -99,12 +99,12 @@ type mockModel struct{} var _ ui.Tabular = (*mockModel)(nil) var _ ui.Suggester = (*mockModel)(nil) -func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false } -func (t *mockModel) NextSuggestion() (string, bool) { return "", false } -func (t *mockModel) PrevSuggestion() (string, bool) { return "", false } -func (t *mockModel) ClearSuggestions() {} - +func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false } +func (t *mockModel) NextSuggestion() (string, bool) { return "", false } +func (t *mockModel) PrevSuggestion() (string, bool) { return "", false } +func (t *mockModel) ClearSuggestions() {} func (t *mockModel) SetInstance(string) {} +func (t *mockModel) SetLabelFilter(string) {} func (t *mockModel) Empty() bool { return false } func (t *mockModel) HasMetrics() bool { return true } func (t *mockModel) Peek() render.TableData { return makeTableData() } diff --git a/internal/view/browser.go b/internal/view/browser.go index 568e30c9..075f98a3 100644 --- a/internal/view/browser.go +++ b/internal/view/browser.go @@ -140,10 +140,20 @@ func (b *Browser) Stop() { } // BufferChanged indicates the buffer was changed. -func (b *Browser) BufferChanged(s string) {} +func (b *Browser) BufferChanged(s string) { + if ui.IsLabelSelector(s) { + b.GetModel().SetLabelFilter(ui.TrimLabelSelector(s)) + } else { + b.GetModel().SetLabelFilter("") + } +} // BufferActive indicates the buff activity changed. func (b *Browser) BufferActive(state bool, k model.BufferKind) { + if state { + return + } + b.GetModel().Refresh(b.defaultContext()) b.app.QueueUpdateDraw(func() { b.Update(b.GetModel().Peek()) if b.GetRowCount() > 1 { diff --git a/internal/view/table_int_test.go b/internal/view/table_int_test.go index 887c2c45..6d5d6cba 100644 --- a/internal/view/table_int_test.go +++ b/internal/view/table_int_test.go @@ -93,6 +93,7 @@ type mockTableModel struct{} var _ ui.Tabular = (*mockTableModel)(nil) func (t *mockTableModel) SetInstance(string) {} +func (t *mockTableModel) SetLabelFilter(string) {} func (t *mockTableModel) Empty() bool { return false } func (t *mockTableModel) HasMetrics() bool { return true } func (t *mockTableModel) Peek() render.TableData { return makeTableData() }