diff --git a/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/customresource_handler.go index 4a49df3664c..d4883f7c933 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/kube-apiextensions-server/pkg/apiserver/customresource_handler.go @@ -20,6 +20,7 @@ import ( "bytes" "fmt" "net/http" + "path" "sync" "sync/atomic" "time" @@ -257,14 +258,23 @@ func (r *customResourceDefinitionHandler) getServingInfoFor(customResourceDefini parameterScheme.AddGeneratedDeepCopyFuncs(metav1.GetGeneratedDeepCopyFuncs()...) parameterCodec := runtime.NewParameterCodec(parameterScheme) + selfLinkPrefix := "" + switch customResourceDefinition.Spec.Scope { + case apiextensions.ClusterScoped: + selfLinkPrefix = "/" + path.Join("apis", customResourceDefinition.Spec.Group, customResourceDefinition.Spec.Version) + "/" + case apiextensions.NamespaceScoped: + selfLinkPrefix = "/" + path.Join("apis", customResourceDefinition.Spec.Group, customResourceDefinition.Spec.Version, "namespaces") + "/" + } + requestScope := handlers.RequestScope{ Namer: handlers.ContextBasedNaming{ GetContext: func(req *http.Request) apirequest.Context { ret, _ := r.requestContextMapper.Get(req) return ret }, - SelfLinker: meta.NewAccessor(), - ClusterScoped: customResourceDefinition.Spec.Scope == apiextensions.ClusterScoped, + SelfLinker: meta.NewAccessor(), + ClusterScoped: customResourceDefinition.Spec.Scope == apiextensions.ClusterScoped, + SelfLinkPathPrefix: selfLinkPrefix, }, ContextFunc: func(req *http.Request) apirequest.Context { ret, _ := r.requestContextMapper.Get(req) diff --git a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go index d6128220c49..9e14fca18d9 100644 --- a/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go +++ b/staging/src/k8s.io/kube-apiextensions-server/test/integration/basic_test.go @@ -197,4 +197,6 @@ func TestSelfLink(t *testing.T) { t.Errorf("expected %v, got %v", e, a) } + // TODO add test for cluster scoped self-link when its available + }