mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-20 18:31:15 +00:00
Introduce singularNameProvider for core types
This introduces `singularNameProvider`. This provider will be used by core types to have their singular names are defined in discovery endpoint. Thanks to that, core resources singular name always have higher precedence than CRDs shortcuts or singular names.
This commit is contained in:
parent
ab376e09dd
commit
0990ba1cc9
@ -78,6 +78,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "daemonset"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a daemonset
|
// StatusREST implements the REST endpoint for changing the status of a daemonset
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -197,4 +197,12 @@ func TestShortNames(t *testing.T) {
|
|||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "daemonset"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO TestUpdateStatus
|
// TODO TestUpdateStatus
|
||||||
|
@ -130,6 +130,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "deployment"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a deployment
|
// StatusREST implements the REST endpoint for changing the status of a deployment
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -455,6 +455,14 @@ func TestCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage.Deployment, expected)
|
registrytest.AssertCategories(t, storage.Deployment, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Deployment.Store.DestroyFunc()
|
||||||
|
expected := "deployment"
|
||||||
|
registrytest.AssertSingularName(t, storage.Deployment, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestScalePatchErrors(t *testing.T) {
|
func TestScalePatchErrors(t *testing.T) {
|
||||||
storage, server := newStorage(t)
|
storage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -126,6 +126,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "replicaset"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a ReplicaSet
|
// StatusREST implements the REST endpoint for changing the status of a ReplicaSet
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -399,6 +399,14 @@ func TestCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage.ReplicaSet, expected)
|
registrytest.AssertCategories(t, storage.ReplicaSet, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.ReplicaSet.Store.DestroyFunc()
|
||||||
|
expected := "replicaset"
|
||||||
|
registrytest.AssertSingularName(t, storage.ReplicaSet, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestScalePatchErrors(t *testing.T) {
|
func TestScalePatchErrors(t *testing.T) {
|
||||||
storage, server := newStorage(t)
|
storage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -114,6 +114,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "statefulset"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of an statefulSet
|
// StatusREST implements the REST endpoint for changing the status of an statefulSet
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -199,6 +199,14 @@ func TestCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage.StatefulSet, expected)
|
registrytest.AssertCategories(t, storage.StatefulSet, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.StatefulSet.Store.DestroyFunc()
|
||||||
|
expected := "statefulset"
|
||||||
|
registrytest.AssertSingularName(t, storage.StatefulSet, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestShortNames(t *testing.T) {
|
func TestShortNames(t *testing.T) {
|
||||||
storage, server := newStorage(t)
|
storage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -78,6 +78,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "horizontalpodautoscaler"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a daemonset
|
// StatusREST implements the REST endpoint for changing the status of a daemonset
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -176,6 +176,14 @@ func TestCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage, expected)
|
registrytest.AssertCategories(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "horizontalpodautoscaler"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestUpdateStatus(t *testing.T) {
|
func TestUpdateStatus(t *testing.T) {
|
||||||
storage, statusStorage, server := newStorage(t)
|
storage, statusStorage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -76,6 +76,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"cj"}
|
return []string{"cj"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "cronjob"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a resourcequota.
|
// StatusREST implements the REST endpoint for changing the status of a resourcequota.
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -96,6 +96,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "job"
|
||||||
|
}
|
||||||
|
|
||||||
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
||||||
//nolint:staticcheck // SA1019 backwards compatibility
|
//nolint:staticcheck // SA1019 backwards compatibility
|
||||||
//nolint: staticcheck
|
//nolint: staticcheck
|
||||||
|
@ -375,3 +375,11 @@ func TestCategories(t *testing.T) {
|
|||||||
expected := []string{"all"}
|
expected := []string{"all"}
|
||||||
registrytest.AssertCategories(t, storage.Job, expected)
|
registrytest.AssertCategories(t, storage.Job, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Job.Store.DestroyFunc()
|
||||||
|
expected := "job"
|
||||||
|
registrytest.AssertSingularName(t, storage.Job, expected)
|
||||||
|
}
|
||||||
|
@ -79,6 +79,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"csr"}
|
return []string{"csr"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "certificatesigningrequest"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a CSR.
|
// StatusREST implements the REST endpoint for changing the status of a CSR.
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
coordinationapi "k8s.io/kubernetes/pkg/apis/coordination"
|
coordinationapi "k8s.io/kubernetes/pkg/apis/coordination"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -52,3 +53,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "lease"
|
||||||
|
}
|
||||||
|
@ -66,3 +66,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"cm"}
|
return []string{"cm"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "configmap"
|
||||||
|
}
|
||||||
|
@ -172,3 +172,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"cm"}
|
expected := []string{"cm"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "configmap"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -60,3 +60,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"ep"}
|
return []string{"ep"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "endpoint"
|
||||||
|
}
|
||||||
|
@ -64,3 +64,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"ev"}
|
return []string{"ev"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "event"
|
||||||
|
}
|
||||||
|
@ -123,3 +123,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"ev"}
|
expected := []string{"ev"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "event"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -58,3 +58,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"limits"}
|
return []string{"limits"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "limitrange"
|
||||||
|
}
|
||||||
|
@ -171,3 +171,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"limits"}
|
expected := []string{"limits"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "limitrange"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -291,6 +291,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"ns"}
|
return []string{"ns"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "namespace"
|
||||||
|
}
|
||||||
|
|
||||||
var _ rest.StorageVersionProvider = &REST{}
|
var _ rest.StorageVersionProvider = &REST{}
|
||||||
|
|
||||||
func (r *REST) StorageVersion() runtime.GroupVersioner {
|
func (r *REST) StorageVersion() runtime.GroupVersioner {
|
||||||
|
@ -628,3 +628,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"ns"}
|
expected := []string{"ns"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.store.DestroyFunc()
|
||||||
|
expected := "namespace"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -167,7 +167,17 @@ func (r *REST) ResourceLocation(ctx context.Context, id string) (*url.URL, http.
|
|||||||
return node.ResourceLocation(r, r.connection, r.proxyTransport, ctx, id)
|
return node.ResourceLocation(r, r.connection, r.proxyTransport, ctx, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implement ShortNamesProvider
|
||||||
|
var _ rest.ShortNamesProvider = &REST{}
|
||||||
|
|
||||||
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
|
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
|
||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"no"}
|
return []string{"no"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "node"
|
||||||
|
}
|
||||||
|
@ -73,6 +73,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"pv"}
|
return []string{"pv"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "persistentvolume"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a persistentvolume.
|
// StatusREST implements the REST endpoint for changing the status of a persistentvolume.
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -208,3 +208,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"pv"}
|
expected := []string{"pv"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "persistentvolume"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -77,6 +77,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"pvc"}
|
return []string{"pvc"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "persistentvolumeclaim"
|
||||||
|
}
|
||||||
|
|
||||||
// defaultOnRead sets interlinked fields that were not previously set on read.
|
// defaultOnRead sets interlinked fields that were not previously set on read.
|
||||||
// We can't do this in the normal defaulting path because that same logic
|
// We can't do this in the normal defaulting path because that same logic
|
||||||
// applies on Get, Create, and Update, but we need to distinguish between them.
|
// applies on Get, Create, and Update, but we need to distinguish between them.
|
||||||
|
@ -212,6 +212,14 @@ func TestShortNames(t *testing.T) {
|
|||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "persistentvolumeclaim"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDefaultOnReadPvc(t *testing.T) {
|
func TestDefaultOnReadPvc(t *testing.T) {
|
||||||
storage, _, server := newStorage(t)
|
storage, _, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -142,6 +142,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "pod"
|
||||||
|
}
|
||||||
|
|
||||||
// BindingREST implements the REST endpoint for binding pods to nodes when etcd is in use.
|
// BindingREST implements the REST endpoint for binding pods to nodes when etcd is in use.
|
||||||
type BindingREST struct {
|
type BindingREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -1274,3 +1274,11 @@ func TestCategories(t *testing.T) {
|
|||||||
expected := []string{"all"}
|
expected := []string{"all"}
|
||||||
registrytest.AssertCategories(t, storage, expected)
|
registrytest.AssertCategories(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "pod"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -53,3 +54,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
}
|
}
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "podtemplate"
|
||||||
|
}
|
||||||
|
@ -153,3 +153,11 @@ func TestWatch(t *testing.T) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "podtemplate"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -122,6 +122,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "replicationcontroller"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a replication controller
|
// StatusREST implements the REST endpoint for changing the status of a replication controller
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -352,6 +352,14 @@ func TestCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage.Controller, expected)
|
registrytest.AssertCategories(t, storage.Controller, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Controller.Store.DestroyFunc()
|
||||||
|
expected := "replicationcontroller"
|
||||||
|
registrytest.AssertSingularName(t, storage.Controller, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestScalePatchErrors(t *testing.T) {
|
func TestScalePatchErrors(t *testing.T) {
|
||||||
storage, server := newStorage(t)
|
storage, server := newStorage(t)
|
||||||
defer server.Terminate(t)
|
defer server.Terminate(t)
|
||||||
|
@ -72,6 +72,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"quota"}
|
return []string{"quota"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "resourcequota"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a resourcequota.
|
// StatusREST implements the REST endpoint for changing the status of a resourcequota.
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -217,3 +217,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"quota"}
|
expected := []string{"quota"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "resourcequota"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/apiserver/pkg/storage"
|
"k8s.io/apiserver/pkg/storage"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
@ -57,3 +58,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
}
|
}
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "secret"
|
||||||
|
}
|
||||||
|
@ -143,3 +143,11 @@ func TestWatch(t *testing.T) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "secret"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -153,6 +153,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"all"}
|
return []string{"all"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "service"
|
||||||
|
}
|
||||||
|
|
||||||
// Destroy cleans up everything on shutdown.
|
// Destroy cleans up everything on shutdown.
|
||||||
func (r *REST) Destroy() {
|
func (r *REST) Destroy() {
|
||||||
r.Store.Destroy()
|
r.Store.Destroy()
|
||||||
|
@ -279,6 +279,14 @@ func TestGenericCategories(t *testing.T) {
|
|||||||
registrytest.AssertCategories(t, storage, expected)
|
registrytest.AssertCategories(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t, []api.IPFamily{api.IPv4Protocol})
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "service"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Tests of internal functions
|
// Tests of internal functions
|
||||||
//
|
//
|
||||||
|
@ -84,3 +84,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"sa"}
|
return []string{"sa"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "serviceaccount"
|
||||||
|
}
|
||||||
|
@ -146,3 +146,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"sa"}
|
expected := []string{"sa"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "serviceaccount"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/kubernetes/pkg/apis/discovery"
|
"k8s.io/kubernetes/pkg/apis/discovery"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -51,3 +52,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
}
|
}
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "endpointslice"
|
||||||
|
}
|
||||||
|
@ -70,6 +70,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"ing"}
|
return []string{"ing"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "ingress"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of an ingress
|
// StatusREST implements the REST endpoint for changing the status of an ingress
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -250,4 +250,12 @@ func TestShortNames(t *testing.T) {
|
|||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "ingress"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO TestUpdateStatus
|
// TODO TestUpdateStatus
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/kubernetes/pkg/apis/networking"
|
"k8s.io/kubernetes/pkg/apis/networking"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -52,3 +53,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "ingressclass"
|
||||||
|
}
|
||||||
|
@ -72,6 +72,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"netpol"}
|
return []string{"netpol"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "networkpolicy"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of an ingress
|
// StatusREST implements the REST endpoint for changing the status of an ingress
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -198,6 +198,14 @@ func TestShortNames(t *testing.T) {
|
|||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "networkpolicy"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
|
||||||
func TestStatusUpdate(t *testing.T) {
|
func TestStatusUpdate(t *testing.T) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NetworkPolicyStatus, true)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NetworkPolicyStatus, true)()
|
||||||
storage, statusStorage, server := newStorage(t)
|
storage, statusStorage, server := newStorage(t)
|
||||||
|
@ -67,6 +67,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"pdb"}
|
return []string{"pdb"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "poddisruptionbudget"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of an podDisruptionBudget.
|
// StatusREST implements the REST endpoint for changing the status of an podDisruptionBudget.
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -51,3 +51,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "clusterrole"
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/kubernetes/pkg/apis/rbac"
|
"k8s.io/kubernetes/pkg/apis/rbac"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -52,3 +53,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "clusterrolebinding"
|
||||||
|
}
|
||||||
|
@ -51,3 +51,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "role"
|
||||||
|
}
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
"k8s.io/kubernetes/pkg/apis/rbac"
|
"k8s.io/kubernetes/pkg/apis/rbac"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
printersinternal "k8s.io/kubernetes/pkg/printers/internalversion"
|
||||||
@ -52,3 +53,10 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, error) {
|
|||||||
|
|
||||||
return &REST{store}, nil
|
return &REST{store}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "rolebinding"
|
||||||
|
}
|
||||||
|
30
pkg/registry/registrytest/singularNameProvider.go
Normal file
30
pkg/registry/registrytest/singularNameProvider.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 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 registrytest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AssertSingularName(t *testing.T, storage rest.SingularNameProvider, expected string) {
|
||||||
|
actual := storage.SingularName()
|
||||||
|
if actual != expected {
|
||||||
|
t.Errorf("singular name not equal. expected = %v actual = %v", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
@ -67,6 +67,13 @@ func (r *REST) ShortNames() []string {
|
|||||||
return []string{"pc"}
|
return []string{"pc"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "priorityclass"
|
||||||
|
}
|
||||||
|
|
||||||
// Delete ensures that system priority classes are not deleted.
|
// Delete ensures that system priority classes are not deleted.
|
||||||
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
||||||
for _, spc := range schedulingapiv1.SystemPriorityClasses() {
|
for _, spc := range schedulingapiv1.SystemPriorityClasses() {
|
||||||
|
@ -179,3 +179,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"pc"}
|
expected := []string{"pc"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "priorityclass"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -62,3 +62,10 @@ var _ rest.ShortNamesProvider = &REST{}
|
|||||||
func (r *REST) ShortNames() []string {
|
func (r *REST) ShortNames() []string {
|
||||||
return []string{"sc"}
|
return []string{"sc"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "storageclass"
|
||||||
|
}
|
||||||
|
@ -160,3 +160,11 @@ func TestShortNames(t *testing.T) {
|
|||||||
expected := []string{"sc"}
|
expected := []string{"sc"}
|
||||||
registrytest.AssertShortNames(t, storage, expected)
|
registrytest.AssertShortNames(t, storage, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "storageclass"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -73,6 +73,13 @@ func NewStorage(optsGetter generic.RESTOptionsGetter) (*VolumeAttachmentStorage,
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "volumeattachment"
|
||||||
|
}
|
||||||
|
|
||||||
// StatusREST implements the REST endpoint for changing the status of a VolumeAttachment
|
// StatusREST implements the REST endpoint for changing the status of a VolumeAttachment
|
||||||
type StatusREST struct {
|
type StatusREST struct {
|
||||||
store *genericregistry.Store
|
store *genericregistry.Store
|
||||||
|
@ -200,3 +200,11 @@ func TestEtcdStatusUpdate(t *testing.T) {
|
|||||||
t.Errorf("objects differ: %v", diff.ObjectDiff(attachmentOut.Status, attachmentIn.Status))
|
t.Errorf("objects differ: %v", diff.ObjectDiff(attachmentOut.Status, attachmentIn.Status))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingularName(t *testing.T) {
|
||||||
|
storage, _, server := newStorage(t)
|
||||||
|
defer server.Terminate(t)
|
||||||
|
defer storage.Store.DestroyFunc()
|
||||||
|
expected := "volumeattachment"
|
||||||
|
registrytest.AssertSingularName(t, storage, expected)
|
||||||
|
}
|
||||||
|
@ -79,6 +79,13 @@ func (r *REST) Categories() []string {
|
|||||||
return []string{"api-extensions"}
|
return []string{"api-extensions"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ rest.SingularNameProvider = &REST{}
|
||||||
|
|
||||||
|
// SingularName implements the SingularNameProvider interfaces. This returns singular name of core resource.
|
||||||
|
func (r *REST) SingularName() string {
|
||||||
|
return "customresourcedefinition"
|
||||||
|
}
|
||||||
|
|
||||||
// Delete adds the CRD finalizer to the list
|
// Delete adds the CRD finalizer to the list
|
||||||
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
func (r *REST) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
|
||||||
obj, err := r.Get(ctx, name, &metav1.GetOptions{})
|
obj, err := r.Get(ctx, name, &metav1.GetOptions{})
|
||||||
|
@ -1080,6 +1080,9 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
|
|||||||
if categoriesProvider, ok := storage.(rest.CategoriesProvider); ok {
|
if categoriesProvider, ok := storage.(rest.CategoriesProvider); ok {
|
||||||
apiResource.Categories = categoriesProvider.Categories()
|
apiResource.Categories = categoriesProvider.Categories()
|
||||||
}
|
}
|
||||||
|
if singularNameProvider, ok := storage.(rest.SingularNameProvider); ok {
|
||||||
|
apiResource.SingularName = singularNameProvider.SingularName()
|
||||||
|
}
|
||||||
if gvkProvider, ok := storage.(rest.GroupVersionKindProvider); ok {
|
if gvkProvider, ok := storage.(rest.GroupVersionKindProvider); ok {
|
||||||
gvk := gvkProvider.GroupVersionKind(a.group.GroupVersion)
|
gvk := gvkProvider.GroupVersionKind(a.group.GroupVersion)
|
||||||
apiResource.Group = gvk.Group
|
apiResource.Group = gvk.Group
|
||||||
|
@ -89,6 +89,12 @@ type CategoriesProvider interface {
|
|||||||
Categories() []string
|
Categories() []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SingularNameProvider returns singular name of resources. This is used by kubectl discovery to have singular
|
||||||
|
// name representation of resources. In case of shortcut conflicts(with CRD shortcuts) singular name should always map to this resource.
|
||||||
|
type SingularNameProvider interface {
|
||||||
|
SingularName() string
|
||||||
|
}
|
||||||
|
|
||||||
// GroupVersionKindProvider is used to specify a particular GroupVersionKind to discovery. This is used for polymorphic endpoints
|
// GroupVersionKindProvider is used to specify a particular GroupVersionKind to discovery. This is used for polymorphic endpoints
|
||||||
// which generally point to foreign versions. Scale refers to Scale.v1beta1.extensions for instance.
|
// which generally point to foreign versions. Scale refers to Scale.v1beta1.extensions for instance.
|
||||||
// This trumps KindProvider since it is capable of providing the information required.
|
// This trumps KindProvider since it is capable of providing the information required.
|
||||||
|
@ -55,7 +55,7 @@ run_assert_short_name_tests() {
|
|||||||
output_message=$(kubectl get --raw=/api/v1)
|
output_message=$(kubectl get --raw=/api/v1)
|
||||||
|
|
||||||
## test if a short name is exported during discovery
|
## test if a short name is exported during discovery
|
||||||
kube::test::if_has_string "${output_message}" '{"name":"configmaps","singularName":"","namespaced":true,"kind":"ConfigMap","verbs":\["create","delete","deletecollection","get","list","patch","update","watch"\],"shortNames":\["cm"\],"storageVersionHash":'
|
kube::test::if_has_string "${output_message}" '{"name":"configmaps","singularName":"configmap","namespaced":true,"kind":"ConfigMap","verbs":\["create","delete","deletecollection","get","list","patch","update","watch"\],"shortNames":\["cm"\],"storageVersionHash":'
|
||||||
|
|
||||||
# check that there is no pod with the name test-crd-example
|
# check that there is no pod with the name test-crd-example
|
||||||
output_message=$(kubectl get pod)
|
output_message=$(kubectl get pod)
|
||||||
|
Loading…
Reference in New Issue
Block a user