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

Commit

Permalink
Add custom resource tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fabianvf committed Jul 23, 2019
1 parent e80a4db commit 938ba98
Showing 1 changed file with 188 additions and 88 deletions.
276 changes: 188 additions & 88 deletions dynamic/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,120 +14,221 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import time
import unittest
import uuid

from kubernetes.e2e_test import base
from kubernetes.client import api_client
from kubernetes.dynamic import DynamicClient
from kubernetes.stream import stream
from kubernetes.stream.ws_client import ERROR_CHANNEL

from . import DynamicClient
from .exceptions import ResourceNotFoundError


def short_uuid():
id = str(uuid.uuid4())
return id[-12:]


class TestClient(unittest.TestCase):
class TestDynamicClient(unittest.TestCase):

@classmethod
def setUpClass(cls):
cls.config = base.get_e2e_configuration()

def test_pod_apis(self):
def test_cluster_custom_resources(self):
client = DynamicClient(api_client.ApiClient(configuration=self.config))
api = client.resources.get(api_version='v1', kind='Pod')

name = 'busybox-test-' + short_uuid()
pod_manifest = {
'apiVersion': 'v1',
'kind': 'Pod',
with self.assertRaises(ResourceNotFoundError):
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ClusterChangeMe')

crd_api = client.resources.get(kind='CustomResourceDefinition')
name = 'clusterchangemes.apps.example.com'
crd_manifest = {
'apiVersion': 'apiextensions.k8s.io/v1beta1',
'kind': 'CustomResourceDefinition',
'metadata': {
'name': name,
},
'spec': {
'group': 'apps.example.com',
'names': {
'kind': 'ClusterChangeMe',
'listKind': 'ClusterChangeMeList',
'plural': 'clusterchangemes',
'singular': 'clusterchangeme',
},
'scope': 'Cluster',
'version': 'v1',
'subresources': {
'status': {}
}
}
}
resp = crd_api.create(crd_manifest)

self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status)

resp = crd_api.get(
name=name,
)
self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status)

try:
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ClusterChangeMe')
except ResourceNotFoundError:
# Sometimes need to wait a sec for the discovery layer to get updated
time.sleep(2)
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ClusterChangeMe')
resp = changeme_api.get()
self.assertEqual(resp.items, [])
changeme_name = 'custom-resource' + short_uuid()
changeme_manifest = {
'apiVersion': 'apps.example.com/v1',
'kind': 'ClusterChangeMe',
'metadata': {
'name': changeme_name,
},
'spec': {}
}

resp = changeme_api.create(body=changeme_manifest)
self.assertEqual(resp.metadata.name, changeme_name)

resp = changeme_api.get(name=changeme_name)
self.assertEqual(resp.metadata.name, changeme_name)

changeme_manifest['spec']['size'] = 3
resp = changeme_api.patch(
body=changeme_manifest,
content_type='application/merge-patch+json'
)
self.assertEqual(resp.spec.size, 3)

resp = changeme_api.get(name=changeme_name)
self.assertEqual(resp.spec.size, 3)

resp = changeme_api.get()
self.assertEqual(len(resp.items), 1)

resp = changeme_api.delete(
name=changeme_name,
)

resp = changeme_api.get()
self.assertEqual(len(resp.items), 0)

resp = crd_api.delete(
name=name,
)

time.sleep(2)
client.resources.invalidate_cache()
with self.assertRaises(ResourceNotFoundError):
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ClusterChangeMe')

def test_namespaced_custom_resources(self):
client = DynamicClient(api_client.ApiClient(configuration=self.config))

with self.assertRaises(ResourceNotFoundError):
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ChangeMe')

crd_api = client.resources.get(kind='CustomResourceDefinition')
name = 'changemes.apps.example.com'
crd_manifest = {
'apiVersion': 'apiextensions.k8s.io/v1beta1',
'kind': 'CustomResourceDefinition',
'metadata': {
'name': name
'name': name,
},
'spec': {
'containers': [{
'image': 'busybox',
'name': 'sleep',
"args": [
"/bin/sh",
"-c",
"while true;do date;sleep 5; done"
]
}]
'group': 'apps.example.com',
'names': {
'kind': 'ChangeMe',
'listKind': 'ChangeMeList',
'plural': 'changemes',
'singular': 'changeme',
},
'scope': 'Namespaced',
'version': 'v1',
'subresources': {
'status': {}
}
}
}
resp = crd_api.create(crd_manifest)

resp = api.create(body=pod_manifest, namespace='default')
self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status.phase)

