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

Unable to use Default Kubernetes client to persist generic CRD data along with SharedInformer #5012

Closed
vamseeds opened this issue Mar 30, 2023 · 4 comments
Labels
status/stale Waiting on feedback Issues that require feedback from User/Other community members

Comments

@vamseeds
Copy link

Describe the bug

When Default Kubernetes client is used to persist CRD data everything is working fine.

Success Output :
GenericKubernetesResource(apiVersion=test.oracle.com/v1, kind=API, metadata=ObjectMeta(annotations=null, clusterName=null, creationTimestamp=2023-03-30T11:15:54Z, deletionGracePeriodSeconds=null, deletionTimestamp=null, finalizers=[], generateName=custom-api3, generation=1, labels={Ola=adiyeee}, managedFields=[ManagedFieldsEntry(apiVersion=test.oracle.com/v1, fieldsType=FieldsV1, fieldsV1=FieldsV1(additionalProperties={f:metadata={f:generateName={}, f:labels={.={}, f:Ola={}}}, f:spec={.={}, f:api-id={}, f:api-name={}, f:api-version={}}}), manager=okhttp, operation=Update, subresource=null, time=2023-03-30T11:15:54Z, additionalProperties={})], name=custom-api3sgcj4, namespace=dx-prod, ownerReferences=[], resourceVersion=109818214, selfLink=null, uid=b2397510-a80c-4809-9107-5df5576c5f64, additionalProperties={}), additionalProperties={spec={api-id=custom-103, api-name=custom-api3, api-version=v1}})

When Same Default Kubernetes client is used to persist CRD data along with Shared Informer usage its trying to locate the model class for the CRD and expecting sundrio builder pattern to exist on the model class

Error Output : Exception in thread "main" io.fabric8.kubernetes.client.KubernetesClientException: Cannot edit com.oracle.k8sedit.api.API with visitors, no builder was found at io.fabric8.kubernetes.client.ResourceHandlerImpl.edit(ResourceHandlerImpl.java:59) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableImpl.acceptVisitors(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableImpl.java:245) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.lambda$getItems$1(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:87) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.getItems(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:89) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.getOperations(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:93) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.get(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:196) at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.get(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:54) at com.oracle.k8sedit.TestK8S.extracted(TestK8S.java:69) at com.oracle.k8sedit.TestK8S.main(TestK8S.java:32)

Fabric8 Kubernetes Client version

5.12.4

Steps to reproduce

  1. Checkout Sample project from here : https://github.com/vamseeds/k8sedit and build it
  2. Apply 010-api-crd.yml file from resources folder to k8s .
  3. Run TestK8S2.java it will use Default Kubernetes client to persist sample api data in resources folder and it will be success
  4. Run TestK8S.java . Now this will first try to print the api data using informers and then when it try to persist the sample data using Default Kubernetes client it will fail giving above mentioned error

Expected behavior

Defaultkubernetesclient should not look for model classes and should persist the generic resource like in TestK8S code.

Runtime

Kubernetes (vanilla)

Kubernetes API Server version

1.24

Environment

Windows, Linux

Fabric8 Kubernetes Client Logs

