...
1
16
17 package runtime
18
19 import (
20 "sync"
21
22 "k8s.io/apimachinery/pkg/runtime/schema"
23 )
24
25 type equivalentResourceRegistry struct {
26
27
28 keyFunc func(resource schema.GroupResource) string
29
30
31 resources map[string]map[string][]schema.GroupVersionResource
32
33 kinds map[schema.GroupVersionResource]map[string]schema.GroupVersionKind
34
35 keys map[schema.GroupResource]string
36
37 mutex sync.RWMutex
38 }
39
40 var _ EquivalentResourceMapper = (*equivalentResourceRegistry)(nil)
41 var _ EquivalentResourceRegistry = (*equivalentResourceRegistry)(nil)
42
43
44 func NewEquivalentResourceRegistry() EquivalentResourceRegistry {
45 return &equivalentResourceRegistry{}
46 }
47
48
49
50
51 func NewEquivalentResourceRegistryWithIdentity(keyFunc func(schema.GroupResource) string) EquivalentResourceRegistry {
52 return &equivalentResourceRegistry{keyFunc: keyFunc}
53 }
54
55 func (r *equivalentResourceRegistry) EquivalentResourcesFor(resource schema.GroupVersionResource, subresource string) []schema.GroupVersionResource {
56 r.mutex.RLock()
57 defer r.mutex.RUnlock()
58 return r.resources[r.keys[resource.GroupResource()]][subresource]
59 }
60 func (r *equivalentResourceRegistry) KindFor(resource schema.GroupVersionResource, subresource string) schema.GroupVersionKind {
61 r.mutex.RLock()
62 defer r.mutex.RUnlock()
63 return r.kinds[resource][subresource]
64 }
65 func (r *equivalentResourceRegistry) RegisterKindFor(resource schema.GroupVersionResource, subresource string, kind schema.GroupVersionKind) {
66 r.mutex.Lock()
67 defer r.mutex.Unlock()
68 if r.kinds == nil {
69 r.kinds = map[schema.GroupVersionResource]map[string]schema.GroupVersionKind{}
70 }
71 if r.kinds[resource] == nil {
72 r.kinds[resource] = map[string]schema.GroupVersionKind{}
73 }
74 r.kinds[resource][subresource] = kind
75
76
77 key := ""
78 gr := resource.GroupResource()
79 if r.keyFunc != nil {
80 key = r.keyFunc(gr)
81 }
82 if key == "" {
83 key = gr.String()
84 }
85
86 if r.keys == nil {
87 r.keys = map[schema.GroupResource]string{}
88 }
89 r.keys[gr] = key
90
91 if r.resources == nil {
92 r.resources = map[string]map[string][]schema.GroupVersionResource{}
93 }
94 if r.resources[key] == nil {
95 r.resources[key] = map[string][]schema.GroupVersionResource{}
96 }
97 r.resources[key][subresource] = append(r.resources[key][subresource], resource)
98 }
99
View as plain text