mirror of https://github.com/k3s-io/k3s
134 lines
5.5 KiB
Go
134 lines
5.5 KiB
Go
/*
|
|
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"
|
|
"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: "extensions", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
|
|
{Group: "policy", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
|
|
}
|
|
|
|
func NewStorageFactoryConfig() *StorageFactoryConfig {
|
|
|
|
resources := []schema.GroupVersionResource{
|
|
batch.Resource("cronjobs").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(policy.Resource("podsecuritypolicies"), extensions.Resource("podsecuritypolicies"))
|
|
storageFactory.AddCohabitatingResources(extensions.Resource("ingresses"), networking.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
|
|
}
|