From b70a8d05489e64ea8aa148ba1eab1cb48a42141b Mon Sep 17 00:00:00 2001 From: Michael Bolot Date: Tue, 6 Dec 2022 09:04:31 -0600 Subject: [PATCH 1/2] Fixing view link for management crds --- pkg/resources/common/formatter.go | 37 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/pkg/resources/common/formatter.go b/pkg/resources/common/formatter.go index 06dd345..2922481 100644 --- a/pkg/resources/common/formatter.go +++ b/pkg/resources/common/formatter.go @@ -30,21 +30,32 @@ func DefaultTemplate(clientGetter proxy.ClientGetter, func selfLink(gvr schema2.GroupVersionResource, meta metav1.Object) (prefix string) { buf := &strings.Builder{} - if gvr.Group == "" { - buf.WriteString("/api/v1/") - } else { - buf.WriteString("/apis/") + if gvr.Group == "management.cattle.io" && gvr.Version == "v3" { + buf.WriteString("/v1/") buf.WriteString(gvr.Group) - buf.WriteString("/") - buf.WriteString(gvr.Version) - buf.WriteString("/") + buf.WriteString(".") + buf.WriteString(gvr.Resource) + if meta.GetNamespace() != "" { + buf.WriteString("/") + buf.WriteString(meta.GetNamespace()) + } + } else { + if gvr.Group == "" { + buf.WriteString("/api/v1/") + } else { + buf.WriteString("/apis/") + buf.WriteString(gvr.Group) + buf.WriteString("/") + buf.WriteString(gvr.Version) + buf.WriteString("/") + } + if meta.GetNamespace() != "" { + buf.WriteString("namespaces/") + buf.WriteString(meta.GetNamespace()) + buf.WriteString("/") + } + buf.WriteString(gvr.Resource) } - if meta.GetNamespace() != "" { - buf.WriteString("namespaces/") - buf.WriteString(meta.GetNamespace()) - buf.WriteString("/") - } - buf.WriteString(gvr.Resource) buf.WriteString("/") buf.WriteString(meta.GetName()) return buf.String() From fe51b086819ccaff8a9ccd419f27de488be33824 Mon Sep 17 00:00:00 2001 From: Michael Bolot Date: Tue, 6 Dec 2022 09:04:56 -0600 Subject: [PATCH 2/2] Tests for "Fixing view link for management crds" --- pkg/resources/common/formatter_test.go | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/pkg/resources/common/formatter_test.go b/pkg/resources/common/formatter_test.go index 635fec5..e5a3d60 100644 --- a/pkg/resources/common/formatter_test.go +++ b/pkg/resources/common/formatter_test.go @@ -7,6 +7,7 @@ import ( "github.com/rancher/apiserver/pkg/types" "github.com/stretchr/testify/assert" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + schema2 "k8s.io/apimachinery/pkg/runtime/schema" ) func Test_includeFields(t *testing.T) { @@ -541,3 +542,73 @@ func Test_excludeValues(t *testing.T) { }) } } + +func Test_selfLink(t *testing.T) { + tests := []struct { + name string + group string + version string + resource string + resourceName string + resourceNamespace string + want string + }{ + { + name: "empty group", + group: "", + version: "v1", + resource: "pods", + resourceName: "rancher", + resourceNamespace: "cattle-system", + want: "/api/v1/namespaces/cattle-system/pods/rancher", + }, + { + name: "third party crd", + group: "fake.group.io", + version: "v4", + resource: "new-crd", + resourceName: "new-resource", + resourceNamespace: "random-ns", + want: "/apis/fake.group.io/v4/namespaces/random-ns/new-crd/new-resource", + }, + { + name: "non-namespaced third party crd", + group: "fake.group.io", + version: "v4", + resource: "new-crd", + resourceName: "new-resource", + want: "/apis/fake.group.io/v4/new-crd/new-resource", + }, + { + name: "rancher crd, non namespaced", + group: "management.cattle.io", + version: "v3", + resource: "cluster", + resourceName: "c-123xyz", + want: "/v1/management.cattle.io.cluster/c-123xyz", + }, + { + name: "rancher crd, namespaced", + group: "management.cattle.io", + version: "v3", + resource: "catalogtemplates", + resourceName: "built-in", + resourceNamespace: "cattle-global-data", + want: "/v1/management.cattle.io.catalogtemplates/cattle-global-data/built-in", + }, + } + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + gvr := schema2.GroupVersionResource{ + Group: test.group, + Version: test.version, + Resource: test.resource, + } + obj := unstructured.Unstructured{} + obj.SetName(test.resourceName) + obj.SetNamespace(test.resourceNamespace) + assert.Equal(t, test.want, selfLink(gvr, &obj), "did not get expected prefix for object") + }) + } +}