Commit 3f6dd889 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #40985 from p0lyn0mial/add_shortnames_to_discovery_api

Automatic merge from submit-queue (batch tested with PRs 40980, 40985) added short names for resources which are exposed during discovery **What this PR does / why we need it**: The changes add short names for resources. The short names will be delivered to kubectl during discovery.
parents 63ae15e0 b2cce0ac
...@@ -2818,6 +2818,16 @@ runTests() { ...@@ -2818,6 +2818,16 @@ runTests() {
kube::test::get_object_assert rolebinding/sarole "{{range.subjects}}{{.name}}:{{end}}" 'sa-name:' kube::test::get_object_assert rolebinding/sarole "{{range.subjects}}{{.name}}:{{end}}" 'sa-name:'
fi fi
#########################
# Assert short name #
#########################
kube::log::status "Testing propagation of short names for resources"
output_message=$(kubectl get --raw=/api/v1)
## test if a short name is exported during discovery
kube::test::if_has_string "${output_message}" '{"name":"configmaps","namespaced":true,"kind":"ConfigMap","verbs":\["create","delete","deletecollection","get","list","patch","update","watch"\],"shortNames":\["cm"\]}'
########################### ###########################
# POD creation / deletion # # POD creation / deletion #
########################### ###########################
......
...@@ -60,6 +60,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -60,6 +60,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"hpa"}
}
// 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
......
...@@ -140,4 +140,12 @@ func TestWatch(t *testing.T) { ...@@ -140,4 +140,12 @@ func TestWatch(t *testing.T) {
) )
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"hpa"}
registrytest.AssertShortNames(t, storage, expected)
}
// TODO TestUpdateStatus // TODO TestUpdateStatus
...@@ -67,6 +67,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Approva ...@@ -67,6 +67,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Approva
return &REST{store}, &StatusREST{store: &statusStore}, &ApprovalREST{store: &approvalStore} return &REST{store}, &StatusREST{store: &statusStore}, &ApprovalREST{store: &approvalStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"csr"}
}
// 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
......
...@@ -25,6 +25,7 @@ go_library( ...@@ -25,6 +25,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apimachinery/pkg/util/net", "//vendor:k8s.io/apimachinery/pkg/util/net",
"//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/apiserver/pkg/endpoints/request",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -24,6 +24,7 @@ import ( ...@@ -24,6 +24,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
genericapirequest "k8s.io/apiserver/pkg/endpoints/request" genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/apiserver/pkg/registry/rest"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/probe" "k8s.io/kubernetes/pkg/probe"
httpprober "k8s.io/kubernetes/pkg/probe/http" httpprober "k8s.io/kubernetes/pkg/probe/http"
...@@ -117,3 +118,11 @@ func (rs *REST) getComponentStatus(name string, server Server) *api.ComponentSta ...@@ -117,3 +118,11 @@ func (rs *REST) getComponentStatus(name string, server Server) *api.ComponentSta
return retVal return retVal
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"cs"}
}
...@@ -36,6 +36,7 @@ go_library( ...@@ -36,6 +36,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -20,6 +20,7 @@ import ( ...@@ -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/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/configmap" "k8s.io/kubernetes/pkg/registry/core/configmap"
...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
} }
return &REST{store} return &REST{store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"cm"}
}
...@@ -159,3 +159,11 @@ func TestWatch(t *testing.T) { ...@@ -159,3 +159,11 @@ func TestWatch(t *testing.T) {
}, },
) )
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"cm"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -36,6 +36,7 @@ go_library( ...@@ -36,6 +36,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -20,6 +20,7 @@ import ( ...@@ -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/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/endpoint" "k8s.io/kubernetes/pkg/registry/core/endpoint"
...@@ -52,3 +53,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ...@@ -52,3 +53,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
} }
return &REST{store} return &REST{store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"ep"}
}
...@@ -34,6 +34,7 @@ go_library( ...@@ -34,6 +34,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -20,6 +20,7 @@ import ( ...@@ -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/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/event" "k8s.io/kubernetes/pkg/registry/core/event"
...@@ -65,3 +66,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter, ttl uint64) *REST { ...@@ -65,3 +66,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter, ttl uint64) *REST {
} }
return &REST{store} return &REST{store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"ev"}
}
...@@ -99,3 +99,11 @@ func TestDelete(t *testing.T) { ...@@ -99,3 +99,11 @@ func TestDelete(t *testing.T) {
test := registrytest.New(t, storage.Store) test := registrytest.New(t, storage.Store)
test.TestDelete(validNewEvent(test.TestNamespace())) test.TestDelete(validNewEvent(test.TestNamespace()))
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"ev"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -37,6 +37,7 @@ go_library( ...@@ -37,6 +37,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -20,6 +20,7 @@ import ( ...@@ -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/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/limitrange" "k8s.io/kubernetes/pkg/registry/core/limitrange"
...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
} }
return &REST{store} return &REST{store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"limits"}
}
...@@ -157,3 +157,11 @@ func TestWatch(t *testing.T) { ...@@ -157,3 +157,11 @@ func TestWatch(t *testing.T) {
}, },
) )
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"limits"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -173,6 +173,14 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav ...@@ -173,6 +173,14 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav
return r.Store.Delete(ctx, name, options) return r.Store.Delete(ctx, name, options)
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"ns"}
}
func (r *StatusREST) New() runtime.Object { func (r *StatusREST) New() runtime.Object {
return r.store.New() return r.store.New()
} }
......
...@@ -186,3 +186,11 @@ func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) { ...@@ -186,3 +186,11 @@ func TestDeleteNamespaceWithCompleteFinalizers(t *testing.T) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"ns"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -140,3 +140,8 @@ var _ = rest.Redirector(&REST{}) ...@@ -140,3 +140,8 @@ var _ = rest.Redirector(&REST{})
func (r *REST) ResourceLocation(ctx genericapirequest.Context, id string) (*url.URL, http.RoundTripper, error) { func (r *REST) ResourceLocation(ctx genericapirequest.Context, id string) (*url.URL, http.RoundTripper, error) {
return node.ResourceLocation(r, r.connection, r.proxyTransport, ctx, id) return node.ResourceLocation(r, r.connection, r.proxyTransport, ctx, id)
} }
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"no"}
}
...@@ -150,3 +150,11 @@ func TestWatch(t *testing.T) { ...@@ -150,3 +150,11 @@ func TestWatch(t *testing.T) {
}, },
) )
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"no"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"pv"}
}
// 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
......
...@@ -195,3 +195,11 @@ func TestUpdateStatus(t *testing.T) { ...@@ -195,3 +195,11 @@ func TestUpdateStatus(t *testing.T) {
t.Errorf("unexpected object: %s", diff.ObjectDiff(pvIn.Status, pvOut.Status)) t.Errorf("unexpected object: %s", diff.ObjectDiff(pvIn.Status, pvOut.Status))
} }
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"pv"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"pvc"}
}
// StatusREST implements the REST endpoint for changing the status of a persistentvolumeclaim. // StatusREST implements the REST endpoint for changing the status of a persistentvolumeclaim.
type StatusREST struct { type StatusREST struct {
store *genericregistry.Store store *genericregistry.Store
......
...@@ -192,3 +192,11 @@ func TestUpdateStatus(t *testing.T) { ...@@ -192,3 +192,11 @@ func TestUpdateStatus(t *testing.T) {
t.Errorf("unexpected object: %s", diff.ObjectDiff(pvc.Status, pvcOut.Status)) t.Errorf("unexpected object: %s", diff.ObjectDiff(pvc.Status, pvcOut.Status))
} }
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"pvc"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -105,6 +105,14 @@ func (r *REST) ResourceLocation(ctx genericapirequest.Context, name string) (*ur ...@@ -105,6 +105,14 @@ func (r *REST) ResourceLocation(ctx genericapirequest.Context, name string) (*ur
return pod.ResourceLocation(r, r.proxyTransport, ctx, name) return pod.ResourceLocation(r, r.proxyTransport, ctx, name)
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"po"}
}
// 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
......
...@@ -795,3 +795,11 @@ func TestEtcdUpdateStatus(t *testing.T) { ...@@ -795,3 +795,11 @@ func TestEtcdUpdateStatus(t *testing.T) {
t.Errorf("objects differ: %v", diff.ObjectDiff(podOut, expected)) t.Errorf("objects differ: %v", diff.ObjectDiff(podOut, expected))
} }
} }
func TestShortNames(t *testing.T) {
storage, _, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"po"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -86,6 +86,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -86,6 +86,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"rc"}
}
// 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
......
...@@ -327,3 +327,11 @@ func TestScaleUpdate(t *testing.T) { ...@@ -327,3 +327,11 @@ func TestScaleUpdate(t *testing.T) {
t.Fatalf("unexpected error, expecting an update conflict but got %v", err) t.Fatalf("unexpected error, expecting an update conflict but got %v", err)
} }
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Controller.Store.DestroyFunc()
expected := []string{"rc"}
registrytest.AssertShortNames(t, storage.Controller, expected)
}
...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"quota"}
}
// 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
......
...@@ -202,3 +202,11 @@ func TestUpdateStatus(t *testing.T) { ...@@ -202,3 +202,11 @@ func TestUpdateStatus(t *testing.T) {
t.Errorf("unexpected object: %s", diff.ObjectDiff(resourcequotaIn, rqOut)) t.Errorf("unexpected object: %s", diff.ObjectDiff(resourcequotaIn, rqOut))
} }
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"quota"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -60,6 +60,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -60,6 +60,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"svc"}
}
// StatusREST implements the REST endpoint for changing the status of a service. // StatusREST implements the REST endpoint for changing the status of a service.
type StatusREST struct { type StatusREST struct {
store *genericregistry.Store store *genericregistry.Store
......
...@@ -167,3 +167,11 @@ func TestWatch(t *testing.T) { ...@@ -167,3 +167,11 @@ func TestWatch(t *testing.T) {
}, },
) )
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"svc"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -36,6 +36,7 @@ go_library( ...@@ -36,6 +36,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime",
"//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
], ],
) )
......
...@@ -20,6 +20,7 @@ import ( ...@@ -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/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/serviceaccount" "k8s.io/kubernetes/pkg/registry/core/serviceaccount"
...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ...@@ -53,3 +54,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
} }
return &REST{store} return &REST{store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"sa"}
}
...@@ -133,3 +133,11 @@ func TestWatch(t *testing.T) { ...@@ -133,3 +133,11 @@ func TestWatch(t *testing.T) {
}, },
) )
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"sa"}
registrytest.AssertShortNames(t, storage, expected)
}
...@@ -62,6 +62,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -62,6 +62,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"ds"}
}
// 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
......
...@@ -181,4 +181,12 @@ func TestWatch(t *testing.T) { ...@@ -181,4 +181,12 @@ func TestWatch(t *testing.T) {
) )
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"ds"}
registrytest.AssertShortNames(t, storage, expected)
}
// TODO TestUpdateStatus // TODO TestUpdateStatus
...@@ -87,6 +87,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Rollbac ...@@ -87,6 +87,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *Rollbac
return &REST{store}, &StatusREST{store: &statusStore}, &RollbackREST{store: store} return &REST{store}, &StatusREST{store: &statusStore}, &RollbackREST{store: store}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"deploy"}
}
// 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
......
...@@ -388,3 +388,11 @@ func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) { ...@@ -388,3 +388,11 @@ func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.Deployment.Store.DestroyFunc()
expected := []string{"deploy"}
registrytest.AssertShortNames(t, storage.Deployment, expected)
}
...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -61,6 +61,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"ing"}
}
// 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
......
...@@ -224,4 +224,12 @@ func TestWatch(t *testing.T) { ...@@ -224,4 +224,12 @@ func TestWatch(t *testing.T) {
) )
} }
func TestShortNames(t *testing.T) {
storage, _, server := newStorage(t)
defer server.Terminate(t)
defer storage.Store.DestroyFunc()
expected := []string{"ing"}
registrytest.AssertShortNames(t, storage, expected)
}
// TODO TestUpdateStatus // TODO TestUpdateStatus
...@@ -55,3 +55,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ...@@ -55,3 +55,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST {
} }
return &REST{store} return &REST{store}
} }
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"psp"}
}
...@@ -85,6 +85,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -85,6 +85,14 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// Implement ShortNamesProvider
var _ rest.ShortNamesProvider = &REST{}
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"rs"}
}
// 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
......
...@@ -368,3 +368,11 @@ func TestStatusUpdate(t *testing.T) { ...@@ -368,3 +368,11 @@ func TestStatusUpdate(t *testing.T) {
t.Errorf("we expected .status.replicas to be updated to %d but it was %v", defaultReplicas, rs.Status.Replicas) t.Errorf("we expected .status.replicas to be updated to %d but it was %v", defaultReplicas, rs.Status.Replicas)
} }
} }
func TestShortNames(t *testing.T) {
storage, server := newStorage(t)
defer server.Terminate(t)
defer storage.ReplicaSet.DestroyFunc()
expected := []string{"rs"}
registrytest.AssertShortNames(t, storage.ReplicaSet, expected)
}
...@@ -61,6 +61,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { ...@@ -61,6 +61,11 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) {
return &REST{store}, &StatusREST{store: &statusStore} return &REST{store}, &StatusREST{store: &statusStore}
} }
// ShortNames implements the ShortNamesProvider interface. Returns a list of short names for a resource.
func (r *REST) ShortNames() []string {
return []string{"pdb"}
}
// 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
......
...@@ -15,6 +15,7 @@ go_library( ...@@ -15,6 +15,7 @@ go_library(
"etcd.go", "etcd.go",
"node.go", "node.go",
"service.go", "service.go",
"shortNamesProvider.go",
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
...@@ -30,6 +31,7 @@ go_library( ...@@ -30,6 +31,7 @@ go_library(
"//vendor:k8s.io/apimachinery/pkg/watch", "//vendor:k8s.io/apimachinery/pkg/watch",
"//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/apiserver/pkg/endpoints/request",
"//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry",
"//vendor:k8s.io/apiserver/pkg/registry/rest",
"//vendor:k8s.io/apiserver/pkg/registry/rest/resttest", "//vendor:k8s.io/apiserver/pkg/registry/rest/resttest",
"//vendor:k8s.io/apiserver/pkg/storage/etcd", "//vendor:k8s.io/apiserver/pkg/storage/etcd",
"//vendor:k8s.io/apiserver/pkg/storage/etcd/testing", "//vendor:k8s.io/apiserver/pkg/storage/etcd/testing",
......
/*
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 (
"reflect"
"testing"
"k8s.io/apiserver/pkg/registry/rest"
)
func AssertShortNames(t *testing.T, storage rest.ShortNamesProvider, expected []string) {
actual := storage.ShortNames()
ok := reflect.DeepEqual(actual, expected)
if !ok {
t.Errorf("short names not equal. expected = %v actual = %v", expected, actual)
}
}
...@@ -35,10 +35,10 @@ import ( ...@@ -35,10 +35,10 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apiserver/pkg/endpoints/handlers"
"k8s.io/apiserver/pkg/endpoints/handlers/negotiation" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
"k8s.io/apiserver/pkg/endpoints/metrics" "k8s.io/apiserver/pkg/endpoints/metrics"
"k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/apiserver/pkg/endpoints/handlers"
"k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/registry/rest"
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
...@@ -368,6 +368,12 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -368,6 +368,12 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
resourceKind = kind resourceKind = kind
} }
var shortNames []string
shortNamesProvider, ok := storage.(rest.ShortNamesProvider)
if ok {
shortNames = shortNamesProvider.ShortNames()
}
var apiResource metav1.APIResource var apiResource metav1.APIResource
// Get the list of actions for the given scope. // Get the list of actions for the given scope.
switch scope.Name() { switch scope.Name() {
...@@ -796,6 +802,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -796,6 +802,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
apiResource.Verbs = append(apiResource.Verbs, kubeVerb) apiResource.Verbs = append(apiResource.Verbs, kubeVerb)
} }
sort.Strings(apiResource.Verbs) sort.Strings(apiResource.Verbs)
apiResource.ShortNames = shortNames
return &apiResource, nil return &apiResource, nil
} }
......
...@@ -65,6 +65,11 @@ type KindProvider interface { ...@@ -65,6 +65,11 @@ type KindProvider interface {
Kind() string Kind() string
} }
// ShortNamesProvider is an interface for RESTful storage services. Delivers a list of short names for a resource. The list is used by kubectl to have short names representation of resources.
type ShortNamesProvider interface {
ShortNames() []string
}
// Lister is an object that can retrieve resources that match the provided field and label criteria. // Lister is an object that can retrieve resources that match the provided field and label criteria.
type Lister interface { type Lister interface {
// NewList returns an empty object that can be used with the List call. // NewList returns an empty object that can be used with the List call.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment