Closed abdulmi closed 2 years ago
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.
Hi @schallert, it seems that you worked on the validation stuff for m3db-operator. It would be great if you can give some pointers here. I tried to upgrade the apiextensions api to from v1beta
to v1
, also forked the dependency github.com/ant31/crd-validation to update the api there. However, after doing this and making the changes in this PR, the operator dies with the following schema validation errors:
{"level":"fatal","ts":"2022-06-13T17:26:17.230Z","msg":"error running controller","error":"could not create or update CRD: error creating CRD 'm3dbclusters.operator.m3db.io': CustomResourceDefinition.apiextensions.k8s.io \"m3dbclusters.operator.m3db.io\" is invalid: [spec.validation.openAPIV3Schema.properties[spec].properties[envVars].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[externalCoordinator].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[env].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[emptyDir].properties[sizeLimit].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[projected].properties[sources].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[namespaces].items.type: Required value: must not be empty for specified array items, spec.validation.openAPIV3Schema.properties[spec].properties[podIdentityConfig].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[env].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[emptyDir].properties[sizeLimit].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[projected].properties[sources].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields]","errorVerbose":"CustomResourceDefinition.apiextensions.k8s.io \"m3dbclusters.operator.m3db.io\" is invalid: [spec.validation.openAPIV3Schema.properties[spec].properties[envVars].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[externalCoordinator].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[env].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[initContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[emptyDir].properties[sizeLimit].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[initVolumes].items.properties[projected].properties[sources].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[namespaces].items.type: Required value: must not be empty for specified array items, spec.validation.openAPIV3Schema.properties[spec].properties[podIdentityConfig].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[env].items.properties[valueFrom].properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[postStart].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[lifecycle].properties[preStop].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[livenessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[readinessProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[httpGet].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[0].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].anyOf[1].type: Forbidden: must be empty to be structural, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarContainers].items.properties[startupProbe].properties[tcpSocket].properties[port].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[emptyDir].properties[sizeLimit].type: Required value: must not be empty for specified object fields, spec.validation.openAPIV3Schema.properties[spec].properties[sidecarVolumes].items.properties[projected].properties[sources].items.properties[downwardAPI].properties[items].items.properties[resourceFieldRef].properties[divisor].type: Required value: must not be empty for specified object fields]\nerror creating CRD 'm3dbclusters.operator.m3db.io'\ncould not create or update CRD"}
I looked at some fields from the error like divisor, and it does seem indeed that it doesn't have a type in the openapi generated code https://github.com/m3db/m3db-operator/blob/master/pkg/apis/m3dboperator/v1alpha1/openapi_generated.go#L9759-L9764. Should I try regenerating the schema or is there a bigger change that must be done ? I would appreciate any insights here, since this is my first time working with kubernetes operators and couldn't find much online
Handled by v0.14.0.
Issue: https://github.com/m3db/m3db-operator/issues/323
Switching from apiextensionsv1beta1 to apiextensionsv1 to make m3db-operator compatible with kubernetes 1.22 (kubernetes 1.21 has EOL in July 2022 in AKS :()