Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DO NOT MERGE] Demonstrate custom object JSON merge patch failure #885

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions kubernetes/client/apis/custom_objects_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1657,7 +1657,7 @@ def patch_cluster_custom_object_with_http_info(self, group, version, plural, nam

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down Expand Up @@ -1781,7 +1781,7 @@ def patch_cluster_custom_object_scale_with_http_info(self, group, version, plura

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down Expand Up @@ -1905,7 +1905,7 @@ def patch_cluster_custom_object_status_with_http_info(self, group, version, plur

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down Expand Up @@ -2036,7 +2036,7 @@ def patch_namespaced_custom_object_with_http_info(self, group, version, namespac

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down Expand Up @@ -2167,7 +2167,7 @@ def patch_namespaced_custom_object_scale_with_http_info(self, group, version, na

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down Expand Up @@ -2298,7 +2298,7 @@ def patch_namespaced_custom_object_status_with_http_info(self, group, version, n

# HTTP header `Content-Type`
header_params['Content-Type'] = self.api_client.\
select_header_content_type(['application/merge-patch+json'])
select_header_content_type(['application/json-patch+json', 'application/merge-patch+json'])

# Authentication setting
auth_settings = ['BearerToken']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +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

@property
Expand Down
62 changes: 62 additions & 0 deletions kubernetes/e2e_test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -234,3 +236,63 @@ 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}})
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={})