kubernetes-client icon indicating copy to clipboard operation
kubernetes-client copied to clipboard

CRD generator sporadically doesn't respect `storage`-field in `@Version` annotation

Open thomasdraebing opened this issue 2 years ago • 3 comments

Describe the bug

When multiple versions for a single CustomResource exist and all but one set storage = false in the @Version annotation, the generated CRD sometimes (~50 % of the time) contains multiple versions with storage: true, which is invalid.

Fabric8 Kubernetes Client version

6.6.2

Steps to reproduce

  1. Create a CustomResource with two versions:
@Version(value = "v1beta1", storage = false)
public class Rsrc extends CustomResource<Spec, Status> {}

#different package
@Version(value = "v1beta2", storage = true)
public class Rsrc extends CustomResource<Spec, Status> {}
  1. Generate CRDs

Expected behavior

The generated CRD only contains a single version where storage is true.

Runtime

other (please specify in additional context)

Kubernetes API Server version

other (please specify in additional context)

Environment

macOS

Fabric8 Kubernetes Client Logs

08:21:39.936 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'receivers.gerritoperator.google.com' version 'v1beta2' with com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver (spec: com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverSpec / status com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverStatus)...
08:21:40.433 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gitgcs.gerritoperator.google.com' version 'v1beta1' with com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc.GitGarbageCollection (spec: com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc.GitGarbageCollectionSpec / status com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc.GitGarbageCollectionStatus)...
08:21:40.505 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'receivers.gerritoperator.google.com' version 'v1beta1' with com.google.gerrit.k8s.operator.v1beta1.api.model.receiver.Receiver (spec: com.google.gerrit.k8s.operator.v1beta1.api.model.receiver.ReceiverSpec / status com.google.gerrit.k8s.operator.v1beta1.api.model.receiver.ReceiverStatus)...
08:21:40.949 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gitgcs.gerritoperator.google.com' version 'v1beta2' with com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection (spec: com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionSpec / status com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionStatus)...
08:21:41.017 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerritclusters.gerritoperator.google.com' version 'v1beta2' with com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster (spec: com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritClusterSpec / status com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritClusterStatus)...
08:21:41.597 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerritclusters.gerritoperator.google.com' version 'v1beta1' with com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritCluster (spec: com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritClusterSpec / status com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritClusterStatus)...
08:21:42.187 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerrits.gerritoperator.google.com' version 'v1beta1' with com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit (spec: com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritSpec / status com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritStatus)...
08:21:42.808 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerrits.gerritoperator.google.com' version 'v1beta2' with com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit (spec: com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritSpec / status com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritStatus)...
08:21:43.334 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerritnetworks.gerritoperator.google.com' version 'v1beta2' with com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork (spec: com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetworkSpec / status io.fabric8.kubernetes.api.model.Status)...
08:21:43.485 [INFO ] io.fabric8.crd.generator.CRDGenerator:154 [PID:24549] - Generating 'gerritnetworks.gerritoperator.google.com' version 'v1beta1' with com.google.gerrit.k8s.operator.v1beta1.api.model.network.GerritNetwork (spec: com.google.gerrit.k8s.operator.v1beta1.api.model.network.GerritNetworkSpec / status io.fabric8.kubernetes.api.model.Status)...

Additional context

Kubernetes provider: Gardener Kubernetes version: 1.26.7

thomasdraebing avatar Oct 11 '23 06:10 thomasdraebing

Hi @thomasdraebing and thanks for filing this issue!

I attempted to reproduce your issue here, and I think I'm hitting a slightly different(still not correct) behavior.

More specifically, when the 2 spec POJOs are identical I consistently get an exception in the tests:

 ZookeeperCustomResourceTest.testCrdv1beta1:56->lambda$testCrdv1beta1$1:57 NullPointer Cannot invoke "io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceValidation.getOpenAPIV3Schema()" because the return value of "io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionVersion.getSchema()" is null

If I add a random annotation on one of the fields(like the commented Max) the test consistently passes on my machine.

I think this is evidence enough that there are inconsistencies and, possibly, concurrency issues here.

I would be glad if @metacosm can take a peek at this one.

andreaTP avatar Oct 11 '23 09:10 andreaTP

As far as I remember @metacosm you were going to have a look. Feel free to unassign it if I was wrong. :)

sunix avatar Oct 17 '23 09:10 sunix

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[bot] avatar Jan 16 '24 00:01 stale[bot]

This should have been fixed by #5846.

The latest released version of the client should work as expected: https://github.com/fabric8io/kubernetes-client/releases/tag/v6.12.1

manusa avatar Apr 29 '24 08:04 manusa