while True:
resp = api.get(name=name, namespace='default')
self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status.phase)
if resp.status.phase != 'Pending':
break
time.sleep(1)

exec_command = ['/bin/sh',
'-c',
'for i in $(seq 1 3); do date; done']
resp = stream(
api.subresources['exec'],
name,
'default',
command=exec_command,
stderr=False, stdin=False,
stdout=True, tty=False
self.assertTrue(resp.status)

resp = crd_api.get(
name=name,
)
self.assertEqual(name, resp.metadata.name)
self.assertTrue(resp.status)

try:
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ChangeMe')
except ResourceNotFoundError:
# Sometimes need to wait a sec for the discovery layer to get updated
time.sleep(2)
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ChangeMe')
resp = changeme_api.get()
self.assertEqual(resp.items, [])
changeme_name = 'custom-resource' + short_uuid()
changeme_manifest = {
'apiVersion': 'apps.example.com/v1',
'kind': 'ChangeMe',
'metadata': {
'name': changeme_name,
},
'spec': {}
}

resp = changeme_api.create(body=changeme_manifest, namespace='default')
self.assertEqual(resp.metadata.name, changeme_name)

resp = changeme_api.get(name=changeme_name, namespace='default')
self.assertEqual(resp.metadata.name, changeme_name)

changeme_manifest['spec']['size'] = 3
resp = changeme_api.patch(
body=changeme_manifest,
namespace='default',
content_type='application/merge-patch+json'
)
print('EXEC response : %s' % resp)
self.assertEqual(3, len(resp.splitlines()))

exec_command = 'uptime'
resp = stream(
api.subresources['exec'],
name,
'default',
command=exec_command,
stderr=False, stdin=False,
stdout=True, tty=False
self.assertEqual(resp.spec.size, 3)

resp = changeme_api.get(name=changeme_name, namespace='default')
self.assertEqual(resp.spec.size, 3)

resp = changeme_api.get(namespace='default')
self.assertEqual(len(resp.items), 1)

resp = changeme_api.get()
self.assertEqual(len(resp.items), 1)

resp = changeme_api.delete(
name=changeme_name,
namespace='default'
)
print('EXEC response : %s' % resp)
self.assertEqual(1, len(resp.splitlines()))

resp = stream(
api.subresources['exec'],
name,
'default',
command='/bin/sh',
stderr=False, stdin=False,
stdout=True, tty=False,
_preload_content=False

resp = changeme_api.get(namespace='default')
self.assertEqual(len(resp.items), 0)

resp = changeme_api.get()
self.assertEqual(len(resp.items), 0)

resp = crd_api.delete(
name=name,
)
resp.write_stdin("echo test string 1\n")
line = resp.readline_stdout(timeout=5)
self.assertFalse(resp.peek_stderr())
self.assertEqual("test string 1", line)
resp.write_stdin("echo test string 2 >&2\n")
line = resp.readline_stderr(timeout=5)
self.assertFalse(resp.peek_stdout())
self.assertEqual("test string 2", line)
resp.write_stdin("exit\n")
resp.update(timeout=5)
line = resp.read_channel(ERROR_CHANNEL)
status = json.loads(line)
self.assertEqual(status['status'], 'Success')
resp.update(timeout=5)
self.assertFalse(resp.is_open())

number_of_pods = len(api.get().items)
self.assertTrue(number_of_pods > 0)

resp = api.delete(name=name, body={}, namespace='default')

time.sleep(2)
client.resources.invalidate_cache()
with self.assertRaises(ResourceNotFoundError):
changeme_api = client.resources.get(api_version='apps.example.com/v1', kind='ChangeMe')

def test_service_apis(self):
client = DynamicClient(api_client.ApiClient(configuration=self.config))
Expand Down Expand Up @@ -242,14 +343,13 @@ def test_configmap_apis(self):
resp = api.delete(
name=name, body={}, namespace='default')

resp = api.get('default', pretty=True)
resp = api.get(namespace='default', pretty=True)
self.assertEqual([], resp.items)

def test_node_apis(self):
client = DynamicClient(api_client.ApiClient(configuration=self.config))
api = client.resources.get(api_version='v1', kind='Node')

for item in api.get().items:
node = api.read_node(name=item.metadata.name)
self.assertTrue(len(node.metadata.labels) > 0)
self.assertTrue(isinstance(node.metadata.labels, dict))
node = api.get(name=item.metadata.name)
self.assertTrue(len(dict(node.metadata.labels)) > 0)

0 comments on commit 938ba98

Please sign in to comment.