Commit a5b87330 authored by Darren Shepherd's avatar Darren Shepherd

Add custom listpath to disable aggregation

parent c4fb6177
...@@ -163,6 +163,8 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan ...@@ -163,6 +163,8 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan
return nil, err return nil, err
} }
apiExtensionsServer.GenericAPIServer.DiscoveryGroupManager = kubeAPIServer.GenericAPIServer.DiscoveryGroupManager
// This will wire up openapi for extension api server // This will wire up openapi for extension api server
apiExtensionsServer.GenericAPIServer.PrepareRun() apiExtensionsServer.GenericAPIServer.PrepareRun()
...@@ -429,7 +431,6 @@ func buildGenericConfig( ...@@ -429,7 +431,6 @@ func buildGenericConfig(
if err != nil { if err != nil {
lastErr = fmt.Errorf("failed to initialize admission: %v", err) lastErr = fmt.Errorf("failed to initialize admission: %v", err)
} }
return return
} }
......
...@@ -168,6 +168,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) ...@@ -168,6 +168,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
} }
establishingController := establish.NewEstablishingController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions()) establishingController := establish.NewEstablishingController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions())
crdHandler := NewCustomResourceDefinitionHandler( crdHandler := NewCustomResourceDefinitionHandler(
s.GenericAPIServer,
versionDiscoveryHandler, versionDiscoveryHandler,
groupDiscoveryHandler, groupDiscoveryHandler,
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(),
......
...@@ -25,6 +25,8 @@ import ( ...@@ -25,6 +25,8 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"k8s.io/apiserver/pkg/server"
"github.com/golang/glog" "github.com/golang/glog"
apiequality "k8s.io/apimachinery/pkg/api/equality" apiequality "k8s.io/apimachinery/pkg/api/equality"
...@@ -89,6 +91,9 @@ type crdHandler struct { ...@@ -89,6 +91,9 @@ type crdHandler struct {
// MasterCount is used to implement sleep to improve // MasterCount is used to implement sleep to improve
// CRD establishing process for HA clusters. // CRD establishing process for HA clusters.
masterCount int masterCount int
genericAPIServer *server.GenericAPIServer
addRoot sync.Once
} }
// crdInfo stores enough information to serve the storage for the custom resource // crdInfo stores enough information to serve the storage for the custom resource
...@@ -118,6 +123,7 @@ type crdInfo struct { ...@@ -118,6 +123,7 @@ type crdInfo struct {
type crdStorageMap map[types.UID]*crdInfo type crdStorageMap map[types.UID]*crdInfo
func NewCustomResourceDefinitionHandler( func NewCustomResourceDefinitionHandler(
genericAPIServer *server.GenericAPIServer,
versionDiscoveryHandler *versionDiscoveryHandler, versionDiscoveryHandler *versionDiscoveryHandler,
groupDiscoveryHandler *groupDiscoveryHandler, groupDiscoveryHandler *groupDiscoveryHandler,
crdInformer informers.CustomResourceDefinitionInformer, crdInformer informers.CustomResourceDefinitionInformer,
...@@ -127,6 +133,7 @@ func NewCustomResourceDefinitionHandler( ...@@ -127,6 +133,7 @@ func NewCustomResourceDefinitionHandler(
establishingController *establish.EstablishingController, establishingController *establish.EstablishingController,
masterCount int) *crdHandler { masterCount int) *crdHandler {
ret := &crdHandler{ ret := &crdHandler{
genericAPIServer: genericAPIServer,
versionDiscoveryHandler: versionDiscoveryHandler, versionDiscoveryHandler: versionDiscoveryHandler,
groupDiscoveryHandler: groupDiscoveryHandler, groupDiscoveryHandler: groupDiscoveryHandler,
customStorage: atomic.Value{}, customStorage: atomic.Value{},
...@@ -138,14 +145,27 @@ func NewCustomResourceDefinitionHandler( ...@@ -138,14 +145,27 @@ func NewCustomResourceDefinitionHandler(
masterCount: masterCount, masterCount: masterCount,
} }
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ 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{}) { DeleteFunc: func(obj interface{}) {
ret.updateAPI(obj, true)
ret.removeDeadStorage() ret.removeDeadStorage()
}, },
}) })
ret.customStorage.Store(crdStorageMap{}) 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 return ret
} }
...@@ -304,6 +324,44 @@ func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, reques ...@@ -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{}) { func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition) oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
newCRD := newObj.(*apiextensions.CustomResourceDefinition) newCRD := newObj.(*apiextensions.CustomResourceDefinition)
......
...@@ -18,8 +18,11 @@ package discovery ...@@ -18,8 +18,11 @@ package discovery
import ( import (
"net/http" "net/http"
"strings"
"sync" "sync"
"k8s.io/apiserver/pkg/server/routes"
restful "github.com/emicklei/go-restful" restful "github.com/emicklei/go-restful"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
...@@ -33,6 +36,8 @@ import ( ...@@ -33,6 +36,8 @@ import (
// GroupManager is an interface that allows dynamic mutation of the existing webservice to handle // GroupManager is an interface that allows dynamic mutation of the existing webservice to handle
// API groups being added or removed. // API groups being added or removed.
type GroupManager interface { type GroupManager interface {
routes.ListedPathProvider
AddGroup(apiGroup metav1.APIGroup) AddGroup(apiGroup metav1.APIGroup)
RemoveGroup(groupName string) RemoveGroup(groupName string)
...@@ -69,6 +74,22 @@ func NewRootAPIsHandler(addresses Addresses, serializer runtime.NegotiatedSerial ...@@ -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) { func (s *rootAPIsHandler) AddGroup(apiGroup metav1.APIGroup) {
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()
......
...@@ -388,7 +388,7 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G ...@@ -388,7 +388,7 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G
s.healthzChecks = append(s.healthzChecks, delegateCheck) 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) 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