diff --git a/internal/resource/custom.go b/internal/resource/custom.go index 148df75c..94890dc8 100644 --- a/internal/resource/custom.go +++ b/internal/resource/custom.go @@ -7,9 +7,11 @@ import ( "path" "strings" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/derailed/k9s/internal/k8s" "github.com/rs/zerolog/log" - yaml "gopkg.in/yaml.v2" + "gopkg.in/yaml.v2" metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" ) @@ -79,6 +81,10 @@ func (r *Custom) Marshal(path string) (string, error) { if err != nil { return "", err } + switch v := i.(type) { + case *unstructured.Unstructured: + i = v.Object + } raw, err := yaml.Marshal(i) if err != nil { diff --git a/internal/resource/custom_test.go b/internal/resource/custom_test.go index 83e08b52..ee64f01b 100644 --- a/internal/resource/custom_test.go +++ b/internal/resource/custom_test.go @@ -3,6 +3,8 @@ package resource_test import ( "testing" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/derailed/k9s/internal/k8s" "github.com/derailed/k9s/internal/resource" m "github.com/petergtz/pegomock" @@ -55,6 +57,19 @@ func TestCustomMarshal(t *testing.T) { assert.Equal(t, customYaml(), ma) } +func TestCustomMarshalWithUnstructured(t *testing.T) { + mc := NewMockConnection() + mr := NewMockCruder() + m.When(mr.Get("blee", "fred")).ThenReturn(k8sUnstructured(), nil) + + cm := NewCustomWithArgs(mc, mr) + ma, err := cm.Marshal("blee/fred") + mr.VerifyWasCalledOnce().Get("blee", "fred") + + assert.Nil(t, err) + assert.Equal(t, unstructuredYAML(), ma) +} + func TestCustomListData(t *testing.T) { mc := NewMockConnection() mr := NewMockCruder() @@ -109,6 +124,28 @@ func k8sCustomTable() *metav1beta1.Table { } } +func k8sUnstructured() *unstructured.Unstructured { + return &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "fred", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "namespace": "blee", + "name": "fred", + }, + }, + } +} + +func unstructuredYAML() string { + return `apiVersion: v1 +kind: fred +metadata: + name: fred + namespace: blee +` +} + func k8sCustomRow() *metav1beta1.TableRow { return &metav1beta1.TableRow{ Object: runtime.RawExtension{