Skip to content

Commit e0c1bcb

Browse files
committed
Extract API version retrieval logic into reusable method
1 parent 25879ef commit e0c1bcb

File tree

1 file changed

+37
-31
lines changed

1 file changed

+37
-31
lines changed

manifest/test/helper/kubernetes/kubernetes_helper.go

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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
2929
type Helper struct {
30-
client dynamic.Interface
30+
dynClient dynamic.Interface
31+
restClient *rest.RESTClient
3132
}
3233

3334
type 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
108120
func (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
118130
func (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

Comments
 (0)