default_storage_factory_builder.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package kubeapiserver
  14. import (
  15. "strings"
  16. "k8s.io/apimachinery/pkg/runtime"
  17. "k8s.io/apimachinery/pkg/runtime/schema"
  18. serveroptions "k8s.io/apiserver/pkg/server/options"
  19. "k8s.io/apiserver/pkg/server/options/encryptionconfig"
  20. "k8s.io/apiserver/pkg/server/resourceconfig"
  21. serverstorage "k8s.io/apiserver/pkg/server/storage"
  22. "k8s.io/apiserver/pkg/storage/storagebackend"
  23. "k8s.io/kubernetes/pkg/api/legacyscheme"
  24. "k8s.io/kubernetes/pkg/apis/apps"
  25. "k8s.io/kubernetes/pkg/apis/batch"
  26. api "k8s.io/kubernetes/pkg/apis/core"
  27. "k8s.io/kubernetes/pkg/apis/events"
  28. "k8s.io/kubernetes/pkg/apis/extensions"
  29. "k8s.io/kubernetes/pkg/apis/networking"
  30. "k8s.io/kubernetes/pkg/apis/policy"
  31. apisstorage "k8s.io/kubernetes/pkg/apis/storage"
  32. )
  33. // SpecialDefaultResourcePrefixes are prefixes compiled into Kubernetes.
  34. var SpecialDefaultResourcePrefixes = map[schema.GroupResource]string{
  35. {Group: "", Resource: "replicationcontrollers"}: "controllers",
  36. {Group: "", Resource: "endpoints"}: "services/endpoints",
  37. {Group: "", Resource: "nodes"}: "minions",
  38. {Group: "", Resource: "services"}: "services/specs",
  39. {Group: "extensions", Resource: "ingresses"}: "ingress",
  40. {Group: "networking.k8s.io", Resource: "ingresses"}: "ingress",
  41. {Group: "extensions", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
  42. {Group: "policy", Resource: "podsecuritypolicies"}: "podsecuritypolicy",
  43. }
  44. // NewStorageFactoryConfig returns a new StorageFactoryConfig set up with necessary resource overrides.
  45. func NewStorageFactoryConfig() *StorageFactoryConfig {
  46. resources := []schema.GroupVersionResource{
  47. batch.Resource("cronjobs").WithVersion("v1beta1"),
  48. networking.Resource("ingresses").WithVersion("v1beta1"),
  49. apisstorage.Resource("csidrivers").WithVersion("v1beta1"),
  50. }
  51. return &StorageFactoryConfig{
  52. Serializer: legacyscheme.Codecs,
  53. DefaultResourceEncoding: serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Scheme),
  54. ResourceEncodingOverrides: resources,
  55. }
  56. }
  57. // StorageFactoryConfig is a configuration for creating storage factory.
  58. type StorageFactoryConfig struct {
  59. StorageConfig storagebackend.Config
  60. APIResourceConfig *serverstorage.ResourceConfig
  61. DefaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig
  62. DefaultStorageMediaType string
  63. Serializer runtime.StorageSerializer
  64. ResourceEncodingOverrides []schema.GroupVersionResource
  65. EtcdServersOverrides []string
  66. EncryptionProviderConfigFilepath string
  67. }
  68. // Complete completes the StorageFactoryConfig with provided etcdOptions returning completedStorageFactoryConfig.
  69. func (c *StorageFactoryConfig) Complete(etcdOptions *serveroptions.EtcdOptions) (*completedStorageFactoryConfig, error) {
  70. c.StorageConfig = etcdOptions.StorageConfig
  71. c.DefaultStorageMediaType = etcdOptions.DefaultStorageMediaType
  72. c.EtcdServersOverrides = etcdOptions.EtcdServersOverrides
  73. c.EncryptionProviderConfigFilepath = etcdOptions.EncryptionProviderConfigFilepath
  74. return &completedStorageFactoryConfig{c}, nil
  75. }
  76. // completedStorageFactoryConfig is a wrapper around StorageFactoryConfig completed with etcd options.
  77. //
  78. // Note: this struct is intentionally unexported so that it can only be constructed via a StorageFactoryConfig.Complete
  79. // call. The implied consequence is that this does not comply with golint.
  80. type completedStorageFactoryConfig struct {
  81. *StorageFactoryConfig
  82. }
  83. // New returns a new storage factory created from the completed storage factory configuration.
  84. func (c *completedStorageFactoryConfig) New() (*serverstorage.DefaultStorageFactory, error) {
  85. resourceEncodingConfig := resourceconfig.MergeResourceEncodingConfigs(c.DefaultResourceEncoding, c.ResourceEncodingOverrides)
  86. storageFactory := serverstorage.NewDefaultStorageFactory(
  87. c.StorageConfig,
  88. c.DefaultStorageMediaType,
  89. c.Serializer,
  90. resourceEncodingConfig,
  91. c.APIResourceConfig,
  92. SpecialDefaultResourcePrefixes)
  93. storageFactory.AddCohabitatingResources(networking.Resource("networkpolicies"), extensions.Resource("networkpolicies"))
  94. storageFactory.AddCohabitatingResources(apps.Resource("deployments"), extensions.Resource("deployments"))
  95. storageFactory.AddCohabitatingResources(apps.Resource("daemonsets"), extensions.Resource("daemonsets"))
  96. storageFactory.AddCohabitatingResources(apps.Resource("replicasets"), extensions.Resource("replicasets"))
  97. storageFactory.AddCohabitatingResources(api.Resource("events"), events.Resource("events"))
  98. storageFactory.AddCohabitatingResources(api.Resource("replicationcontrollers"), extensions.Resource("replicationcontrollers")) // to make scale subresources equivalent
  99. storageFactory.AddCohabitatingResources(policy.Resource("podsecuritypolicies"), extensions.Resource("podsecuritypolicies"))
  100. storageFactory.AddCohabitatingResources(networking.Resource("ingresses"), extensions.Resource("ingresses"))
  101. for _, override := range c.EtcdServersOverrides {
  102. tokens := strings.Split(override, "#")
  103. apiresource := strings.Split(tokens[0], "/")
  104. group := apiresource[0]
  105. resource := apiresource[1]
  106. groupResource := schema.GroupResource{Group: group, Resource: resource}
  107. servers := strings.Split(tokens[1], ";")
  108. storageFactory.SetEtcdLocation(groupResource, servers)
  109. }
  110. if len(c.EncryptionProviderConfigFilepath) != 0 {
  111. transformerOverrides, err := encryptionconfig.GetTransformerOverrides(c.EncryptionProviderConfigFilepath)
  112. if err != nil {
  113. return nil, err
  114. }
  115. for groupResource, transformer := range transformerOverrides {
  116. storageFactory.SetTransformer(groupResource, transformer)
  117. }
  118. }
  119. return storageFactory, nil
  120. }