diff --git a/config/v1alpha1/tests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml b/config/v1alpha1/tests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml
new file mode 100644
index 00000000000..de75bb4485f
--- /dev/null
+++ b/config/v1alpha1/tests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml
@@ -0,0 +1,80 @@
+apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this
+name: "ControllerManager"
+crdName: controllermanagers.config.openshift.io
+featureGates:
+ - DisableForceDetachOnTimeout
+tests:
+ onCreate:
+ - name: Should be able to create with default values
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout:
+ expected: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Enabled
+ - name: Should be able to create with force detach enabled
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Enabled
+ expected: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Enabled
+ - name: Should be able to create with force detach disabled
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Disabled
+ expected: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Disabled
+ - name: Should reject unsupported value of forceDetachOnTimeout
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: INVALID
+ expectedError: "spec.forceDetachOnTimeout: Unsupported value: \"INVALID\": supported values: \"Enabled\", \"Disabled\""
+ onUpdate:
+ - name: Enabled to Disabled
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Enabled
+ updated: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Disabled
+ expected: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Disabled
+ - name: Disabled to default value
+ initial: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Disabled
+ updated: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout:
+ expected: |
+ apiVersion: config.openshift.io/v1alpha1
+ kind: ControllerManager
+ spec:
+ forceDetachOnTimeout: Enabled
diff --git a/config/v1alpha1/types_controllermanager.go b/config/v1alpha1/types_controllermanager.go
new file mode 100644
index 00000000000..d73d1d2c86f
--- /dev/null
+++ b/config/v1alpha1/types_controllermanager.go
@@ -0,0 +1,76 @@
+package v1alpha1
+
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+// +genclient
+// +genclient:nonNamespaced
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// ControllerManager holds cluster-wide config information to run the Kubernetes controller manager
+// and influence its placement decisions. The canonical name for this config is `cluster`.
+//
+// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+// +openshift:compatibility-gen:level=4
+// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2668
+// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:path=controllermanagers,scope=Cluster
+// +kubebuilder:subresource:status
+// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true
+// +openshift:enable:FeatureGate=DisableForceDetachOnTimeout
+type ControllerManager struct {
+ metav1.TypeMeta `json:",inline"`
+
+ // metadata is the standard object's metadata.
+ // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
+ // +optional
+ metav1.ObjectMeta `json:"metadata,omitzero"`
+ // spec holds user settable values for configuration
+ // +required
+ Spec ControllerManagerSpec `json:"spec,omitzero"`
+ // status holds observed values from the cluster. They may not be overridden.
+ // +optional
+ Status ControllerManagerStatus `json:"status,omitzero"`
+}
+
+// ControllerManagerSpec defines the desired state of the Kubernetes controller manager
+// +kubebuilder:validation:MinProperties=1
+type ControllerManagerSpec struct {
+ // forceDetachOnTimeout expresses whether to allow kube-controller-manager
+ // to force detach volumes when unmount takes longer than the timeout.
+ // Valid values are Enabled and Disabled. If omitted, the default is Enabled.
+ // +default="Enabled"
+ // +optional
+ ForceDetachOnTimeout ForceDetachOnTimeoutPolicy `json:"forceDetachOnTimeout,omitempty"`
+}
+
+// +kubebuilder:validation:Enum=Enabled;Disabled
+type ForceDetachOnTimeoutPolicy string
+
+const (
+ // ForceDetachOnTimeoutEnabled will allow kube-controller-manager to
+ // force detach volumes based on maximum unmount time and node status.
+ ForceDetachOnTimeoutEnabled ForceDetachOnTimeoutPolicy = "Enabled"
+ // ForceDetachOnTimeoutDisabled will prevent kube-controller-manager
+ // from force detaching volumes.
+ ForceDetachOnTimeoutDisabled ForceDetachOnTimeoutPolicy = "Disabled"
+)
+
+// ControllerManagerStatus defines the observed state of the Kubernetes controller manager
+// +kubebuilder:validation:MinProperties=1
+type ControllerManagerStatus struct {
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+// +openshift:compatibility-gen:level=4
+type ControllerManagerList struct {
+ metav1.TypeMeta `json:",inline"`
+
+ // metadata is the standard list's metadata.
+ // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
+ metav1.ListMeta `json:"metadata"`
+
+ Items []ControllerManager `json:"items"`
+}
diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-CustomNoUpgrade.crd.yaml
new file mode 100644
index 00000000000..c782c83cf8c
--- /dev/null
+++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-CustomNoUpgrade.crd.yaml
@@ -0,0 +1,73 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.openshift.io: https://github.com/openshift/api/pull/2668
+ api.openshift.io/merged-by-featuregates: "true"
+ include.release.openshift.io/ibm-cloud-managed: "true"
+ include.release.openshift.io/self-managed-high-availability: "true"
+ release.openshift.io/bootstrap-required: "true"
+ release.openshift.io/feature-set: CustomNoUpgrade
+ name: controllermanagers.config.openshift.io
+spec:
+ group: config.openshift.io
+ names:
+ kind: ControllerManager
+ listKind: ControllerManagerList
+ plural: controllermanagers
+ singular: controllermanager
+ scope: Cluster
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ ControllerManager holds cluster-wide config information to run the Kubernetes controller manager
+ and influence its placement decisions. The canonical name for this config is `cluster`.
+
+ Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec holds user settable values for configuration
+ minProperties: 1
+ properties:
+ forceDetachOnTimeout:
+ default: Enabled
+ description: |-
+ forceDetachOnTimeout expresses whether to allow kube-controller-manager
+ to force detach volumes when unmount takes longer than the timeout.
+ Valid values are Enabled and Disabled. If omitted, the default is Enabled.
+ enum:
+ - Enabled
+ - Disabled
+ type: string
+ type: object
+ status:
+ description: status holds observed values from the cluster. They may not
+ be overridden.
+ minProperties: 1
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-DevPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-DevPreviewNoUpgrade.crd.yaml
new file mode 100644
index 00000000000..88e2c38c966
--- /dev/null
+++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-DevPreviewNoUpgrade.crd.yaml
@@ -0,0 +1,73 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.openshift.io: https://github.com/openshift/api/pull/2668
+ api.openshift.io/merged-by-featuregates: "true"
+ include.release.openshift.io/ibm-cloud-managed: "true"
+ include.release.openshift.io/self-managed-high-availability: "true"
+ release.openshift.io/bootstrap-required: "true"
+ release.openshift.io/feature-set: DevPreviewNoUpgrade
+ name: controllermanagers.config.openshift.io
+spec:
+ group: config.openshift.io
+ names:
+ kind: ControllerManager
+ listKind: ControllerManagerList
+ plural: controllermanagers
+ singular: controllermanager
+ scope: Cluster
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ ControllerManager holds cluster-wide config information to run the Kubernetes controller manager
+ and influence its placement decisions. The canonical name for this config is `cluster`.
+
+ Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec holds user settable values for configuration
+ minProperties: 1
+ properties:
+ forceDetachOnTimeout:
+ default: Enabled
+ description: |-
+ forceDetachOnTimeout expresses whether to allow kube-controller-manager
+ to force detach volumes when unmount takes longer than the timeout.
+ Valid values are Enabled and Disabled. If omitted, the default is Enabled.
+ enum:
+ - Enabled
+ - Disabled
+ type: string
+ type: object
+ status:
+ description: status holds observed values from the cluster. They may not
+ be overridden.
+ minProperties: 1
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-TechPreviewNoUpgrade.crd.yaml
new file mode 100644
index 00000000000..e6a6997a612
--- /dev/null
+++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-TechPreviewNoUpgrade.crd.yaml
@@ -0,0 +1,73 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.openshift.io: https://github.com/openshift/api/pull/2668
+ api.openshift.io/merged-by-featuregates: "true"
+ include.release.openshift.io/ibm-cloud-managed: "true"
+ include.release.openshift.io/self-managed-high-availability: "true"
+ release.openshift.io/bootstrap-required: "true"
+ release.openshift.io/feature-set: TechPreviewNoUpgrade
+ name: controllermanagers.config.openshift.io
+spec:
+ group: config.openshift.io
+ names:
+ kind: ControllerManager
+ listKind: ControllerManagerList
+ plural: controllermanagers
+ singular: controllermanager
+ scope: Cluster
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ ControllerManager holds cluster-wide config information to run the Kubernetes controller manager
+ and influence its placement decisions. The canonical name for this config is `cluster`.
+
+ Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec holds user settable values for configuration
+ minProperties: 1
+ properties:
+ forceDetachOnTimeout:
+ default: Enabled
+ description: |-
+ forceDetachOnTimeout expresses whether to allow kube-controller-manager
+ to force detach volumes when unmount takes longer than the timeout.
+ Valid values are Enabled and Disabled. If omitted, the default is Enabled.
+ enum:
+ - Enabled
+ - Disabled
+ type: string
+ type: object
+ status:
+ description: status holds observed values from the cluster. They may not
+ be overridden.
+ minProperties: 1
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
diff --git a/config/v1alpha1/zz_generated.deepcopy.go b/config/v1alpha1/zz_generated.deepcopy.go
index 9ead6aba26b..54aeebccbcb 100644
--- a/config/v1alpha1/zz_generated.deepcopy.go
+++ b/config/v1alpha1/zz_generated.deepcopy.go
@@ -412,6 +412,99 @@ func (in *ContainerResource) DeepCopy() *ContainerResource {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerManager) DeepCopyInto(out *ControllerManager) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ out.Spec = in.Spec
+ out.Status = in.Status
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerManager.
+func (in *ControllerManager) DeepCopy() *ControllerManager {
+ if in == nil {
+ return nil
+ }
+ out := new(ControllerManager)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ControllerManager) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerManagerList) DeepCopyInto(out *ControllerManagerList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]ControllerManager, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerManagerList.
+func (in *ControllerManagerList) DeepCopy() *ControllerManagerList {
+ if in == nil {
+ return nil
+ }
+ out := new(ControllerManagerList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ControllerManagerList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerManagerSpec) DeepCopyInto(out *ControllerManagerSpec) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerManagerSpec.
+func (in *ControllerManagerSpec) DeepCopy() *ControllerManagerSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(ControllerManagerSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ControllerManagerStatus) DeepCopyInto(out *ControllerManagerStatus) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControllerManagerStatus.
+func (in *ControllerManagerStatus) DeepCopy() *ControllerManagerStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ControllerManagerStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EtcdBackupSpec) DeepCopyInto(out *EtcdBackupSpec) {
*out = *in
diff --git a/config/v1alpha1/zz_generated.featuregated-crd-manifests.yaml b/config/v1alpha1/zz_generated.featuregated-crd-manifests.yaml
index 2f79f801dd4..cd0ae5cd201 100644
--- a/config/v1alpha1/zz_generated.featuregated-crd-manifests.yaml
+++ b/config/v1alpha1/zz_generated.featuregated-crd-manifests.yaml
@@ -69,6 +69,30 @@ clustermonitorings.config.openshift.io:
- ClusterMonitoringConfig
Version: v1alpha1
+controllermanagers.config.openshift.io:
+ Annotations:
+ release.openshift.io/bootstrap-required: "true"
+ ApprovedPRNumber: https://github.com/openshift/api/pull/2668
+ CRDName: controllermanagers.config.openshift.io
+ Capability: ""
+ Category: ""
+ FeatureGates:
+ - DisableForceDetachOnTimeout
+ FilenameOperatorName: config-operator
+ FilenameOperatorOrdering: "01"
+ FilenameRunLevel: "0000_10"
+ GroupName: config.openshift.io
+ HasStatus: true
+ KindName: ControllerManager
+ Labels: {}
+ PluralName: controllermanagers
+ PrinterColumns: []
+ Scope: Cluster
+ ShortNames: null
+ TopLevelFeatureGates:
+ - DisableForceDetachOnTimeout
+ Version: v1alpha1
+
imagepolicies.config.openshift.io:
Annotations: {}
ApprovedPRNumber: https://github.com/openshift/api/pull/1457
diff --git a/config/v1alpha1/zz_generated.featuregated-crd-manifests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml b/config/v1alpha1/zz_generated.featuregated-crd-manifests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml
new file mode 100644
index 00000000000..fab6a22a712
--- /dev/null
+++ b/config/v1alpha1/zz_generated.featuregated-crd-manifests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml
@@ -0,0 +1,73 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ api-approved.openshift.io: https://github.com/openshift/api/pull/2668
+ api.openshift.io/filename-cvo-runlevel: "0000_10"
+ api.openshift.io/filename-operator: config-operator
+ api.openshift.io/filename-ordering: "01"
+ feature-gate.release.openshift.io/DisableForceDetachOnTimeout: "true"
+ release.openshift.io/bootstrap-required: "true"
+ name: controllermanagers.config.openshift.io
+spec:
+ group: config.openshift.io
+ names:
+ kind: ControllerManager
+ listKind: ControllerManagerList
+ plural: controllermanagers
+ singular: controllermanager
+ scope: Cluster
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: |-
+ ControllerManager holds cluster-wide config information to run the Kubernetes controller manager
+ and influence its placement decisions. The canonical name for this config is `cluster`.
+
+ Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec holds user settable values for configuration
+ minProperties: 1
+ properties:
+ forceDetachOnTimeout:
+ default: Enabled
+ description: |-
+ forceDetachOnTimeout expresses whether to allow kube-controller-manager
+ to force detach volumes when unmount takes longer than the timeout.
+ Valid values are Enabled and Disabled. If omitted, the default is Enabled.
+ enum:
+ - Enabled
+ - Disabled
+ type: string
+ type: object
+ status:
+ description: status holds observed values from the cluster. They may not
+ be overridden.
+ minProperties: 1
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
diff --git a/config/v1alpha1/zz_generated.swagger_doc_generated.go b/config/v1alpha1/zz_generated.swagger_doc_generated.go
index 59a5b370856..62f42be4558 100644
--- a/config/v1alpha1/zz_generated.swagger_doc_generated.go
+++ b/config/v1alpha1/zz_generated.swagger_doc_generated.go
@@ -226,6 +226,43 @@ func (UserDefinedMonitoring) SwaggerDoc() map[string]string {
return map_UserDefinedMonitoring
}
+var map_ControllerManager = map[string]string{
+ "": "ControllerManager holds cluster-wide config information to run the Kubernetes controller manager and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ "spec": "spec holds user settable values for configuration",
+ "status": "status holds observed values from the cluster. They may not be overridden.",
+}
+
+func (ControllerManager) SwaggerDoc() map[string]string {
+ return map_ControllerManager
+}
+
+var map_ControllerManagerList = map[string]string{
+ "": "Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+}
+
+func (ControllerManagerList) SwaggerDoc() map[string]string {
+ return map_ControllerManagerList
+}
+
+var map_ControllerManagerSpec = map[string]string{
+ "": "ControllerManagerSpec defines the desired state of the Kubernetes controller manager",
+ "forceDetachOnTimeout": "forceDetachOnTimeout expresses whether to allow kube-controller-manager to force detach volumes when unmount takes longer than the timeout. Valid values are Enabled and Disabled. If omitted, the default is Enabled.",
+}
+
+func (ControllerManagerSpec) SwaggerDoc() map[string]string {
+ return map_ControllerManagerSpec
+}
+
+var map_ControllerManagerStatus = map[string]string{
+ "": "ControllerManagerStatus defines the observed state of the Kubernetes controller manager",
+}
+
+func (ControllerManagerStatus) SwaggerDoc() map[string]string {
+ return map_ControllerManagerStatus
+}
+
var map_ImagePolicy = map[string]string{
"": "ImagePolicy holds namespace-wide configuration for image signature verification\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
"metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
diff --git a/features.md b/features.md
index feed2f307d2..48da9c00eb4 100644
--- a/features.md
+++ b/features.md
@@ -41,6 +41,7 @@
| ClusterVersionOperatorConfiguration| | | Enabled | Enabled | | | Enabled | Enabled |
| ConfigurablePKI| | | Enabled | Enabled | | | Enabled | Enabled |
| DNSNameResolver| | | Enabled | Enabled | | | Enabled | Enabled |
+| DisableForceDetachOnTimeout| | | Enabled | Enabled | | | Enabled | Enabled |
| DualReplica| | | Enabled | Enabled | | | Enabled | Enabled |
| DyanmicServiceEndpointIBMCloud| | | Enabled | Enabled | | | Enabled | Enabled |
| EVPN| | | Enabled | Enabled | | | Enabled | Enabled |
diff --git a/features/features.go b/features/features.go
index 73e90c07618..28dcadae399 100644
--- a/features/features.go
+++ b/features/features.go
@@ -978,4 +978,12 @@ var (
enhancementPR("https://github.com/openshift/enhancements/pull/1465").
enableIn(configv1.DevPreviewNoUpgrade).
mustRegister()
+
+ FeatureGateDisableForceDetachOnTimeout = newFeatureGate("DisableForceDetachOnTimeout").
+ reportProblemsToJiraComponent("Storage").
+ contactPerson("jdobson").
+ productScope(ocpSpecific).
+ enhancementPR("https://github.com/openshift/enhancements/pull/1935").
+ enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
+ mustRegister()
)
diff --git a/openapi/generated_openapi/zz_generated.openapi.go b/openapi/generated_openapi/zz_generated.openapi.go
index 83a9e5b0375..bcb815929ea 100644
--- a/openapi/generated_openapi/zz_generated.openapi.go
+++ b/openapi/generated_openapi/zz_generated.openapi.go
@@ -461,6 +461,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/openshift/api/config/v1alpha1.ClusterMonitoringSpec": schema_openshift_api_config_v1alpha1_ClusterMonitoringSpec(ref),
"github.com/openshift/api/config/v1alpha1.ClusterMonitoringStatus": schema_openshift_api_config_v1alpha1_ClusterMonitoringStatus(ref),
"github.com/openshift/api/config/v1alpha1.ContainerResource": schema_openshift_api_config_v1alpha1_ContainerResource(ref),
+ "github.com/openshift/api/config/v1alpha1.ControllerManager": schema_openshift_api_config_v1alpha1_ControllerManager(ref),
+ "github.com/openshift/api/config/v1alpha1.ControllerManagerList": schema_openshift_api_config_v1alpha1_ControllerManagerList(ref),
+ "github.com/openshift/api/config/v1alpha1.ControllerManagerSpec": schema_openshift_api_config_v1alpha1_ControllerManagerSpec(ref),
+ "github.com/openshift/api/config/v1alpha1.ControllerManagerStatus": schema_openshift_api_config_v1alpha1_ControllerManagerStatus(ref),
"github.com/openshift/api/config/v1alpha1.EtcdBackupSpec": schema_openshift_api_config_v1alpha1_EtcdBackupSpec(ref),
"github.com/openshift/api/config/v1alpha1.GatherConfig": schema_openshift_api_config_v1alpha1_GatherConfig(ref),
"github.com/openshift/api/config/v1alpha1.ImagePolicy": schema_openshift_api_config_v1alpha1_ImagePolicy(ref),
@@ -22991,6 +22995,139 @@ func schema_openshift_api_config_v1alpha1_ContainerResource(ref common.Reference
}
}
+func schema_openshift_api_config_v1alpha1_ControllerManager(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ControllerManager holds cluster-wide config information to run the Kubernetes controller manager and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Description: "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Description: "spec holds user settable values for configuration",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/openshift/api/config/v1alpha1.ControllerManagerSpec"),
+ },
+ },
+ "status": {
+ SchemaProps: spec.SchemaProps{
+ Description: "status holds observed values from the cluster. They may not be overridden.",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/openshift/api/config/v1alpha1.ControllerManagerStatus"),
+ },
+ },
+ },
+ Required: []string{"spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/openshift/api/config/v1alpha1.ControllerManagerSpec", "github.com/openshift/api/config/v1alpha1.ControllerManagerStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ }
+}
+
+func schema_openshift_api_config_v1alpha1_ControllerManagerList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Description: "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/openshift/api/config/v1alpha1.ControllerManager"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"metadata", "items"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/openshift/api/config/v1alpha1.ControllerManager", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_openshift_api_config_v1alpha1_ControllerManagerSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ControllerManagerSpec defines the desired state of the Kubernetes controller manager",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "forceDetachOnTimeout": {
+ SchemaProps: spec.SchemaProps{
+ Description: "forceDetachOnTimeout expresses whether to allow kube-controller-manager to force detach volumes when unmount takes longer than the timeout. Valid values are Enabled and Disabled. If omitted, the default is Enabled.",
+ Default: "Enabled",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_openshift_api_config_v1alpha1_ControllerManagerStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ControllerManagerStatus defines the observed state of the Kubernetes controller manager",
+ Type: []string{"object"},
+ },
+ },
+ }
+}
+
func schema_openshift_api_config_v1alpha1_EtcdBackupSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
diff --git a/openapi/openapi.json b/openapi/openapi.json
index ba45ba36dee..46fb154b1dd 100644
--- a/openapi/openapi.json
+++ b/openapi/openapi.json
@@ -12543,6 +12543,83 @@
}
}
},
+ "com.github.openshift.api.config.v1alpha1.ControllerManager": {
+ "description": "ControllerManager holds cluster-wide config information to run the Kubernetes controller manager and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ "type": "object",
+ "required": [
+ "spec"
+ ],
+ "properties": {
+ "apiVersion": {
+ "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ "type": "string"
+ },
+ "kind": {
+ "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ "type": "string"
+ },
+ "metadata": {
+ "description": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ "default": {},
+ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"
+ },
+ "spec": {
+ "description": "spec holds user settable values for configuration",
+ "default": {},
+ "$ref": "#/definitions/com.github.openshift.api.config.v1alpha1.ControllerManagerSpec"
+ },
+ "status": {
+ "description": "status holds observed values from the cluster. They may not be overridden.",
+ "default": {},
+ "$ref": "#/definitions/com.github.openshift.api.config.v1alpha1.ControllerManagerStatus"
+ }
+ }
+ },
+ "com.github.openshift.api.config.v1alpha1.ControllerManagerList": {
+ "description": "Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
+ "type": "object",
+ "required": [
+ "metadata",
+ "items"
+ ],
+ "properties": {
+ "apiVersion": {
+ "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ "type": "string"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "default": {},
+ "$ref": "#/definitions/com.github.openshift.api.config.v1alpha1.ControllerManager"
+ }
+ },
+ "kind": {
+ "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ "type": "string"
+ },
+ "metadata": {
+ "description": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ "default": {},
+ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"
+ }
+ }
+ },
+ "com.github.openshift.api.config.v1alpha1.ControllerManagerSpec": {
+ "description": "ControllerManagerSpec defines the desired state of the Kubernetes controller manager",
+ "type": "object",
+ "properties": {
+ "forceDetachOnTimeout": {
+ "description": "forceDetachOnTimeout expresses whether to allow kube-controller-manager to force detach volumes when unmount takes longer than the timeout. Valid values are Enabled and Disabled. If omitted, the default is Enabled.",
+ "type": "string",
+ "default": "Enabled"
+ }
+ }
+ },
+ "com.github.openshift.api.config.v1alpha1.ControllerManagerStatus": {
+ "description": "ControllerManagerStatus defines the observed state of the Kubernetes controller manager",
+ "type": "object"
+ },
"com.github.openshift.api.config.v1alpha1.EtcdBackupSpec": {
"description": "EtcdBackupSpec provides configuration for automated etcd backups to the cluster-etcd-operator",
"type": "object",
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
index e9ab2c71f85..d38d1228314 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml
@@ -93,6 +93,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
index 9d89a5fbb0b..a10f0117fcb 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
@@ -148,6 +148,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml b/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml
index 9254ff74cd1..94d9f4812e0 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml
@@ -95,6 +95,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
index a0aaa4af862..22358c7e20b 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
@@ -166,6 +166,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
index bb0c6114535..95dea2cb8ba 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml
@@ -93,6 +93,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
index 19cbcc48622..9c6bf7b62c0 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
@@ -130,6 +130,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml
index d01874b21c3..fbf0c67260f 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml
@@ -95,6 +95,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
index 4cdee108736..ba548fe74c6 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
@@ -148,6 +148,9 @@
{
"name": "DNSNameResolver"
},
+ {
+ "name": "DisableForceDetachOnTimeout"
+ },
{
"name": "DualReplica"
},