123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /*
- 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 kubeapiserver
- import (
- "strings"
- "k8s.io/apimachinery/pkg/runtime"
- "k8s.io/apimachinery/pkg/runtime/schema"
- serveroptions "k8s.io/apiserver/pkg/server/options"
- "k8s.io/apiserver/pkg/server/options/encryptionconfig"
- "k8s.io/apiserver/pkg/server/resourceconfig"
- serverstorage "k8s.io/apiserver/pkg/server/storage"
- "k8s.io/apiserver/pkg/storage/storagebackend"
- utilfeature "k8s.io/apiserver/pkg/util/feature"
- "k8s.io/kubernetes/pkg/api/legacyscheme"
- "k8s.io/kubernetes/pkg/apis/apps"
- "k8s.io/kubernetes/pkg/apis/batch"
- api "k8s.io/kubernetes/pkg/apis/core"
- "k8s.io/kubernetes/pkg/apis/events"
- "k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/kubernetes/pkg/apis/networking"
- "k8s.io/kubernetes/pkg/apis/policy"
- apisstorage "k8s.io/kubernetes/pkg/apis/storage"
- "k8s.io/kubernetes/pkg/features"
- )
- // SpecialDefaultResourcePrefixes are prefixes compiled into Kubernetes.
- var SpecialDefaultResourcePrefixes = map[schema.GroupResource]string{
- {Group: "", Resource: "replicationcontrollers"}: "controllers",
- {Group: "", Resource: "endpoints"}: "services/endpoints",
- {Group: "", Resource: "nodes"}: "minions",
- {Group: "", Resource: "services"}: "services/specs",
- {Group: "extensions", Resource: "ingresses"}: "ingress",
- {Group: "networking.k8s.io", Resource: "ingresses"}: "ingress",
- {Group: "extensions", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
- {Group: "policy", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
- }
- func NewStorageFactoryConfig() *StorageFactoryConfig {
- resources := []schema.GroupVersionResource{
- batch.Resource("cronjobs").WithVersion("v1beta1"),
- networking.Resource("ingresses").WithVersion("v1beta1"),
- }
- // add csinodes if CSINodeInfo feature gate is enabled
- if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
- resources = append(resources, apisstorage.Resource("csinodes").WithVersion("v1beta1"))
- }
- // add csidrivers if CSIDriverRegistry feature gate is enabled
- if utilfeature.DefaultFeatureGate.Enabled(features.CSIDriverRegistry) {
- resources = append(resources, apisstorage.Resource("csidrivers").WithVersion("v1beta1"))
- }
- return &StorageFactoryConfig{
- Serializer: legacyscheme.Codecs,
- DefaultResourceEncoding: serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Scheme),
- ResourceEncodingOverrides: resources,
- }
- }
- type StorageFactoryConfig struct {
- StorageConfig storagebackend.Config
- ApiResourceConfig *serverstorage.ResourceConfig
- DefaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig
- DefaultStorageMediaType string
- Serializer runtime.StorageSerializer
- ResourceEncodingOverrides []schema.GroupVersionResource
- EtcdServersOverrides []string
- EncryptionProviderConfigFilepath string
- }
- func (c *StorageFactoryConfig) Complete(etcdOptions *serveroptions.EtcdOptions) (*completedStorageFactoryConfig, error) {
- c.StorageConfig = etcdOptions.StorageConfig
- c.DefaultStorageMediaType = etcdOptions.DefaultStorageMediaType
- c.EtcdServersOverrides = etcdOptions.EtcdServersOverrides
- c.EncryptionProviderConfigFilepath = etcdOptions.EncryptionProviderConfigFilepath
- return &completedStorageFactoryConfig{c}, nil
- }
- type completedStorageFactoryConfig struct {
- *StorageFactoryConfig
- }
- func (c *completedStorageFactoryConfig) New() (*serverstorage.DefaultStorageFactory, error) {
- resourceEncodingConfig := resourceconfig.MergeResourceEncodingConfigs(c.DefaultResourceEncoding, c.ResourceEncodingOverrides)
- storageFactory := serverstorage.NewDefaultStorageFactory(
- c.StorageConfig,
- c.DefaultStorageMediaType,
- c.Serializer,
- resourceEncodingConfig,
- c.ApiResourceConfig,
- SpecialDefaultResourcePrefixes)
- storageFactory.AddCohabitatingResources(networking.Resource("networkpolicies"), extensions.Resource("networkpolicies"))
- storageFactory.AddCohabitatingResources(apps.Resource("deployments"), extensions.Resource("deployments"))
- storageFactory.AddCohabitatingResources(apps.Resource("daemonsets"), extensions.Resource("daemonsets"))
- storageFactory.AddCohabitatingResources(apps.Resource("replicasets"), extensions.Resource("replicasets"))
- storageFactory.AddCohabitatingResources(api.Resource("events"), events.Resource("events"))
- storageFactory.AddCohabitatingResources(api.Resource("replicationcontrollers"), extensions.Resource("replicationcontrollers")) // to make scale subresources equivalent
- storageFactory.AddCohabitatingResources(policy.Resource("podsecuritypolicies"), extensions.Resource("podsecuritypolicies"))
- storageFactory.AddCohabitatingResources(networking.Resource("ingresses"), extensions.Resource("ingresses"))
- for _, override := range c.EtcdServersOverrides {
- tokens := strings.Split(override, "#")
- apiresource := strings.Split(tokens[0], "/")
- group := apiresource[0]
- resource := apiresource[1]
- groupResource := schema.GroupResource{Group: group, Resource: resource}
- servers := strings.Split(tokens[1], ";")
- storageFactory.SetEtcdLocation(groupResource, servers)
- }
- if len(c.EncryptionProviderConfigFilepath) != 0 {
- transformerOverrides, err := encryptionconfig.GetTransformerOverrides(c.EncryptionProviderConfigFilepath)
- if err != nil {
- return nil, err
- }
- for groupResource, transformer := range transformerOverrides {
- storageFactory.SetTransformer(groupResource, transformer)
- }
- }
- return storageFactory, nil
- }
|