This repository has been archived by the owner on Jan 29, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use dynamic REST mapper for the client
- Loading branch information
Artyom Lukianov
committed
Sep 10, 2019
1 parent
f1f7911
commit aa31f4d
Showing
8 changed files
with
164 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
load("@io_bazel_rules_go//go:def.bzl", "go_library") | ||
|
||
go_library( | ||
name = "go_default_library", | ||
srcs = ["mapper.go"], | ||
importpath = "kubevirt.io/machine-remediation-operator/pkg/utils/mapper", | ||
visibility = ["//visibility:public"], | ||
deps = [ | ||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", | ||
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", | ||
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", | ||
"//vendor/k8s.io/client-go/discovery:go_default_library", | ||
"//vendor/k8s.io/client-go/rest:go_default_library", | ||
"//vendor/k8s.io/client-go/restmapper:go_default_library", | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
package mapper | ||
|
||
import ( | ||
"k8s.io/apimachinery/pkg/api/meta" | ||
"k8s.io/apimachinery/pkg/runtime/schema" | ||
utilruntime "k8s.io/apimachinery/pkg/util/runtime" | ||
"k8s.io/client-go/discovery" | ||
"k8s.io/client-go/rest" | ||
"k8s.io/client-go/restmapper" | ||
) | ||
|
||
// DynamicRESTMapper defines dynamic REST mapper entity | ||
type DynamicRESTMapper struct { | ||
client discovery.DiscoveryInterface | ||
delegate meta.RESTMapper | ||
} | ||
|
||
// NewDynamicRESTMapper returns a RESTMapper that dynamically discovers resource | ||
// types at runtime. This is in contrast to controller-manager's default RESTMapper, which | ||
// only checks resource types at startup, and so can't handle the case of first creating a | ||
// CRD and then creating an instance of that CRD. | ||
func NewDynamicRESTMapper(cfg *rest.Config) (meta.RESTMapper, error) { | ||
client, err := discovery.NewDiscoveryClientForConfig(cfg) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
drm := &DynamicRESTMapper{client: client} | ||
if err := drm.reload(); err != nil { | ||
return nil, err | ||
} | ||
return drm, nil | ||
} | ||
|
||
func (drm *DynamicRESTMapper) reload() error { | ||
gr, err := restmapper.GetAPIGroupResources(drm.client) | ||
if err != nil { | ||
return err | ||
} | ||
drm.delegate = restmapper.NewDiscoveryRESTMapper(gr) | ||
return nil | ||
} | ||
|
||
// reloadOnError checks if an error indicates that the delegated RESTMapper needs to be | ||
// reloaded, and if so, reloads it and returns true. | ||
func (drm *DynamicRESTMapper) reloadOnError(err error) bool { | ||
if _, matches := err.(*meta.NoKindMatchError); !matches { | ||
return false | ||
} | ||
err = drm.reload() | ||
if err != nil { | ||
utilruntime.HandleError(err) | ||
} | ||
return err == nil | ||
} | ||
|
||
// KindFor returns the kind by GroupVersionResource | ||
func (drm *DynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { | ||
gvk, err := drm.delegate.KindFor(resource) | ||
if drm.reloadOnError(err) { | ||
gvk, err = drm.delegate.KindFor(resource) | ||
} | ||
return gvk, err | ||
} | ||
|
||
// KindsFor returns kinds by GroupVersionResource | ||
func (drm *DynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) { | ||
gvks, err := drm.delegate.KindsFor(resource) | ||
if drm.reloadOnError(err) { | ||
gvks, err = drm.delegate.KindsFor(resource) | ||
} | ||
return gvks, err | ||
} | ||
|
||
// ResourceFor returns resource by GroupVersionResource | ||
func (drm *DynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) { | ||
gvr, err := drm.delegate.ResourceFor(input) | ||
if drm.reloadOnError(err) { | ||
gvr, err = drm.delegate.ResourceFor(input) | ||
} | ||
return gvr, err | ||
} | ||
|
||
// ResourcesFor returns resources by GroupVersionResource | ||
func (drm *DynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { | ||
gvrs, err := drm.delegate.ResourcesFor(input) | ||
if drm.reloadOnError(err) { | ||
gvrs, err = drm.delegate.ResourcesFor(input) | ||
} | ||
return gvrs, err | ||
} | ||
|
||
// RESTMapping returns RESTMapping from kind and versions | ||
func (drm *DynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) { | ||
m, err := drm.delegate.RESTMapping(gk, versions...) | ||
if drm.reloadOnError(err) { | ||
m, err = drm.delegate.RESTMapping(gk, versions...) | ||
} | ||
return m, err | ||
} | ||
|
||
// RESTMappings returns RESTMappings from kind and versions | ||
func (drm *DynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) { | ||
ms, err := drm.delegate.RESTMappings(gk, versions...) | ||
if drm.reloadOnError(err) { | ||
ms, err = drm.delegate.RESTMappings(gk, versions...) | ||
} | ||
return ms, err | ||
} | ||
|
||
// ResourceSingularizer returns resource singular | ||
func (drm *DynamicRESTMapper) ResourceSingularizer(resource string) (singular string, err error) { | ||
s, err := drm.delegate.ResourceSingularizer(resource) | ||
if drm.reloadOnError(err) { | ||
s, err = drm.delegate.ResourceSingularizer(resource) | ||
} | ||
return s, err | ||
} |