mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #29674 from deads2k/api-group-register
Automatic merge from submit-queue separate out api group storage registration Moves RESTStorage creation for API groups out of master.go proper and makes dependencies clear. This is prereq for being able to build the `RESTStorageProviders` as plugins. @lavalamp This is the follow-on I promised. @sttts ptal.
This commit is contained in:
		@@ -17,14 +17,6 @@
 | 
				
			|||||||
    "path": "/api",
 | 
					    "path": "/api",
 | 
				
			||||||
    "description": "get available API versions"
 | 
					    "description": "get available API versions"
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
    "path": "/apis/extensions/v1beta1",
 | 
					 | 
				
			||||||
    "description": "API at /apis/extensions/v1beta1"
 | 
					 | 
				
			||||||
   },
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
    "path": "/apis/extensions",
 | 
					 | 
				
			||||||
    "description": "get information of a group"
 | 
					 | 
				
			||||||
   },
 | 
					 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
    "path": "/apis/apps/v1alpha1",
 | 
					    "path": "/apis/apps/v1alpha1",
 | 
				
			||||||
    "description": "API at /apis/apps/v1alpha1"
 | 
					    "description": "API at /apis/apps/v1alpha1"
 | 
				
			||||||
@@ -61,6 +53,14 @@
 | 
				
			|||||||
    "path": "/apis/certificates",
 | 
					    "path": "/apis/certificates",
 | 
				
			||||||
    "description": "get information of a group"
 | 
					    "description": "get information of a group"
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					    "path": "/apis/extensions/v1beta1",
 | 
				
			||||||
 | 
					    "description": "API at /apis/extensions/v1beta1"
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					    "path": "/apis/extensions",
 | 
				
			||||||
 | 
					    "description": "get information of a group"
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
    "path": "/apis/policy/v1alpha1",
 | 
					    "path": "/apis/policy/v1alpha1",
 | 
				
			||||||
    "description": "API at /apis/policy/v1alpha1"
 | 
					    "description": "API at /apis/policy/v1alpha1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/api/rest"
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apimachinery"
 | 
						"k8s.io/kubernetes/pkg/apimachinery"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apimachinery/registered"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apiserver"
 | 
						"k8s.io/kubernetes/pkg/apiserver"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/auth/authenticator"
 | 
						"k8s.io/kubernetes/pkg/auth/authenticator"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/auth/authorizer"
 | 
						"k8s.io/kubernetes/pkg/auth/authorizer"
 | 
				
			||||||
@@ -918,3 +919,18 @@ func (s *GenericAPIServer) InstallSwaggerAPI() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	swagger.RegisterSwaggerService(swaggerConfig, s.HandlerContainer)
 | 
						swagger.RegisterSwaggerService(swaggerConfig, s.HandlerContainer)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewDefaultAPIGroupInfo returns an APIGroupInfo stubbed with "normal" values
 | 
				
			||||||
 | 
					// exposed for easier composition from other packages
 | 
				
			||||||
 | 
					func NewDefaultAPIGroupInfo(group string) APIGroupInfo {
 | 
				
			||||||
 | 
						groupMeta := registered.GroupOrDie(group)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return APIGroupInfo{
 | 
				
			||||||
 | 
							GroupMeta:                    *groupMeta,
 | 
				
			||||||
 | 
							VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
 | 
				
			||||||
 | 
							OptionsExternalVersion:       ®istered.GroupOrDie(api.GroupName).GroupVersion,
 | 
				
			||||||
 | 
							Scheme:                       api.Scheme,
 | 
				
			||||||
 | 
							ParameterCodec:               api.ParameterCodec,
 | 
				
			||||||
 | 
							NegotiatedSerializer:         api.Codecs,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,13 +33,11 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	apiv1 "k8s.io/kubernetes/pkg/api/v1"
 | 
						apiv1 "k8s.io/kubernetes/pkg/api/v1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apimachinery/registered"
 | 
						"k8s.io/kubernetes/pkg/apimachinery/registered"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/apps"
 | 
					 | 
				
			||||||
	appsapi "k8s.io/kubernetes/pkg/apis/apps/v1alpha1"
 | 
						appsapi "k8s.io/kubernetes/pkg/apis/apps/v1alpha1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/autoscaling"
 | 
						"k8s.io/kubernetes/pkg/apis/autoscaling"
 | 
				
			||||||
	autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
 | 
						autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/batch"
 | 
						"k8s.io/kubernetes/pkg/apis/batch"
 | 
				
			||||||
	batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
 | 
						batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
 | 
				
			||||||
	batchapiv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/certificates"
 | 
						"k8s.io/kubernetes/pkg/apis/certificates"
 | 
				
			||||||
	certificatesapiv1alpha1 "k8s.io/kubernetes/pkg/apis/certificates/v1alpha1"
 | 
						certificatesapiv1alpha1 "k8s.io/kubernetes/pkg/apis/certificates/v1alpha1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/extensions"
 | 
						"k8s.io/kubernetes/pkg/apis/extensions"
 | 
				
			||||||
@@ -48,60 +46,35 @@ import (
 | 
				
			|||||||
	policyapiv1alpha1 "k8s.io/kubernetes/pkg/apis/policy/v1alpha1"
 | 
						policyapiv1alpha1 "k8s.io/kubernetes/pkg/apis/policy/v1alpha1"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/rbac"
 | 
						"k8s.io/kubernetes/pkg/apis/rbac"
 | 
				
			||||||
	rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1"
 | 
						rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1"
 | 
				
			||||||
	rbacvalidation "k8s.io/kubernetes/pkg/apis/rbac/validation"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apiserver"
 | 
						"k8s.io/kubernetes/pkg/apiserver"
 | 
				
			||||||
	apiservermetrics "k8s.io/kubernetes/pkg/apiserver/metrics"
 | 
						apiservermetrics "k8s.io/kubernetes/pkg/apiserver/metrics"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/genericapiserver"
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/healthz"
 | 
						"k8s.io/kubernetes/pkg/healthz"
 | 
				
			||||||
	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
 | 
						kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/master/ports"
 | 
						"k8s.io/kubernetes/pkg/master/ports"
 | 
				
			||||||
	certificateetcd "k8s.io/kubernetes/pkg/registry/certificates/etcd"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/clusterrole"
 | 
					 | 
				
			||||||
	clusterroleetcd "k8s.io/kubernetes/pkg/registry/clusterrole/etcd"
 | 
					 | 
				
			||||||
	clusterrolepolicybased "k8s.io/kubernetes/pkg/registry/clusterrole/policybased"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/clusterrolebinding"
 | 
					 | 
				
			||||||
	clusterrolebindingetcd "k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd"
 | 
					 | 
				
			||||||
	clusterrolebindingpolicybased "k8s.io/kubernetes/pkg/registry/clusterrolebinding/policybased"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/componentstatus"
 | 
						"k8s.io/kubernetes/pkg/registry/componentstatus"
 | 
				
			||||||
	configmapetcd "k8s.io/kubernetes/pkg/registry/configmap/etcd"
 | 
						configmapetcd "k8s.io/kubernetes/pkg/registry/configmap/etcd"
 | 
				
			||||||
	controlleretcd "k8s.io/kubernetes/pkg/registry/controller/etcd"
 | 
						controlleretcd "k8s.io/kubernetes/pkg/registry/controller/etcd"
 | 
				
			||||||
	deploymentetcd "k8s.io/kubernetes/pkg/registry/deployment/etcd"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/endpoint"
 | 
						"k8s.io/kubernetes/pkg/registry/endpoint"
 | 
				
			||||||
	endpointsetcd "k8s.io/kubernetes/pkg/registry/endpoint/etcd"
 | 
						endpointsetcd "k8s.io/kubernetes/pkg/registry/endpoint/etcd"
 | 
				
			||||||
	eventetcd "k8s.io/kubernetes/pkg/registry/event/etcd"
 | 
						eventetcd "k8s.io/kubernetes/pkg/registry/event/etcd"
 | 
				
			||||||
	expcontrolleretcd "k8s.io/kubernetes/pkg/registry/experimental/controller/etcd"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/generic"
 | 
						"k8s.io/kubernetes/pkg/registry/generic"
 | 
				
			||||||
	ingressetcd "k8s.io/kubernetes/pkg/registry/ingress/etcd"
 | 
					 | 
				
			||||||
	jobetcd "k8s.io/kubernetes/pkg/registry/job/etcd"
 | 
					 | 
				
			||||||
	limitrangeetcd "k8s.io/kubernetes/pkg/registry/limitrange/etcd"
 | 
						limitrangeetcd "k8s.io/kubernetes/pkg/registry/limitrange/etcd"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/namespace"
 | 
						"k8s.io/kubernetes/pkg/registry/namespace"
 | 
				
			||||||
	namespaceetcd "k8s.io/kubernetes/pkg/registry/namespace/etcd"
 | 
						namespaceetcd "k8s.io/kubernetes/pkg/registry/namespace/etcd"
 | 
				
			||||||
	networkpolicyetcd "k8s.io/kubernetes/pkg/registry/networkpolicy/etcd"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/node"
 | 
						"k8s.io/kubernetes/pkg/registry/node"
 | 
				
			||||||
	nodeetcd "k8s.io/kubernetes/pkg/registry/node/etcd"
 | 
						nodeetcd "k8s.io/kubernetes/pkg/registry/node/etcd"
 | 
				
			||||||
	pvetcd "k8s.io/kubernetes/pkg/registry/persistentvolume/etcd"
 | 
						pvetcd "k8s.io/kubernetes/pkg/registry/persistentvolume/etcd"
 | 
				
			||||||
	pvcetcd "k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd"
 | 
						pvcetcd "k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd"
 | 
				
			||||||
	petsetetcd "k8s.io/kubernetes/pkg/registry/petset/etcd"
 | 
					 | 
				
			||||||
	podetcd "k8s.io/kubernetes/pkg/registry/pod/etcd"
 | 
						podetcd "k8s.io/kubernetes/pkg/registry/pod/etcd"
 | 
				
			||||||
	poddisruptionbudgetetcd "k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd"
 | 
					 | 
				
			||||||
	pspetcd "k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd"
 | 
					 | 
				
			||||||
	podtemplateetcd "k8s.io/kubernetes/pkg/registry/podtemplate/etcd"
 | 
						podtemplateetcd "k8s.io/kubernetes/pkg/registry/podtemplate/etcd"
 | 
				
			||||||
	replicasetetcd "k8s.io/kubernetes/pkg/registry/replicaset/etcd"
 | 
					 | 
				
			||||||
	resourcequotaetcd "k8s.io/kubernetes/pkg/registry/resourcequota/etcd"
 | 
						resourcequotaetcd "k8s.io/kubernetes/pkg/registry/resourcequota/etcd"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/role"
 | 
					 | 
				
			||||||
	roleetcd "k8s.io/kubernetes/pkg/registry/role/etcd"
 | 
					 | 
				
			||||||
	rolepolicybased "k8s.io/kubernetes/pkg/registry/role/policybased"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/rolebinding"
 | 
					 | 
				
			||||||
	rolebindingetcd "k8s.io/kubernetes/pkg/registry/rolebinding/etcd"
 | 
					 | 
				
			||||||
	rolebindingpolicybased "k8s.io/kubernetes/pkg/registry/rolebinding/policybased"
 | 
					 | 
				
			||||||
	secretetcd "k8s.io/kubernetes/pkg/registry/secret/etcd"
 | 
						secretetcd "k8s.io/kubernetes/pkg/registry/secret/etcd"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/service"
 | 
						"k8s.io/kubernetes/pkg/registry/service"
 | 
				
			||||||
	etcdallocator "k8s.io/kubernetes/pkg/registry/service/allocator/etcd"
 | 
						etcdallocator "k8s.io/kubernetes/pkg/registry/service/allocator/etcd"
 | 
				
			||||||
	serviceetcd "k8s.io/kubernetes/pkg/registry/service/etcd"
 | 
						serviceetcd "k8s.io/kubernetes/pkg/registry/service/etcd"
 | 
				
			||||||
	ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator"
 | 
						ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator"
 | 
				
			||||||
	serviceaccountetcd "k8s.io/kubernetes/pkg/registry/serviceaccount/etcd"
 | 
						serviceaccountetcd "k8s.io/kubernetes/pkg/registry/serviceaccount/etcd"
 | 
				
			||||||
	storageclassetcd "k8s.io/kubernetes/pkg/registry/storageclass/etcd"
 | 
					 | 
				
			||||||
	thirdpartyresourceetcd "k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata"
 | 
						"k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata"
 | 
				
			||||||
	thirdpartyresourcedataetcd "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd"
 | 
						thirdpartyresourcedataetcd "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
@@ -109,10 +82,6 @@ import (
 | 
				
			|||||||
	etcdmetrics "k8s.io/kubernetes/pkg/storage/etcd/metrics"
 | 
						etcdmetrics "k8s.io/kubernetes/pkg/storage/etcd/metrics"
 | 
				
			||||||
	etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util"
 | 
						etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/sets"
 | 
						"k8s.io/kubernetes/pkg/util/sets"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/wait"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	daemonetcd "k8s.io/kubernetes/pkg/registry/daemonset/etcd"
 | 
					 | 
				
			||||||
	horizontalpodautoscaleretcd "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
	"github.com/prometheus/client_golang/prometheus"
 | 
						"github.com/prometheus/client_golang/prometheus"
 | 
				
			||||||
@@ -189,7 +158,10 @@ type thirdPartyEntry struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RESTOptionsGetter func(resource unversioned.GroupResource) generic.RESTOptions
 | 
					type RESTOptionsGetter func(resource unversioned.GroupResource) generic.RESTOptions
 | 
				
			||||||
type RESTStorageProvider func(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool)
 | 
					
 | 
				
			||||||
 | 
					type RESTStorageProvider interface {
 | 
				
			||||||
 | 
						NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// New returns a new instance of Master from the given config.
 | 
					// New returns a new instance of Master from the given config.
 | 
				
			||||||
// Certain config fields will be set to a default value if unset.
 | 
					// Certain config fields will be set to a default value if unset.
 | 
				
			||||||
@@ -218,12 +190,16 @@ func New(c *Config) (*Master, error) {
 | 
				
			|||||||
	if c.RESTStorageProviders == nil {
 | 
						if c.RESTStorageProviders == nil {
 | 
				
			||||||
		c.RESTStorageProviders = map[string]RESTStorageProvider{}
 | 
							c.RESTStorageProviders = map[string]RESTStorageProvider{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	c.RESTStorageProviders[autoscaling.GroupName] = buildAutoscalingResources
 | 
						c.RESTStorageProviders[appsapi.GroupName] = AppsRESTStorageProvider{}
 | 
				
			||||||
	c.RESTStorageProviders[batch.GroupName] = buildBatchResources
 | 
						c.RESTStorageProviders[autoscaling.GroupName] = AutoscalingRESTStorageProvider{}
 | 
				
			||||||
	c.RESTStorageProviders[policy.GroupName] = buildPolicyResources
 | 
						c.RESTStorageProviders[batch.GroupName] = BatchRESTStorageProvider{}
 | 
				
			||||||
	c.RESTStorageProviders[appsapi.GroupName] = buildAppsResources
 | 
						c.RESTStorageProviders[certificates.GroupName] = CertificatesRESTStorageProvider{}
 | 
				
			||||||
	c.RESTStorageProviders[rbac.GroupName] = buildRBACResources(c.AuthorizerRBACSuperUser)
 | 
						c.RESTStorageProviders[extensions.GroupName] = ExtensionsRESTStorageProvider{
 | 
				
			||||||
	c.RESTStorageProviders[certificates.GroupName] = buildCertificateResources
 | 
							ResourceInterface:                     m,
 | 
				
			||||||
 | 
							DisableThirdPartyControllerForTesting: m.disableThirdPartyControllerForTesting,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c.RESTStorageProviders[policy.GroupName] = PolicyRESTStorageProvider{}
 | 
				
			||||||
 | 
						c.RESTStorageProviders[rbac.GroupName] = RBACRESTStorageProvider{AuthorizerRBACSuperUser: c.AuthorizerRBACSuperUser}
 | 
				
			||||||
	m.InstallAPIs(c)
 | 
						m.InstallAPIs(c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: Attempt clean shutdown?
 | 
						// TODO: Attempt clean shutdown?
 | 
				
			||||||
@@ -290,29 +266,15 @@ func (m *Master) InstallAPIs(c *Config) {
 | 
				
			|||||||
		m.MuxHelper.HandleFunc("/metrics", defaultMetricsHandler)
 | 
							m.MuxHelper.HandleFunc("/metrics", defaultMetricsHandler)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Install extensions unless disabled.
 | 
						// Install third party resource support if requested
 | 
				
			||||||
	if c.APIResourceConfigSource.AnyResourcesForVersionEnabled(extensionsapiv1beta1.SchemeGroupVersion) {
 | 
						// TODO seems like this bit ought to be unconditional and the REST API is controlled by the config
 | 
				
			||||||
 | 
						if c.APIResourceConfigSource.ResourceEnabled(extensionsapiv1beta1.SchemeGroupVersion.WithResource("thirdpartyresources")) {
 | 
				
			||||||
		var err error
 | 
							var err error
 | 
				
			||||||
		m.thirdPartyStorage, err = c.StorageFactory.New(extensions.Resource("thirdpartyresources"))
 | 
							m.thirdPartyStorage, err = c.StorageFactory.New(extensions.Resource("thirdpartyresources"))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			glog.Fatalf("Error getting third party storage: %v", err)
 | 
								glog.Fatalf("Error getting third party storage: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		m.thirdPartyResources = map[string]thirdPartyEntry{}
 | 
							m.thirdPartyResources = map[string]thirdPartyEntry{}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		extensionResources := m.getExtensionResources(c)
 | 
					 | 
				
			||||||
		extensionsGroupMeta := registered.GroupOrDie(extensions.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		apiGroupInfo := genericapiserver.APIGroupInfo{
 | 
					 | 
				
			||||||
			GroupMeta: *extensionsGroupMeta,
 | 
					 | 
				
			||||||
			VersionedResourcesStorageMap: map[string]map[string]rest.Storage{
 | 
					 | 
				
			||||||
				"v1beta1": extensionResources,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			OptionsExternalVersion: ®istered.GroupOrDie(api.GroupName).GroupVersion,
 | 
					 | 
				
			||||||
			Scheme:                 api.Scheme,
 | 
					 | 
				
			||||||
			ParameterCodec:         api.ParameterCodec,
 | 
					 | 
				
			||||||
			NegotiatedSerializer:   api.Codecs,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	restOptionsGetter := func(resource unversioned.GroupResource) generic.RESTOptions {
 | 
						restOptionsGetter := func(resource unversioned.GroupResource) generic.RESTOptions {
 | 
				
			||||||
@@ -326,7 +288,7 @@ func (m *Master) InstallAPIs(c *Config) {
 | 
				
			|||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		restStorageBuilder := c.RESTStorageProviders[group]
 | 
							restStorageBuilder := c.RESTStorageProviders[group]
 | 
				
			||||||
		apiGroupInfo, enabled := restStorageBuilder(c.APIResourceConfigSource, restOptionsGetter)
 | 
							apiGroupInfo, enabled := restStorageBuilder.NewRESTStorage(c.APIResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
		if !enabled {
 | 
							if !enabled {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -736,259 +698,6 @@ func (m *Master) GetRESTOptionsOrDie(c *Config, resource unversioned.GroupResour
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getExperimentalResources returns the resources for extensions api
 | 
					 | 
				
			||||||
func (m *Master) getExtensionResources(c *Config) map[string]rest.Storage {
 | 
					 | 
				
			||||||
	restOptions := func(resource string) generic.RESTOptions {
 | 
					 | 
				
			||||||
		return m.GetRESTOptionsOrDie(c, extensions.Resource(resource))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO update when we support more than one version of this group
 | 
					 | 
				
			||||||
	version := extensionsapiv1beta1.SchemeGroupVersion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("horizontalpodautoscalers")) {
 | 
					 | 
				
			||||||
		hpaStorage, hpaStatusStorage := horizontalpodautoscaleretcd.NewREST(restOptions("horizontalpodautoscalers"))
 | 
					 | 
				
			||||||
		storage["horizontalpodautoscalers"] = hpaStorage
 | 
					 | 
				
			||||||
		storage["horizontalpodautoscalers/status"] = hpaStatusStorage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		controllerStorage := expcontrolleretcd.NewStorage(m.GetRESTOptionsOrDie(c, api.Resource("replicationControllers")))
 | 
					 | 
				
			||||||
		storage["replicationcontrollers"] = controllerStorage.ReplicationController
 | 
					 | 
				
			||||||
		storage["replicationcontrollers/scale"] = controllerStorage.Scale
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	thirdPartyResourceStorage := thirdpartyresourceetcd.NewREST(restOptions("thirdpartyresources"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("thirdpartyresources")) {
 | 
					 | 
				
			||||||
		thirdPartyControl := ThirdPartyController{
 | 
					 | 
				
			||||||
			master: m,
 | 
					 | 
				
			||||||
			thirdPartyResourceRegistry: thirdPartyResourceStorage,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !m.disableThirdPartyControllerForTesting {
 | 
					 | 
				
			||||||
			go wait.Forever(func() {
 | 
					 | 
				
			||||||
				if err := thirdPartyControl.SyncResources(); err != nil {
 | 
					 | 
				
			||||||
					glog.Warningf("third party resource sync failed: %v", err)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}, 10*time.Second)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		storage["thirdpartyresources"] = thirdPartyResourceStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	daemonSetStorage, daemonSetStatusStorage := daemonetcd.NewREST(restOptions("daemonsets"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("daemonsets")) {
 | 
					 | 
				
			||||||
		storage["daemonsets"] = daemonSetStorage
 | 
					 | 
				
			||||||
		storage["daemonsets/status"] = daemonSetStatusStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	deploymentStorage := deploymentetcd.NewStorage(restOptions("deployments"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("deployments")) {
 | 
					 | 
				
			||||||
		storage["deployments"] = deploymentStorage.Deployment
 | 
					 | 
				
			||||||
		storage["deployments/status"] = deploymentStorage.Status
 | 
					 | 
				
			||||||
		storage["deployments/rollback"] = deploymentStorage.Rollback
 | 
					 | 
				
			||||||
		storage["deployments/scale"] = deploymentStorage.Scale
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("jobs")) {
 | 
					 | 
				
			||||||
		jobsStorage, jobsStatusStorage := jobetcd.NewREST(restOptions("jobs"))
 | 
					 | 
				
			||||||
		storage["jobs"] = jobsStorage
 | 
					 | 
				
			||||||
		storage["jobs/status"] = jobsStatusStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ingressStorage, ingressStatusStorage := ingressetcd.NewREST(restOptions("ingresses"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("ingresses")) {
 | 
					 | 
				
			||||||
		storage["ingresses"] = ingressStorage
 | 
					 | 
				
			||||||
		storage["ingresses/status"] = ingressStatusStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	podSecurityPolicyStorage := pspetcd.NewREST(restOptions("podsecuritypolicy"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("podsecuritypolicy")) {
 | 
					 | 
				
			||||||
		storage["podSecurityPolicies"] = podSecurityPolicyStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	replicaSetStorage := replicasetetcd.NewStorage(restOptions("replicasets"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("replicasets")) {
 | 
					 | 
				
			||||||
		storage["replicasets"] = replicaSetStorage.ReplicaSet
 | 
					 | 
				
			||||||
		storage["replicasets/status"] = replicaSetStorage.Status
 | 
					 | 
				
			||||||
		storage["replicasets/scale"] = replicaSetStorage.Scale
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	networkPolicyStorage := networkpolicyetcd.NewREST(restOptions("networkpolicies"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("networkpolicies")) {
 | 
					 | 
				
			||||||
		storage["networkpolicies"] = networkPolicyStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	storageClassStorage := storageclassetcd.NewREST(restOptions("storageclasses"))
 | 
					 | 
				
			||||||
	if c.APIResourceConfigSource.ResourceEnabled(version.WithResource("storageclasses")) {
 | 
					 | 
				
			||||||
		storage["storageclasses"] = storageClassStorage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return storage
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewDefaultAPIGroupInfo returns a complete APIGroupInfo stubbed with "normal" values
 | 
					 | 
				
			||||||
// exposed for easier composition from other packages
 | 
					 | 
				
			||||||
func NewDefaultAPIGroupInfo(group string) genericapiserver.APIGroupInfo {
 | 
					 | 
				
			||||||
	groupMeta := registered.GroupOrDie(group)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return genericapiserver.APIGroupInfo{
 | 
					 | 
				
			||||||
		GroupMeta:                    *groupMeta,
 | 
					 | 
				
			||||||
		VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
 | 
					 | 
				
			||||||
		OptionsExternalVersion:       ®istered.GroupOrDie(api.GroupName).GroupVersion,
 | 
					 | 
				
			||||||
		Scheme:                       api.Scheme,
 | 
					 | 
				
			||||||
		ParameterCodec:               api.ParameterCodec,
 | 
					 | 
				
			||||||
		NegotiatedSerializer:         api.Codecs,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildCertificateResources(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
	apiGroupInfo := NewDefaultAPIGroupInfo(certificates.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
		storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.ResourceEnabled(version.WithResource("certificatesigningrequests")) {
 | 
					 | 
				
			||||||
			csrStorage, csrStatusStorage, csrApprovalStorage := certificateetcd.NewREST(restOptionsGetter(certificates.Resource("certificatesigningrequests")))
 | 
					 | 
				
			||||||
			storage["certificatesigningrequests"] = csrStorage
 | 
					 | 
				
			||||||
			storage["certificatesigningrequests/status"] = csrStatusStorage
 | 
					 | 
				
			||||||
			storage["certificatesigningrequests/approval"] = csrApprovalStorage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return storage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(certificatesapiv1alpha1.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1alpha1.SchemeGroupVersion.Version] = storageForVersion(certificatesapiv1alpha1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = certificatesapiv1alpha1.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return apiGroupInfo, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildAutoscalingResources(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
	apiGroupInfo := NewDefaultAPIGroupInfo(autoscaling.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
		storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.ResourceEnabled(version.WithResource("horizontalpodautoscalers")) {
 | 
					 | 
				
			||||||
			hpaStorage, hpaStatusStorage := horizontalpodautoscaleretcd.NewREST(restOptionsGetter(autoscaling.Resource("horizontalpodautoscalers")))
 | 
					 | 
				
			||||||
			storage["horizontalpodautoscalers"] = hpaStorage
 | 
					 | 
				
			||||||
			storage["horizontalpodautoscalers/status"] = hpaStatusStorage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return storage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(autoscalingapiv1.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[autoscalingapiv1.SchemeGroupVersion.Version] = storageForVersion(autoscalingapiv1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = autoscalingapiv1.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return apiGroupInfo, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildBatchResources(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
	apiGroupInfo := NewDefaultAPIGroupInfo(batch.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
		storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.ResourceEnabled(version.WithResource("jobs")) {
 | 
					 | 
				
			||||||
			jobsStorage, jobsStatusStorage := jobetcd.NewREST(restOptionsGetter(batch.Resource("jobs")))
 | 
					 | 
				
			||||||
			storage["jobs"] = jobsStorage
 | 
					 | 
				
			||||||
			storage["jobs/status"] = jobsStatusStorage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return storage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = storageForVersion(batchapiv2alpha1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = batchapiv2alpha1.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv1.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[batchapiv1.SchemeGroupVersion.Version] = storageForVersion(batchapiv1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = batchapiv1.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return apiGroupInfo, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildPolicyResources(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
	apiGroupInfo := NewDefaultAPIGroupInfo(policy.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
		storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.ResourceEnabled(version.WithResource("poddisruptionbudgets")) {
 | 
					 | 
				
			||||||
			poddisruptionbudgetStorage, poddisruptionbudgetStatusStorage := poddisruptionbudgetetcd.NewREST(restOptionsGetter(policy.Resource("poddisruptionbudgets")))
 | 
					 | 
				
			||||||
			storage["poddisruptionbudgets"] = poddisruptionbudgetStorage
 | 
					 | 
				
			||||||
			storage["poddisruptionbudgets/status"] = poddisruptionbudgetStatusStorage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return storage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(policyapiv1alpha1.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[policyapiv1alpha1.SchemeGroupVersion.Version] = storageForVersion(policyapiv1alpha1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = policyapiv1alpha1.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return apiGroupInfo, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildAppsResources(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
	apiGroupInfo := NewDefaultAPIGroupInfo(appsapi.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
		storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.ResourceEnabled(version.WithResource("petsets")) {
 | 
					 | 
				
			||||||
			petsetStorage, petsetStatusStorage := petsetetcd.NewREST(restOptionsGetter(apps.Resource("petsets")))
 | 
					 | 
				
			||||||
			storage["petsets"] = petsetStorage
 | 
					 | 
				
			||||||
			storage["petsets/status"] = petsetStatusStorage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return storage
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if apiResourceConfigSource.AnyResourcesForVersionEnabled(appsapi.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
		apiGroupInfo.VersionedResourcesStorageMap[appsapi.SchemeGroupVersion.Version] = storageForVersion(appsapi.SchemeGroupVersion)
 | 
					 | 
				
			||||||
		apiGroupInfo.GroupMeta.GroupVersion = appsapi.SchemeGroupVersion
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return apiGroupInfo, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func buildRBACResources(authorizerRBACSuperUser string) RESTStorageProvider {
 | 
					 | 
				
			||||||
	return func(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
					 | 
				
			||||||
		apiGroupInfo := NewDefaultAPIGroupInfo(rbac.GroupName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		storageForVersion := func(version unversioned.GroupVersion) map[string]rest.Storage {
 | 
					 | 
				
			||||||
			once := new(sync.Once)
 | 
					 | 
				
			||||||
			var authorizationRuleResolver rbacvalidation.AuthorizationRuleResolver
 | 
					 | 
				
			||||||
			newRuleValidator := func() rbacvalidation.AuthorizationRuleResolver {
 | 
					 | 
				
			||||||
				once.Do(func() {
 | 
					 | 
				
			||||||
					authorizationRuleResolver = rbacvalidation.NewDefaultRuleResolver(
 | 
					 | 
				
			||||||
						role.NewRegistry(roleetcd.NewREST(restOptionsGetter(rbac.Resource("roles")))),
 | 
					 | 
				
			||||||
						rolebinding.NewRegistry(rolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("rolebindings")))),
 | 
					 | 
				
			||||||
						clusterrole.NewRegistry(clusterroleetcd.NewREST(restOptionsGetter(rbac.Resource("clusterroles")))),
 | 
					 | 
				
			||||||
						clusterrolebinding.NewRegistry(clusterrolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("clusterrolebindings")))),
 | 
					 | 
				
			||||||
					)
 | 
					 | 
				
			||||||
				})
 | 
					 | 
				
			||||||
				return authorizationRuleResolver
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
			if apiResourceConfigSource.ResourceEnabled(version.WithResource("roles")) {
 | 
					 | 
				
			||||||
				rolesStorage := roleetcd.NewREST(restOptionsGetter(rbac.Resource("roles")))
 | 
					 | 
				
			||||||
				storage["roles"] = rolepolicybased.NewStorage(rolesStorage, newRuleValidator(), authorizerRBACSuperUser)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if apiResourceConfigSource.ResourceEnabled(version.WithResource("rolebindings")) {
 | 
					 | 
				
			||||||
				roleBindingsStorage := rolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("rolebindings")))
 | 
					 | 
				
			||||||
				storage["rolebindings"] = rolebindingpolicybased.NewStorage(roleBindingsStorage, newRuleValidator(), authorizerRBACSuperUser)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if apiResourceConfigSource.ResourceEnabled(version.WithResource("clusterroles")) {
 | 
					 | 
				
			||||||
				clusterRolesStorage := clusterroleetcd.NewREST(restOptionsGetter(rbac.Resource("clusterroles")))
 | 
					 | 
				
			||||||
				storage["clusterroles"] = clusterrolepolicybased.NewStorage(clusterRolesStorage, newRuleValidator(), authorizerRBACSuperUser)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if apiResourceConfigSource.ResourceEnabled(version.WithResource("clusterrolebindings")) {
 | 
					 | 
				
			||||||
				clusterRoleBindingsStorage := clusterrolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("clusterrolebindings")))
 | 
					 | 
				
			||||||
				storage["clusterrolebindings"] = clusterrolebindingpolicybased.NewStorage(clusterRoleBindingsStorage, newRuleValidator(), authorizerRBACSuperUser)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return storage
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapi.SchemeGroupVersion) {
 | 
					 | 
				
			||||||
			apiGroupInfo.VersionedResourcesStorageMap[rbacapi.SchemeGroupVersion.Version] = storageForVersion(rbacapi.SchemeGroupVersion)
 | 
					 | 
				
			||||||
			apiGroupInfo.GroupMeta.GroupVersion = rbacapi.SchemeGroupVersion
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return apiGroupInfo, true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// findExternalAddress returns ExternalIP of provided node with fallback to LegacyHostIP.
 | 
					// findExternalAddress returns ExternalIP of provided node with fallback to LegacyHostIP.
 | 
				
			||||||
func findExternalAddress(node *api.Node) (string, error) {
 | 
					func findExternalAddress(node *api.Node) (string, error) {
 | 
				
			||||||
	var fallback string
 | 
						var fallback string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								pkg/master/storage_apps.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								pkg/master/storage_apps.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/apps"
 | 
				
			||||||
 | 
						appsapiv1alpha1 "k8s.io/kubernetes/pkg/apis/apps/v1alpha1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						petsetetcd "k8s.io/kubernetes/pkg/registry/petset/etcd"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AppsRESTStorageProvider struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &AppsRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p AppsRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apps.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(appsapiv1alpha1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[appsapiv1alpha1.SchemeGroupVersion.Version] = p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = appsapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p AppsRESTStorageProvider) v1alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := appsapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("petsets")) {
 | 
				
			||||||
 | 
							petsetStorage, petsetStatusStorage := petsetetcd.NewREST(restOptionsGetter(apps.Resource("petsets")))
 | 
				
			||||||
 | 
							storage["petsets"] = petsetStorage
 | 
				
			||||||
 | 
							storage["petsets/status"] = petsetStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								pkg/master/storage_autoscaling.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								pkg/master/storage_autoscaling.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/autoscaling"
 | 
				
			||||||
 | 
						autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						horizontalpodautoscaleretcd "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AutoscalingRESTStorageProvider struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &AutoscalingRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p AutoscalingRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(autoscaling.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(autoscalingapiv1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[autoscalingapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = autoscalingapiv1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p AutoscalingRESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := autoscalingapiv1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("horizontalpodautoscalers")) {
 | 
				
			||||||
 | 
							hpaStorage, hpaStatusStorage := horizontalpodautoscaleretcd.NewREST(restOptionsGetter(autoscaling.Resource("horizontalpodautoscalers")))
 | 
				
			||||||
 | 
							storage["horizontalpodautoscalers"] = hpaStorage
 | 
				
			||||||
 | 
							storage["horizontalpodautoscalers/status"] = hpaStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										69
									
								
								pkg/master/storage_batch.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								pkg/master/storage_batch.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/batch"
 | 
				
			||||||
 | 
						batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
 | 
				
			||||||
 | 
						batchapiv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						jobetcd "k8s.io/kubernetes/pkg/registry/job/etcd"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BatchRESTStorageProvider struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &BatchRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p BatchRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(batch.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = p.v2alpha1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = batchapiv2alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[batchapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = batchapiv1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p BatchRESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := batchapiv1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("jobs")) {
 | 
				
			||||||
 | 
							jobsStorage, jobsStatusStorage := jobetcd.NewREST(restOptionsGetter(batch.Resource("jobs")))
 | 
				
			||||||
 | 
							storage["jobs"] = jobsStorage
 | 
				
			||||||
 | 
							storage["jobs/status"] = jobsStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p BatchRESTStorageProvider) v2alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := batchapiv2alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("jobs")) {
 | 
				
			||||||
 | 
							jobsStorage, jobsStatusStorage := jobetcd.NewREST(restOptionsGetter(batch.Resource("jobs")))
 | 
				
			||||||
 | 
							storage["jobs"] = jobsStorage
 | 
				
			||||||
 | 
							storage["jobs/status"] = jobsStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										53
									
								
								pkg/master/storage_certificates.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								pkg/master/storage_certificates.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/certificates"
 | 
				
			||||||
 | 
						certificatesapiv1alpha1 "k8s.io/kubernetes/pkg/apis/certificates/v1alpha1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						certificateetcd "k8s.io/kubernetes/pkg/registry/certificates/etcd"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CertificatesRESTStorageProvider struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &CertificatesRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p CertificatesRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(certificates.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(certificatesapiv1alpha1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1alpha1.SchemeGroupVersion.Version] = p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = certificatesapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p CertificatesRESTStorageProvider) v1alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := certificatesapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("certificatesigningrequests")) {
 | 
				
			||||||
 | 
							csrStorage, csrStatusStorage, csrApprovalStorage := certificateetcd.NewREST(restOptionsGetter(certificates.Resource("certificatesigningrequests")))
 | 
				
			||||||
 | 
							storage["certificatesigningrequests"] = csrStorage
 | 
				
			||||||
 | 
							storage["certificatesigningrequests/status"] = csrStatusStorage
 | 
				
			||||||
 | 
							storage["certificatesigningrequests/approval"] = csrApprovalStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										133
									
								
								pkg/master/storage_extensions.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								pkg/master/storage_extensions.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/golang/glog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/extensions"
 | 
				
			||||||
 | 
						extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						daemonetcd "k8s.io/kubernetes/pkg/registry/daemonset/etcd"
 | 
				
			||||||
 | 
						deploymentetcd "k8s.io/kubernetes/pkg/registry/deployment/etcd"
 | 
				
			||||||
 | 
						expcontrolleretcd "k8s.io/kubernetes/pkg/registry/experimental/controller/etcd"
 | 
				
			||||||
 | 
						horizontalpodautoscaleretcd "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd"
 | 
				
			||||||
 | 
						ingressetcd "k8s.io/kubernetes/pkg/registry/ingress/etcd"
 | 
				
			||||||
 | 
						jobetcd "k8s.io/kubernetes/pkg/registry/job/etcd"
 | 
				
			||||||
 | 
						networkpolicyetcd "k8s.io/kubernetes/pkg/registry/networkpolicy/etcd"
 | 
				
			||||||
 | 
						pspetcd "k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd"
 | 
				
			||||||
 | 
						replicasetetcd "k8s.io/kubernetes/pkg/registry/replicaset/etcd"
 | 
				
			||||||
 | 
						storageclassetcd "k8s.io/kubernetes/pkg/registry/storageclass/etcd"
 | 
				
			||||||
 | 
						thirdpartyresourceetcd "k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/util/wait"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ExtensionsRESTStorageProvider struct {
 | 
				
			||||||
 | 
						ResourceInterface                     resourceInterface
 | 
				
			||||||
 | 
						DisableThirdPartyControllerForTesting bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &ExtensionsRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p ExtensionsRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(extensions.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(extensionsapiv1beta1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[extensionsapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = extensionsapiv1beta1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p ExtensionsRESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := extensionsapiv1beta1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("horizontalpodautoscalers")) {
 | 
				
			||||||
 | 
							hpaStorage, hpaStatusStorage := horizontalpodautoscaleretcd.NewREST(restOptionsGetter(extensions.Resource("horizontalpodautoscalers")))
 | 
				
			||||||
 | 
							storage["horizontalpodautoscalers"] = hpaStorage
 | 
				
			||||||
 | 
							storage["horizontalpodautoscalers/status"] = hpaStatusStorage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							controllerStorage := expcontrolleretcd.NewStorage(restOptionsGetter(api.Resource("replicationControllers")))
 | 
				
			||||||
 | 
							storage["replicationcontrollers"] = controllerStorage.ReplicationController
 | 
				
			||||||
 | 
							storage["replicationcontrollers/scale"] = controllerStorage.Scale
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("thirdpartyresources")) {
 | 
				
			||||||
 | 
							thirdPartyResourceStorage := thirdpartyresourceetcd.NewREST(restOptionsGetter(extensions.Resource("thirdpartyresources")))
 | 
				
			||||||
 | 
							thirdPartyControl := ThirdPartyController{
 | 
				
			||||||
 | 
								master: p.ResourceInterface,
 | 
				
			||||||
 | 
								thirdPartyResourceRegistry: thirdPartyResourceStorage,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !p.DisableThirdPartyControllerForTesting {
 | 
				
			||||||
 | 
								go wait.Forever(func() {
 | 
				
			||||||
 | 
									if err := thirdPartyControl.SyncResources(); err != nil {
 | 
				
			||||||
 | 
										glog.Warningf("third party resource sync failed: %v", err)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}, 10*time.Second)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							storage["thirdpartyresources"] = thirdPartyResourceStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("daemonsets")) {
 | 
				
			||||||
 | 
							daemonSetStorage, daemonSetStatusStorage := daemonetcd.NewREST(restOptionsGetter(extensions.Resource("daemonsets")))
 | 
				
			||||||
 | 
							storage["daemonsets"] = daemonSetStorage
 | 
				
			||||||
 | 
							storage["daemonsets/status"] = daemonSetStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("deployments")) {
 | 
				
			||||||
 | 
							deploymentStorage := deploymentetcd.NewStorage(restOptionsGetter(extensions.Resource("deployments")))
 | 
				
			||||||
 | 
							storage["deployments"] = deploymentStorage.Deployment
 | 
				
			||||||
 | 
							storage["deployments/status"] = deploymentStorage.Status
 | 
				
			||||||
 | 
							storage["deployments/rollback"] = deploymentStorage.Rollback
 | 
				
			||||||
 | 
							storage["deployments/scale"] = deploymentStorage.Scale
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("jobs")) {
 | 
				
			||||||
 | 
							jobsStorage, jobsStatusStorage := jobetcd.NewREST(restOptionsGetter(extensions.Resource("jobs")))
 | 
				
			||||||
 | 
							storage["jobs"] = jobsStorage
 | 
				
			||||||
 | 
							storage["jobs/status"] = jobsStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("ingresses")) {
 | 
				
			||||||
 | 
							ingressStorage, ingressStatusStorage := ingressetcd.NewREST(restOptionsGetter(extensions.Resource("ingresses")))
 | 
				
			||||||
 | 
							storage["ingresses"] = ingressStorage
 | 
				
			||||||
 | 
							storage["ingresses/status"] = ingressStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("podsecuritypolicy")) {
 | 
				
			||||||
 | 
							podSecurityExtensionsStorage := pspetcd.NewREST(restOptionsGetter(extensions.Resource("podsecuritypolicy")))
 | 
				
			||||||
 | 
							storage["podSecurityPolicies"] = podSecurityExtensionsStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("replicasets")) {
 | 
				
			||||||
 | 
							replicaSetStorage := replicasetetcd.NewStorage(restOptionsGetter(extensions.Resource("replicasets")))
 | 
				
			||||||
 | 
							storage["replicasets"] = replicaSetStorage.ReplicaSet
 | 
				
			||||||
 | 
							storage["replicasets/status"] = replicaSetStorage.Status
 | 
				
			||||||
 | 
							storage["replicasets/scale"] = replicaSetStorage.Scale
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("networkpolicies")) {
 | 
				
			||||||
 | 
							networkExtensionsStorage := networkpolicyetcd.NewREST(restOptionsGetter(extensions.Resource("networkpolicies")))
 | 
				
			||||||
 | 
							storage["networkpolicies"] = networkExtensionsStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("storageclasses")) {
 | 
				
			||||||
 | 
							storageClassStorage := storageclassetcd.NewREST(restOptionsGetter(extensions.Resource("storageclasses")))
 | 
				
			||||||
 | 
							storage["storageclasses"] = storageClassStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								pkg/master/storage_policy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								pkg/master/storage_policy.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/policy"
 | 
				
			||||||
 | 
						policyapiv1alpha1 "k8s.io/kubernetes/pkg/apis/policy/v1alpha1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						poddisruptionbudgetetcd "k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type PolicyRESTStorageProvider struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &PolicyRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p PolicyRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(policy.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(policyapiv1alpha1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[policyapiv1alpha1.SchemeGroupVersion.Version] = p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = policyapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p PolicyRESTStorageProvider) v1alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := policyapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("poddisruptionbudgets")) {
 | 
				
			||||||
 | 
							poddisruptionbudgetStorage, poddisruptionbudgetStatusStorage := poddisruptionbudgetetcd.NewREST(restOptionsGetter(policy.Resource("poddisruptionbudgets")))
 | 
				
			||||||
 | 
							storage["poddisruptionbudgets"] = poddisruptionbudgetStorage
 | 
				
			||||||
 | 
							storage["poddisruptionbudgets/status"] = poddisruptionbudgetStatusStorage
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										93
									
								
								pkg/master/storage_rbac.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								pkg/master/storage_rbac.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2016 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package master
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/rbac"
 | 
				
			||||||
 | 
						rbacapiv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1"
 | 
				
			||||||
 | 
						rbacvalidation "k8s.io/kubernetes/pkg/apis/rbac/validation"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/genericapiserver"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/registry/clusterrole"
 | 
				
			||||||
 | 
						clusterroleetcd "k8s.io/kubernetes/pkg/registry/clusterrole/etcd"
 | 
				
			||||||
 | 
						clusterrolepolicybased "k8s.io/kubernetes/pkg/registry/clusterrole/policybased"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/registry/clusterrolebinding"
 | 
				
			||||||
 | 
						clusterrolebindingetcd "k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd"
 | 
				
			||||||
 | 
						clusterrolebindingpolicybased "k8s.io/kubernetes/pkg/registry/clusterrolebinding/policybased"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/registry/role"
 | 
				
			||||||
 | 
						roleetcd "k8s.io/kubernetes/pkg/registry/role/etcd"
 | 
				
			||||||
 | 
						rolepolicybased "k8s.io/kubernetes/pkg/registry/role/policybased"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/registry/rolebinding"
 | 
				
			||||||
 | 
						rolebindingetcd "k8s.io/kubernetes/pkg/registry/rolebinding/etcd"
 | 
				
			||||||
 | 
						rolebindingpolicybased "k8s.io/kubernetes/pkg/registry/rolebinding/policybased"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RBACRESTStorageProvider struct {
 | 
				
			||||||
 | 
						AuthorizerRBACSuperUser string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ RESTStorageProvider = &RBACRESTStorageProvider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p RBACRESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) {
 | 
				
			||||||
 | 
						apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(rbac.GroupName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapiv1alpha1.SchemeGroupVersion) {
 | 
				
			||||||
 | 
							apiGroupInfo.VersionedResourcesStorageMap[rbacapiv1alpha1.SchemeGroupVersion.Version] = p.v1alpha1Storage(apiResourceConfigSource, restOptionsGetter)
 | 
				
			||||||
 | 
							apiGroupInfo.GroupMeta.GroupVersion = rbacapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return apiGroupInfo, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p RBACRESTStorageProvider) v1alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) map[string]rest.Storage {
 | 
				
			||||||
 | 
						version := rbacapiv1alpha1.SchemeGroupVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						once := new(sync.Once)
 | 
				
			||||||
 | 
						var authorizationRuleResolver rbacvalidation.AuthorizationRuleResolver
 | 
				
			||||||
 | 
						newRuleValidator := func() rbacvalidation.AuthorizationRuleResolver {
 | 
				
			||||||
 | 
							once.Do(func() {
 | 
				
			||||||
 | 
								authorizationRuleResolver = rbacvalidation.NewDefaultRuleResolver(
 | 
				
			||||||
 | 
									role.NewRegistry(roleetcd.NewREST(restOptionsGetter(rbac.Resource("roles")))),
 | 
				
			||||||
 | 
									rolebinding.NewRegistry(rolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("rolebindings")))),
 | 
				
			||||||
 | 
									clusterrole.NewRegistry(clusterroleetcd.NewREST(restOptionsGetter(rbac.Resource("clusterroles")))),
 | 
				
			||||||
 | 
									clusterrolebinding.NewRegistry(clusterrolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("clusterrolebindings")))),
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							return authorizationRuleResolver
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("roles")) {
 | 
				
			||||||
 | 
							rolesStorage := roleetcd.NewREST(restOptionsGetter(rbac.Resource("roles")))
 | 
				
			||||||
 | 
							storage["roles"] = rolepolicybased.NewStorage(rolesStorage, newRuleValidator(), p.AuthorizerRBACSuperUser)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("rolebindings")) {
 | 
				
			||||||
 | 
							roleBindingsStorage := rolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("rolebindings")))
 | 
				
			||||||
 | 
							storage["rolebindings"] = rolebindingpolicybased.NewStorage(roleBindingsStorage, newRuleValidator(), p.AuthorizerRBACSuperUser)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("clusterroles")) {
 | 
				
			||||||
 | 
							clusterRolesStorage := clusterroleetcd.NewREST(restOptionsGetter(rbac.Resource("clusterroles")))
 | 
				
			||||||
 | 
							storage["clusterroles"] = clusterrolepolicybased.NewStorage(clusterRolesStorage, newRuleValidator(), p.AuthorizerRBACSuperUser)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if apiResourceConfigSource.ResourceEnabled(version.WithResource("clusterrolebindings")) {
 | 
				
			||||||
 | 
							clusterRoleBindingsStorage := clusterrolebindingetcd.NewREST(restOptionsGetter(rbac.Resource("clusterrolebindings")))
 | 
				
			||||||
 | 
							storage["clusterrolebindings"] = clusterrolebindingpolicybased.NewStorage(clusterRoleBindingsStorage, newRuleValidator(), p.AuthorizerRBACSuperUser)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return storage
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user