mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
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.
This commit is contained in:
commit
3f6dd889f3
@ -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) {
|
|||||||
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) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
|||||||
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(
|
|||||||
"//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 (
|
|||||||
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
|
|||||||
|
|
||||||
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(
|
|||||||
"//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 (
|
|||||||
"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 {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(
|
|||||||
"//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 (
|
|||||||
"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 {
|
|||||||
}
|
}
|
||||||
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(
|
|||||||
"//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 (
|
|||||||
"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 {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
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(
|
|||||||
"//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 (
|
|||||||
"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 {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
|||||||
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) {
|
|||||||
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{})
|
|||||||
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) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(
|
|||||||
"//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 (
|
|||||||
"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 {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
|||||||
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) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
|||||||
}
|
}
|
||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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(
|
|||||||
"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(
|
|||||||
"//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",
|
||||||
|
32
pkg/registry/registrytest/shortNamesProvider.go
Normal file
32
pkg/registry/registrytest/shortNamesProvider.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
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 (
|
|||||||
"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
|
|||||||
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
|
|||||||
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 {
|
|||||||
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.
|
||||||
|
Loading…
Reference in New Issue
Block a user