mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Merge pull request #30421 from nikhiljindal/eventsAPI
Automatic merge from submit-queue Adding events to federation control plane Adding events to federation control plane. Apart from the standard changes to add a resource to `federation/apis/core/v1`, other changes are: * Adding a new `federationoptions.ServerRunOptions` which includes `genericoptions.ServerRunOptions` and EventsTTL. * Added a new method in `pkg/api/mapper` to build a RestMapper based on the passed Scheme rather than using `api.Scheme`. Updated `federation/apis/core/install` to use this new method. Without this change, if `federation/apis/core/install.init()` is called before `pkg/api/install.init()` then the registered RESTMapper in `pkg/apimachinery/registered` will have no resources. This second problem will be fixed once we have instances of `pkg/apimachinery/registered` instead of a single global singleton (generated clientset which imports `pkg/api/install` will have a different instance of registered, than federation-apiserver which imports `federation/apis/core/install`). cc @kubernetes/sig-cluster-federation @lavalamp
This commit is contained in:
commit
29eda9bf29
@ -18,13 +18,13 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app"
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app"
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewFederationAPIServer creates a new hyperkube Server object that includes the
|
// NewFederationAPIServer creates a new hyperkube Server object that includes the
|
||||||
// description and flags.
|
// description and flags.
|
||||||
func NewFederationAPIServer() *Server {
|
func NewFederationAPIServer() *Server {
|
||||||
s := genericoptions.NewServerRunOptions().WithEtcdOptions()
|
s := options.NewServerRunOptions()
|
||||||
|
|
||||||
hks := Server{
|
hks := Server{
|
||||||
SimpleUsage: "federation-apiserver",
|
SimpleUsage: "federation-apiserver",
|
||||||
@ -33,7 +33,6 @@ func NewFederationAPIServer() *Server {
|
|||||||
return app.Run(s)
|
return app.Run(s)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
s.AddUniversalFlags(hks.Flags())
|
s.AddFlags(hks.Flags())
|
||||||
s.AddEtcdStorageFlags(hks.Flags())
|
|
||||||
return &hks
|
return &hks
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
|
||||||
const importPrefix = "k8s.io/kubernetes/federation/api"
|
const importPrefix = "k8s.io/kubernetes/pkg/api"
|
||||||
|
|
||||||
var accessor = meta.NewAccessor()
|
var accessor = meta.NewAccessor()
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper
|
|||||||
"DeleteOptions",
|
"DeleteOptions",
|
||||||
"Status")
|
"Status")
|
||||||
|
|
||||||
mapper := api.NewDefaultRESTMapper(externalVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped)
|
mapper := api.NewDefaultRESTMapperFromScheme(externalVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped, core.Scheme)
|
||||||
// setup aliases for groups of resources
|
// setup aliases for groups of resources
|
||||||
mapper.AddResourceAlias("all", userResources...)
|
mapper.AddResourceAlias("all", userResources...)
|
||||||
|
|
||||||
|
@ -70,6 +70,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
|
|||||||
&api.DeleteOptions{},
|
&api.DeleteOptions{},
|
||||||
&api.Secret{},
|
&api.Secret{},
|
||||||
&api.SecretList{},
|
&api.SecretList{},
|
||||||
|
&api.Event{},
|
||||||
|
&api.EventList{},
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register Unversioned types under their own special group
|
// Register Unversioned types under their own special group
|
||||||
|
@ -81,5 +81,14 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := v1.AddFieldLabelConversionsForEvent(scheme); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err := v1.AddFieldLabelConversionsForNamespace(scheme); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err := v1.AddFieldLabelConversionsForSecret(scheme); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
|
|||||||
&v1.DeleteOptions{},
|
&v1.DeleteOptions{},
|
||||||
&v1.Secret{},
|
&v1.Secret{},
|
||||||
&v1.SecretList{},
|
&v1.SecretList{},
|
||||||
|
&v1.Event{},
|
||||||
|
&v1.EventList{},
|
||||||
)
|
)
|
||||||
|
|
||||||
// Add common types
|
// Add common types
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app"
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app"
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/util/flag"
|
"k8s.io/kubernetes/pkg/util/flag"
|
||||||
"k8s.io/kubernetes/pkg/util/logs"
|
"k8s.io/kubernetes/pkg/util/logs"
|
||||||
"k8s.io/kubernetes/pkg/version/verflag"
|
"k8s.io/kubernetes/pkg/version/verflag"
|
||||||
@ -36,9 +36,8 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
rand.Seed(time.Now().UTC().UnixNano())
|
rand.Seed(time.Now().UTC().UnixNano())
|
||||||
|
|
||||||
s := genericoptions.NewServerRunOptions().WithEtcdOptions()
|
s := options.NewServerRunOptions()
|
||||||
s.AddUniversalFlags(pflag.CommandLine)
|
s.AddFlags(pflag.CommandLine)
|
||||||
s.AddEtcdStorageFlags(pflag.CommandLine)
|
|
||||||
|
|
||||||
flag.InitFlags()
|
flag.InitFlags()
|
||||||
logs.InitLogs()
|
logs.InitLogs()
|
||||||
|
@ -18,30 +18,32 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
|
||||||
|
|
||||||
"k8s.io/kubernetes/federation/apis/core"
|
"k8s.io/kubernetes/federation/apis/core"
|
||||||
_ "k8s.io/kubernetes/federation/apis/core/install"
|
_ "k8s.io/kubernetes/federation/apis/core/install"
|
||||||
"k8s.io/kubernetes/federation/apis/core/v1"
|
"k8s.io/kubernetes/federation/apis/core/v1"
|
||||||
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/rest"
|
"k8s.io/kubernetes/pkg/api/rest"
|
||||||
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
|
eventetcd "k8s.io/kubernetes/pkg/registry/event/etcd"
|
||||||
namespaceetcd "k8s.io/kubernetes/pkg/registry/namespace/etcd"
|
namespaceetcd "k8s.io/kubernetes/pkg/registry/namespace/etcd"
|
||||||
secretetcd "k8s.io/kubernetes/pkg/registry/secret/etcd"
|
secretetcd "k8s.io/kubernetes/pkg/registry/secret/etcd"
|
||||||
serviceetcd "k8s.io/kubernetes/pkg/registry/service/etcd"
|
serviceetcd "k8s.io/kubernetes/pkg/registry/service/etcd"
|
||||||
)
|
)
|
||||||
|
|
||||||
func installCoreAPIs(s *genericoptions.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
func installCoreAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
||||||
serviceStore, serviceStatusStore := serviceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("service")))
|
serviceStore, serviceStatusStore := serviceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("service")))
|
||||||
namespaceStore, namespaceStatusStore, _ := namespaceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("namespaces")))
|
namespaceStore, namespaceStatusStore, _ := namespaceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("namespaces")))
|
||||||
secretStore := secretetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("secrets")))
|
secretStore := secretetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("secrets")))
|
||||||
|
eventStore := eventetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("events")), uint64(s.EventTTL.Seconds()))
|
||||||
coreResources := map[string]rest.Storage{
|
coreResources := map[string]rest.Storage{
|
||||||
"secrets": secretStore,
|
"secrets": secretStore,
|
||||||
"services": serviceStore,
|
"services": serviceStore,
|
||||||
"services/status": serviceStatusStore,
|
"services/status": serviceStatusStore,
|
||||||
"namespaces": namespaceStore,
|
"namespaces": namespaceStore,
|
||||||
"namespaces/status": namespaceStatusStore,
|
"namespaces/status": namespaceStatusStore,
|
||||||
|
"events": eventStore,
|
||||||
}
|
}
|
||||||
coreGroupMeta := registered.GroupOrDie(core.GroupName)
|
coreGroupMeta := registered.GroupOrDie(core.GroupName)
|
||||||
apiGroupInfo := genericapiserver.APIGroupInfo{
|
apiGroupInfo := genericapiserver.APIGroupInfo{
|
||||||
@ -56,6 +58,6 @@ func installCoreAPIs(s *genericoptions.ServerRunOptions, g *genericapiserver.Gen
|
|||||||
NegotiatedSerializer: core.Codecs,
|
NegotiatedSerializer: core.Codecs,
|
||||||
}
|
}
|
||||||
if err := g.InstallAPIGroup(&apiGroupInfo); err != nil {
|
if err := g.InstallAPIGroup(&apiGroupInfo); err != nil {
|
||||||
glog.Fatalf("Error in registering group version: %v", err)
|
glog.Fatalf("Error in registering group version: %+v.\n Error: %v\n", apiGroupInfo, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,19 +18,18 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/rest"
|
"k8s.io/kubernetes/pkg/api/rest"
|
||||||
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
|
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
|
||||||
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
ingressetcd "k8s.io/kubernetes/pkg/registry/ingress/etcd"
|
ingressetcd "k8s.io/kubernetes/pkg/registry/ingress/etcd"
|
||||||
replicasetetcd "k8s.io/kubernetes/pkg/registry/replicaset/etcd"
|
replicasetetcd "k8s.io/kubernetes/pkg/registry/replicaset/etcd"
|
||||||
)
|
)
|
||||||
|
|
||||||
func installExtensionsAPIs(s *genericoptions.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
func installExtensionsAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
||||||
replicaSetStorage := replicasetetcd.NewStorage(createRESTOptionsOrDie(s, g, f, extensions.Resource("replicasets")))
|
replicaSetStorage := replicasetetcd.NewStorage(createRESTOptionsOrDie(s, g, f, extensions.Resource("replicasets")))
|
||||||
ingressStorage, ingressStatusStorage := ingressetcd.NewREST(createRESTOptionsOrDie(s, g, f, extensions.Resource("ingresses")))
|
ingressStorage, ingressStatusStorage := ingressetcd.NewREST(createRESTOptionsOrDie(s, g, f, extensions.Resource("ingresses")))
|
||||||
extensionsResources := map[string]rest.Storage{
|
extensionsResources := map[string]rest.Storage{
|
||||||
|
@ -20,17 +20,17 @@ import (
|
|||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
"k8s.io/kubernetes/federation/apis/federation"
|
"k8s.io/kubernetes/federation/apis/federation"
|
||||||
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/rest"
|
"k8s.io/kubernetes/pkg/api/rest"
|
||||||
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
|
||||||
|
|
||||||
_ "k8s.io/kubernetes/federation/apis/federation/install"
|
_ "k8s.io/kubernetes/federation/apis/federation/install"
|
||||||
clusteretcd "k8s.io/kubernetes/federation/registry/cluster/etcd"
|
clusteretcd "k8s.io/kubernetes/federation/registry/cluster/etcd"
|
||||||
)
|
)
|
||||||
|
|
||||||
func installFederationAPIs(s *genericoptions.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
func installFederationAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) {
|
||||||
clusterStorage, clusterStatusStorage := clusteretcd.NewREST(createRESTOptionsOrDie(s, g, f, federation.Resource("clusters")))
|
clusterStorage, clusterStatusStorage := clusteretcd.NewREST(createRESTOptionsOrDie(s, g, f, federation.Resource("clusters")))
|
||||||
federationResources := map[string]rest.Storage{
|
federationResources := map[string]rest.Storage{
|
||||||
"clusters": clusterStorage,
|
"clusters": clusterStorage,
|
||||||
|
52
federation/cmd/federation-apiserver/app/options/options.go
Normal file
52
federation/cmd/federation-apiserver/app/options/options.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
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 options contains flags and options for initializing federation-apiserver.
|
||||||
|
package options
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
||||||
|
|
||||||
|
"github.com/spf13/pflag"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Runtime options for the federation-apiserver.
|
||||||
|
type ServerRunOptions struct {
|
||||||
|
*genericoptions.ServerRunOptions
|
||||||
|
EventTTL time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewServerRunOptions creates a new ServerRunOptions object with default values.
|
||||||
|
func NewServerRunOptions() *ServerRunOptions {
|
||||||
|
s := ServerRunOptions{
|
||||||
|
ServerRunOptions: genericoptions.NewServerRunOptions().WithEtcdOptions(),
|
||||||
|
EventTTL: 1 * time.Hour,
|
||||||
|
}
|
||||||
|
return &s
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddFlags adds flags for ServerRunOptions fields to be specified via FlagSet.
|
||||||
|
func (s *ServerRunOptions) AddFlags(fs *pflag.FlagSet) {
|
||||||
|
// Add the generic flags.
|
||||||
|
s.ServerRunOptions.AddUniversalFlags(fs)
|
||||||
|
//Add etcd specific flags.
|
||||||
|
s.ServerRunOptions.AddEtcdStorageFlags(fs)
|
||||||
|
|
||||||
|
fs.DurationVar(&s.EventTTL, "event-ttl", s.EventTTL,
|
||||||
|
"Amount of time to retain events. Default is 1h.")
|
||||||
|
}
|
@ -27,6 +27,7 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/admission"
|
"k8s.io/kubernetes/pkg/admission"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
@ -34,7 +35,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/apiserver/authenticator"
|
"k8s.io/kubernetes/pkg/apiserver/authenticator"
|
||||||
"k8s.io/kubernetes/pkg/controller/framework/informers"
|
"k8s.io/kubernetes/pkg/controller/framework/informers"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver"
|
"k8s.io/kubernetes/pkg/genericapiserver"
|
||||||
genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
|
|
||||||
genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation"
|
genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation"
|
||||||
"k8s.io/kubernetes/pkg/registry/cachesize"
|
"k8s.io/kubernetes/pkg/registry/cachesize"
|
||||||
"k8s.io/kubernetes/pkg/registry/generic"
|
"k8s.io/kubernetes/pkg/registry/generic"
|
||||||
@ -43,9 +43,8 @@ import (
|
|||||||
|
|
||||||
// NewAPIServerCommand creates a *cobra.Command object with default parameters
|
// NewAPIServerCommand creates a *cobra.Command object with default parameters
|
||||||
func NewAPIServerCommand() *cobra.Command {
|
func NewAPIServerCommand() *cobra.Command {
|
||||||
s := genericoptions.NewServerRunOptions().WithEtcdOptions()
|
s := options.NewServerRunOptions()
|
||||||
s.AddUniversalFlags(pflag.CommandLine)
|
s.AddFlags(pflag.CommandLine)
|
||||||
s.AddEtcdStorageFlags(pflag.CommandLine)
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "federation-apiserver",
|
Use: "federation-apiserver",
|
||||||
Long: `The Kubernetes federation API server validates and configures data
|
Long: `The Kubernetes federation API server validates and configures data
|
||||||
@ -55,14 +54,13 @@ cluster's shared state through which all other components interact.`,
|
|||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run runs the specified APIServer. This should never exit.
|
// Run runs the specified APIServer. This should never exit.
|
||||||
func Run(s *genericoptions.ServerRunOptions) error {
|
func Run(s *options.ServerRunOptions) error {
|
||||||
genericvalidation.VerifyEtcdServersList(s)
|
genericvalidation.VerifyEtcdServersList(s.ServerRunOptions)
|
||||||
genericapiserver.DefaultAndValidateRunOptions(s)
|
genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions)
|
||||||
|
|
||||||
// TODO: register cluster federation resources here.
|
// TODO: register cluster federation resources here.
|
||||||
resourceConfig := genericapiserver.NewResourceConfig()
|
resourceConfig := genericapiserver.NewResourceConfig()
|
||||||
@ -132,7 +130,7 @@ func Run(s *genericoptions.ServerRunOptions) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Failed to initialize plugins: %v", err)
|
glog.Fatalf("Failed to initialize plugins: %v", err)
|
||||||
}
|
}
|
||||||
genericConfig := genericapiserver.NewConfig(s)
|
genericConfig := genericapiserver.NewConfig(s.ServerRunOptions)
|
||||||
// TODO: Move the following to generic api server as well.
|
// TODO: Move the following to generic api server as well.
|
||||||
genericConfig.StorageFactory = storageFactory
|
genericConfig.StorageFactory = storageFactory
|
||||||
genericConfig.Authenticator = authenticator
|
genericConfig.Authenticator = authenticator
|
||||||
@ -159,11 +157,11 @@ func Run(s *genericoptions.ServerRunOptions) error {
|
|||||||
installExtensionsAPIs(s, m, storageFactory)
|
installExtensionsAPIs(s, m, storageFactory)
|
||||||
|
|
||||||
sharedInformers.Start(wait.NeverStop)
|
sharedInformers.Start(wait.NeverStop)
|
||||||
m.Run(s)
|
m.Run(s.ServerRunOptions)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createRESTOptionsOrDie(s *genericoptions.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory, resource unversioned.GroupResource) generic.RESTOptions {
|
func createRESTOptionsOrDie(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory, resource unversioned.GroupResource) generic.RESTOptions {
|
||||||
storage, err := f.New(resource)
|
storage, err := f.New(resource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Fatalf("Unable to find storage destination for %v, due to %v", resource, err.Error())
|
glog.Fatalf("Unable to find storage destination for %v, due to %v", resource, err.Error())
|
||||||
|
@ -29,14 +29,14 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
fed_v1b1 "k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
fed_v1b1 "k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
||||||
|
"k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
ext_v1b1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
ext_v1b1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
||||||
"k8s.io/kubernetes/pkg/genericapiserver/options"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLongRunningRequestRegexp(t *testing.T) {
|
func TestLongRunningRequestRegexp(t *testing.T) {
|
||||||
regexp := regexp.MustCompile(options.NewServerRunOptions().WithEtcdOptions().LongRunningRequestRE)
|
regexp := regexp.MustCompile(options.NewServerRunOptions().LongRunningRequestRE)
|
||||||
dontMatch := []string{
|
dontMatch := []string{
|
||||||
"/api/v1/watch-namespace/",
|
"/api/v1/watch-namespace/",
|
||||||
"/api/v1/namespace-proxy/",
|
"/api/v1/namespace-proxy/",
|
||||||
@ -84,7 +84,7 @@ var groupVersions = []unversioned.GroupVersion{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRun(t *testing.T) {
|
func TestRun(t *testing.T) {
|
||||||
s := options.NewServerRunOptions().WithEtcdOptions()
|
s := options.NewServerRunOptions()
|
||||||
s.InsecurePort = insecurePort
|
s.InsecurePort = insecurePort
|
||||||
_, ipNet, _ := net.ParseCIDR("10.10.10.0/24")
|
_, ipNet, _ := net.ParseCIDR("10.10.10.0/24")
|
||||||
s.ServiceClusterIPRange = *ipNet
|
s.ServiceClusterIPRange = *ipNet
|
||||||
@ -258,6 +258,8 @@ func testFederationResourceList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
assert.Equal(t, "v1", apiResourceList.APIVersion)
|
assert.Equal(t, "v1", apiResourceList.APIVersion)
|
||||||
assert.Equal(t, fed_v1b1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
assert.Equal(t, fed_v1b1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
||||||
|
// Assert that there are exactly 2 resources.
|
||||||
|
assert.Equal(t, 2, len(apiResourceList.APIResources))
|
||||||
|
|
||||||
found := findResource(apiResourceList.APIResources, "clusters")
|
found := findResource(apiResourceList.APIResources, "clusters")
|
||||||
assert.NotNil(t, found)
|
assert.NotNil(t, found)
|
||||||
@ -280,13 +282,34 @@ func testCoreResourceList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
assert.Equal(t, "", apiResourceList.APIVersion)
|
assert.Equal(t, "", apiResourceList.APIVersion)
|
||||||
assert.Equal(t, v1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
assert.Equal(t, v1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
||||||
|
// Assert that there are exactly 6 resources.
|
||||||
|
assert.Equal(t, 6, len(apiResourceList.APIResources))
|
||||||
|
|
||||||
|
// Verify services.
|
||||||
found := findResource(apiResourceList.APIResources, "services")
|
found := findResource(apiResourceList.APIResources, "services")
|
||||||
assert.NotNil(t, found)
|
assert.NotNil(t, found)
|
||||||
assert.True(t, found.Namespaced)
|
assert.True(t, found.Namespaced)
|
||||||
found = findResource(apiResourceList.APIResources, "services/status")
|
found = findResource(apiResourceList.APIResources, "services/status")
|
||||||
assert.NotNil(t, found)
|
assert.NotNil(t, found)
|
||||||
assert.True(t, found.Namespaced)
|
assert.True(t, found.Namespaced)
|
||||||
|
|
||||||
|
// Verify namespaces.
|
||||||
|
found = findResource(apiResourceList.APIResources, "namespaces")
|
||||||
|
assert.NotNil(t, found)
|
||||||
|
assert.True(t, found.Namespaced)
|
||||||
|
found = findResource(apiResourceList.APIResources, "namespaces/status")
|
||||||
|
assert.NotNil(t, found)
|
||||||
|
assert.True(t, found.Namespaced)
|
||||||
|
|
||||||
|
// Verify events.
|
||||||
|
found = findResource(apiResourceList.APIResources, "events")
|
||||||
|
assert.NotNil(t, found)
|
||||||
|
assert.True(t, found.Namespaced)
|
||||||
|
|
||||||
|
// Verify secrets.
|
||||||
|
found = findResource(apiResourceList.APIResources, "secrets")
|
||||||
|
assert.NotNil(t, found)
|
||||||
|
assert.True(t, found.Namespaced)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testExtensionsResourceList(t *testing.T) {
|
func testExtensionsResourceList(t *testing.T) {
|
||||||
@ -303,6 +326,8 @@ func testExtensionsResourceList(t *testing.T) {
|
|||||||
// empty APIVersion for extensions group
|
// empty APIVersion for extensions group
|
||||||
assert.Equal(t, "", apiResourceList.APIVersion)
|
assert.Equal(t, "", apiResourceList.APIVersion)
|
||||||
assert.Equal(t, ext_v1b1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
assert.Equal(t, ext_v1b1.SchemeGroupVersion.String(), apiResourceList.GroupVersion)
|
||||||
|
// Assert that there are exactly 5 resources.
|
||||||
|
assert.Equal(t, 5, len(apiResourceList.APIResources))
|
||||||
|
|
||||||
// Verify replicasets.
|
// Verify replicasets.
|
||||||
found := findResource(apiResourceList.APIResources, "replicasets")
|
found := findResource(apiResourceList.APIResources, "replicasets")
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api/meta"
|
"k8s.io/kubernetes/pkg/api/meta"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,14 +35,21 @@ func RegisterRESTMapper(m meta.RESTMapper) {
|
|||||||
RESTMapper = append(RESTMapper.(meta.MultiRESTMapper), m)
|
RESTMapper = append(RESTMapper.(meta.MultiRESTMapper), m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instantiates a DefaultRESTMapper based on types registered in api.Scheme
|
||||||
func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, interfacesFunc meta.VersionInterfacesFunc,
|
func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, interfacesFunc meta.VersionInterfacesFunc,
|
||||||
importPathPrefix string, ignoredKinds, rootScoped sets.String) *meta.DefaultRESTMapper {
|
importPathPrefix string, ignoredKinds, rootScoped sets.String) *meta.DefaultRESTMapper {
|
||||||
|
return NewDefaultRESTMapperFromScheme(defaultGroupVersions, interfacesFunc, importPathPrefix, ignoredKinds, rootScoped, Scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instantiates a DefaultRESTMapper based on types registered in the given scheme.
|
||||||
|
func NewDefaultRESTMapperFromScheme(defaultGroupVersions []unversioned.GroupVersion, interfacesFunc meta.VersionInterfacesFunc,
|
||||||
|
importPathPrefix string, ignoredKinds, rootScoped sets.String, scheme *runtime.Scheme) *meta.DefaultRESTMapper {
|
||||||
|
|
||||||
mapper := meta.NewDefaultRESTMapper(defaultGroupVersions, interfacesFunc)
|
mapper := meta.NewDefaultRESTMapper(defaultGroupVersions, interfacesFunc)
|
||||||
// enumerate all supported versions, get the kinds, and register with the mapper how to address
|
// enumerate all supported versions, get the kinds, and register with the mapper how to address
|
||||||
// our resources.
|
// our resources.
|
||||||
for _, gv := range defaultGroupVersions {
|
for _, gv := range defaultGroupVersions {
|
||||||
for kind, oType := range Scheme.KnownTypes(gv) {
|
for kind, oType := range scheme.KnownTypes(gv) {
|
||||||
gvk := gv.WithKind(kind)
|
gvk := gv.WithKind(kind)
|
||||||
// TODO: Remove import path check.
|
// TODO: Remove import path check.
|
||||||
// We check the import path because we currently stuff both "api" and "extensions" objects
|
// We check the import path because we currently stuff both "api" and "extensions" objects
|
||||||
|
@ -172,7 +172,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
"ServiceAccount",
|
"ServiceAccount",
|
||||||
"ConfigMap",
|
"ConfigMap",
|
||||||
} {
|
} {
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", kind,
|
err = scheme.AddFieldLabelConversionFunc("v1", kind,
|
||||||
func(label, value string) (string, string, error) {
|
func(label, value string) (string, string, error) {
|
||||||
switch label {
|
switch label {
|
||||||
case "metadata.namespace",
|
case "metadata.namespace",
|
||||||
@ -189,7 +189,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add field conversion funcs.
|
// Add field conversion funcs.
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "Pod",
|
err = scheme.AddFieldLabelConversionFunc("v1", "Pod",
|
||||||
func(label, value string) (string, string, error) {
|
func(label, value string) (string, string, error) {
|
||||||
switch label {
|
switch label {
|
||||||
case "metadata.name",
|
case "metadata.name",
|
||||||
@ -212,7 +212,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "Node",
|
err = scheme.AddFieldLabelConversionFunc("v1", "Node",
|
||||||
func(label, value string) (string, string, error) {
|
func(label, value string) (string, string, error) {
|
||||||
switch label {
|
switch label {
|
||||||
case "metadata.name":
|
case "metadata.name":
|
||||||
@ -227,7 +227,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "ReplicationController",
|
err = scheme.AddFieldLabelConversionFunc("v1", "ReplicationController",
|
||||||
func(label, value string) (string, string, error) {
|
func(label, value string) (string, string, error) {
|
||||||
switch label {
|
switch label {
|
||||||
case "metadata.name",
|
case "metadata.name",
|
||||||
@ -241,45 +241,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "Event",
|
err = scheme.AddFieldLabelConversionFunc("v1", "PersistentVolume",
|
||||||
func(label, value string) (string, string, error) {
|
|
||||||
switch label {
|
|
||||||
case "involvedObject.kind",
|
|
||||||
"involvedObject.namespace",
|
|
||||||
"involvedObject.name",
|
|
||||||
"involvedObject.uid",
|
|
||||||
"involvedObject.apiVersion",
|
|
||||||
"involvedObject.resourceVersion",
|
|
||||||
"involvedObject.fieldPath",
|
|
||||||
"reason",
|
|
||||||
"source",
|
|
||||||
"type",
|
|
||||||
"metadata.namespace",
|
|
||||||
"metadata.name":
|
|
||||||
return label, value, nil
|
|
||||||
default:
|
|
||||||
return "", "", fmt.Errorf("field label not supported: %s", label)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "Namespace",
|
|
||||||
func(label, value string) (string, string, error) {
|
|
||||||
switch label {
|
|
||||||
case "status.phase",
|
|
||||||
"metadata.name":
|
|
||||||
return label, value, nil
|
|
||||||
default:
|
|
||||||
return "", "", fmt.Errorf("field label not supported: %s", label)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "PersistentVolume",
|
|
||||||
func(label, value string) (string, string, error) {
|
func(label, value string) (string, string, error) {
|
||||||
switch label {
|
switch label {
|
||||||
case "metadata.name":
|
case "metadata.name":
|
||||||
@ -292,19 +254,13 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = api.Scheme.AddFieldLabelConversionFunc("v1", "Secret",
|
if err := AddFieldLabelConversionsForEvent(scheme); err != nil {
|
||||||
func(label, value string) (string, string, error) {
|
return err
|
||||||
switch label {
|
}
|
||||||
case "type",
|
if err := AddFieldLabelConversionsForNamespace(scheme); err != nil {
|
||||||
"metadata.namespace",
|
return err
|
||||||
"metadata.name":
|
}
|
||||||
return label, value, nil
|
if err := AddFieldLabelConversionsForSecret(scheme); err != nil {
|
||||||
default:
|
|
||||||
return "", "", fmt.Errorf("field label not supported: %s", label)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -769,3 +725,53 @@ func Convert_v1_ResourceList_To_api_ResourceList(in *ResourceList, out *api.Reso
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddFieldLabelConversionsForEvent(scheme *runtime.Scheme) error {
|
||||||
|
return scheme.AddFieldLabelConversionFunc("v1", "Event",
|
||||||
|
func(label, value string) (string, string, error) {
|
||||||
|
switch label {
|
||||||
|
case "involvedObject.kind",
|
||||||
|
"involvedObject.namespace",
|
||||||
|
"involvedObject.name",
|
||||||
|
"involvedObject.uid",
|
||||||
|
"involvedObject.apiVersion",
|
||||||
|
"involvedObject.resourceVersion",
|
||||||
|
"involvedObject.fieldPath",
|
||||||
|
"reason",
|
||||||
|
"source",
|
||||||
|
"type",
|
||||||
|
"metadata.namespace",
|
||||||
|
"metadata.name":
|
||||||
|
return label, value, nil
|
||||||
|
default:
|
||||||
|
return "", "", fmt.Errorf("field label not supported: %s", label)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddFieldLabelConversionsForNamespace(scheme *runtime.Scheme) error {
|
||||||
|
return scheme.AddFieldLabelConversionFunc("v1", "Namespace",
|
||||||
|
func(label, value string) (string, string, error) {
|
||||||
|
switch label {
|
||||||
|
case "status.phase",
|
||||||
|
"metadata.name":
|
||||||
|
return label, value, nil
|
||||||
|
default:
|
||||||
|
return "", "", fmt.Errorf("field label not supported: %s", label)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddFieldLabelConversionsForSecret(scheme *runtime.Scheme) error {
|
||||||
|
return scheme.AddFieldLabelConversionFunc("v1", "Secret",
|
||||||
|
func(label, value string) (string, string, error) {
|
||||||
|
switch label {
|
||||||
|
case "type",
|
||||||
|
"metadata.namespace",
|
||||||
|
"metadata.name":
|
||||||
|
return label, value, nil
|
||||||
|
default:
|
||||||
|
return "", "", fmt.Errorf("field label not supported: %s", label)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user