func (g *configRESTOptionsGetter) GetRESTOptions(resource unversioned.GroupResource) (genericrest.RESTOptions, error) { g.restOptionsLock.Lock() defer g.restOptionsLock.Unlock() if resourceOptions, ok := g.restOptionsMap[resource]; ok { return resourceOptions, nil } if g.etcdHelper == nil { // TODO: choose destination etcd based on input resource etcdClient, err := etcd.MakeNewEtcdClient(g.masterOptions.EtcdClientInfo) if err != nil { return genericrest.RESTOptions{}, err } // TODO: choose destination group/version based on input group/resource // TODO: Tune the cache size groupVersion := unversioned.GroupVersion{Group: "", Version: g.masterOptions.EtcdStorageConfig.OpenShiftStorageVersion} g.etcdHelper = etcdstorage.NewEtcdStorage(etcdClient, kapi.Codecs.LegacyCodec(groupVersion), g.masterOptions.EtcdStorageConfig.OpenShiftStoragePrefix, false, genericapiserver.DefaultDeserializationCacheSize) } configuredCacheSize, specified := g.cacheSizes[resource] if !specified || configuredCacheSize < 0 { configuredCacheSize = g.defaultCacheSize } decorator := func(s storage.Interface, requestedSize int, objectType runtime.Object, resourcePrefix string, scopeStrategy rest.NamespaceScopedStrategy, newListFunc func() runtime.Object) storage.Interface { capacity := requestedSize if capacity == UseConfiguredCacheSize { capacity = configuredCacheSize } if capacity == 0 || !g.cacheEnabled { glog.V(5).Infof("using uncached watch storage for %s", resource.String()) return genericrest.UndecoratedStorage(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFunc) } else { glog.V(5).Infof("using watch cache storage (capacity=%d) for %s", capacity, resource.String()) return registry.StorageWithCacher(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFunc) } } resourceOptions := genericrest.RESTOptions{ Storage: g.etcdHelper, Decorator: decorator, DeleteCollectionWorkers: 1, } g.restOptionsMap[resource] = resourceOptions return resourceOptions, nil }
func (g *configRESTOptionsGetter) GetRESTOptions(resource unversioned.GroupResource) (genericrest.RESTOptions, error) { g.restOptionsLock.Lock() defer g.restOptionsLock.Unlock() if resourceOptions, ok := g.restOptionsMap[resource]; ok { return resourceOptions, nil } config, err := g.storageFactory.NewConfig(resource) if err != nil { return genericrest.RESTOptions{}, err } if _, ok := g.quorumResources[resource]; ok { config.Quorum = true } configuredCacheSize, specified := g.cacheSizes[resource] if !specified || configuredCacheSize < 0 { configuredCacheSize = g.defaultCacheSize } decorator := func(s *storagebackend.Config, requestedSize int, objectType runtime.Object, resourcePrefix string, scopeStrategy rest.NamespaceScopedStrategy, newListFn func() runtime.Object, triggerFn storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc) { capacity := requestedSize if capacity == UseConfiguredCacheSize { capacity = configuredCacheSize } if capacity == 0 || !g.cacheEnabled { glog.V(5).Infof("using uncached watch storage for %s", resource.String()) return genericrest.UndecoratedStorage(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFn, triggerFn) } glog.V(5).Infof("using watch cache storage (capacity=%d) for %s %#v", capacity, resource.String(), s) return registry.StorageWithCacher(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFn, triggerFn) } resourceOptions := genericrest.RESTOptions{ StorageConfig: config, Decorator: decorator, DeleteCollectionWorkers: 1, ResourcePrefix: g.storageFactory.ResourcePrefix(resource), } g.restOptionsMap[resource] = resourceOptions return resourceOptions, nil }