k9s/internal/xray/generic.go

68 lines
1.4 KiB
Go

package xray
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/derailed/k9s/internal/client"
metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
)
// Generic renders a generic resource to screen.
type Generic struct {
table *metav1beta1.Table
}
// SetTable sets the tabular resource.
func (g *Generic) SetTable(t *metav1beta1.Table) {
g.table = t
}
// Render renders a K8s resource to screen.
func (g *Generic) Render(ctx context.Context, ns string, o interface{}) error {
row, ok := o.(metav1beta1.TableRow)
if !ok {
return fmt.Errorf("expecting a TableRow but got %T", o)
}
n, ok := row.Cells[0].(string)
if !ok {
return fmt.Errorf("expecting row 0 to be a string but got %T", row.Cells[0])
}
root := NewTreeNode("generic", client.FQN(ns, n))
parent := ctx.Value(KeyParent).(*TreeNode)
parent.Add(root)
return nil
}
// ----------------------------------------------------------------------------
// Helpers...
func resourceNS(raw []byte) (bool, string, error) {
var obj map[string]interface{}
err := json.Unmarshal(raw, &obj)
if err != nil {
return false, "", err
}
meta, ok := obj["metadata"].(map[string]interface{})
if !ok {
return false, "", errors.New("no metadata found on generic resource")
}
ns, ok := meta["namespace"]
if !ok {
return true, "", nil
}
nns, ok := ns.(string)
if !ok {
return false, "", fmt.Errorf("expecting namespace string type but got %T", ns)
}
return false, nns, nil
}