add kindfor func to get apiresource from gvk (#2764)

* add kindfor func to get apiresource from gvk

Signed-off-by: RyderXia <ryder.xia@sap.com>

* impl interface & changelog

Signed-off-by: RyderXia <ryder.xia@sap.com>
pull/2832/head
runzexia 2020-08-18 06:52:33 +08:00 committed by GitHub
parent c663ce15ab
commit 3a4e441af8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 0 deletions

View File

@ -0,0 +1 @@
discovery Helper support get GroupVersionResource and an APIResource from GroupVersionKind

View File

@ -45,6 +45,10 @@ type Helper interface {
// APIResource for the provided partially-specified GroupVersionResource.
ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, metav1.APIResource, error)
// KindFor gets a fully-resolved GroupVersionResource and an
// APIResource for the provided partially-specified GroupVersionKind.
KindFor(input schema.GroupVersionKind) (schema.GroupVersionResource, metav1.APIResource, error)
// Refresh pulls an updated set of Velero-backuppable resources from the
// discovery API.
Refresh() error
@ -75,6 +79,7 @@ type helper struct {
mapper meta.RESTMapper
resources []*metav1.APIResourceList
resourcesMap map[schema.GroupVersionResource]metav1.APIResource
kindMap map[schema.GroupVersionKind]metav1.APIResource
apiGroups []metav1.APIGroup
serverVersion *version.Info
}
@ -109,6 +114,31 @@ func (h *helper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVer
return gvr, apiResource, nil
}
func (h *helper) KindFor(input schema.GroupVersionKind) (schema.GroupVersionResource, metav1.APIResource, error) {
h.lock.RLock()
defer h.lock.RUnlock()
if resource, ok := h.kindMap[input]; ok {
return schema.GroupVersionResource{
Group: resource.Group,
Version: resource.Version,
Resource: resource.Name,
}, resource, nil
}
m, err := h.mapper.RESTMapping(schema.GroupKind{Group: input.Group, Kind: input.Kind}, input.Version)
if err != nil {
return schema.GroupVersionResource{}, metav1.APIResource{}, err
}
if resource, ok := h.kindMap[m.GroupVersionKind]; ok {
return schema.GroupVersionResource{
Group: resource.Group,
Version: resource.Version,
Resource: resource.Name,
}, resource, nil
}
return schema.GroupVersionResource{}, metav1.APIResource{}, errors.Errorf("APIResource not found for GroupVersionKind %v ", input)
}
func (h *helper) Refresh() error {
h.lock.Lock()
defer h.lock.Unlock()
@ -151,6 +181,7 @@ func (h *helper) Refresh() error {
h.mapper = shortcutExpander
h.resourcesMap = make(map[schema.GroupVersionResource]metav1.APIResource)
h.kindMap = make(map[schema.GroupVersionKind]metav1.APIResource)
for _, resourceGroup := range h.resources {
gv, err := schema.ParseGroupVersion(resourceGroup.GroupVersion)
if err != nil {
@ -159,7 +190,9 @@ func (h *helper) Refresh() error {
for _, resource := range resourceGroup.APIResources {
gvr := gv.WithResource(resource.Name)
gvk := gv.WithKind(resource.Kind)
h.resourcesMap[gvr] = resource
h.kindMap[gvk] = resource
}
}

View File

@ -35,6 +35,10 @@ type FakeDiscoveryHelper struct {
ServerVersionData *version.Info
}
func (dh *FakeDiscoveryHelper) KindFor(input schema.GroupVersionKind) (schema.GroupVersionResource, metav1.APIResource, error) {
panic("implement me")
}
func NewFakeDiscoveryHelper(autoReturnResource bool, resources map[schema.GroupVersionResource]schema.GroupVersionResource) *FakeDiscoveryHelper {
helper := &FakeDiscoveryHelper{
AutoReturnResource: autoReturnResource,