Commit 75faf550 authored by Darren Shepherd's avatar Darren Shepherd

Add custom listpath to disable aggregation

parent f1b344ff
......@@ -163,6 +163,8 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan
return nil, err
}
apiExtensionsServer.GenericAPIServer.DiscoveryGroupManager = kubeAPIServer.GenericAPIServer.DiscoveryGroupManager
// This will wire up openapi for extension api server
apiExtensionsServer.GenericAPIServer.PrepareRun()
......@@ -429,7 +431,6 @@ func buildGenericConfig(
if err != nil {
lastErr = fmt.Errorf("failed to initialize admission: %v", err)
}
return
}
......
......@@ -168,6 +168,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
}
establishingController := establish.NewEstablishingController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions())
crdHandler := NewCustomResourceDefinitionHandler(
s.GenericAPIServer,
versionDiscoveryHandler,
groupDiscoveryHandler,
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(),
......
......@@ -25,6 +25,8 @@ import (
"sync/atomic"
"time"
"k8s.io/apiserver/pkg/server"
"github.com/golang/glog"
apiequality "k8s.io/apimachinery/pkg/api/equality"
......@@ -89,6 +91,9 @@ type crdHandler struct {
// MasterCount is used to implement sleep to improve
// CRD establishing process for HA clusters.
masterCount int
genericAPIServer *server.GenericAPIServer
addRoot sync.Once
}
// crdInfo stores enough information to serve the storage for the custom resource
......@@ -118,6 +123,7 @@ type crdInfo struct {
type crdStorageMap map[types.UID]*crdInfo
func NewCustomResourceDefinitionHandler(
genericAPIServer *server.GenericAPIServer,
versionDiscoveryHandler *versionDiscoveryHandler,
groupDiscoveryHandler *groupDiscoveryHandler,
crdInformer informers.CustomResourceDefinitionInformer,
......@@ -127,6 +133,7 @@ func NewCustomResourceDefinitionHandler(
establishingController *establish.EstablishingController,
masterCount int) *crdHandler {
ret := &crdHandler{
genericAPIServer: genericAPIServer,
versionDiscoveryHandler: versionDiscoveryHandler,
groupDiscoveryHandler: groupDiscoveryHandler,
customStorage: atomic.Value{},
......@@ -138,14 +145,27 @@ func NewCustomResourceDefinitionHandler(
masterCount: masterCount,
}
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
UpdateFunc: ret.updateCustomResourceDefinition,
AddFunc: func(obj interface{}) {
ret.updateAPI(obj, false)
},
UpdateFunc: func(oldObj, newObj interface{}) {
ret.updateCustomResourceDefinition(oldObj, newObj)
ret.updateAPI(newObj, false)
},
DeleteFunc: func(obj interface{}) {
ret.updateAPI(obj, true)
ret.removeDeadStorage()
},
})
ret.customStorage.Store(crdStorageMap{})
go func() {
// pretty hacky, but this will install the CRD api group if no CRDs exist
time.Sleep(5 * time.Second)
ret.updateAPI(nil, false)
}()
return ret
}
......@@ -304,6 +324,44 @@ func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, reques
}
}
func (r *crdHandler) updateAPI(obj interface{}, del bool) {
if r.genericAPIServer.DiscoveryGroupManager == nil {
return
}
r.addRoot.Do(func() {
ver := metav1.GroupVersionForDiscovery{
Version: "v1beta1",
GroupVersion: fmt.Sprintf("apiextensions.k8s.io/v1beta1"),
}
r.genericAPIServer.DiscoveryGroupManager.AddGroup(metav1.APIGroup{
Name: "apiextensions.k8s.io",
Versions: []metav1.GroupVersionForDiscovery{ver},
PreferredVersion: ver,
})
})
newCRD, ok := obj.(*apiextensions.CustomResourceDefinition)
if !ok {
return
}
if del {
r.genericAPIServer.DiscoveryGroupManager.RemoveGroup(newCRD.Spec.Group)
return
}
ver := metav1.GroupVersionForDiscovery{
Version: newCRD.Spec.Version,
GroupVersion: fmt.Sprintf("%s/%s", newCRD.Spec.Group, newCRD.Spec.Version),
}
r.genericAPIServer.DiscoveryGroupManager.AddGroup(metav1.APIGroup{
Name: newCRD.Spec.Group,
Versions: []metav1.GroupVersionForDiscovery{ver},
PreferredVersion: ver,
})
}
func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
......
......@@ -18,8 +18,11 @@ package discovery
import (
"net/http"
"strings"
"sync"
"k8s.io/apiserver/pkg/server/routes"
restful "github.com/emicklei/go-restful"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
......@@ -33,6 +36,8 @@ import (
// GroupManager is an interface that allows dynamic mutation of the existing webservice to handle
// API groups being added or removed.
type GroupManager interface {
routes.ListedPathProvider
AddGroup(apiGroup metav1.APIGroup)
RemoveGroup(groupName string)
......@@ -69,6 +74,22 @@ func NewRootAPIsHandler(addresses Addresses, serializer runtime.NegotiatedSerial
}
}
func (s *rootAPIsHandler) ListedPaths() []string {
s.lock.RLock()
defer s.lock.RUnlock()
var result []string
for name, group := range s.apiGroups {
if strings.Contains(name, ".") {
for _, ver := range group.Versions {
result = append(result, "/apis/"+ver.GroupVersion)
}
}
}
return result
}
func (s *rootAPIsHandler) AddGroup(apiGroup metav1.APIGroup) {
s.lock.Lock()
defer s.lock.Unlock()
......
......@@ -388,7 +388,7 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G
s.healthzChecks = append(s.healthzChecks, delegateCheck)
}
s.listedPathProvider = routes.ListedPathProviders{s.listedPathProvider, delegationTarget}
s.listedPathProvider = routes.ListedPathProviders{s.listedPathProvider, delegationTarget, s.DiscoveryGroupManager}
installAPI(s, c.Config)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment