Skip to content

Commit d7c1327

Browse files
committed
update restmapper
Signed-off-by: Liang Deng <[email protected]>
1 parent 71dbacd commit d7c1327

File tree

3 files changed

+13
-336
lines changed

3 files changed

+13
-336
lines changed

pkg/admiralctl/federalize/federalize.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,12 +258,12 @@ func (o *CommandFederalizeOption) Preflight(f util.Factory, args []string) error
258258

259259
o.resourceObj = obj
260260
o.gvk = obj.GetObjectKind().GroupVersionKind()
261-
o.mapper, err = restmapper.MapperProvider(o.controlPlaneRestConfig)
261+
o.mapper, err = restmapper.GetRESTMapper(o.controlPlaneRestConfig)
262262
if err != nil {
263263
return fmt.Errorf("failed to create restmapper: %w", err)
264264
}
265265

266-
o.gvr, err = restmapper.GetGroupVersionResource(o.mapper, o.gvk)
266+
o.gvr, err = restmapper.ConvertGVKToGVR(o.mapper, o.gvk)
267267
if err != nil {
268268
return fmt.Errorf("failed to get gvr from %q: %w", o.gvk, err)
269269
}

pkg/admiralctl/util/restmapper/restmapper.go

Lines changed: 11 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -17,142 +17,32 @@ limitations under the License.
1717
package restmapper
1818

1919
import (
20-
"sync"
21-
2220
"k8s.io/apimachinery/pkg/api/meta"
2321
"k8s.io/apimachinery/pkg/runtime/schema"
2422
"k8s.io/client-go/discovery"
2523
"k8s.io/client-go/rest"
2624
"k8s.io/client-go/restmapper"
2725
)
2826

