mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-31 15:25:57 +00:00
Initialize API servers with negotiated serializers
Pass down into the server initialization the necessary interface for handling client/server content type negotiation. Add integration tests for the negotiation.
This commit is contained in:
parent
c49cd4edf9
commit
4d127dc969
@ -47,6 +47,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
|
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
|
||||||
"k8s.io/kubernetes/pkg/master"
|
"k8s.io/kubernetes/pkg/master"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/serviceaccount"
|
"k8s.io/kubernetes/pkg/serviceaccount"
|
||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
||||||
@ -81,9 +82,9 @@ func verifyClusterIPFlags(s *options.APIServer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type newEtcdFunc func([]string, meta.VersionInterfacesFunc, string, string) (storage.Interface, error)
|
type newEtcdFunc func([]string, runtime.NegotiatedSerializer, string, string) (storage.Interface, error)
|
||||||
|
|
||||||
func newEtcd(etcdServerList []string, interfacesFunc meta.VersionInterfacesFunc, storageGroupVersionString, pathPrefix string) (etcdStorage storage.Interface, err error) {
|
func newEtcd(etcdServerList []string, ns runtime.NegotiatedSerializer, storageGroupVersionString, pathPrefix string) (etcdStorage storage.Interface, err error) {
|
||||||
if storageGroupVersionString == "" {
|
if storageGroupVersionString == "" {
|
||||||
return etcdStorage, fmt.Errorf("storageVersion is required to create a etcd storage")
|
return etcdStorage, fmt.Errorf("storageVersion is required to create a etcd storage")
|
||||||
}
|
}
|
||||||
@ -95,11 +96,11 @@ func newEtcd(etcdServerList []string, interfacesFunc meta.VersionInterfacesFunc,
|
|||||||
var storageConfig etcdstorage.EtcdConfig
|
var storageConfig etcdstorage.EtcdConfig
|
||||||
storageConfig.ServerList = etcdServerList
|
storageConfig.ServerList = etcdServerList
|
||||||
storageConfig.Prefix = pathPrefix
|
storageConfig.Prefix = pathPrefix
|
||||||
versionedInterface, err := interfacesFunc(storageVersion)
|
s, ok := ns.SerializerForMediaType("application/json", nil)
|
||||||
if err != nil {
|
if !ok {
|
||||||
return nil, err
|
return nil, fmt.Errorf("unable to find serializer for JSON")
|
||||||
}
|
}
|
||||||
storageConfig.Codec = versionedInterface.Codec
|
storageConfig.Codec = runtime.NewCodec(ns.EncoderForVersion(s, storageVersion), ns.DecoderToVersion(s, unversioned.GroupVersion{Group: storageVersion.Group, Version: runtime.APIVersionInternal}))
|
||||||
return storageConfig.NewStorage()
|
return storageConfig.NewStorage()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +149,7 @@ func updateEtcdOverrides(overrides []string, storageVersions map[string]string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
servers := strings.Split(tokens[1], ";")
|
servers := strings.Split(tokens[1], ";")
|
||||||
etcdOverrideStorage, err := newEtcdFn(servers, apigroup.InterfacesFor, storageVersions[apigroup.GroupVersion.Group], prefix)
|
etcdOverrideStorage, err := newEtcdFn(servers, api.Codecs, storageVersions[apigroup.GroupVersion.Group], prefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Invalid storage version or misconfigured etcd for %s: %v", tokens[0], err)
|
glog.Fatalf("Invalid storage version or misconfigured etcd for %s: %v", tokens[0], err)
|
||||||
}
|
}
|
||||||
@ -259,7 +260,7 @@ func Run(s *options.APIServer) error {
|
|||||||
if _, found := storageVersions[legacyV1Group.GroupVersion.Group]; !found {
|
if _, found := storageVersions[legacyV1Group.GroupVersion.Group]; !found {
|
||||||
glog.Fatalf("Couldn't find the storage version for group: %q in storageVersions: %v", legacyV1Group.GroupVersion.Group, storageVersions)
|
glog.Fatalf("Couldn't find the storage version for group: %q in storageVersions: %v", legacyV1Group.GroupVersion.Group, storageVersions)
|
||||||
}
|
}
|
||||||
etcdStorage, err := newEtcd(s.EtcdServerList, legacyV1Group.InterfacesFor, storageVersions[legacyV1Group.GroupVersion.Group], s.EtcdPathPrefix)
|
etcdStorage, err := newEtcd(s.EtcdServerList, api.Codecs, storageVersions[legacyV1Group.GroupVersion.Group], s.EtcdPathPrefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Invalid storage version or misconfigured etcd: %v", err)
|
glog.Fatalf("Invalid storage version or misconfigured etcd: %v", err)
|
||||||
}
|
}
|
||||||
@ -273,7 +274,7 @@ func Run(s *options.APIServer) error {
|
|||||||
if _, found := storageVersions[expGroup.GroupVersion.Group]; !found {
|
if _, found := storageVersions[expGroup.GroupVersion.Group]; !found {
|
||||||
glog.Fatalf("Couldn't find the storage version for group: %q in storageVersions: %v", expGroup.GroupVersion.Group, storageVersions)
|
glog.Fatalf("Couldn't find the storage version for group: %q in storageVersions: %v", expGroup.GroupVersion.Group, storageVersions)
|
||||||
}
|
}
|
||||||
expEtcdStorage, err := newEtcd(s.EtcdServerList, expGroup.InterfacesFor, storageVersions[expGroup.GroupVersion.Group], s.EtcdPathPrefix)
|
expEtcdStorage, err := newEtcd(s.EtcdServerList, api.Codecs, storageVersions[expGroup.GroupVersion.Group], s.EtcdPathPrefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Invalid extensions storage version or misconfigured etcd: %v", err)
|
glog.Fatalf("Invalid extensions storage version or misconfigured etcd: %v", err)
|
||||||
}
|
}
|
||||||
@ -380,6 +381,7 @@ func Run(s *options.APIServer) error {
|
|||||||
ProxyTLSClientConfig: proxyTLSClientConfig,
|
ProxyTLSClientConfig: proxyTLSClientConfig,
|
||||||
ServiceNodePortRange: s.ServiceNodePortRange,
|
ServiceNodePortRange: s.ServiceNodePortRange,
|
||||||
KubernetesServiceNodePort: s.KubernetesServiceNodePort,
|
KubernetesServiceNodePort: s.KubernetesServiceNodePort,
|
||||||
|
Serializer: api.Codecs,
|
||||||
},
|
},
|
||||||
EnableCoreControllers: true,
|
EnableCoreControllers: true,
|
||||||
EventTTL: s.EventTTL,
|
EventTTL: s.EventTTL,
|
||||||
|
@ -24,9 +24,9 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/meta"
|
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ func TestUpdateEtcdOverrides(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
newEtcd := func(serverList []string, _ meta.VersionInterfacesFunc, _, _ string) (storage.Interface, error) {
|
newEtcd := func(serverList []string, _ runtime.NegotiatedSerializer, _, _ string) (storage.Interface, error) {
|
||||||
if !reflect.DeepEqual(test.servers, serverList) {
|
if !reflect.DeepEqual(test.servers, serverList) {
|
||||||
t.Errorf("unexpected server list, expected: %#v, got: %#v", test.servers, serverList)
|
t.Errorf("unexpected server list, expected: %#v, got: %#v", test.servers, serverList)
|
||||||
}
|
}
|
||||||
|
@ -102,15 +102,9 @@ func TestRESTMapper(t *testing.T) {
|
|||||||
t.Errorf("incorrect groupVersion: %v", mapping)
|
t.Errorf("incorrect groupVersion: %v", mapping)
|
||||||
}
|
}
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version)
|
interfaces, _ := registered.GroupOrDie(extensions.GroupName).InterfacesFor(version)
|
||||||
if mapping.Codec != interfaces.Codec {
|
|
||||||
t.Errorf("unexpected codec: %#v, expected: %#v", mapping, interfaces)
|
|
||||||
=======
|
|
||||||
interfaces, _ := latest.GroupOrDie(extensions.GroupName).InterfacesFor(version)
|
|
||||||
if mapping.ObjectConvertor != interfaces.ObjectConvertor {
|
if mapping.ObjectConvertor != interfaces.ObjectConvertor {
|
||||||
t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces)
|
t.Errorf("unexpected: %#v, expected: %#v", mapping, interfaces)
|
||||||
>>>>>>> e776ada... Switch API objects to not register per version codecs
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc := &extensions.HorizontalPodAutoscaler{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
rc := &extensions.HorizontalPodAutoscaler{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
|
@ -23,7 +23,6 @@ import (
|
|||||||
|
|
||||||
// TODO: Ideally we should create the necessary package structure in e.g.,
|
// TODO: Ideally we should create the necessary package structure in e.g.,
|
||||||
// pkg/conversion/test/... instead of importing pkg/api here.
|
// pkg/conversion/test/... instead of importing pkg/api here.
|
||||||
"k8s.io/kubernetes/pkg/api/latest"
|
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
|
@ -40,6 +40,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/registry/generic"
|
"k8s.io/kubernetes/pkg/registry/generic"
|
||||||
genericetcd "k8s.io/kubernetes/pkg/registry/generic/etcd"
|
genericetcd "k8s.io/kubernetes/pkg/registry/generic/etcd"
|
||||||
ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator"
|
ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
"k8s.io/kubernetes/pkg/ui"
|
"k8s.io/kubernetes/pkg/ui"
|
||||||
"k8s.io/kubernetes/pkg/util"
|
"k8s.io/kubernetes/pkg/util"
|
||||||
@ -188,6 +189,9 @@ type Config struct {
|
|||||||
// Map requests to contexts. Exported so downstream consumers can provider their own mappers
|
// Map requests to contexts. Exported so downstream consumers can provider their own mappers
|
||||||
RequestContextMapper api.RequestContextMapper
|
RequestContextMapper api.RequestContextMapper
|
||||||
|
|
||||||
|
// Required, the interface for serializing and converting objects to and from the wire
|
||||||
|
Serializer runtime.NegotiatedSerializer
|
||||||
|
|
||||||
// If specified, all web services will be registered into this container
|
// If specified, all web services will be registered into this container
|
||||||
RestfulContainer *restful.Container
|
RestfulContainer *restful.Container
|
||||||
|
|
||||||
@ -394,6 +398,7 @@ func New(c *Config) *GenericAPIServer {
|
|||||||
AdmissionControl: c.AdmissionControl,
|
AdmissionControl: c.AdmissionControl,
|
||||||
ApiGroupVersionOverrides: c.APIGroupVersionOverrides,
|
ApiGroupVersionOverrides: c.APIGroupVersionOverrides,
|
||||||
RequestContextMapper: c.RequestContextMapper,
|
RequestContextMapper: c.RequestContextMapper,
|
||||||
|
Serializer: c.Serializer,
|
||||||
|
|
||||||
cacheTimeout: c.CacheTimeout,
|
cacheTimeout: c.CacheTimeout,
|
||||||
MinRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second,
|
MinRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second,
|
||||||
@ -418,7 +423,7 @@ func New(c *Config) *GenericAPIServer {
|
|||||||
} else {
|
} else {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
s.mux = mux
|
s.mux = mux
|
||||||
handlerContainer = NewHandlerContainer(mux)
|
handlerContainer = NewHandlerContainer(mux, c.Serializer)
|
||||||
}
|
}
|
||||||
s.HandlerContainer = handlerContainer
|
s.HandlerContainer = handlerContainer
|
||||||
// Use CurlyRouter to be able to use regular expressions in paths. Regular expressions are required in paths for example for proxy (where the path is proxy/{kind}/{name}/{*})
|
// Use CurlyRouter to be able to use regular expressions in paths. Regular expressions are required in paths for example for proxy (where the path is proxy/{kind}/{name}/{*})
|
||||||
@ -457,10 +462,10 @@ func (s *GenericAPIServer) HandleFuncWithAuth(pattern string, handler func(http.
|
|||||||
s.MuxHelper.HandleFunc(pattern, handler)
|
s.MuxHelper.HandleFunc(pattern, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHandlerContainer(mux *http.ServeMux) *restful.Container {
|
func NewHandlerContainer(mux *http.ServeMux, s runtime.NegotiatedSerializer) *restful.Container {
|
||||||
container := restful.NewContainer()
|
container := restful.NewContainer()
|
||||||
container.ServeMux = mux
|
container.ServeMux = mux
|
||||||
apiserver.InstallRecoverHandler(container)
|
apiserver.InstallRecoverHandler(s, container)
|
||||||
return container
|
return container
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -667,7 +672,7 @@ func (s *GenericAPIServer) installAPIGroup(apiGroupInfo *APIGroupInfo) error {
|
|||||||
// Install the version handler.
|
// Install the version handler.
|
||||||
if apiGroupInfo.IsLegacyGroup {
|
if apiGroupInfo.IsLegacyGroup {
|
||||||
// Add a handler at /api to enumerate the supported api versions.
|
// Add a handler at /api to enumerate the supported api versions.
|
||||||
apiserver.AddApiWebService(s.HandlerContainer, apiPrefix, apiVersions)
|
apiserver.AddApiWebService(s.Serializer, s.HandlerContainer, apiPrefix, apiVersions)
|
||||||
} else {
|
} else {
|
||||||
// Add a handler at /apis/<groupName> to enumerate all versions supported by this group.
|
// Add a handler at /apis/<groupName> to enumerate all versions supported by this group.
|
||||||
apiVersionsForDiscovery := []unversioned.GroupVersionForDiscovery{}
|
apiVersionsForDiscovery := []unversioned.GroupVersionForDiscovery{}
|
||||||
@ -686,9 +691,9 @@ func (s *GenericAPIServer) installAPIGroup(apiGroupInfo *APIGroupInfo) error {
|
|||||||
Versions: apiVersionsForDiscovery,
|
Versions: apiVersionsForDiscovery,
|
||||||
PreferredVersion: preferedVersionForDiscovery,
|
PreferredVersion: preferedVersionForDiscovery,
|
||||||
}
|
}
|
||||||
apiserver.AddGroupWebService(s.HandlerContainer, apiPrefix+"/"+apiGroup.Name, apiGroup)
|
apiserver.AddGroupWebService(s.Serializer, s.HandlerContainer, apiPrefix+"/"+apiGroup.Name, apiGroup)
|
||||||
}
|
}
|
||||||
apiserver.InstallServiceErrorHandler(s.HandlerContainer, s.NewRequestInfoResolver(), apiVersions)
|
apiserver.InstallServiceErrorHandler(s.Serializer, s.HandlerContainer, s.NewRequestInfoResolver(), apiVersions)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -700,25 +705,21 @@ func (s *GenericAPIServer) getAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupV
|
|||||||
version, err := s.newAPIGroupVersion(apiGroupInfo.GroupMeta, groupVersion)
|
version, err := s.newAPIGroupVersion(apiGroupInfo.GroupMeta, groupVersion)
|
||||||
version.Root = apiPrefix
|
version.Root = apiPrefix
|
||||||
version.Storage = storage
|
version.Storage = storage
|
||||||
|
version.ParameterCodec = apiGroupInfo.ParameterCodec
|
||||||
|
version.Serializer = apiGroupInfo.NegotiatedSerializer
|
||||||
|
version.Creater = apiGroupInfo.Scheme
|
||||||
|
version.Convertor = apiGroupInfo.Scheme
|
||||||
|
version.Typer = apiGroupInfo.Scheme
|
||||||
return version, err
|
return version, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GenericAPIServer) newAPIGroupVersion(groupMeta apimachinery.GroupMeta, groupVersion unversioned.GroupVersion) (*apiserver.APIGroupVersion, error) {
|
func (s *GenericAPIServer) newAPIGroupVersion(groupMeta apimachinery.GroupMeta, groupVersion unversioned.GroupVersion) (*apiserver.APIGroupVersion, error) {
|
||||||
versionInterface, err := groupMeta.InterfacesFor(groupVersion)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &apiserver.APIGroupVersion{
|
return &apiserver.APIGroupVersion{
|
||||||
RequestInfoResolver: s.NewRequestInfoResolver(),
|
RequestInfoResolver: s.NewRequestInfoResolver(),
|
||||||
|
|
||||||
Creater: api.Scheme,
|
|
||||||
Convertor: api.Scheme,
|
|
||||||
Typer: api.Scheme,
|
|
||||||
|
|
||||||
GroupVersion: groupVersion,
|
GroupVersion: groupVersion,
|
||||||
Linker: groupMeta.SelfLinker,
|
Linker: groupMeta.SelfLinker,
|
||||||
Mapper: groupMeta.RESTMapper,
|
Mapper: groupMeta.RESTMapper,
|
||||||
Codec: versionInterface.Codec,
|
|
||||||
|
|
||||||
Admit: s.AdmissionControl,
|
Admit: s.AdmissionControl,
|
||||||
Context: s.RequestContextMapper,
|
Context: s.RequestContextMapper,
|
||||||
|
@ -105,12 +105,16 @@ func TestInstallAPIGroups(t *testing.T) {
|
|||||||
GroupMeta: *apiGroupMeta,
|
GroupMeta: *apiGroupMeta,
|
||||||
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
|
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
|
||||||
IsLegacyGroup: true,
|
IsLegacyGroup: true,
|
||||||
|
ParameterCodec: api.ParameterCodec,
|
||||||
|
NegotiatedSerializer: api.Codecs,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// extensions group version
|
// extensions group version
|
||||||
GroupMeta: *extensionsGroupMeta,
|
GroupMeta: *extensionsGroupMeta,
|
||||||
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
|
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
|
||||||
OptionsExternalVersion: &apiGroupMeta.GroupVersion,
|
OptionsExternalVersion: &apiGroupMeta.GroupVersion,
|
||||||
|
ParameterCodec: api.ParameterCodec,
|
||||||
|
NegotiatedSerializer: api.Codecs,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
s.InstallAPIGroups(apiGroupsInfo)
|
s.InstallAPIGroups(apiGroupsInfo)
|
||||||
@ -140,7 +144,7 @@ func TestInstallAPIGroups(t *testing.T) {
|
|||||||
func TestNewHandlerContainer(t *testing.T) {
|
func TestNewHandlerContainer(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
container := NewHandlerContainer(mux)
|
container := NewHandlerContainer(mux, nil)
|
||||||
assert.Equal(mux, container.ServeMux, "ServerMux's do not match")
|
assert.Equal(mux, container.ServeMux, "ServerMux's do not match")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,7 +183,7 @@ func TestInstallSwaggerAPI(t *testing.T) {
|
|||||||
defer etcdserver.Terminate(t)
|
defer etcdserver.Terminate(t)
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
server.HandlerContainer = NewHandlerContainer(mux)
|
server.HandlerContainer = NewHandlerContainer(mux, nil)
|
||||||
|
|
||||||
// Ensure swagger isn't installed without the call
|
// Ensure swagger isn't installed without the call
|
||||||
ws := server.HandlerContainer.RegisteredWebServices()
|
ws := server.HandlerContainer.RegisteredWebServices()
|
||||||
@ -198,7 +202,7 @@ func TestInstallSwaggerAPI(t *testing.T) {
|
|||||||
|
|
||||||
// Empty externalHost verification
|
// Empty externalHost verification
|
||||||
mux = http.NewServeMux()
|
mux = http.NewServeMux()
|
||||||
server.HandlerContainer = NewHandlerContainer(mux)
|
server.HandlerContainer = NewHandlerContainer(mux, nil)
|
||||||
server.externalHost = ""
|
server.externalHost = ""
|
||||||
server.ClusterIP = net.IPv4(10, 10, 10, 10)
|
server.ClusterIP = net.IPv4(10, 10, 10, 10)
|
||||||
server.PublicReadWritePort = 1010
|
server.PublicReadWritePort = 1010
|
||||||
|
@ -66,6 +66,7 @@ import (
|
|||||||
thirdpartyresourceetcd "k8s.io/kubernetes/pkg/registry/thirdpartyresource/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/storage"
|
"k8s.io/kubernetes/pkg/storage"
|
||||||
etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util"
|
etcdutil "k8s.io/kubernetes/pkg/storage/etcd/util"
|
||||||
"k8s.io/kubernetes/pkg/util"
|
"k8s.io/kubernetes/pkg/util"
|
||||||
@ -183,7 +184,10 @@ func (m *Master) InstallAPIs(c *Config) {
|
|||||||
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{
|
VersionedResourcesStorageMap: map[string]map[string]rest.Storage{
|
||||||
"v1": m.v1ResourcesStorage,
|
"v1": m.v1ResourcesStorage,
|
||||||
},
|
},
|
||||||
IsLegacyGroup: true,
|
IsLegacyGroup: true,
|
||||||
|
Scheme: api.Scheme,
|
||||||
|
ParameterCodec: api.ParameterCodec,
|
||||||
|
NegotiatedSerializer: api.Codecs,
|
||||||
}
|
}
|
||||||
apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo)
|
apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo)
|
||||||
}
|
}
|
||||||
@ -217,6 +221,9 @@ func (m *Master) InstallAPIs(c *Config) {
|
|||||||
"v1beta1": extensionResources,
|
"v1beta1": extensionResources,
|
||||||
},
|
},
|
||||||
OptionsExternalVersion: ®istered.GroupOrDie(api.GroupName).GroupVersion,
|
OptionsExternalVersion: ®istered.GroupOrDie(api.GroupName).GroupVersion,
|
||||||
|
Scheme: api.Scheme,
|
||||||
|
ParameterCodec: api.ParameterCodec,
|
||||||
|
NegotiatedSerializer: api.Codecs,
|
||||||
}
|
}
|
||||||
apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo)
|
apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo)
|
||||||
|
|
||||||
@ -237,7 +244,7 @@ func (m *Master) InstallAPIs(c *Config) {
|
|||||||
|
|
||||||
// This should be done after all groups are registered
|
// This should be done after all groups are registered
|
||||||
// TODO: replace the hardcoded "apis".
|
// TODO: replace the hardcoded "apis".
|
||||||
apiserver.AddApisWebService(m.HandlerContainer, "/apis", func() []unversioned.APIGroup {
|
apiserver.AddApisWebService(m.Serializer, m.HandlerContainer, "/apis", func() []unversioned.APIGroup {
|
||||||
groups := []unversioned.APIGroup{}
|
groups := []unversioned.APIGroup{}
|
||||||
for ix := range allGroups {
|
for ix := range allGroups {
|
||||||
groups = append(groups, allGroups[ix])
|
groups = append(groups, allGroups[ix])
|
||||||
@ -517,9 +524,9 @@ func (m *Master) InstallThirdPartyResource(rsrc *extensions.ThirdPartyResource)
|
|||||||
Name: group,
|
Name: group,
|
||||||
Versions: []unversioned.GroupVersionForDiscovery{groupVersion},
|
Versions: []unversioned.GroupVersionForDiscovery{groupVersion},
|
||||||
}
|
}
|
||||||
apiserver.AddGroupWebService(m.HandlerContainer, path, apiGroup)
|
apiserver.AddGroupWebService(api.Codecs, m.HandlerContainer, path, apiGroup)
|
||||||
m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST), apiGroup)
|
m.addThirdPartyResourceStorage(path, thirdparty.Storage[strings.ToLower(kind)+"s"].(*thirdpartyresourcedataetcd.REST), apiGroup)
|
||||||
apiserver.InstallServiceErrorHandler(m.HandlerContainer, m.NewRequestInfoResolver(), []string{thirdparty.GroupVersion.String()})
|
apiserver.InstallServiceErrorHandler(api.Codecs, m.HandlerContainer, m.NewRequestInfoResolver(), []string{thirdparty.GroupVersion.String()})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,10 +540,12 @@ func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupV
|
|||||||
}
|
}
|
||||||
|
|
||||||
optionsExternalVersion := registered.GroupOrDie(api.GroupName).GroupVersion
|
optionsExternalVersion := registered.GroupOrDie(api.GroupName).GroupVersion
|
||||||
|
internalVersion := unversioned.GroupVersion{Group: group, Version: runtime.APIVersionInternal}
|
||||||
|
externalVersion := unversioned.GroupVersion{Group: group, Version: version}
|
||||||
|
|
||||||
return &apiserver.APIGroupVersion{
|
return &apiserver.APIGroupVersion{
|
||||||
Root: apiRoot,
|
Root: apiRoot,
|
||||||
GroupVersion: unversioned.GroupVersion{Group: group, Version: version},
|
GroupVersion: externalVersion,
|
||||||
RequestInfoResolver: m.NewRequestInfoResolver(),
|
RequestInfoResolver: m.NewRequestInfoResolver(),
|
||||||
|
|
||||||
Creater: thirdpartyresourcedata.NewObjectCreator(group, version, api.Scheme),
|
Creater: thirdpartyresourcedata.NewObjectCreator(group, version, api.Scheme),
|
||||||
@ -544,11 +553,13 @@ func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupV
|
|||||||
Typer: api.Scheme,
|
Typer: api.Scheme,
|
||||||
|
|
||||||
Mapper: thirdpartyresourcedata.NewMapper(registered.GroupOrDie(extensions.GroupName).RESTMapper, kind, version, group),
|
Mapper: thirdpartyresourcedata.NewMapper(registered.GroupOrDie(extensions.GroupName).RESTMapper, kind, version, group),
|
||||||
Codec: thirdpartyresourcedata.NewCodec(registered.GroupOrDie(extensions.GroupName).Codec, kind),
|
|
||||||
Linker: registered.GroupOrDie(extensions.GroupName).SelfLinker,
|
Linker: registered.GroupOrDie(extensions.GroupName).SelfLinker,
|
||||||
Storage: storage,
|
Storage: storage,
|
||||||
OptionsExternalVersion: &optionsExternalVersion,
|
OptionsExternalVersion: &optionsExternalVersion,
|
||||||
|
|
||||||
|
Serializer: thirdpartyresourcedata.NewNegotiatedSerializer(api.Codecs, kind, externalVersion, internalVersion),
|
||||||
|
ParameterCodec: api.ParameterCodec,
|
||||||
|
|
||||||
Context: m.RequestContextMapper,
|
Context: m.RequestContextMapper,
|
||||||
|
|
||||||
MinRequestTimeout: m.MinRequestTimeout,
|
MinRequestTimeout: m.MinRequestTimeout,
|
||||||
|
@ -83,6 +83,7 @@ func setUp(t *testing.T) (Master, *etcdtesting.EtcdTestServer, Config, *assert.A
|
|||||||
func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
|
||||||
_, etcdserver, config, assert := setUp(t)
|
_, etcdserver, config, assert := setUp(t)
|
||||||
|
|
||||||
|
config.Serializer = api.Codecs
|
||||||
config.KubeletClient = client.FakeKubeletClient{}
|
config.KubeletClient = client.FakeKubeletClient{}
|
||||||
|
|
||||||
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
|
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
|
||||||
@ -496,7 +497,6 @@ func decodeResponse(resp *http.Response, obj interface{}) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := json.Unmarshal(data, obj); err != nil {
|
if err := json.Unmarshal(data, obj); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func TestSet(t *testing.T) {
|
|||||||
if err != nil || resp.Node == nil {
|
if err != nil || resp.Node == nil {
|
||||||
t.Fatalf("unexpected error: %v %v", err, resp)
|
t.Fatalf("unexpected error: %v %v", err, resp)
|
||||||
}
|
}
|
||||||
decoded, err := testapi.Default.Codec().Decode([]byte(resp.Node.Value))
|
decoded, err := runtime.Decode(testapi.Default.Codec(), []byte(resp.Node.Value))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected response: %#v", resp.Node)
|
t.Fatalf("unexpected response: %#v", resp.Node)
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ func TestGet(t *testing.T) {
|
|||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
framework.WithEtcdKey(func(key string) {
|
framework.WithEtcdKey(func(key string) {
|
||||||
testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
testObject := api.ServiceAccount{ObjectMeta: api.ObjectMeta{Name: "foo"}}
|
||||||
coded, err := testapi.Default.Codec().Encode(&testObject)
|
coded, err := runtime.Encode(testapi.Default.Codec(), &testObject)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error: %v", err)
|
t.Fatalf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"runtime"
|
goruntime "runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -40,6 +40,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
|
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
|
||||||
"k8s.io/kubernetes/pkg/master"
|
"k8s.io/kubernetes/pkg/master"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
|
||||||
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/admit"
|
"k8s.io/kubernetes/plugin/pkg/admission/admit"
|
||||||
@ -106,7 +107,7 @@ func NewMasterComponents(c *Config) *MasterComponents {
|
|||||||
// TODO: Support events once we can cleanly shutdown an event recorder.
|
// TODO: Support events once we can cleanly shutdown an event recorder.
|
||||||
controllerManager.SetEventRecorder(&record.FakeRecorder{})
|
controllerManager.SetEventRecorder(&record.FakeRecorder{})
|
||||||
if c.StartReplicationManager {
|
if c.StartReplicationManager {
|
||||||
go controllerManager.Run(runtime.NumCPU(), rcStopCh)
|
go controllerManager.Run(goruntime.NumCPU(), rcStopCh)
|
||||||
}
|
}
|
||||||
var once sync.Once
|
var once sync.Once
|
||||||
return &MasterComponents{
|
return &MasterComponents{
|
||||||
@ -157,6 +158,7 @@ func NewMasterConfig() *master.Config {
|
|||||||
APIGroupPrefix: "/apis",
|
APIGroupPrefix: "/apis",
|
||||||
Authorizer: apiserver.NewAlwaysAllowAuthorizer(),
|
Authorizer: apiserver.NewAlwaysAllowAuthorizer(),
|
||||||
AdmissionControl: admit.NewAlwaysAdmit(),
|
AdmissionControl: admit.NewAlwaysAdmit(),
|
||||||
|
Serializer: api.Codecs,
|
||||||
},
|
},
|
||||||
KubeletClient: kubeletclient.FakeKubeletClient{},
|
KubeletClient: kubeletclient.FakeKubeletClient{},
|
||||||
}
|
}
|
||||||
@ -195,7 +197,7 @@ func RCFromManifest(fileName string) *api.ReplicationController {
|
|||||||
glog.Fatalf("Unexpected error reading rc manifest %v", err)
|
glog.Fatalf("Unexpected error reading rc manifest %v", err)
|
||||||
}
|
}
|
||||||
var controller api.ReplicationController
|
var controller api.ReplicationController
|
||||||
if err := api.Scheme.DecodeInto(data, &controller); err != nil {
|
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &controller); err != nil {
|
||||||
glog.Fatalf("Unexpected error reading rc manifest %v", err)
|
glog.Fatalf("Unexpected error reading rc manifest %v", err)
|
||||||
}
|
}
|
||||||
return &controller
|
return &controller
|
||||||
|
@ -19,9 +19,13 @@ limitations under the License.
|
|||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ghodss/yaml"
|
||||||
|
|
||||||
"k8s.io/kubernetes/test/integration/framework"
|
"k8s.io/kubernetes/test/integration/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user