Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Commit 5b21d65

Browse files
committed
Add tests for dynamic client
1 parent 461a3bf commit 5b21d65

File tree

1 file changed

+362
-0
lines changed

1 file changed

+362
-0
lines changed

dynamic/test_client.py

+362
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
# -*- coding: utf-8 -*-
2+
3+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
# not use this file except in compliance with the License. You may obtain
5+
# a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
15+
import time
16+
import unittest
17+
import uuid
18+
19+
from kubernetes.e2e_test import base
20+
from kubernetes.client import api_client
21+
22+
from . import DynamicClient
23+
from .exceptions import ResourceNotFoundError
24+
25+
26+
def short_uuid():
27+
id = str(uuid.uuid4())
28+
return id[-12:]
29+
30+
31+
class TestDynamicClient(unittest.TestCase):
32+
33+
@classmethod
34+
def setUpClass(cls):
35+
cls.config = base.get_e2e_configuration()
36+
37+
def test_cluster_custom_resources(self):
38+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
39+
40+
with self.assertRaises(ResourceNotFoundError):
41+
changeme_api = client.resources.get(
42+
api_version='apps.example.com/v1', kind='ClusterChangeMe')
43+
44+
crd_api = client.resources.get(kind='CustomResourceDefinition')
45+
name = 'clusterchangemes.apps.example.com'
46+
crd_manifest = {
47+
'apiVersion': 'apiextensions.k8s.io/v1beta1',
48+
'kind': 'CustomResourceDefinition',
49+
'metadata': {
50+
'name': name,
51+
},
52+
'spec': {
53+
'group': 'apps.example.com',
54+
'names': {
55+
'kind': 'ClusterChangeMe',
56+
'listKind': 'ClusterChangeMeList',
57+
'plural': 'clusterchangemes',
58+
'singular': 'clusterchangeme',
59+
},
60+
'scope': 'Cluster',
61+
'version': 'v1',
62+
'subresources': {
63+
'status': {}
64+
}
65+
}
66+
}
67+
resp = crd_api.create(crd_manifest)
68+
69+
self.assertEqual(name, resp.metadata.name)
70+
self.assertTrue(resp.status)
71+
72+
resp = crd_api.get(
73+
name=name,
74+
)
75+
self.assertEqual(name, resp.metadata.name)
76+
self.assertTrue(resp.status)
77+
78+
try:
79+
changeme_api = client.resources.get(
80+
api_version='apps.example.com/v1', kind='ClusterChangeMe')
81+
except ResourceNotFoundError:
82+
# Need to wait a sec for the discovery layer to get updated
83+
time.sleep(2)
84+
changeme_api = client.resources.get(
85+
api_version='apps.example.com/v1', kind='ClusterChangeMe')
86+
resp = changeme_api.get()
87+
self.assertEqual(resp.items, [])
88+
changeme_name = 'custom-resource' + short_uuid()
89+
changeme_manifest = {
90+
'apiVersion': 'apps.example.com/v1',
91+
'kind': 'ClusterChangeMe',
92+
'metadata': {
93+
'name': changeme_name,
94+
},
95+
'spec': {}
96+
}
97+
98+
resp = changeme_api.create(body=changeme_manifest)
99+
self.assertEqual(resp.metadata.name, changeme_name)
100+
101+
resp = changeme_api.get(name=changeme_name)
102+
self.assertEqual(resp.metadata.name, changeme_name)
103+
104+
changeme_manifest['spec']['size'] = 3
105+
resp = changeme_api.patch(
106+
body=changeme_manifest,
107+
content_type='application/merge-patch+json'
108+
)
109+
self.assertEqual(resp.spec.size, 3)
110+
111+
resp = changeme_api.get(name=changeme_name)
112+
self.assertEqual(resp.spec.size, 3)
113+
114+
resp = changeme_api.get()
115+
self.assertEqual(len(resp.items), 1)
116+
117+
resp = changeme_api.delete(
118+
name=changeme_name,
119+
)
120+
121+
resp = changeme_api.get()
122+
self.assertEqual(len(resp.items), 0)
123+
124+
resp = crd_api.delete(
125+
name=name,
126+
)
127+
128+
time.sleep(2)
129+
client.resources.invalidate_cache()
130+
with self.assertRaises(ResourceNotFoundError):
131+
changeme_api = client.resources.get(
132+
api_version='apps.example.com/v1', kind='ClusterChangeMe')
133+
134+
def test_namespaced_custom_resources(self):
135+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
136+
137+
with self.assertRaises(ResourceNotFoundError):
138+
changeme_api = client.resources.get(
139+
api_version='apps.example.com/v1', kind='ChangeMe')
140+
141+
crd_api = client.resources.get(kind='CustomResourceDefinition')
142+
name = 'changemes.apps.example.com'
143+
crd_manifest = {
144+
'apiVersion': 'apiextensions.k8s.io/v1beta1',
145+
'kind': 'CustomResourceDefinition',
146+
'metadata': {
147+
'name': name,
148+
},
149+
'spec': {
150+
'group': 'apps.example.com',
151+
'names': {
152+
'kind': 'ChangeMe',
153+
'listKind': 'ChangeMeList',
154+
'plural': 'changemes',
155+
'singular': 'changeme',
156+
},
157+
'scope': 'Namespaced',
158+
'version': 'v1',
159+
'subresources': {
160+
'status': {}
161+
}
162+
}
163+
}
164+
resp = crd_api.create(crd_manifest)
165+
166+
self.assertEqual(name, resp.metadata.name)
167+
self.assertTrue(resp.status)
168+
169+
resp = crd_api.get(
170+
name=name,
171+
)
172+
self.assertEqual(name, resp.metadata.name)
173+
self.assertTrue(resp.status)
174+
175+
try:
176+
changeme_api = client.resources.get(
177+
api_version='apps.example.com/v1', kind='ChangeMe')
178+
except ResourceNotFoundError:
179+
# Need to wait a sec for the discovery layer to get updated
180+
time.sleep(2)
181+
changeme_api = client.resources.get(
182+
api_version='apps.example.com/v1', kind='ChangeMe')
183+
resp = changeme_api.get()
184+
self.assertEqual(resp.items, [])
185+
changeme_name = 'custom-resource' + short_uuid()
186+
changeme_manifest = {
187+
'apiVersion': 'apps.example.com/v1',
188+
'kind': 'ChangeMe',
189+
'metadata': {
190+
'name': changeme_name,
191+
},
192+
'spec': {}
193+
}
194+
195+
resp = changeme_api.create(body=changeme_manifest, namespace='default')
196+
self.assertEqual(resp.metadata.name, changeme_name)
197+
198+
resp = changeme_api.get(name=changeme_name, namespace='default')
199+
self.assertEqual(resp.metadata.name, changeme_name)
200+
201+
changeme_manifest['spec']['size'] = 3
202+
resp = changeme_api.patch(
203+
body=changeme_manifest,
204+
namespace='default',
205+
content_type='application/merge-patch+json'
206+
)
207+
self.assertEqual(resp.spec.size, 3)
208+
209+
resp = changeme_api.get(name=changeme_name, namespace='default')
210+
self.assertEqual(resp.spec.size, 3)
211+
212+
resp = changeme_api.get(namespace='default')
213+
self.assertEqual(len(resp.items), 1)
214+
215+
resp = changeme_api.get()
216+
self.assertEqual(len(resp.items), 1)
217+
218+
resp = changeme_api.delete(
219+
name=changeme_name,
220+
namespace='default'
221+
)
222+
223+
resp = changeme_api.get(namespace='default')
224+
self.assertEqual(len(resp.items), 0)
225+
226+
resp = changeme_api.get()
227+
self.assertEqual(len(resp.items), 0)
228+
229+
resp = crd_api.delete(
230+
name=name,
231+
)
232+
233+
time.sleep(2)
234+
client.resources.invalidate_cache()
235+
with self.assertRaises(ResourceNotFoundError):
236+
changeme_api = client.resources.get(
237+
api_version='apps.example.com/v1', kind='ChangeMe')
238+
239+
def test_service_apis(self):
240+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
241+
api = client.resources.get(api_version='v1', kind='Service')
242+
243+
name = 'frontend-' + short_uuid()
244+
service_manifest = {'apiVersion': 'v1',
245+
'kind': 'Service',
246+
'metadata': {'labels': {'name': name},
247+
'name': name,
248+
'resourceversion': 'v1'},
249+
'spec': {'ports': [{'name': 'port',
250+
'port': 80,
251+
'protocol': 'TCP',
252+
'targetPort': 80}],
253+
'selector': {'name': name}}}
254+
255+
resp = api.create(
256+
body=service_manifest,
257+
namespace='default'
258+
)
259+
self.assertEqual(name, resp.metadata.name)
260+
self.assertTrue(resp.status)
261+
262+
resp = api.get(
263+
name=name,
264+
namespace='default'
265+
)
266+
self.assertEqual(name, resp.metadata.name)
267+
self.assertTrue(resp.status)
268+
269+
service_manifest['spec']['ports'] = [{'name': 'new',
270+
'port': 8080,
271+
'protocol': 'TCP',
272+
'targetPort': 8080}]
273+
resp = api.patch(
274+
body=service_manifest,
275+
name=name,
276+
namespace='default'
277+
)
278+
self.assertEqual(2, len(resp.spec.ports))
279+
self.assertTrue(resp.status)
280+
281+
resp = api.delete(
282+
name=name, body={},
283+
namespace='default'
284+
)
285+
286+
def test_replication_controller_apis(self):
287+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
288+
api = client.resources.get(
289+
api_version='v1', kind='ReplicationController')
290+
291+
name = 'frontend-' + short_uuid()
292+
rc_manifest = {
293+
'apiVersion': 'v1',
294+
'kind': 'ReplicationController',
295+
'metadata': {'labels': {'name': name},
296+
'name': name},
297+
'spec': {'replicas': 2,
298+
'selector': {'name': name},
299+
'template': {'metadata': {
300+
'labels': {'name': name}},
301+
'spec': {'containers': [{
302+
'image': 'nginx',
303+
'name': 'nginx',
304+
'ports': [{'containerPort': 80,
305+
'protocol': 'TCP'}]}]}}}}
306+
307+
resp = api.create(
308+
body=rc_manifest, namespace='default')
309+
self.assertEqual(name, resp.metadata.name)
310+
self.assertEqual(2, resp.spec.replicas)
311+
312+
resp = api.get(
313+
name=name, namespace='default')
314+
self.assertEqual(name, resp.metadata.name)
315+
self.assertEqual(2, resp.spec.replicas)
316+
317+
resp = api.delete(
318+
name=name, body={}, namespace='default')
319+
320+
def test_configmap_apis(self):
321+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
322+
api = client.resources.get(api_version='v1', kind='ConfigMap')
323+
324+
name = 'test-configmap-' + short_uuid()
325+
test_configmap = {
326+
"kind": "ConfigMap",
327+
"apiVersion": "v1",
328+
"metadata": {
329+
"name": name,
330+
},
331+
"data": {
332+
"config.json": "{\"command\":\"/usr/bin/mysqld_safe\"}",
333+
"frontend.cnf": "[mysqld]\nbind-address = 10.0.0.3\n"
334+
}
335+
}
336+
337+
resp = api.create(
338+
body=test_configmap, namespace='default'
339+
)
340+
self.assertEqual(name, resp.metadata.name)
341+
342+
resp = api.get(
343+
name=name, namespace='default')
344+
self.assertEqual(name, resp.metadata.name)
345+
346+
test_configmap['data']['config.json'] = "{}"
347+
resp = api.patch(
348+
name=name, namespace='default', body=test_configmap)
349+
350+
resp = api.delete(
351+
name=name, body={}, namespace='default')
352+
353+
resp = api.get(namespace='default', pretty=True)
354+
self.assertEqual([], resp.items)
355+
356+
def test_node_apis(self):
357+
client = DynamicClient(api_client.ApiClient(configuration=self.config))
358+
api = client.resources.get(api_version='v1', kind='Node')
359+
360+
for item in api.get().items:
361+
node = api.get(name=item.metadata.name)
362+
self.assertTrue(len(dict(node.metadata.labels)) > 0)

0 commit comments

Comments
 (0)