// ResolveResource returns the resource type and name of the resourceString. // If the resource string has no specified type, defaultResource will be returned. func ResolveResource(defaultResource unversioned.GroupResource, resourceString string, mapper meta.RESTMapper) (unversioned.GroupResource, string, error) { if mapper == nil { return unversioned.GroupResource{}, "", errors.New("mapper cannot be nil") } var name string parts := strings.Split(resourceString, "/") switch len(parts) { case 1: name = parts[0] case 2: name = parts[1] // Allow specifying the group the same way kubectl does, as "resource.group.name" groupResource := unversioned.ParseGroupResource(parts[0]) // normalize resource case groupResource.Resource = strings.ToLower(groupResource.Resource) gvr, err := mapper.ResourceFor(groupResource.WithVersion("")) if err != nil { return unversioned.GroupResource{}, "", err } return gvr.GroupResource(), name, nil default: return unversioned.GroupResource{}, "", fmt.Errorf("invalid resource format: %s", resourceString) } return defaultResource, name, nil }
func resourceFor(mapper meta.RESTMapper, resourceArg string) unversioned.GroupVersionResource { fullySpecifiedGVR, groupResource := unversioned.ParseResourceArg(strings.ToLower(resourceArg)) gvr := unversioned.GroupVersionResource{} if fullySpecifiedGVR != nil { gvr, _ = mapper.ResourceFor(*fullySpecifiedGVR) } if gvr.IsEmpty() { var err error gvr, err = mapper.ResourceFor(groupResource.WithVersion("")) if err != nil { return unversioned.GroupVersionResource{Resource: resourceArg} } } return gvr }