/
mapping.go
72 lines (66 loc) · 2.33 KB
/
mapping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package kubectl
import (
"errors"
"strings"
"github.com/jmespath-community/go-jmespath/pkg/binding"
"github.com/kyverno/chainsaw/pkg/apis/v1alpha1"
"github.com/kyverno/chainsaw/pkg/client"
apibindings "github.com/kyverno/chainsaw/pkg/runner/bindings"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime/schema"
)
func mapResource(client client.Client, bindings binding.Bindings, resource v1alpha1.ResourceReference) (string, bool, error) {
if resource.Resource != "" {
if resource, err := apibindings.String(resource.Resource, bindings); err != nil {
return "", false, err
} else {
return mapResourceFromResource(client, resource)
}
}
if resource.APIVersion != "" && resource.Kind != "" {
if apiVersion, err := apibindings.String(resource.APIVersion, bindings); err != nil {
return "", false, err
} else if kind, err := apibindings.String(resource.Kind, bindings); err != nil {
return "", false, err
} else {
return mapResourceFromKind(client, apiVersion, kind)
}
}
return "", false, errors.New("failed to map resource, either kind or resource must be specified")
}
func mapResourceFromResource(client client.Client, resource string) (string, bool, error) {
gvr, gv := schema.ParseResourceArg(resource)
if gvr == nil {
gvr = &schema.GroupVersionResource{Group: gv.Group, Resource: gv.Resource}
}
mapper := client.RESTMapper()
gvk, err := mapper.KindFor(*gvr)
// if we have an error, it may be because the resource name is a short one
if err != nil {
return resource, false, nil
}
return mapResourceFromGVK(mapper, gvk)
}
func mapResourceFromKind(client client.Client, apiVersion string, kind string) (string, bool, error) {
gv, err := schema.ParseGroupVersion(apiVersion)
if err != nil {
return "", false, err
}
return mapResourceFromGVK(client.RESTMapper(), gv.WithKind(kind))
}
func mapResourceFromGVK(mapper meta.RESTMapper, gvk schema.GroupVersionKind) (string, bool, error) {
mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil {
return "", false, err
}
clustered := mapping.Scope.Name() == meta.RESTScopeNameRoot
if mapping.Resource.Group == "" {
return mapping.Resource.Resource, clustered, nil
}
parts := []string{
mapping.Resource.Resource,
mapping.Resource.Version,
mapping.Resource.Group,
}
return strings.Join(parts, "."), clustered, nil
}