@@ -7,10 +7,6 @@ import (
77 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
88 "k8s.io/apimachinery/pkg/runtime/schema"
99 "k8s.io/apimachinery/pkg/util/yaml"
10- "k8s.io/client-go/discovery"
11- memory "k8s.io/client-go/discovery/cached"
12- "k8s.io/client-go/dynamic"
13- "k8s.io/client-go/restmapper"
1410 "regexp"
1511 "strings"
1612)
@@ -23,26 +19,18 @@ const (
2319)
2420
2521func (k * Kubernetes ) ResourcesList (ctx context.Context , gvk * schema.GroupVersionKind , namespace string ) (string , error ) {
26- client , err := dynamic .NewForConfig (k .cfg )
27- if err != nil {
28- return "" , err
29- }
3022 gvr , err := k .resourceFor (gvk )
3123 if err != nil {
3224 return "" , err
3325 }
34- rl , err := client .Resource (* gvr ).Namespace (namespace ).List (ctx , metav1.ListOptions {})
26+ rl , err := k . dynamicClient .Resource (* gvr ).Namespace (namespace ).List (ctx , metav1.ListOptions {})
3527 if err != nil {
3628 return "" , err
3729 }
3830 return marshal (rl .Items )
3931}
4032
4133func (k * Kubernetes ) ResourcesGet (ctx context.Context , gvk * schema.GroupVersionKind , namespace , name string ) (string , error ) {
42- client , err := dynamic .NewForConfig (k .cfg )
43- if err != nil {
44- return "" , err
45- }
4634 gvr , err := k .resourceFor (gvk )
4735 if err != nil {
4836 return "" , err
@@ -51,7 +39,7 @@ func (k *Kubernetes) ResourcesGet(ctx context.Context, gvk *schema.GroupVersionK
5139 if namespaced , nsErr := k .isNamespaced (gvk ); nsErr == nil && namespaced {
5240 namespace = namespaceOrDefault (namespace )
5341 }
54- rg , err := client .Resource (* gvr ).Namespace (namespace ).Get (ctx , name , metav1.GetOptions {})
42+ rg , err := k . dynamicClient .Resource (* gvr ).Namespace (namespace ).Get (ctx , name , metav1.GetOptions {})
5543 if err != nil {
5644 return "" , err
5745 }
@@ -73,10 +61,6 @@ func (k *Kubernetes) ResourcesCreateOrUpdate(ctx context.Context, resource strin
7361}
7462
7563func (k * Kubernetes ) ResourcesDelete (ctx context.Context , gvk * schema.GroupVersionKind , namespace , name string ) error {
76- client , err := dynamic .NewForConfig (k .cfg )
77- if err != nil {
78- return err
79- }
8064 gvr , err := k .resourceFor (gvk )
8165 if err != nil {
8266 return err
@@ -85,14 +69,10 @@ func (k *Kubernetes) ResourcesDelete(ctx context.Context, gvk *schema.GroupVersi
8569 if namespaced , nsErr := k .isNamespaced (gvk ); nsErr == nil && namespaced {
8670 namespace = namespaceOrDefault (namespace )
8771 }
88- return client .Resource (* gvr ).Namespace (namespace ).Delete (ctx , name , metav1.DeleteOptions {})
72+ return k . dynamicClient .Resource (* gvr ).Namespace (namespace ).Delete (ctx , name , metav1.DeleteOptions {})
8973}
9074
9175func (k * Kubernetes ) resourcesCreateOrUpdate (ctx context.Context , resources []* unstructured.Unstructured ) (string , error ) {
92- client , err := dynamic .NewForConfig (k .cfg )
93- if err != nil {
94- return "" , err
95- }
9676 for i , obj := range resources {
9777 gvk := obj .GroupVersionKind ()
9878 gvr , rErr := k .resourceFor (& gvk )
@@ -104,24 +84,21 @@ func (k *Kubernetes) resourcesCreateOrUpdate(ctx context.Context, resources []*u
10484 if namespaced , nsErr := k .isNamespaced (& gvk ); nsErr == nil && namespaced {
10585 namespace = namespaceOrDefault (namespace )
10686 }
107- resources [i ], rErr = client .Resource (* gvr ).Namespace (namespace ).Apply (ctx , obj .GetName (), obj , metav1.ApplyOptions {
87+ resources [i ], rErr = k . dynamicClient .Resource (* gvr ).Namespace (namespace ).Apply (ctx , obj .GetName (), obj , metav1.ApplyOptions {
10888 FieldManager : version .BinaryName ,
10989 })
11090 if rErr != nil {
11191 return "" , rErr
11292 }
93+ // Clear the cache to ensure the next operation is performed on the latest exposed APIs
94+ if gvk .Kind == "CustomResourceDefinition" {
95+ k .deferredDiscoveryRESTMapper .Reset ()
96+ }
11397 }
11498 return marshal (resources )
11599}
116100
117101func (k * Kubernetes ) resourceFor (gvk * schema.GroupVersionKind ) (* schema.GroupVersionResource , error ) {
118- if k .deferredDiscoveryRESTMapper == nil {
119- d , err := discovery .NewDiscoveryClientForConfig (k .cfg )
120- if err != nil {
121- return nil , err
122- }
123- k .deferredDiscoveryRESTMapper = restmapper .NewDeferredDiscoveryRESTMapper (memory .NewMemCacheClient (d ))
124- }
125102 m , err := k .deferredDiscoveryRESTMapper .RESTMapping (schema.GroupKind {Group : gvk .Group , Kind : gvk .Kind }, gvk .Version )
126103 if err != nil {
127104 return nil , err
@@ -130,11 +107,7 @@ func (k *Kubernetes) resourceFor(gvk *schema.GroupVersionKind) (*schema.GroupVer
130107}
131108
132109func (k * Kubernetes ) isNamespaced (gvk * schema.GroupVersionKind ) (bool , error ) {
133- d , err := discovery .NewDiscoveryClientForConfig (k .cfg )
134- if err != nil {
135- return false , err
136- }
137- apiResourceList , err := d .ServerResourcesForGroupVersion (gvk .GroupVersion ().String ())
110+ apiResourceList , err := k .discoveryClient .ServerResourcesForGroupVersion (gvk .GroupVersion ().String ())
138111 if err != nil {
139112 return false , err
140113 }
@@ -147,13 +120,8 @@ func (k *Kubernetes) isNamespaced(gvk *schema.GroupVersionKind) (bool, error) {
147120}
148121
149122func (k * Kubernetes ) supportsGroupVersion (groupVersion string ) bool {
150- d , err := discovery .NewDiscoveryClientForConfig (k .cfg )
151- if err != nil {
123+ if _ , err := k .discoveryClient .ServerResourcesForGroupVersion (groupVersion ); err != nil {
152124 return false
153125 }
154- _ , err = d .ServerResourcesForGroupVersion (groupVersion )
155- if err == nil {
156- return true
157- }
158- return false
126+ return true
159127}
0 commit comments