@@ -23,7 +23,6 @@ import (
2323 "context"
2424 "testing"
2525
26- "github.com/stretchr/testify/require"
2726 k8serrors "k8s.io/apimachinery/pkg/api/errors"
2827 "k8s.io/apimachinery/pkg/api/meta"
2928 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -34,6 +33,8 @@ import (
3433 "k8s.io/client-go/dynamic"
3534 "k8s.io/client-go/kubernetes"
3635 "k8s.io/client-go/restmapper"
36+
37+ "github.com/stretchr/testify/require"
3738)
3839
3940type DynamicResourceLoader struct {
@@ -56,60 +57,10 @@ func NewDynamicResourceLoader(context context.Context, t *testing.T) DynamicReso
5657 }
5758}
5859
59- func (d DynamicResourceLoader ) noErrorSkipExists (err error ) {
60- if ! k8serrors .IsAlreadyExists (err ) {
61- require .NoError (d .t , err )
62- }
63- }
64-
65- func (d DynamicResourceLoader ) noErrorSkipNotExisting (err error ) {
66- if ! k8serrors .IsNotFound (err ) {
67- require .NoError (d .t , err )
68- }
69- }
70-
71- func (d DynamicResourceLoader ) do (do doFunc , assetFunc func (name string ) ([]byte , error ), filename string , overrideNamespace string ) {
72- b , err := assetFunc (filename )
73- require .NoError (d .t , err )
74-
75- decoder := yamlutil .NewYAMLOrJSONDecoder (bytes .NewReader (b ), 1024 )
76- var rawObj runtime.RawExtension
77- err = decoder .Decode (& rawObj )
78- require .NoError (d .t , err )
79-
80- obj , gvk , err := yaml .NewDecodingSerializer (unstructured .UnstructuredJSONScheme ).Decode (rawObj .Raw , nil , nil )
81- require .NoError (d .t , err )
82-
83- unstructuredMap , err := runtime .DefaultUnstructuredConverter .ToUnstructured (obj )
84- require .NoError (d .t , err )
85-
86- unstructuredObj := & unstructured.Unstructured {Object : unstructuredMap }
87-
88- gr , err := restmapper .GetAPIGroupResources (d .KubeClient .Discovery ())
89- require .NoError (d .t , err )
90-
91- mapper := restmapper .NewDiscoveryRESTMapper (gr )
92- mapping , err := mapper .RESTMapping (gvk .GroupKind (), gvk .Version )
93- require .NoError (d .t , err )
94-
95- var dri dynamic.ResourceInterface
96- if mapping .Scope .Name () == meta .RESTScopeNameNamespace {
97- if overrideNamespace != "" {
98- unstructuredObj .SetNamespace (overrideNamespace )
99- }
100- require .NotEmpty (d .t , unstructuredObj .GetNamespace (), "Namespace can not be empty!" )
101- dri = d .DynamicClient .Resource (mapping .Resource ).Namespace (unstructuredObj .GetNamespace ())
102- } else {
103- dri = d .DynamicClient .Resource (mapping .Resource )
104- }
105-
106- do (d .t , unstructuredObj , dri )
107- }
108-
10960func (d DynamicResourceLoader ) DeleteFromFile (assetFunc func (name string ) ([]byte , error ), filename string , overrideNamespace string ) {
11061 d .t .Logf ("Deleting resource %v\n " , filename )
11162 deleteFunc := func (t * testing.T , unstructured * unstructured.Unstructured , dynamicResourceInterface dynamic.ResourceInterface ) {
112- err := dynamicResourceInterface .Delete (context . Background () , unstructured .GetName (), metav1.DeleteOptions {})
63+ err := dynamicResourceInterface .Delete (d . context , unstructured .GetName (), metav1.DeleteOptions {})
11364 d .noErrorSkipNotExisting (err )
11465 }
11566
@@ -120,7 +71,7 @@ func (d DynamicResourceLoader) DeleteFromFile(assetFunc func(name string) ([]byt
12071func (d DynamicResourceLoader ) CreateFromFile (assetFunc func (name string ) ([]byte , error ), filename string , overrideNamespace string ) {
12172 d .t .Logf ("Creating resource %v\n " , filename )
12273 createFunc := func (t * testing.T , unstructured * unstructured.Unstructured , dynamicResourceInterface dynamic.ResourceInterface ) {
123- _ , err := dynamicResourceInterface .Create (context . Background () , unstructured , metav1.CreateOptions {})
74+ _ , err := dynamicResourceInterface .Create (d . context , unstructured , metav1.CreateOptions {})
12475 d .noErrorSkipExists (err )
12576 }
12677
@@ -142,31 +93,86 @@ func (d DynamicResourceLoader) CreateFromUnstructured(unstructuredObj *unstructu
14293// Use from Ginkgo tests with Expect(err).NotTo(HaveOccurred()) to see the actual API error on failure.
14394func (d DynamicResourceLoader ) CreateFromUnstructuredReturnErr (unstructuredObj * unstructured.Unstructured , overrideNamespace string ) error {
14495 dri := d .getResourceInterface (unstructuredObj , overrideNamespace )
145- _ , err := dri .Create (context . Background () , unstructuredObj , metav1.CreateOptions {})
96+ _ , err := dri .Create (d . context , unstructuredObj , metav1.CreateOptions {})
14697 return err
14798}
14899
149100// DeleteFromUnstructured deletes a resource by name. For cluster-scoped resources, namespace is ignored.
150101func (d DynamicResourceLoader ) DeleteFromUnstructured (unstructuredObj * unstructured.Unstructured , overrideNamespace string ) {
151102 dri := d .getResourceInterface (unstructuredObj , overrideNamespace )
152- err := dri .Delete (context .Background (), unstructuredObj .GetName (), metav1.DeleteOptions {})
153- d .noErrorSkipNotExisting (err )
154- d .t .Logf ("Resource %s deleted\n " , unstructuredObj .GetName ())
103+ err := dri .Delete (d .context , unstructuredObj .GetName (), metav1.DeleteOptions {})
104+ if err != nil && ! k8serrors .IsNotFound (err ) {
105+ require .NoError (d .t , err )
106+ }
107+ if err == nil || k8serrors .IsNotFound (err ) {
108+ d .t .Logf ("Resource %s deleted\n " , unstructuredObj .GetName ())
109+ }
155110}
156111
157112func (d DynamicResourceLoader ) getResourceInterface (unstructuredObj * unstructured.Unstructured , overrideNamespace string ) dynamic.ResourceInterface {
158- gvk := unstructuredObj .GroupVersionKind ()
113+ objCopy := unstructuredObj .DeepCopy ()
114+ gvk := objCopy .GroupVersionKind ()
159115 gr , err := restmapper .GetAPIGroupResources (d .KubeClient .Discovery ())
160116 require .NoError (d .t , err )
161117 mapper := restmapper .NewDiscoveryRESTMapper (gr )
162118 mapping , err := mapper .RESTMapping (gvk .GroupKind (), gvk .Version )
163119 require .NoError (d .t , err )
164120 if mapping .Scope .Name () == meta .RESTScopeNameNamespace {
165121 if overrideNamespace != "" {
166- unstructuredObj .SetNamespace (overrideNamespace )
122+ objCopy .SetNamespace (overrideNamespace )
167123 }
168- require .NotEmpty (d .t , unstructuredObj .GetNamespace (), "Namespace can not be empty for namespaced resource" )
169- return d .DynamicClient .Resource (mapping .Resource ).Namespace (unstructuredObj .GetNamespace ())
124+ require .NotEmpty (d .t , objCopy .GetNamespace (), "Namespace can not be empty for namespaced resource" )
125+ return d .DynamicClient .Resource (mapping .Resource ).Namespace (objCopy .GetNamespace ())
170126 }
171127 return d .DynamicClient .Resource (mapping .Resource )
172128}
129+
130+ func (d DynamicResourceLoader ) noErrorSkipExists (err error ) {
131+ if ! k8serrors .IsAlreadyExists (err ) {
132+ require .NoError (d .t , err )
133+ }
134+ }
135+
136+ func (d DynamicResourceLoader ) noErrorSkipNotExisting (err error ) {
137+ if ! k8serrors .IsNotFound (err ) {
138+ require .NoError (d .t , err )
139+ }
140+ }
141+
142+ func (d DynamicResourceLoader ) do (do doFunc , assetFunc func (name string ) ([]byte , error ), filename string , overrideNamespace string ) {
143+ b , err := assetFunc (filename )
144+ require .NoError (d .t , err )
145+
146+ decoder := yamlutil .NewYAMLOrJSONDecoder (bytes .NewReader (b ), 1024 )
147+ var rawObj runtime.RawExtension
148+ err = decoder .Decode (& rawObj )
149+ require .NoError (d .t , err )
150+
151+ obj , gvk , err := yaml .NewDecodingSerializer (unstructured .UnstructuredJSONScheme ).Decode (rawObj .Raw , nil , nil )
152+ require .NoError (d .t , err )
153+
154+ unstructuredMap , err := runtime .DefaultUnstructuredConverter .ToUnstructured (obj )
155+ require .NoError (d .t , err )
156+
157+ unstructuredObj := & unstructured.Unstructured {Object : unstructuredMap }
158+
159+ gr , err := restmapper .GetAPIGroupResources (d .KubeClient .Discovery ())
160+ require .NoError (d .t , err )
161+
162+ mapper := restmapper .NewDiscoveryRESTMapper (gr )
163+ mapping , err := mapper .RESTMapping (gvk .GroupKind (), gvk .Version )
164+ require .NoError (d .t , err )
165+
166+ var dri dynamic.ResourceInterface
167+ if mapping .Scope .Name () == meta .RESTScopeNameNamespace {
168+ if overrideNamespace != "" {
169+ unstructuredObj .SetNamespace (overrideNamespace )
170+ }
171+ require .NotEmpty (d .t , unstructuredObj .GetNamespace (), "Namespace can not be empty!" )
172+ dri = d .DynamicClient .Resource (mapping .Resource ).Namespace (unstructuredObj .GetNamespace ())
173+ } else {
174+ dri = d .DynamicClient .Resource (mapping .Resource )
175+ }
176+
177+ do (d .t , unstructuredObj , dri )
178+ }
0 commit comments