diff --git a/operator/v1/tests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml b/operator/v1/tests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml index f0b8c4daa85..5e942ec9818 100644 --- a/operator/v1/tests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml +++ b/operator/v1/tests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml @@ -23,7 +23,7 @@ tests: status: nodeStatuses: - nodeName: a - targetRevision: 1 + targetRevision: 0 - nodeName: b targetRevision: 0 - nodeName: c @@ -50,7 +50,7 @@ tests: status: nodeStatuses: - nodeName: a - currentRevision: 3 + currentRevision: 0 updated: | apiVersion: operator.openshift.io/v1 kind: KubeAPIServer @@ -58,9 +58,12 @@ tests: status: nodeStatuses: - nodeName: a - currentRevision: 2 + currentRevision: -1 expectedStatusError: "status.nodeStatuses[0].currentRevision: Invalid value: \"integer\": must only increase" - name: Should reject clearing currentRevision + initialCRDPatches: + - op: remove + path: /spec/versions/0/schema/openAPIV3Schema/properties/status/properties/nodeStatuses/items/properties/currentRevision/x-kubernetes-validations/1 initial: | apiVersion: operator.openshift.io/v1 kind: KubeAPIServer @@ -77,3 +80,62 @@ tests: nodeStatuses: - nodeName: a expectedStatusError: "status.nodeStatuses[0].currentRevision: Invalid value: \"object\": cannot be unset once set" + - name: Should reject setting new nodeStatus with a non-zero currentRevision + initial: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: [] + updated: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: + - nodeName: a + currentRevision: 3 + expectedStatusError: "status.nodeStatuses[0].currentRevision: Invalid value: \"integer\": must be set to 0 on creation" + - name: Should reject setting new nodeStatus with a non-zero targetRevision + initial: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: [] + updated: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: + - nodeName: a + targetRevision: 3 + expectedStatusError: "status.nodeStatuses[0].targetRevision: Invalid value: \"integer\": must be set to 0 on creation" + - name: Should allow adding nodes with name only + initial: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: + - nodeName: a + updated: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: {} # No spec is required for a KubeAPIServer + status: + nodeStatuses: + - nodeName: a + - nodeName: b + expected: | + apiVersion: operator.openshift.io/v1 + kind: KubeAPIServer + spec: + logLevel: Normal + operatorLogLevel: Normal + status: + nodeStatuses: + - nodeName: a + - nodeName: b + diff --git a/operator/v1/types.go b/operator/v1/types.go index 0b20a34651c..2cbceae3a3c 100644 --- a/operator/v1/types.go +++ b/operator/v1/types.go @@ -264,13 +264,13 @@ type NodeStatus struct { NodeName string `json:"nodeName"` // currentRevision is the generation of the most recently successful deployment. - // It must be set to 0 on creation. Updates must only increase the value. + // If set on creation, it must be set to 0. Updates must only increase the value. // +kubebuilder:validation:XValidation:rule="self >= oldSelf",message="must only increase" // +kubebuilder:validation:XValidation:rule="oldSelf.hasValue() || self == 0",message="must be set to 0 on creation",optionalOldSelf=true - // +required + // +optional CurrentRevision int32 `json:"currentRevision"` // targetRevision is the generation of the deployment we're trying to apply. - // It must be set to 0 on creation. + // If set on creation, it must be set to 0. // +kubebuilder:validation:XValidation:rule="oldSelf.hasValue() || self == 0",message="must be set to 0 on creation",optionalOldSelf=true // +optional TargetRevision int32 `json:"targetRevision,omitempty"` diff --git a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml index fafd4a901d1..9687efad061 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml index 49f923e20d6..75577af1ead 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-Default.crd.yaml @@ -293,7 +293,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml index 052666ebbaf..9cbf6c4149c 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml index 5291396eb88..ed8dc471e63 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml index 9f049d18679..43f1724e8ed 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml @@ -275,7 +275,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml index 6ece031eeb7..7283cdd229a 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml @@ -284,7 +284,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml b/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml index 95603ed710d..8106b3a921c 100644 --- a/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml +++ b/operator/v1/zz_generated.crd-manifests/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml @@ -275,7 +275,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/AAA_ungated.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/AAA_ungated.yaml index 1e8358b2646..fe23c1e5e08 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/AAA_ungated.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/AAA_ungated.yaml @@ -280,7 +280,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/EtcdBackendQuota.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/EtcdBackendQuota.yaml index 766f8653b4c..9f4707b6160 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/EtcdBackendQuota.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/EtcdBackendQuota.yaml @@ -293,7 +293,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/HardwareSpeed.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/HardwareSpeed.yaml index 64951a075c8..00b02c6bb39 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/HardwareSpeed.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/etcds.operator.openshift.io/HardwareSpeed.yaml @@ -293,7 +293,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml index f290de54e92..de9967bc8e5 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/kubeapiservers.operator.openshift.io/AAA_ungated.yaml @@ -276,7 +276,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/kubecontrollermanagers.operator.openshift.io/AAA_ungated.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/kubecontrollermanagers.operator.openshift.io/AAA_ungated.yaml index 2d469fd270a..1a900833a1e 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/kubecontrollermanagers.operator.openshift.io/AAA_ungated.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/kubecontrollermanagers.operator.openshift.io/AAA_ungated.yaml @@ -285,7 +285,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/operator/v1/zz_generated.featuregated-crd-manifests/kubeschedulers.operator.openshift.io/AAA_ungated.yaml b/operator/v1/zz_generated.featuregated-crd-manifests/kubeschedulers.operator.openshift.io/AAA_ungated.yaml index 174147f8f4d..e05bb1546ee 100644 --- a/operator/v1/zz_generated.featuregated-crd-manifests/kubeschedulers.operator.openshift.io/AAA_ungated.yaml +++ b/operator/v1/zz_generated.featuregated-crd-manifests/kubeschedulers.operator.openshift.io/AAA_ungated.yaml @@ -276,7 +276,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml index fafd4a901d1..9687efad061 100644 --- a/payload-manifests/crds/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_12_etcd_01_etcds-CustomNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_12_etcd_01_etcds-Default.crd.yaml b/payload-manifests/crds/0000_12_etcd_01_etcds-Default.crd.yaml index 49f923e20d6..75577af1ead 100644 --- a/payload-manifests/crds/0000_12_etcd_01_etcds-Default.crd.yaml +++ b/payload-manifests/crds/0000_12_etcd_01_etcds-Default.crd.yaml @@ -293,7 +293,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml index 052666ebbaf..9cbf6c4149c 100644 --- a/payload-manifests/crds/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_12_etcd_01_etcds-DevPreviewNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml index 5291396eb88..ed8dc471e63 100644 --- a/payload-manifests/crds/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_12_etcd_01_etcds-TechPreviewNoUpgrade.crd.yaml @@ -306,7 +306,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml b/payload-manifests/crds/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml index 9f049d18679..43f1724e8ed 100644 --- a/payload-manifests/crds/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml +++ b/payload-manifests/crds/0000_20_kube-apiserver_01_kubeapiservers.crd.yaml @@ -275,7 +275,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml b/payload-manifests/crds/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml index 6ece031eeb7..7283cdd229a 100644 --- a/payload-manifests/crds/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml +++ b/payload-manifests/crds/0000_25_kube-controller-manager_01_kubecontrollermanagers.crd.yaml @@ -284,7 +284,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: diff --git a/payload-manifests/crds/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml b/payload-manifests/crds/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml index 95603ed710d..8106b3a921c 100644 --- a/payload-manifests/crds/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml +++ b/payload-manifests/crds/0000_25_kube-scheduler_01_kubeschedulers.crd.yaml @@ -275,7 +275,6 @@ spec: optionalOldSelf: true rule: oldSelf.hasValue() || self == 0 required: - - currentRevision - nodeName type: object x-kubernetes-validations: