@@ -16,18 +16,19 @@ import (
1616 "k8s.io/apimachinery/pkg/runtime/serializer"
1717 "k8s.io/apimachinery/pkg/version"
1818 "k8s.io/client-go/dynamic"
19- "k8s.io/client-go/kubernetes/scheme"
2019 "k8s.io/client-go/rest"
2120 "k8s.io/client-go/tools/clientcmd"
2221 k8sretry "k8s.io/client-go/util/retry"
22+ "k8s.io/kubectl/pkg/scheme"
2323
2424 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525)
2626
2727// Helper is a Kubernetes dynamic client wrapped with a set of helper functions
2828// for making assertions about API resources
2929type Helper struct {
30- client dynamic.Interface
30+ dynClient dynamic.Interface
31+ restClient * rest.RESTClient
3132}
3233
3334type apiVersionResponse struct {
@@ -47,19 +48,30 @@ func NewHelper() *Helper {
4748 config = & rest.Config {}
4849 }
4950
50- // print API server version to log output
51- // also serves as validation for client config
52- logAPIVersion (config )
53-
5451 client , err := dynamic .NewForConfig (config )
5552 if err != nil {
5653 //lintignore:R009
5754 panic (err )
5855 }
5956
60- return & Helper {
61- client : client ,
57+ codec := runtime.NoopEncoder {Decoder : scheme .Codecs .UniversalDecoder ()}
58+ config .NegotiatedSerializer = serializer .NegotiatedSerializerWrapper (runtime.SerializerInfo {Serializer : codec })
59+
60+ rc , err := rest .UnversionedRESTClientFor (config )
61+ if err != nil {
62+ //lintignore:R009
63+ panic (err )
6264 }
65+
66+ h := Helper {
67+ dynClient : client ,
68+ restClient : rc ,
69+ }
70+ // print API server version to log output
71+ // also serves as validation for client config
72+ h .logAPIVersion ()
73+
74+ return & h
6375}
6476
6577// CreateNamespace creates a new namespace
@@ -76,7 +88,7 @@ func (k *Helper) CreateNamespace(t *testing.T, name string) {
7688 },
7789 }
7890 gvr := NewGroupVersionResource ("v1" , "namespaces" )
79- _ , err := k .client .Resource (gvr ).Create (context .TODO (), namespace , metav1.CreateOptions {})
91+ _ , err := k .dynClient .Resource (gvr ).Create (context .TODO (), namespace , metav1.CreateOptions {})
8092 if err != nil {
8193 t .Fatalf ("Failed to create namespace %q: %v" , name , err )
8294 }
@@ -98,7 +110,7 @@ func (k *Helper) CreateConfigMap(t *testing.T, name string, namespace string, da
98110 },
99111 }
100112 gvr := NewGroupVersionResource ("v1" , "configmaps" )
101- _ , err := k .client .Resource (gvr ).Namespace (namespace ).Create (context .TODO (), cfgmap , metav1.CreateOptions {})
113+ _ , err := k .dynClient .Resource (gvr ).Namespace (namespace ).Create (context .TODO (), cfgmap , metav1.CreateOptions {})
102114 if err != nil {
103115 t .Fatalf ("Failed to create configmap %q/%q: %v" , namespace , name , err )
104116 }
@@ -108,7 +120,7 @@ func (k *Helper) CreateConfigMap(t *testing.T, name string, namespace string, da
108120func (k * Helper ) DeleteResource (t * testing.T , name string , gvr schema.GroupVersionResource ) {
109121 t .Helper ()
110122
111- err := k .client .Resource (gvr ).Delete (context .TODO (), name , metav1.DeleteOptions {})
123+ err := k .dynClient .Resource (gvr ).Delete (context .TODO (), name , metav1.DeleteOptions {})
112124 if err != nil {
113125 t .Fatalf ("Failed to delete resource %q: %v" , name , err )
114126 }
@@ -118,7 +130,7 @@ func (k *Helper) DeleteResource(t *testing.T, name string, gvr schema.GroupVersi
118130func (k * Helper ) DeleteNamespacedResource (t * testing.T , name string , namespace string , gvr schema.GroupVersionResource ) {
119131 t .Helper ()
120132
121- err := k .client .Resource (gvr ).Namespace (namespace ).Delete (context .TODO (), name , metav1.DeleteOptions {})
133+ err := k .dynClient .Resource (gvr ).Namespace (namespace ).Delete (context .TODO (), name , metav1.DeleteOptions {})
122134 if err != nil {
123135 t .Fatalf ("Failed to delete resource \" %s/%s\" : %v" , namespace , name , err )
124136 }
@@ -137,7 +149,7 @@ func (k *Helper) AssertNamespacedResourceExists(t *testing.T, gv, resource, name
137149 gvr := NewGroupVersionResource (gv , resource )
138150
139151 op := func () error {
140- _ , operr := k .client .Resource (gvr ).Namespace (namespace ).Get (context .TODO (), name , metav1.GetOptions {})
152+ _ , operr := k .dynClient .Resource (gvr ).Namespace (namespace ).Get (context .TODO (), name , metav1.GetOptions {})
141153 return operr
142154 }
143155
@@ -161,7 +173,7 @@ func (k *Helper) AssertResourceExists(t *testing.T, gv, resource, name string) {
161173 gvr := NewGroupVersionResource (gv , resource )
162174
163175 op := func () error {
164- _ , operr := k .client .Resource (gvr ).Get (context .TODO (), name , metav1.GetOptions {})
176+ _ , operr := k .dynClient .Resource (gvr ).Get (context .TODO (), name , metav1.GetOptions {})
165177 return operr
166178 }
167179 err := k8sretry .OnError (k8sretry .DefaultBackoff , func (e error ) bool {
@@ -186,10 +198,10 @@ func (k *Helper) AssertResourceGeneration(t *testing.T, gv, resource, namespace,
186198 var res * unstructured.Unstructured
187199 var operr error
188200 if namespace != "" {
189- res , operr = k .client .Resource (gvr ).Namespace (namespace ).Get (
201+ res , operr = k .dynClient .Resource (gvr ).Namespace (namespace ).Get (
190202 context .TODO (), name , metav1.GetOptions {})
191203 } else {
192- res , operr = k .client .Resource (gvr ).Get (context .TODO (),
204+ res , operr = k .dynClient .Resource (gvr ).Get (context .TODO (),
193205 name , metav1.GetOptions {})
194206 }
195207
@@ -223,7 +235,7 @@ func (k *Helper) AssertNamespacedResourceDoesNotExist(t *testing.T, gv, resource
223235 gvr := NewGroupVersionResource (gv , resource )
224236
225237 op := func () error {
226- _ , operr := k .client .Resource (gvr ).Namespace (namespace ).Get (context .TODO (), name , metav1.GetOptions {})
238+ _ , operr := k .dynClient .Resource (gvr ).Namespace (namespace ).Get (context .TODO (), name , metav1.GetOptions {})
227239 if errors .IsNotFound (operr ) {
228240 return nil
229241 }
@@ -249,7 +261,7 @@ func (k *Helper) AssertResourceDoesNotExist(t *testing.T, gv, resource, name str
249261 gvr := NewGroupVersionResource (gv , resource )
250262
251263 op := func () error {
252- _ , operr := k .client .Resource (gvr ).Get (context .TODO (), name , metav1.GetOptions {})
264+ _ , operr := k .dynClient .Resource (gvr ).Get (context .TODO (), name , metav1.GetOptions {})
253265 if errors .IsNotFound (operr ) {
254266 return nil
255267 }
@@ -280,25 +292,19 @@ func isErrorRetriable(e error) bool {
280292 return true
281293}
282294
283- func logAPIVersion (config * rest.Config ) {
284- codec := runtime.NoopEncoder {Decoder : scheme .Codecs .UniversalDecoder ()}
285- config .NegotiatedSerializer = serializer .NegotiatedSerializerWrapper (runtime.SerializerInfo {Serializer : codec })
286- rc , err := rest .UnversionedRESTClientFor (config )
287- if err != nil {
288- //lintignore:R009
289- panic (err )
290- }
291- apiVer , err := rc .Get ().AbsPath ("/version" ).DoRaw (context .Background ())
295+ func (k * Helper ) logAPIVersion () {
296+ log .Printf ("Testing against Kubernetes API version: %s" , k .ClusterVersion ().String ())
297+ }
298+
299+ func (k * Helper ) ClusterVersion () (vInfo version.Info ) {
300+ apiVer , err := k .restClient .Get ().AbsPath ("/version" ).DoRaw (context .Background ())
292301 if err != nil {
293302 log .Printf ("API version check responded with error: %s" , err )
294303 return
295304 }
296- var vInfo version.Info
297305 err = json .Unmarshal (apiVer , & vInfo )
298306 if err != nil {
299307 log .Printf ("Failed to decode API version block: %s" , err )
300- return
301308 }
302- log .Printf ("Testing against Kubernetes API version: %s" , vInfo .String ())
303-
309+ return
304310}
0 commit comments