Mar 30, 2023 4:46:11 PM com.oracle.k8sedit.AbstractCRDRepository startSyncIfNeeded
INFO: API sync started
Mar 30, 2023 4:46:13 PM com.oracle.k8sedit.InformerResourceHandler waitForSync
INFO: Sync for type com.oracle.k8sedit.api.API completed
Mar 30, 2023 4:46:15 PM com.oracle.k8sedit.InformerResourceHandler establishWatch
INFO: Watch established for type com.oracle.k8sedit.api.API.
API{metadata=ObjectMeta(annotations=null, clusterName=null, creationTimestamp=2023-03-30T11:15:54Z, deletionGracePeriodSeconds=null, deletionTimestamp=null, finalizers=[], generateName=custom-api3, generation=1, labels={Ola=adiyeee}, managedFields=[ManagedFieldsEntry(apiVersion=test.oracle.com/v1, fieldsType=FieldsV1, fieldsV1=FieldsV1(additionalProperties={f:metadata={f:generateName={}, f:labels={.={}, f:Ola={}}}, f:spec={.={}, f:api-id={}, f:api-name={}, f:api-version={}}}), manager=okhttp, operation=Update, subresource=null, time=2023-03-30T11:15:54Z, additionalProperties={})], name=custom-api3sgcj4, namespace=dx-prod, ownerReferences=[], resourceVersion=109818214, selfLink=null, uid=b2397510-a80c-4809-9107-5df5576c5f64, additionalProperties={}), spec=APISpec{apiName='custom-api3', apiId='custom-103', apiVersion='v1'}}
API{metadata=ObjectMeta(annotations=null, clusterName=null, creationTimestamp=2023-03-30T11:15:54Z, deletionGracePeriodSeconds=null, deletionTimestamp=null, finalizers=[], generateName=null, generation=1, labels={Ola=adiyeee}, managedFields=[ManagedFieldsEntry(apiVersion=test.oracle.com/v1, fieldsType=FieldsV1, fieldsV1=FieldsV1(additionalProperties={f:metadata={f:labels={.={}, f:Ola={}}}, f:spec={.={}, f:api-id={}, f:api-name={}, f:api-version={}}}), manager=okhttp, operation=Update, subresource=null, time=2023-03-30T11:15:54Z, additionalProperties={})], name=sundrio-test-api4, namespace=dx-prod, ownerReferences=[], resourceVersion=109818215, selfLink=null, uid=5b60d791-dad1-467e-910f-388e0f0c1aa6, additionalProperties={}), spec=APISpec{apiName='sundrio-test-api', apiId='sndr-001', apiVersion='v1'}}
API{metadata=ObjectMeta(annotations=null, clusterName=null, creationTimestamp=2023-03-30T11:15:55Z, deletionGracePeriodSeconds=null, deletionTimestamp=null, finalizers=[], generateName=null, generation=1, labels={Ola=adiyeee}, managedFields=[ManagedFieldsEntry(apiVersion=test.oracle.com/v1, fieldsType=FieldsV1, fieldsV1=FieldsV1(additionalProperties={f:metadata={f:labels={.={}, f:Ola={}}}, f:spec={.={}, f:api-id={}, f:api-name={}, f:api-version={}}}), manager=okhttp, operation=Update, subresource=null, time=2023-03-30T11:15:55Z, additionalProperties={})], name=sundrio-test-api5, namespace=dx-prod, ownerReferences=[], resourceVersion=109818217, selfLink=null, uid=a063d531-d76c-47fe-a683-6873f0d7fbe2, additionalProperties={}), spec=APISpec{apiName='sundrio-test-api', apiId='sndr-001', apiVersion='v1'}}
Exception in thread "main" io.fabric8.kubernetes.client.KubernetesClientException: Cannot edit com.oracle.k8sedit.api.API with visitors, no builder was found
	at io.fabric8.kubernetes.client.ResourceHandlerImpl.edit(ResourceHandlerImpl.java:59)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableImpl.acceptVisitors(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableImpl.java:245)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.lambda$getItems$1(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:87)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.getItems(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:89)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.getOperations(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:93)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.get(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:196)
	at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.get(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:54)
	at com.oracle.k8sedit.TestK8S.extracted(TestK8S.java:69)
	at com.oracle.k8sedit.TestK8S.main(TestK8S.java:32)

Additional context

No response

@shawkins
Copy link
Contributor

There are a couple things going on here. The specific error with not finding a builder addressed in later versions - the fix for #4590 removed the requirement of using a builder for simple operations.

Run TestK8S.java . Now this will first try to print the api data using informers and then when it try to persist the sample data using Default Kubernetes client it will fail giving above mentioned error

With older versions a side effect of using the typed dsl was the registration of the type with the deserialization logic. That no longer happens, so your later deserialization would use a generic type instead.

@vamseeds
Copy link
Author

Can you share the starting version which helps to overcome this

@shawkins
Copy link
Contributor

The change to the static registration was done under #3972 for 6.3.0. But you should generally use the latest release if possible.

@manusa manusa added the Waiting on feedback Issues that require feedback from User/Other community members label Apr 4, 2023
@stale
Copy link

stale bot commented Jul 3, 2023

This issue has been automatically marked as stale because it has not had any activity since 90 days. It will be closed if no further activity occurs within 7 days. Thank you for your contributions!

@stale stale bot added the status/stale label Jul 3, 2023
@stale stale bot closed this as completed Jul 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status/stale Waiting on feedback Issues that require feedback from User/Other community members
Projects
None yet
Development

No branches or pull requests

3 participants