diff --git a/pkg/resources/common/formatter.go b/pkg/resources/common/formatter.go index 1688c9e..1ffdc32 100644 --- a/pkg/resources/common/formatter.go +++ b/pkg/resources/common/formatter.go @@ -5,6 +5,7 @@ import ( "github.com/rancher/apiserver/pkg/types" "github.com/rancher/steve/pkg/accesscontrol" + "github.com/rancher/steve/pkg/attributes" "github.com/rancher/steve/pkg/schema" "github.com/rancher/steve/pkg/stores/proxy" "github.com/rancher/steve/pkg/summarycache" @@ -12,7 +13,9 @@ import ( "github.com/rancher/wrangler/pkg/slice" "github.com/rancher/wrangler/pkg/summary" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + schema2 "k8s.io/apimachinery/pkg/runtime/schema" ) func DefaultTemplate(clientGetter proxy.ClientGetter, @@ -24,17 +27,44 @@ 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/") + 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) + buf.WriteString("/") + buf.WriteString(meta.GetName()) + return buf.String() +} + func formatter(summarycache *summarycache.SummaryCache) types.Formatter { return func(request *types.APIRequest, resource *types.RawResource) { + if resource.Schema == nil { + return + } + + gvr := attributes.GVR(resource.Schema) + if gvr.Version == "" { + return + } + meta, err := meta.Accessor(resource.APIObject.Object) if err != nil { return } - - selfLink := meta.GetSelfLink() - if selfLink == "" { - return - } + selfLink := selfLink(gvr, meta) u := request.URLBuilder.RelativeToRoot(selfLink) resource.Links["view"] = u