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
parent
c663ce15ab
commit
3a4e441af8
|
@ -0,0 +1 @@
|
|||
discovery Helper support get GroupVersionResource and an APIResource from GroupVersionKind
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue