package prune import ( "fmt" "strings" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" ) type Resource struct { group string version string kind string namespaced bool } func (pr Resource) String() string { return fmt.Sprintf("%v/%v, Kind=%v, Namespaced=%v", pr.group, pr.version, pr.kind, pr.namespaced) } func GetRESTMappings(mapper meta.RESTMapper, pruneResources *[]Resource) (namespaced, nonNamespaced []*meta.RESTMapping, err error) { if len(*pruneResources) == 0 { // default allowlist *pruneResources = []Resource{ {"", "v1", "ConfigMap", true}, {"", "v1", "Endpoints", true}, {"", "v1", "Namespace", false}, {"", "v1", "PersistentVolumeClaim", true}, {"", "v1", "PersistentVolume", false}, {"", "v1", "Pod", true}, {"", "v1", "ReplicationController", true}, {"", "v1", "Secret", true}, {"", "v1", "Service", true}, {"batch", "v1", "Job", true}, {"batch", "v1", "CronJob", true}, {"networking.k8s.io", "v1", "Ingress", true}, {"apps", "v1", "DaemonSet", true}, {"apps", "v1", "Deployment", true}, {"apps", "v1", "ReplicaSet", true}, {"apps", "v1", "StatefulSet", true}, } } for _, resource := range *pruneResources { addedMapping, err := mapper.RESTMapping(schema.GroupKind{Group: resource.group, Kind: resource.kind}, resource.version) if err != nil { return nil, nil, fmt.Errorf("invalid resource %v: %v", resource, err) } if resource.namespaced { namespaced = append(namespaced, addedMapping) } else { nonNamespaced = append(nonNamespaced, addedMapping) } } return namespaced, nonNamespaced, nil } func ParseResources(mapper meta.RESTMapper, gvks []string) ([]Resource, error) { pruneResources := []Resource{} for _, groupVersionKind := range gvks { gvk := strings.Split(groupVersionKind, "/") if len(gvk) != 3 { return nil, fmt.Errorf("invalid GroupVersionKind format: %v, please follow ", groupVersionKind) } if gvk[0] == "core" { gvk[0] = "" } mapping, err := mapper.RESTMapping(schema.GroupKind{Group: gvk[0], Kind: gvk[2]}, gvk[1]) if err != nil { return pruneResources, err } var namespaced bool namespaceScope := mapping.Scope.Name() switch namespaceScope { case meta.RESTScopeNameNamespace: namespaced = true case meta.RESTScopeNameRoot: namespaced = false default: return pruneResources, fmt.Errorf("Unknown namespace scope: %q", namespaceScope) } pruneResources = append(pruneResources, Resource{gvk[0], gvk[1], gvk[2], namespaced}) } return pruneResources, nil }