k9s/internal/render/ev.go

111 lines
2.3 KiB
Go

package render
import (
"fmt"
"strings"
"github.com/derailed/k9s/internal/client"
"github.com/gdamore/tcell/v2"
metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
)
// Event renders a K8s Event to screen.
type Event struct {
Generic
}
func (*Event) IsGeneric() bool {
return true
}
// ColorerFunc colors a resource row.
func (e *Event) ColorerFunc() ColorerFunc {
return func(ns string, h Header, re RowEvent) tcell.Color {
reasonCol := h.IndexOf("REASON", true)
if reasonCol >= 0 && strings.TrimSpace(re.Row.Fields[reasonCol]) == "Killing" {
return KillColor
}
return DefaultColorer(ns, h, re)
}
}
var ageCols = map[string]struct{}{
"FIRST SEEN": {},
"LAST SEEN": {},
}
var wideCols = map[string]struct{}{
"SUBOBJECT": {},
"SOURCE": {},
"FIRST SEEN": {},
"NAME": {},
"MESSAGE": {},
}
func (e *Event) Header(ns string) Header {
if e.table == nil {
return Header{}
}
hh := make(Header, 0, len(e.table.ColumnDefinitions))
hh = append(hh, HeaderColumn{Name: "NAMESPACE"})
for _, h := range e.table.ColumnDefinitions {
header := HeaderColumn{Name: strings.ToUpper(h.Name)}
if _, ok := ageCols[header.Name]; ok {
header.Time = true
}
if _, ok := wideCols[header.Name]; ok {
header.Wide = true
}
hh = append(hh, header)
}
return hh
}
// Render renders a K8s resource to screen.
func (e *Event) Render(o interface{}, ns string, r *Row) error {
row, ok := o.(metav1beta1.TableRow)
if !ok {
return fmt.Errorf("expecting a TableRow but got %T", o)
}
nns, name, err := resourceNS(row.Object.Raw)
if err != nil {
return err
}
if !ok {
return fmt.Errorf("expecting row 0 to be a string but got %T", row.Cells[0])
}
r.ID = client.FQN(nns, name)
r.Fields = make(Fields, 0, len(e.Header(ns)))
r.Fields = append(r.Fields, nns)
for _, o := range row.Cells {
if o == nil {
r.Fields = append(r.Fields, Blank)
continue
}
if s, ok := o.(fmt.Stringer); ok {
r.Fields = append(r.Fields, s.String())
continue
}
if s, ok := o.(string); ok {
r.Fields = append(r.Fields, s)
continue
}
r.Fields = append(r.Fields, fmt.Sprintf("%v", o))
}
return nil
}
func (e *Event) cellFor(n string, row metav1beta1.TableRow) (string, bool) {
for i, h := range e.table.ColumnDefinitions {
if h.Name == n {
return fmt.Sprintf("%v", row.Cells[i]), true
}
}
return "", false
}