83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package view
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/derailed/k9s/internal"
|
|
"github.com/derailed/k9s/internal/client"
|
|
"github.com/derailed/k9s/internal/ui"
|
|
"github.com/gdamore/tcell"
|
|
"github.com/rs/zerolog/log"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
)
|
|
|
|
// Node represents a node view.
|
|
type Node struct {
|
|
ResourceViewer
|
|
}
|
|
|
|
// NewNode returns a new node view.
|
|
func NewNode(gvr client.GVR) ResourceViewer {
|
|
n := Node{
|
|
ResourceViewer: NewBrowser(gvr),
|
|
}
|
|
n.SetBindKeysFn(n.bindKeys)
|
|
n.GetTable().SetEnterFn(n.showPods)
|
|
n.SetContextFn(n.nodeContext)
|
|
|
|
return &n
|
|
}
|
|
|
|
func (n *Node) bindKeys(aa ui.KeyActions) {
|
|
aa.Delete(ui.KeySpace, tcell.KeyCtrlSpace, tcell.KeyCtrlD)
|
|
aa.Add(ui.KeyActions{
|
|
ui.KeyY: ui.NewKeyAction("YAML", n.viewCmd, true),
|
|
ui.KeyShiftC: ui.NewKeyAction("Sort CPU", n.GetTable().SortColCmd(7, false), false),
|
|
ui.KeyShiftM: ui.NewKeyAction("Sort MEM", n.GetTable().SortColCmd(8, false), false),
|
|
ui.KeyShiftX: ui.NewKeyAction("Sort CPU%", n.GetTable().SortColCmd(9, false), false),
|
|
ui.KeyShiftZ: ui.NewKeyAction("Sort MEM%", n.GetTable().SortColCmd(10, false), false),
|
|
})
|
|
}
|
|
|
|
func (n *Node) nodeContext(ctx context.Context) context.Context {
|
|
mx := client.NewMetricsServer(n.App().factory.Client())
|
|
nmx, err := mx.FetchNodesMetrics()
|
|
if err != nil {
|
|
log.Warn().Err(err).Msgf("No node metrics")
|
|
}
|
|
|
|
return context.WithValue(ctx, internal.KeyMetrics, nmx)
|
|
}
|
|
|
|
func (n *Node) showPods(app *App, ns, res, sel string) {
|
|
showPods(app, n.GetTable().GetSelectedItem(), "", "spec.nodeName="+sel)
|
|
}
|
|
|
|
func (n *Node) viewCmd(evt *tcell.EventKey) *tcell.EventKey {
|
|
path := n.GetTable().GetSelectedItem()
|
|
if path == "" {
|
|
return evt
|
|
}
|
|
|
|
sel := n.GetTable().GetSelectedItem()
|
|
gvr := client.NewGVR(n.GVR()).AsGVR()
|
|
o, err := n.App().factory.Client().DynDialOrDie().Resource(gvr).Get(sel, metav1.GetOptions{})
|
|
if err != nil {
|
|
n.App().Flash().Errf("Unable to get resource %q -- %s", n.GVR(), err)
|
|
return nil
|
|
}
|
|
|
|
raw, err := toYAML(o)
|
|
if err != nil {
|
|
n.App().Flash().Errf("Unable to marshal resource %s", err)
|
|
return nil
|
|
}
|
|
|
|
details := NewDetails(n.App(), "YAML", sel).Update(raw)
|
|
if err := n.App().inject(details); err != nil {
|
|
n.App().Flash().Err(err)
|
|
}
|
|
|
|
return nil
|
|
}
|