diff --git a/cmd/hyperkube/federation-apiserver.go b/cmd/hyperkube/federation-apiserver.go index 31261097cebdb..25c0f209e4836 100644 --- a/cmd/hyperkube/federation-apiserver.go +++ b/cmd/hyperkube/federation-apiserver.go @@ -18,13 +18,13 @@ package main import ( "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 // description and flags. func NewFederationAPIServer() *Server { - s := genericoptions.NewServerRunOptions().WithEtcdOptions() + s := options.NewServerRunOptions() hks := Server{ SimpleUsage: "federation-apiserver", @@ -33,7 +33,6 @@ func NewFederationAPIServer() *Server { return app.Run(s) }, } - s.AddUniversalFlags(hks.Flags()) - s.AddEtcdStorageFlags(hks.Flags()) + s.AddFlags(hks.Flags()) return &hks } diff --git a/federation/apis/core/install/install.go b/federation/apis/core/install/install.go index 68a8daee0cae7..f6797fd1c9fd1 100644 --- a/federation/apis/core/install/install.go +++ b/federation/apis/core/install/install.go @@ -32,7 +32,7 @@ import ( "k8s.io/kubernetes/pkg/util/sets" ) -const importPrefix = "k8s.io/kubernetes/federation/api" +const importPrefix = "k8s.io/kubernetes/pkg/api" var accessor = meta.NewAccessor() @@ -99,7 +99,7 @@ func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper "DeleteOptions", "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 mapper.AddResourceAlias("all", userResources...) diff --git a/federation/apis/core/register.go b/federation/apis/core/register.go index 0aef5f8f351a9..e66c7b5adf302 100644 --- a/federation/apis/core/register.go +++ b/federation/apis/core/register.go @@ -70,6 +70,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &api.DeleteOptions{}, &api.Secret{}, &api.SecretList{}, + &api.Event{}, + &api.EventList{}, ) // Register Unversioned types under their own special group diff --git a/federation/apis/core/v1/conversion.go b/federation/apis/core/v1/conversion.go index db122e7a66289..082688a634379 100644 --- a/federation/apis/core/v1/conversion.go +++ b/federation/apis/core/v1/conversion.go @@ -81,5 +81,14 @@ func addConversionFuncs(scheme *runtime.Scheme) error { 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 } diff --git a/federation/apis/core/v1/register.go b/federation/apis/core/v1/register.go index da54b9c39cce6..df3191ec3ee7c 100644 --- a/federation/apis/core/v1/register.go +++ b/federation/apis/core/v1/register.go @@ -45,6 +45,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &v1.DeleteOptions{}, &v1.Secret{}, &v1.SecretList{}, + &v1.Event{}, + &v1.EventList{}, ) // Add common types diff --git a/federation/cmd/federation-apiserver/apiserver.go b/federation/cmd/federation-apiserver/apiserver.go index 109709bec72f1..4fd5dcd966699 100644 --- a/federation/cmd/federation-apiserver/apiserver.go +++ b/federation/cmd/federation-apiserver/apiserver.go @@ -25,7 +25,7 @@ import ( "time" "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/logs" "k8s.io/kubernetes/pkg/version/verflag" @@ -36,9 +36,8 @@ import ( func main() { rand.Seed(time.Now().UTC().UnixNano()) - s := genericoptions.NewServerRunOptions().WithEtcdOptions() - s.AddUniversalFlags(pflag.CommandLine) - s.AddEtcdStorageFlags(pflag.CommandLine) + s := options.NewServerRunOptions() + s.AddFlags(pflag.CommandLine) flag.InitFlags() logs.InitLogs() diff --git a/federation/cmd/federation-apiserver/app/core.go b/federation/cmd/federation-apiserver/app/core.go index 1ba7a5730a4f8..93ee5c93d88de 100644 --- a/federation/cmd/federation-apiserver/app/core.go +++ b/federation/cmd/federation-apiserver/app/core.go @@ -18,30 +18,32 @@ package app import ( "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/install" "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/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" secretetcd "k8s.io/kubernetes/pkg/registry/secret/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"))) namespaceStore, namespaceStatusStore, _ := namespaceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("namespaces"))) 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{ "secrets": secretStore, "services": serviceStore, "services/status": serviceStatusStore, "namespaces": namespaceStore, "namespaces/status": namespaceStatusStore, + "events": eventStore, } coreGroupMeta := registered.GroupOrDie(core.GroupName) apiGroupInfo := genericapiserver.APIGroupInfo{ @@ -56,6 +58,6 @@ func installCoreAPIs(s *genericoptions.ServerRunOptions, g *genericapiserver.Gen NegotiatedSerializer: core.Codecs, } 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) } } diff --git a/federation/cmd/federation-apiserver/app/extensions.go b/federation/cmd/federation-apiserver/app/extensions.go index 7b7d463d36523..68ad20a5c673e 100644 --- a/federation/cmd/federation-apiserver/app/extensions.go +++ b/federation/cmd/federation-apiserver/app/extensions.go @@ -18,19 +18,18 @@ package app import ( "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/cmd/federation-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/extensions" _ "k8s.io/kubernetes/pkg/apis/extensions/install" + "k8s.io/kubernetes/pkg/genericapiserver" ingressetcd "k8s.io/kubernetes/pkg/registry/ingress/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"))) ingressStorage, ingressStatusStorage := ingressetcd.NewREST(createRESTOptionsOrDie(s, g, f, extensions.Resource("ingresses"))) extensionsResources := map[string]rest.Storage{ diff --git a/federation/cmd/federation-apiserver/app/federation.go b/federation/cmd/federation-apiserver/app/federation.go index f1a55eed7337a..44079cc852a23 100644 --- a/federation/cmd/federation-apiserver/app/federation.go +++ b/federation/cmd/federation-apiserver/app/federation.go @@ -20,17 +20,17 @@ import ( "github.com/golang/glog" "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/rest" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/genericapiserver" - genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options" _ "k8s.io/kubernetes/federation/apis/federation/install" 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"))) federationResources := map[string]rest.Storage{ "clusters": clusterStorage, diff --git a/federation/cmd/federation-apiserver/app/options/options.go b/federation/cmd/federation-apiserver/app/options/options.go new file mode 100644 index 0000000000000..56fee8ace6360 --- /dev/null +++ b/federation/cmd/federation-apiserver/app/options/options.go @@ -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.") +} diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index bc0390cc72f07..8812468166faa 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -27,6 +27,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options" "k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" @@ -34,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/apiserver/authenticator" "k8s.io/kubernetes/pkg/controller/framework/informers" "k8s.io/kubernetes/pkg/genericapiserver" - genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options" genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/generic" @@ -43,9 +43,8 @@ import ( // NewAPIServerCommand creates a *cobra.Command object with default parameters func NewAPIServerCommand() *cobra.Command { - s := genericoptions.NewServerRunOptions().WithEtcdOptions() - s.AddUniversalFlags(pflag.CommandLine) - s.AddEtcdStorageFlags(pflag.CommandLine) + s := options.NewServerRunOptions() + s.AddFlags(pflag.CommandLine) cmd := &cobra.Command{ Use: "federation-apiserver", 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) { }, } - return cmd } // Run runs the specified APIServer. This should never exit. -func Run(s *genericoptions.ServerRunOptions) error { - genericvalidation.VerifyEtcdServersList(s) - genericapiserver.DefaultAndValidateRunOptions(s) +func Run(s *options.ServerRunOptions) error { + genericvalidation.VerifyEtcdServersList(s.ServerRunOptions) + genericapiserver.DefaultAndValidateRunOptions(s.ServerRunOptions) // TODO: register cluster federation resources here. resourceConfig := genericapiserver.NewResourceConfig() @@ -132,7 +130,7 @@ func Run(s *genericoptions.ServerRunOptions) error { if err != nil { 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. genericConfig.StorageFactory = storageFactory genericConfig.Authenticator = authenticator @@ -159,11 +157,11 @@ func Run(s *genericoptions.ServerRunOptions) error { installExtensionsAPIs(s, m, storageFactory) sharedInformers.Start(wait.NeverStop) - m.Run(s) + m.Run(s.ServerRunOptions) 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) if err != nil { glog.Fatalf("Unable to find storage destination for %v, due to %v", resource, err.Error()) diff --git a/federation/cmd/federation-apiserver/app/server_test.go b/federation/cmd/federation-apiserver/app/server_test.go index 101600e359773..e8e8445c8a68b 100644 --- a/federation/cmd/federation-apiserver/app/server_test.go +++ b/federation/cmd/federation-apiserver/app/server_test.go @@ -29,14 +29,14 @@ import ( "github.com/stretchr/testify/assert" 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/v1" ext_v1b1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" - "k8s.io/kubernetes/pkg/genericapiserver/options" ) func TestLongRunningRequestRegexp(t *testing.T) { - regexp := regexp.MustCompile(options.NewServerRunOptions().WithEtcdOptions().LongRunningRequestRE) + regexp := regexp.MustCompile(options.NewServerRunOptions().LongRunningRequestRE) dontMatch := []string{ "/api/v1/watch-namespace/", "/api/v1/namespace-proxy/", @@ -84,7 +84,7 @@ var groupVersions = []unversioned.GroupVersion{ } func TestRun(t *testing.T) { - s := options.NewServerRunOptions().WithEtcdOptions() + s := options.NewServerRunOptions() s.InsecurePort = insecurePort _, ipNet, _ := net.ParseCIDR("10.10.10.0/24") s.ServiceClusterIPRange = *ipNet @@ -258,6 +258,8 @@ func testFederationResourceList(t *testing.T) { } assert.Equal(t, "v1", apiResourceList.APIVersion) 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") assert.NotNil(t, found) @@ -280,13 +282,34 @@ func testCoreResourceList(t *testing.T) { } assert.Equal(t, "", apiResourceList.APIVersion) 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") assert.NotNil(t, found) assert.True(t, found.Namespaced) found = findResource(apiResourceList.APIResources, "services/status") assert.NotNil(t, found) 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) { @@ -303,6 +326,8 @@ func testExtensionsResourceList(t *testing.T) { // empty APIVersion for extensions group assert.Equal(t, "", apiResourceList.APIVersion) 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. found := findResource(apiResourceList.APIResources, "replicasets") diff --git a/pkg/api/mapper.go b/pkg/api/mapper.go index 60addca7f2456..c5876b8cadf2d 100644 --- a/pkg/api/mapper.go +++ b/pkg/api/mapper.go @@ -21,6 +21,7 @@ import ( "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" ) @@ -34,14 +35,21 @@ func RegisterRESTMapper(m meta.RESTMapper) { RESTMapper = append(RESTMapper.(meta.MultiRESTMapper), m) } +// Instantiates a DefaultRESTMapper based on types registered in api.Scheme func NewDefaultRESTMapper(defaultGroupVersions []unversioned.GroupVersion, interfacesFunc meta.VersionInterfacesFunc, 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) // enumerate all supported versions, get the kinds, and register with the mapper how to address // our resources. for _, gv := range defaultGroupVersions { - for kind, oType := range Scheme.KnownTypes(gv) { + for kind, oType := range scheme.KnownTypes(gv) { gvk := gv.WithKind(kind) // TODO: Remove import path check. // We check the import path because we currently stuff both "api" and "extensions" objects diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index e820e0c95e85e..d2cb2dc7acb89 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -172,7 +172,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { "ServiceAccount", "ConfigMap", } { - err = api.Scheme.AddFieldLabelConversionFunc("v1", kind, + err = scheme.AddFieldLabelConversionFunc("v1", kind, func(label, value string) (string, string, error) { switch label { case "metadata.namespace", @@ -189,7 +189,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { } // Add field conversion funcs. - err = api.Scheme.AddFieldLabelConversionFunc("v1", "Pod", + err = scheme.AddFieldLabelConversionFunc("v1", "Pod", func(label, value string) (string, string, error) { switch label { case "metadata.name", @@ -212,7 +212,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err != nil { return err } - err = api.Scheme.AddFieldLabelConversionFunc("v1", "Node", + err = scheme.AddFieldLabelConversionFunc("v1", "Node", func(label, value string) (string, string, error) { switch label { case "metadata.name": @@ -227,7 +227,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err != nil { return err } - err = api.Scheme.AddFieldLabelConversionFunc("v1", "ReplicationController", + err = scheme.AddFieldLabelConversionFunc("v1", "ReplicationController", func(label, value string) (string, string, error) { switch label { case "metadata.name", @@ -241,21 +241,10 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err != nil { 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": + case "metadata.name": return label, value, nil default: return "", "", fmt.Errorf("field label not supported: %s", label) @@ -265,46 +254,13 @@ func addConversionFuncs(scheme *runtime.Scheme) error { 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 { + if err := AddFieldLabelConversionsForEvent(scheme); err != nil { return err } - err = api.Scheme.AddFieldLabelConversionFunc("v1", "PersistentVolume", - func(label, value string) (string, string, error) { - switch label { - case "metadata.name": - return label, value, nil - default: - return "", "", fmt.Errorf("field label not supported: %s", label) - } - }, - ) - if err != nil { + if err := AddFieldLabelConversionsForNamespace(scheme); err != nil { return err } - err = api.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) - } - }, - ) - if err != nil { + if err := AddFieldLabelConversionsForSecret(scheme); err != nil { return err } return nil @@ -769,3 +725,53 @@ func Convert_v1_ResourceList_To_api_ResourceList(in *ResourceList, out *api.Reso } 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) + } + }) +}