parent
48317abc2a
commit
e1a5dd510f
10
README.md
10
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`:
|
You can run k9s as a Docker container by mounting your `KUBECONFIG`:
|
||||||
|
|
||||||
```shell
|
```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:
|
For default path it would be:
|
||||||
|
|
||||||
```shell
|
```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!
|
> NOTE: This is still in flux and will change while in pre-release stage!
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# config.yml
|
# $HOME/.k9s/config.yml
|
||||||
k9s:
|
k9s:
|
||||||
# Represents ui poll intervals. Default 2secs
|
# Represents ui poll intervals. Default 2secs
|
||||||
refreshRate: 2
|
refreshRate: 2
|
||||||
|
|
@ -272,7 +272,7 @@ K9s uses aliases to navigate most K8s resources.
|
||||||
currentCluster: minikube
|
currentCluster: minikube
|
||||||
# Persists per cluster preferences for favorite namespaces and view.
|
# Persists per cluster preferences for favorite namespaces and view.
|
||||||
clusters:
|
clusters:
|
||||||
cooln:
|
coolio:
|
||||||
namespace:
|
namespace:
|
||||||
active: coolio
|
active: coolio
|
||||||
favorites:
|
favorites:
|
||||||
|
|
@ -295,7 +295,7 @@ K9s uses aliases to navigate most K8s resources.
|
||||||
memory: 100Mi
|
memory: 100Mi
|
||||||
# The IP Address to use when launching a port-forward.
|
# The IP Address to use when launching a port-forward.
|
||||||
portForwardAddress: 1.2.3.4
|
portForwardAddress: 1.2.3.4
|
||||||
minikube:
|
kind:
|
||||||
namespace:
|
namespace:
|
||||||
active: all
|
active: all
|
||||||
favorites:
|
favorites:
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ func Colorize(s string, c Paint) string {
|
||||||
return fmt.Sprintf(colorFmt, c, s)
|
return fmt.Sprintf(colorFmt, c, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnsiColorize colors a string.
|
// ANSIColorize colors a string.
|
||||||
func AnsiColorize(s string, c int) string {
|
func ANSIColorize(s string, c int) string {
|
||||||
return fmt.Sprintf(ansiColorFmt, c, s)
|
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 {
|
func colorizeByte(b byte, color int) []byte {
|
||||||
return []byte(AnsiColorize(string(b), color))
|
return []byte(ANSIColorize(string(b), color))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,9 @@ func (c *CronJob) Run(path string) error {
|
||||||
// BOZO!! Factory resource??
|
// BOZO!! Factory resource??
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), client.CallTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), client.CallTimeout)
|
||||||
defer cancel()
|
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 {
|
if err != nil {
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,15 +78,15 @@ func (l *LogItem) IsEmpty() bool {
|
||||||
func (l *LogItem) Render(c int, showTime bool) []byte {
|
func (l *LogItem) Render(c int, showTime bool) []byte {
|
||||||
bb := make([]byte, 0, 30+len(l.Bytes)+len(l.Info()))
|
bb := make([]byte, 0, 30+len(l.Bytes)+len(l.Info()))
|
||||||
if showTime {
|
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 != "" {
|
if l.Pod != "" {
|
||||||
bb = append(bb, []byte(color.AnsiColorize(l.Pod, c))...)
|
bb = append(bb, []byte(color.ANSIColorize(l.Pod, c))...)
|
||||||
bb = append(bb, ':')
|
bb = append(bb, ':')
|
||||||
}
|
}
|
||||||
if !l.SingleContainer && l.Container != "" {
|
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, ' ')
|
||||||
}
|
}
|
||||||
bb = append(bb, []byte(tview.Escape(string(l.Bytes)))...)
|
bb = append(bb, []byte(tview.Escape(string(l.Bytes)))...)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ type Table struct {
|
||||||
refreshRate time.Duration
|
refreshRate time.Duration
|
||||||
instance string
|
instance string
|
||||||
mx sync.RWMutex
|
mx sync.RWMutex
|
||||||
|
labelFilter string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTable returns a new table model.
|
// 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.
|
// SetInstance sets a single entry table.
|
||||||
func (t *Table) SetInstance(path string) {
|
func (t *Table) SetInstance(path string) {
|
||||||
t.instance = path
|
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 {
|
func (t *Table) reconcile(ctx context.Context) error {
|
||||||
meta := t.resourceMeta()
|
meta := t.resourceMeta()
|
||||||
|
if t.labelFilter != "" {
|
||||||
|
ctx = context.WithValue(ctx, internal.KeyLabels, t.labelFilter)
|
||||||
|
}
|
||||||
var (
|
var (
|
||||||
oo []runtime.Object
|
oo []runtime.Object
|
||||||
err error
|
err error
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ type mockModel struct{}
|
||||||
var _ ui.Tabular = &mockModel{}
|
var _ ui.Tabular = &mockModel{}
|
||||||
|
|
||||||
func (t *mockModel) SetInstance(string) {}
|
func (t *mockModel) SetInstance(string) {}
|
||||||
|
func (t *mockModel) SetLabelFilter(string) {}
|
||||||
func (t *mockModel) Empty() bool { return false }
|
func (t *mockModel) Empty() bool { return false }
|
||||||
func (t *mockModel) HasMetrics() bool { return true }
|
func (t *mockModel) HasMetrics() bool { return true }
|
||||||
func (t *mockModel) Peek() render.TableData { return makeTableData() }
|
func (t *mockModel) Peek() render.TableData { return makeTableData() }
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,9 @@ type Tabular interface {
|
||||||
// SetInstance sets parent resource path.
|
// SetInstance sets parent resource path.
|
||||||
SetInstance(string)
|
SetInstance(string)
|
||||||
|
|
||||||
|
// SetLabelFilter sets the label filter.
|
||||||
|
SetLabelFilter(string)
|
||||||
|
|
||||||
// Empty returns true if model has no data.
|
// Empty returns true if model has no data.
|
||||||
Empty() bool
|
Empty() bool
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,12 +99,12 @@ type mockModel struct{}
|
||||||
var _ ui.Tabular = (*mockModel)(nil)
|
var _ ui.Tabular = (*mockModel)(nil)
|
||||||
var _ ui.Suggester = (*mockModel)(nil)
|
var _ ui.Suggester = (*mockModel)(nil)
|
||||||
|
|
||||||
func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false }
|
func (t *mockModel) CurrentSuggestion() (string, bool) { return "", false }
|
||||||
func (t *mockModel) NextSuggestion() (string, bool) { return "", false }
|
func (t *mockModel) NextSuggestion() (string, bool) { return "", false }
|
||||||
func (t *mockModel) PrevSuggestion() (string, bool) { return "", false }
|
func (t *mockModel) PrevSuggestion() (string, bool) { return "", false }
|
||||||
func (t *mockModel) ClearSuggestions() {}
|
func (t *mockModel) ClearSuggestions() {}
|
||||||
|
|
||||||
func (t *mockModel) SetInstance(string) {}
|
func (t *mockModel) SetInstance(string) {}
|
||||||
|
func (t *mockModel) SetLabelFilter(string) {}
|
||||||
func (t *mockModel) Empty() bool { return false }
|
func (t *mockModel) Empty() bool { return false }
|
||||||
func (t *mockModel) HasMetrics() bool { return true }
|
func (t *mockModel) HasMetrics() bool { return true }
|
||||||
func (t *mockModel) Peek() render.TableData { return makeTableData() }
|
func (t *mockModel) Peek() render.TableData { return makeTableData() }
|
||||||
|
|
|
||||||
|
|
@ -140,10 +140,20 @@ func (b *Browser) Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// BufferChanged indicates the buffer was changed.
|
// 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.
|
// BufferActive indicates the buff activity changed.
|
||||||
func (b *Browser) BufferActive(state bool, k model.BufferKind) {
|
func (b *Browser) BufferActive(state bool, k model.BufferKind) {
|
||||||
|
if state {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.GetModel().Refresh(b.defaultContext())
|
||||||
b.app.QueueUpdateDraw(func() {
|
b.app.QueueUpdateDraw(func() {
|
||||||
b.Update(b.GetModel().Peek())
|
b.Update(b.GetModel().Peek())
|
||||||
if b.GetRowCount() > 1 {
|
if b.GetRowCount() > 1 {
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ type mockTableModel struct{}
|
||||||
var _ ui.Tabular = (*mockTableModel)(nil)
|
var _ ui.Tabular = (*mockTableModel)(nil)
|
||||||
|
|
||||||
func (t *mockTableModel) SetInstance(string) {}
|
func (t *mockTableModel) SetInstance(string) {}
|
||||||
|
func (t *mockTableModel) SetLabelFilter(string) {}
|
||||||
func (t *mockTableModel) Empty() bool { return false }
|
func (t *mockTableModel) Empty() bool { return false }
|
||||||
func (t *mockTableModel) HasMetrics() bool { return true }
|
func (t *mockTableModel) HasMetrics() bool { return true }
|
||||||
func (t *mockTableModel) Peek() render.TableData { return makeTableData() }
|
func (t *mockTableModel) Peek() render.TableData { return makeTableData() }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue