Add singular name for the rest of types

Kubernetes-commit: 578ddde80e72a300fdb3798d68e550d2b4a61203
This commit is contained in:
Arda Güçlü 2022-11-03 10:18:45 +03:00 committed by Kubernetes Publisher
parent da3d6b945b
commit d20862a68e
6 changed files with 60 additions and 9 deletions

View File

@ -372,6 +372,10 @@ func (storage *SimpleRESTStorage) ConvertToTable(ctx context.Context, obj runtim
return rest.NewDefaultTableConvertor(schema.GroupResource{Resource: "simple"}).ConvertToTable(ctx, obj, tableOptions)
}
func (storate *SimpleRESTStorage) GetSingularName() string {
return "simple"
}
func (storage *SimpleRESTStorage) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) {
storage.checkContext(ctx)
result := &genericapitesting.SimpleList{
@ -575,6 +579,10 @@ func (s *ConnecterRESTStorage) NewConnectOptions() (runtime.Object, bool, string
return s.emptyConnectOptions, false, ""
}
func (s *ConnecterRESTStorage) GetSingularName() string {
return "simple"
}
type MetadataRESTStorage struct {
*SimpleRESTStorage
types []string
@ -619,6 +627,10 @@ type GetWithOptionsRootRESTStorage struct {
takesPath string
}
func (r *GetWithOptionsRootRESTStorage) GetSingularName() string {
return "simple"
}
func (r *GetWithOptionsRootRESTStorage) NamespaceScoped() bool {
return false
}
@ -687,6 +699,10 @@ func (storage *SimpleTypedStorage) checkContext(ctx context.Context) {
storage.actualNamespace, storage.namespacePresent = request.NamespaceFrom(ctx)
}
func (storage *SimpleTypedStorage) GetSingularName() string {
return "simple"
}
func bodyOrDie(response *http.Response) string {
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
@ -823,6 +839,10 @@ func (UnimplementedRESTStorage) New() runtime.Object {
func (UnimplementedRESTStorage) Destroy() {
}
func (UnimplementedRESTStorage) GetSingularName() string {
return ""
}
// TestUnimplementedRESTStorage ensures that if a rest.Storage does not implement a given
// method, that it is literally not registered with the server. In the past,
// we registered everything, and returned method not supported if it didn't support
@ -4289,6 +4309,10 @@ func (storage *SimpleXGSubresourceRESTStorage) GroupVersionKind(containingGV sch
return storage.itemGVK
}
func (storage *SimpleXGSubresourceRESTStorage) GetSingularName() string {
return "simple"
}
func TestXGSubresource(t *testing.T) {
container := restful.NewContainer()
container.Router(restful.CurlyRouter{})

View File

@ -1080,9 +1080,12 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if categoriesProvider, ok := storage.(rest.CategoriesProvider); ok {
apiResource.Categories = categoriesProvider.Categories()
}
if singularNameProvider, ok := storage.(rest.SingularNameProvider); ok {
apiResource.SingularName = singularNameProvider.SingularName()
singularNameProvider, ok := storage.(rest.SingularNameProvider)
if !ok {
return nil, nil, fmt.Errorf("resource %s must implement SingularNameProvider", resource)
}
apiResource.SingularName = singularNameProvider.GetSingularName()
if gvkProvider, ok := storage.(rest.GroupVersionKindProvider); ok {
gvk := gvkProvider.GroupVersionKind(a.group.GroupVersion)
apiResource.Group = gvk.Group

View File

@ -110,6 +110,9 @@ type Store struct {
// See qualifiedResourceFromContext for details.
DefaultQualifiedResource schema.GroupResource
// SingularQualifiedResource is the singular name of the resource.
SingularQualifiedResource schema.GroupResource
// KeyRootFunc returns the root etcd key for this resource; should not
// include trailing "/". This is used for operations that work on the
// entire collection (listing and watching).
@ -229,6 +232,8 @@ var _ rest.StandardStorage = &Store{}
var _ rest.TableConvertor = &Store{}
var _ GenericStore = &Store{}
var _ rest.SingularNameProvider = &Store{}
const (
OptimisticLockErrorMsg = "the object has been modified; please apply your changes to the latest version and try again"
resourceCountPollPeriodJitter = 1.2
@ -1320,6 +1325,12 @@ func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error {
if e.DefaultQualifiedResource.Empty() {
return fmt.Errorf("store %#v must have a non-empty qualified resource", e)
}
if e.SingularQualifiedResource.Empty() {
return fmt.Errorf("store %#v must have a non-empty singular qualified resource", e)
}
if e.DefaultQualifiedResource.Group != e.SingularQualifiedResource.Group {
return fmt.Errorf("store for %#v, singular and plural qualified resource's group name's must match", e)
}
if e.NewFunc == nil {
return fmt.Errorf("store for %s must have NewFunc set", e.DefaultQualifiedResource.String())
}
@ -1515,6 +1526,10 @@ func (e *Store) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set {
return e.ResetFieldsStrategy.GetResetFields()
}
func (e *Store) GetSingularName() string {
return e.SingularQualifiedResource.Resource
}
// validateIndexers will check the prefix of indexers.
func validateIndexers(indexers *cache.Indexers) error {
if indexers == nil {

View File

@ -2339,12 +2339,13 @@ func newTestGenericStoreRegistry(t *testing.T, scheme *runtime.Scheme, hasCacheE
}
return destroyFunc, &Store{
NewFunc: func() runtime.Object { return &example.Pod{} },
NewListFunc: func() runtime.Object { return &example.PodList{} },
DefaultQualifiedResource: example.Resource("pods"),
CreateStrategy: strategy,
UpdateStrategy: strategy,
DeleteStrategy: strategy,
NewFunc: func() runtime.Object { return &example.Pod{} },
NewListFunc: func() runtime.Object { return &example.PodList{} },
DefaultQualifiedResource: example.Resource("pods"),
SingularQualifiedResource: example.Resource("pod"),
CreateStrategy: strategy,
UpdateStrategy: strategy,
DeleteStrategy: strategy,
KeyRootFunc: func(ctx context.Context) string {
return podPrefix
},

View File

@ -92,7 +92,7 @@ type CategoriesProvider interface {
// 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
GetSingularName() string
}
// GroupVersionKindProvider is used to specify a particular GroupVersionKind to discovery. This is used for polymorphic endpoints

View File

@ -551,6 +551,10 @@ func (p *testGetterStorage) Get(ctx context.Context, name string, options *metav
return nil, nil
}
func (p *testGetterStorage) GetSingularName() string {
return "getter"
}
type testNoVerbsStorage struct {
Version string
}
@ -571,6 +575,10 @@ func (p *testNoVerbsStorage) New() runtime.Object {
func (p *testNoVerbsStorage) Destroy() {
}
func (p *testNoVerbsStorage) GetSingularName() string {
return "noverb"
}
func fakeVersion() version.Info {
return version.Info{
Major: "42",