mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
k8s.io/apiserver: move server storage code into subpackage
This commit is contained in:
parent
0e682ca7cd
commit
bd41389754
18
staging/src/k8s.io/apiserver/pkg/server/storage/doc.go
Normal file
18
staging/src/k8s.io/apiserver/pkg/server/storage/doc.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 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 storage contains the plumbing to setup the etcd storage of the apiserver.
|
||||||
|
package storage
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/apimachinery/registered"
|
"k8s.io/apimachinery/pkg/apimachinery/registered"
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017 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 storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"mime"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer/recognizer"
|
||||||
|
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StorageCodecConfig are the arguments passed to newStorageCodecFn
|
||||||
|
type StorageCodecConfig struct {
|
||||||
|
StorageMediaType string
|
||||||
|
StorageSerializer runtime.StorageSerializer
|
||||||
|
StorageVersion schema.GroupVersion
|
||||||
|
MemoryVersion schema.GroupVersion
|
||||||
|
Config storagebackend.Config
|
||||||
|
|
||||||
|
EncoderDecoratorFn func(runtime.Encoder) runtime.Encoder
|
||||||
|
DecoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewStorageCodec assembles a storage codec for the provided storage media type, the provided serializer, and the requested
|
||||||
|
// storage and memory versions.
|
||||||
|
func NewStorageCodec(opts StorageCodecConfig) (runtime.Codec, error) {
|
||||||
|
mediaType, _, err := mime.ParseMediaType(opts.StorageMediaType)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("%q is not a valid mime-type", opts.StorageMediaType)
|
||||||
|
}
|
||||||
|
serializer, ok := runtime.SerializerInfoForMediaType(opts.StorageSerializer.SupportedMediaTypes(), mediaType)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("unable to find serializer for %q", opts.StorageMediaType)
|
||||||
|
}
|
||||||
|
|
||||||
|
s := serializer.Serializer
|
||||||
|
|
||||||
|
// etcd2 only supports string data - we must wrap any result before returning
|
||||||
|
// TODO: storagebackend should return a boolean indicating whether it supports binary data
|
||||||
|
if !serializer.EncodesAsText && (opts.Config.Type == storagebackend.StorageTypeUnset || opts.Config.Type == storagebackend.StorageTypeETCD2) {
|
||||||
|
glog.V(4).Infof("Wrapping the underlying binary storage serializer with a base64 encoding for etcd2")
|
||||||
|
s = runtime.NewBase64Serializer(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give callers the opportunity to wrap encoders and decoders. For decoders, each returned decoder will
|
||||||
|
// be passed to the recognizer so that multiple decoders are available.
|
||||||
|
var encoder runtime.Encoder = s
|
||||||
|
if opts.EncoderDecoratorFn != nil {
|
||||||
|
encoder = opts.EncoderDecoratorFn(encoder)
|
||||||
|
}
|
||||||
|
decoders := []runtime.Decoder{s, opts.StorageSerializer.UniversalDeserializer()}
|
||||||
|
if opts.DecoderDecoratorFn != nil {
|
||||||
|
decoders = opts.DecoderDecoratorFn(decoders)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the storage receives the correct version.
|
||||||
|
encoder = opts.StorageSerializer.EncoderForVersion(
|
||||||
|
encoder,
|
||||||
|
runtime.NewMultiGroupVersioner(
|
||||||
|
opts.StorageVersion,
|
||||||
|
schema.GroupKind{Group: opts.StorageVersion.Group},
|
||||||
|
schema.GroupKind{Group: opts.MemoryVersion.Group},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
decoder := opts.StorageSerializer.DecoderToVersion(
|
||||||
|
recognizer.NewDecoder(decoders...),
|
||||||
|
runtime.NewMultiGroupVersioner(
|
||||||
|
opts.MemoryVersion,
|
||||||
|
schema.GroupKind{Group: opts.MemoryVersion.Group},
|
||||||
|
schema.GroupKind{Group: opts.StorageVersion.Group},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return runtime.NewCodec(encoder, decoder), nil
|
||||||
|
}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -77,18 +77,6 @@ type DefaultStorageFactory struct {
|
|||||||
newStorageCodecFn func(opts StorageCodecConfig) (codec runtime.Codec, err error)
|
newStorageCodecFn func(opts StorageCodecConfig) (codec runtime.Codec, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// StorageCodecConfig are the arguments passed to newStorageCodecFn
|
|
||||||
type StorageCodecConfig struct {
|
|
||||||
StorageMediaType string
|
|
||||||
StorageSerializer runtime.StorageSerializer
|
|
||||||
StorageVersion schema.GroupVersion
|
|
||||||
MemoryVersion schema.GroupVersion
|
|
||||||
Config storagebackend.Config
|
|
||||||
|
|
||||||
EncoderDecoratorFn func(runtime.Encoder) runtime.Encoder
|
|
||||||
DecoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder
|
|
||||||
}
|
|
||||||
|
|
||||||
type groupResourceOverrides struct {
|
type groupResourceOverrides struct {
|
||||||
// etcdLocation contains the list of "special" locations that are used for particular GroupResources
|
// etcdLocation contains the list of "special" locations that are used for particular GroupResources
|
||||||
// These are merged on top of the StorageConfig when requesting the storage.Interface for a given GroupResource
|
// These are merged on top of the StorageConfig when requesting the storage.Interface for a given GroupResource
|
||||||
@ -278,59 +266,6 @@ func (s *DefaultStorageFactory) Backends() []string {
|
|||||||
return backends.List()
|
return backends.List()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStorageCodec assembles a storage codec for the provided storage media type, the provided serializer, and the requested
|
|
||||||
// storage and memory versions.
|
|
||||||
func NewStorageCodec(opts StorageCodecConfig) (runtime.Codec, error) {
|
|
||||||
mediaType, _, err := mime.ParseMediaType(opts.StorageMediaType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("%q is not a valid mime-type", opts.StorageMediaType)
|
|
||||||
}
|
|
||||||
serializer, ok := runtime.SerializerInfoForMediaType(opts.StorageSerializer.SupportedMediaTypes(), mediaType)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("unable to find serializer for %q", opts.StorageMediaType)
|
|
||||||
}
|
|
||||||
|
|
||||||
s := serializer.Serializer
|
|
||||||
|
|
||||||
// etcd2 only supports string data - we must wrap any result before returning
|
|
||||||
// TODO: storagebackend should return a boolean indicating whether it supports binary data
|
|
||||||
if !serializer.EncodesAsText && (opts.Config.Type == storagebackend.StorageTypeUnset || opts.Config.Type == storagebackend.StorageTypeETCD2) {
|
|
||||||
glog.V(4).Infof("Wrapping the underlying binary storage serializer with a base64 encoding for etcd2")
|
|
||||||
s = runtime.NewBase64Serializer(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give callers the opportunity to wrap encoders and decoders. For decoders, each returned decoder will
|
|
||||||
// be passed to the recognizer so that multiple decoders are available.
|
|
||||||
var encoder runtime.Encoder = s
|
|
||||||
if opts.EncoderDecoratorFn != nil {
|
|
||||||
encoder = opts.EncoderDecoratorFn(encoder)
|
|
||||||
}
|
|
||||||
decoders := []runtime.Decoder{s, opts.StorageSerializer.UniversalDeserializer()}
|
|
||||||
if opts.DecoderDecoratorFn != nil {
|
|
||||||
decoders = opts.DecoderDecoratorFn(decoders)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure the storage receives the correct version.
|
|
||||||
encoder = opts.StorageSerializer.EncoderForVersion(
|
|
||||||
encoder,
|
|
||||||
runtime.NewMultiGroupVersioner(
|
|
||||||
opts.StorageVersion,
|
|
||||||
schema.GroupKind{Group: opts.StorageVersion.Group},
|
|
||||||
schema.GroupKind{Group: opts.MemoryVersion.Group},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
decoder := opts.StorageSerializer.DecoderToVersion(
|
|
||||||
recognizer.NewDecoder(decoders...),
|
|
||||||
runtime.NewMultiGroupVersioner(
|
|
||||||
opts.MemoryVersion,
|
|
||||||
schema.GroupKind{Group: opts.MemoryVersion.Group},
|
|
||||||
schema.GroupKind{Group: opts.StorageVersion.Group},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
return runtime.NewCodec(encoder, decoder), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *DefaultStorageFactory) ResourcePrefix(groupResource schema.GroupResource) string {
|
func (s *DefaultStorageFactory) ResourcePrefix(groupResource schema.GroupResource) string {
|
||||||
chosenStorageResource := s.getStorageGroupResource(groupResource)
|
chosenStorageResource := s.getStorageGroupResource(groupResource)
|
||||||
groupOverride := s.Overrides[getAllResourcesAlias(chosenStorageResource)]
|
groupOverride := s.Overrides[getAllResourcesAlias(chosenStorageResource)]
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
Loading…
Reference in New Issue
Block a user