From 798218412b175d6efdbff9ecd3e88043816ea455 Mon Sep 17 00:00:00 2001 From: Haowei Cai Date: Tue, 13 Aug 2019 14:17:26 -0700 Subject: [PATCH 1/2] add e2e test for custom object operations --- kubernetes/e2e_test/test_client.py | 64 ++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/kubernetes/e2e_test/test_client.py b/kubernetes/e2e_test/test_client.py index 57000b9827..7528535e93 100644 --- a/kubernetes/e2e_test/test_client.py +++ b/kubernetes/e2e_test/test_client.py @@ -19,6 +19,8 @@ from kubernetes.client import api_client from kubernetes.client.apis import core_v1_api +from kubernetes.client.apis import apiextensions_v1beta1_api +from kubernetes.client.apis import custom_objects_api from kubernetes.e2e_test import base from kubernetes.stream import stream from kubernetes.stream.ws_client import ERROR_CHANNEL @@ -234,3 +236,65 @@ def test_node_apis(self): node = api.read_node(name=item.metadata.name) self.assertTrue(len(node.metadata.labels) > 0) self.assertTrue(isinstance(node.metadata.labels, dict)) + + def test_custom_objects_apis(self): + """ + It should be able to create and patch a namespaced custom object. + """ + client = api_client.ApiClient(configuration=self.config) + crd_api = apiextensions_v1beta1_api.ApiextensionsV1beta1Api(client) + cr_api = custom_objects_api.CustomObjectsApi(client) + + # create a CRD that defines a namespace-scoped custom resource Foo + # TODO: The test objects in this test file are unstructured. Verify + # if it makes more sense to switch to typed objects defined under + # kubernetes.client.models + group_prefix = 'test-crd-' + short_uuid() + group = group_prefix + '.test.e2e.com' + api_version = group + '/v1' + name = 'foos.' + group + test_crd = { + 'kind': 'CustomResourceDefinition', + 'apiVersion': 'apiextensions.k8s.io/v1beta1', + 'metadata': { + 'name': name, + }, + 'spec': { + 'group': group, + 'versions': [{ + 'name': 'v1', + 'served': True, + 'storage': True + }], + 'names': { + 'kind': 'Foo', + 'plural': 'foos' + }, + 'scope': 'Namespaced' + } + } + resp = crd_api.create_custom_resource_definition(body=test_crd) + self.assertEqual(name, resp.metadata.name) + print('E2E test CRD created') + + # wait for the CRD to be ready + time.sleep(5) + + # create a custom object + name = 'test-foo-' + short_uuid() + resp = cr_api.create_namespaced_custom_object(group=group, + version='v1', + plural='foos', + namespace='default', + body={'kind':'Foo', 'apiVersion':api_version, 'metadata':{'name':name}}) + self.assertEqual(name, resp.metadata.name) + print('E2E test CR created') + + # perform an emtpy JSON merge patch on the custom object + resp = cr_api.patch_namespaced_custom_object(group=group, + version='v1', + plural='foos', + namespace='default', + name=name, + body={}) + self.assertEqual(name, resp.metadata.name) From 433178b5e59b40f0d6fc02abe2f6df64d77166b5 Mon Sep 17 00:00:00 2001 From: Haowei Cai Date: Tue, 13 Aug 2019 16:57:08 -0700 Subject: [PATCH 2/2] workaround for CRD .status.conditions being required --- .../client/models/v1beta1_custom_resource_definition_status.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/kubernetes/client/models/v1beta1_custom_resource_definition_status.py b/kubernetes/client/models/v1beta1_custom_resource_definition_status.py index 4b10a8a619..b1fae7318c 100644 --- a/kubernetes/client/models/v1beta1_custom_resource_definition_status.py +++ b/kubernetes/client/models/v1beta1_custom_resource_definition_status.py @@ -101,8 +101,6 @@ def conditions(self, conditions): :param conditions: The conditions of this V1beta1CustomResourceDefinitionStatus. :type: list[V1beta1CustomResourceDefinitionCondition] """ - if conditions is None: - raise ValueError("Invalid value for `conditions`, must not be `None`") self._conditions = conditions