29-
// GetGroupVersionResource is a helper to map GVK(schema.GroupVersionKind) to GVR(schema.GroupVersionResource).
30-
func GetGroupVersionResource(restMapper meta.RESTMapper, gvk schema.GroupVersionKind) (schema.GroupVersionResource, error) {
31-
restMapping, err := restMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
27+
func GetRESTMapper(restConfig *rest.Config) (meta.RESTMapper, error) {
28+
dc, err := discovery.NewDiscoveryClientForConfig(restConfig)
3229
if err != nil {
33-
return schema.GroupVersionResource{}, err
34-
}
35-
return restMapping.Resource, nil
36-
}
37-
38-
// cachedRESTMapper caches the previous result to accelerate subsequent queries.
39-
type cachedRESTMapper struct {
40-
restMapper meta.RESTMapper
41-
discoveryClient discovery.DiscoveryInterface
42-
gvkToGVR sync.Map
43-
// mu is used to provide thread-safe mapper reloading.
44-
mu sync.RWMutex
45-
}
46-
47-
func (g *cachedRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) {
48-
return g.getMapper().KindFor(resource)
49-
}
50-
51-
func (g *cachedRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
52-
return g.getMapper().KindsFor(resource)
53-
}
54-
55-
func (g *cachedRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) {
56-
return g.getMapper().ResourceFor(input)
57-
}
58-
59-
func (g *cachedRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) {
60-
return g.getMapper().ResourcesFor(input)
61-
}
62-
63-
func (g *cachedRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) {
64-
return g.getMapper().RESTMappings(gk, versions...)
65-
}
66-
67-
func (g *cachedRESTMapper) ResourceSingularizer(resource string) (singular string, err error) {
68-
return g.getMapper().ResourceSingularizer(resource)
69-
}
70-
71-
func (g *cachedRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
72-
// in case of multi-versions or no versions, cachedRESTMapper don't know which is the preferred version,
73-
// so just bypass the cache and consult the underlying mapper.
74-
if len(versions) != 1 {
75-
return g.getMapper().RESTMapping(gk, versions...)
76-
}
77-
78-
gvk := gk.WithVersion(versions[0])
79-
value, ok := g.gvkToGVR.Load(gvk)
80-
if ok { // hit cache, just return
81-
return value.(*meta.RESTMapping), nil
82-
}
83-
84-
// consult underlying mapper and then update cache
85-
restMapping, err := g.getMapper().RESTMapping(gk, versions...)
86-
if meta.IsNoMatchError(err) {
87-
// hit here means a resource might be missing from the current rest mapper,
88-
// probably because a new resource(CRD) has been added, we have to reload
89-
// resource and rebuild the rest mapper.
90-
91-
var groupResources []*restmapper.APIGroupResources
92-
groupResources, err = restmapper.GetAPIGroupResources(g.discoveryClient)
93-
if err != nil {
94-
return nil, err
95-
}
96-
97-
newMapper := restmapper.NewDiscoveryRESTMapper(groupResources)
98-
restMapping, err = newMapper.RESTMapping(gk, versions...)
99-
if err == nil {
100-
// hit here means after reloading, the new rest mapper can recognize
101-
// the resource, we have to replace the mapper and clear cache.
102-
g.mu.Lock()
103-
g.restMapper = newMapper
104-
g.mu.Unlock()
105-
g.gvkToGVR.Range(func(key, value any) bool {
106-
g.gvkToGVR.Delete(key)
107-
return true
108-
})
109-
}
30+
panic(err.Error())
11031
}
11132

33+
grl, err := restmapper.GetAPIGroupResources(dc)
11234
if err != nil {
113-
return restMapping, err
35+
panic(err.Error())
11436
}
115-
g.gvkToGVR.Store(gvk, restMapping)
11637

117-
return restMapping, nil
38+
return restmapper.NewDiscoveryRESTMapper(grl), nil
11839
}
11940

120-
func (g *cachedRESTMapper) getMapper() meta.RESTMapper {
121-
g.mu.RLock()
122-
defer g.mu.RUnlock()
123-
return g.restMapper
124-
}
125-
126-
// NewCachedRESTMapper builds a cachedRESTMapper with a customized underlyingMapper.
127-
// If underlyingMapper is nil, defaults to DiscoveryRESTMapper.
128-
func NewCachedRESTMapper(cfg *rest.Config, underlyingMapper meta.RESTMapper) (meta.RESTMapper, error) {
129-
cachedMapper := cachedRESTMapper{}
130-
131-
// short path, build with customized underlying mapper.
132-
if underlyingMapper != nil {
133-
cachedMapper.restMapper = underlyingMapper
134-
return &cachedMapper, nil
135-
}
136-
137-
client, err := discovery.NewDiscoveryClientForConfig(cfg)
138-
if err != nil {
139-
return nil, err
140-
}
141-
142-
// loading current resources for building a base rest mapper.
143-
groupResources, err := restmapper.GetAPIGroupResources(client)
41+
// ConvertGVKToGVR convert GVK to GVR
42+
func ConvertGVKToGVR(restMapper meta.RESTMapper, gvk schema.GroupVersionKind) (schema.GroupVersionResource, error) {
43+
restMapping, err := restMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
14444
if err != nil {
145-
return nil, err
45+
return schema.GroupVersionResource{}, err
14646
}
147-
148-
cachedMapper.restMapper = restmapper.NewDiscoveryRESTMapper(groupResources)
149-
cachedMapper.discoveryClient = client
150-
151-
return &cachedMapper, nil
152-
}
153-
154-
// MapperProvider is a wrapper of cachedRESTMapper which is typically used
155-
// to generate customized RESTMapper for controller-runtime framework.
156-
func MapperProvider(c *rest.Config) (meta.RESTMapper, error) {
157-
return NewCachedRESTMapper(c, nil)
47+
return restMapping.Resource, nil
15848
}

pkg/admiralctl/util/restmapper/restmapper_test.go

Lines changed: 0 additions & 213 deletions
This file was deleted.

0 commit comments

Comments
 (0)