kubernetes-client / csharp

Officially supported dotnet Kubernetes Client library
Apache License 2.0
1.1k stars 295 forks source link

KubernetesJson.Serialize fails due to null JsonSerializerInfo for V1Patch #1587

Closed hwoodiwiss closed 5 days ago

hwoodiwiss commented 1 month ago

Describe the bug It looks like SourceGenerationContext lacks JSON serialization metadata for the V1Patch type, which causes patch requests to fail in AOT scenarios.

Kubernetes C# SDK Client Version 15.0.1

Server Kubernetes Version 1.30.0

Dotnet Runtime Version net9.0, though this is likely reproducible across AOT compatible TFM's

To Reproduce Attempt to patch some k8s config using one of the Patch... methods on the Kubernetes client that takes V1Patch while using the Kubernetes.Aot package.

Expected behavior Configuration to update successfully.

Where do you run your app with Kubernetes SDK (please complete the following information):

Additional context

I've fixed this in a local version of the package by just adding a second JsonSerializerContext just for V1Patch, and in KubernetesJson.Serialize checking both contexts for type info (commit):

var info = SourceGenerationContext.Default.GetTypeInfo(value.GetType()) ?? LocalSgContext.Default.GetTypeInfo(value.GetType());

I appreciate this is a suboptimal solution. Unfortunately I get build errors adding V1Patch to SourceGenerationContext.

tg123 commented 1 month ago

this is a known issue, Patch is not supported in AOT at the moment :(

hwoodiwiss commented 1 month ago

I've only seen the use case so far where the body of the V1Patch object is already a JSON string. In that case, I think it would be viable to special case it and skip serialization altogether, and just return the body as string, that would enable some level of support in AOT scenarios.

It would be good to get some level of patch support into the AOT version of the library.

If that sounds reasonable, I would be happy to contribute.

hwoodiwiss commented 1 month ago

I've raised https://github.com/kubernetes-client/csharp/pull/1588, I've tested this and it works in the AOT project I'm working on