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`:
|
||||
|
||||
```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:
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)))...)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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() }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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() }
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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() }
|
||||
|
|
|
|||
Loading…
Reference in New Issue