From 80eaa4190e444cdf0debb65fa196345444ce5b2f Mon Sep 17 00:00:00 2001 From: Jonathan Dobson Date: Fri, 30 Jan 2026 17:48:24 -0700 Subject: [PATCH] STOR-2859: Add APIs for disabling force detach in KCM operator --- .../DisableForceDetachOnTimeout.yaml | 80 ++++++++++ config/v1alpha1/types_controllermanager.go | 76 ++++++++++ ...ontrollermanagers-CustomNoUpgrade.crd.yaml | 73 ++++++++++ ...ollermanagers-DevPreviewNoUpgrade.crd.yaml | 73 ++++++++++ ...llermanagers-TechPreviewNoUpgrade.crd.yaml | 73 ++++++++++ config/v1alpha1/zz_generated.deepcopy.go | 93 ++++++++++++ ..._generated.featuregated-crd-manifests.yaml | 24 +++ .../DisableForceDetachOnTimeout.yaml | 73 ++++++++++ .../zz_generated.swagger_doc_generated.go | 37 +++++ features.md | 1 + features/features.go | 8 + .../generated_openapi/zz_generated.openapi.go | 137 ++++++++++++++++++ openapi/openapi.json | 77 ++++++++++ .../featureGate-Hypershift-Default.yaml | 3 + ...reGate-Hypershift-DevPreviewNoUpgrade.yaml | 3 + .../featureGate-Hypershift-OKD.yaml | 3 + ...eGate-Hypershift-TechPreviewNoUpgrade.yaml | 3 + .../featureGate-SelfManagedHA-Default.yaml | 3 + ...ate-SelfManagedHA-DevPreviewNoUpgrade.yaml | 3 + .../featureGate-SelfManagedHA-OKD.yaml | 3 + ...te-SelfManagedHA-TechPreviewNoUpgrade.yaml | 3 + 21 files changed, 849 insertions(+) create mode 100644 config/v1alpha1/tests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml create mode 100644 config/v1alpha1/types_controllermanager.go create mode 100644 config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-CustomNoUpgrade.crd.yaml create mode 100644 config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-DevPreviewNoUpgrade.crd.yaml create mode 100644 config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_controllermanagers-TechPreviewNoUpgrade.crd.yaml create mode 100644 config/v1alpha1/zz_generated.featuregated-crd-manifests/controllermanagers.config.openshift.io/DisableForceDetachOnTimeout.yaml 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" },