diff --git a/.golangci.yaml b/.golangci.yaml index 1f1c43fc469..608fb0ed2e7 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -111,6 +111,9 @@ linters: # Silence norefs lint for `Ref` field in ClusterAPI as it refers to an OCI image reference, not a kube object reference. path: operator/v1alpha1/types_clusterapi.go text: "noreferences: naming convention \"no-references\": field ClusterAPIInstallerComponentImage.Ref: field names should not contain reference-related words" + - linters: + - kubeapilinter + path: features|payload-command/*.go issues: # We have a lot of existing issues. # Want to make sure that those adding new fields have an diff --git a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml b/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index d537572823d..00000000000 --- a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,234 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the Insights Operator. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - gatherConfig: - description: gatherConfig is a required spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers will run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - required: - - gatherConfig - type: object - required: - - spec - type: object - served: true - storage: true diff --git a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml b/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml similarity index 99% rename from config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml rename to config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml index 97698ce0bec..ff8ce547e38 100644 --- a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml +++ b/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: insightsdatagathers.config.openshift.io spec: group: config.openshift.io diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 7a1cf061647..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,139 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: CustomNoUpgrade - name: backups.config.openshift.io -spec: - group: config.openshift.io - names: - kind: Backup - listKind: BackupList - plural: backups - singular: backup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - Backup provides configuration for performing backups of the openshift 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 - properties: - etcd: - description: etcd specifies the configuration for periodic backups - of the etcd cluster - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup files would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - retentionPolicy: - description: retentionPolicy defines the retention policy for - retaining and deleting existing backups. - properties: - retentionNumber: - description: retentionNumber configures the retention policy - based on the number of backups - properties: - maxNumberOfBackups: - description: |- - maxNumberOfBackups defines the maximum number of backups to retain. - If the existing number of backups saved is equal to MaxNumberOfBackups then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxNumberOfBackups - type: object - retentionSize: - description: retentionSize configures the retention policy - based on the size of backups - properties: - maxSizeOfBackupsGb: - description: |- - maxSizeOfBackupsGb defines the total size in GB of backups to retain. - If the current total size backups exceeds MaxSizeOfBackupsGb then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxSizeOfBackupsGb - type: object - retentionType: - description: |- - retentionType sets the type of retention policy. - Currently, the only valid policies are retention by number of backups (RetentionNumber), by the size of backups (RetentionSize). More policies or types may be added in the future. - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is RetentionNumber with 15 backups kept. - enum: - - RetentionNumber - - RetentionSize - type: string - required: - - retentionType - type: object - schedule: - description: |- - schedule defines the recurring backup schedule in Cron format - every 2 hours: 0 */2 * * * - every day at 3am: 0 3 * * * - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is "no backups", but will change in the future. - pattern: ^(@(annually|yearly|monthly|weekly|daily|hourly))|(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*)) - (\*|(?:\*|(?:\*|(?:[0-9]|1[0-9]|2[0-3])))\/(?:[0-9]|1[0-9]|2[0-3])|(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*)) - (\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*)) - (\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*)) - (\*|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))$ - type: string - timeZone: - description: |- - The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - If not specified, this will default to the time zone of the kube-controller-manager process. - See https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones - pattern: ^([A-Za-z_]+([+-]*0)*|[A-Za-z_]+(\/[A-Za-z_]+){1,2})(\/GMT[+-]\d{1,2})?$ - type: string - type: object - required: - - etcd - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_backups-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 75b882873cb..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,139 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: TechPreviewNoUpgrade - name: backups.config.openshift.io -spec: - group: config.openshift.io - names: - kind: Backup - listKind: BackupList - plural: backups - singular: backup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - Backup provides configuration for performing backups of the openshift 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 - properties: - etcd: - description: etcd specifies the configuration for periodic backups - of the etcd cluster - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup files would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - retentionPolicy: - description: retentionPolicy defines the retention policy for - retaining and deleting existing backups. - properties: - retentionNumber: - description: retentionNumber configures the retention policy - based on the number of backups - properties: - maxNumberOfBackups: - description: |- - maxNumberOfBackups defines the maximum number of backups to retain. - If the existing number of backups saved is equal to MaxNumberOfBackups then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxNumberOfBackups - type: object - retentionSize: - description: retentionSize configures the retention policy - based on the size of backups - properties: - maxSizeOfBackupsGb: - description: |- - maxSizeOfBackupsGb defines the total size in GB of backups to retain. - If the current total size backups exceeds MaxSizeOfBackupsGb then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxSizeOfBackupsGb - type: object - retentionType: - description: |- - retentionType sets the type of retention policy. - Currently, the only valid policies are retention by number of backups (RetentionNumber), by the size of backups (RetentionSize). More policies or types may be added in the future. - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is RetentionNumber with 15 backups kept. - enum: - - RetentionNumber - - RetentionSize - type: string - required: - - retentionType - type: object - schedule: - description: |- - schedule defines the recurring backup schedule in Cron format - every 2 hours: 0 */2 * * * - every day at 3am: 0 3 * * * - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is "no backups", but will change in the future. - pattern: ^(@(annually|yearly|monthly|weekly|daily|hourly))|(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*)) - (\*|(?:\*|(?:\*|(?:[0-9]|1[0-9]|2[0-3])))\/(?:[0-9]|1[0-9]|2[0-3])|(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*)) - (\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*)) - (\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*)) - (\*|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))$ - type: string - timeZone: - description: |- - The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - If not specified, this will default to the time zone of the kube-controller-manager process. - See https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones - pattern: ^([A-Za-z_]+([+-]*0)*|[A-Za-z_]+(\/[A-Za-z_]+){1,2})(\/GMT[+-]\d{1,2})?$ - type: string - type: object - required: - - etcd - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups.crd.yaml similarity index 98% rename from payload-manifests/crds/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml rename to config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups.crd.yaml index 7a1cf061647..7cffedaa00e 100644 --- a/payload-manifests/crds/0000_10_config-operator_01_backups-CustomNoUpgrade.crd.yaml +++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: backups.config.openshift.io spec: group: config.openshift.io diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index af85a050e3c..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,1685 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1929 - api.openshift.io/merged-by-featuregates: "true" - description: Cluster Monitoring Operators configuration API - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: clustermonitorings.config.openshift.io -spec: - group: config.openshift.io - names: - kind: ClusterMonitoring - listKind: ClusterMonitoringList - plural: clustermonitorings - singular: clustermonitoring - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterMonitoring is the Custom Resource object which holds the current status of Cluster Monitoring Operator. CMO is a central component of the monitoring stack. - - 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. - ClusterMonitoring is the Schema for the Cluster Monitoring Operators API - 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 configuration for the Cluster Monitoring - Operator - minProperties: 1 - properties: - alertmanagerConfig: - description: |- - alertmanagerConfig allows users to configure how the default Alertmanager instance - should be deployed in the `openshift-monitoring` namespace. - alertmanagerConfig is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `DefaultConfig`. - properties: - customConfig: - description: |- - customConfig must be set when deploymentMode is CustomConfig, and must be unset otherwise. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Alertmanager. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Alertmanager container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource - requirement for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an - alphanumeric character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - secrets: - description: |- - secrets defines a list of secrets that need to be mounted into the Alertmanager. - The secrets must reside within the same namespace as the Alertmanager object. - They will be added as volumes named secret- and mounted at - /etc/alertmanager/secrets/ within the 'alertmanager' container of - the Alertmanager Pods. - - These secrets can be used to authenticate Alertmanager with endpoint receivers. - For example, you can use secrets to: - - Provide certificates for TLS authentication with receivers that require private CA certificates - - Store credentials for Basic HTTP authentication with receivers that require password-based auth - - Store any other authentication credentials needed by your alert receivers - - This field is optional. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries in this list must be unique. - items: - description: |- - SecretName is a type that represents the name of a Secret in the same namespace. - It must be at most 253 characters in length. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of - lower case alphanumeric characters, '-' or '.', and - must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: set - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Alertmanager Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumeClaimTemplate: - description: |- - volumeClaimTemplate Defines persistent storage for Alertmanager. Use this setting to - configure the persistent volume claim, including storage class, volume - size, and name. - If omitted, the Pod uses ephemeral storage and alert data will not persist - across restarts. - This field is optional. - 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: |- - Standard object's metadata. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - type: object - spec: - description: |- - spec defines the desired characteristics of a volume requested by a pod author. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) - If the provisioner or an external controller can support the specified data source, - it will create a new volume based on the contents of the specified data source. - When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, - and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. - If the namespace is specified, then dataSourceRef will not be copied to dataSource. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a non-empty API group (non - core object) or a PersistentVolumeClaim object. - When this field is specified, volume binding will only succeed if the type of - the specified object matches some installed volume populator or dynamic - provisioner. - This field will replace the functionality of the dataSource field and as such - if both fields are non-empty, they must have the same value. For backwards - compatibility, when namespace isn't specified in dataSourceRef, - both fields (dataSource and dataSourceRef) will be set to the same - value automatically if one of them is empty and the other is non-empty. - When namespace is specified in dataSourceRef, - dataSource isn't set to the same value and must be empty. - There are three important differences between dataSource and dataSourceRef: - * While dataSource only allows two specific types of objects, dataSourceRef - allows any non-core object, as well as PersistentVolumeClaim objects. - * While dataSource ignores disallowed values (dropping them), dataSourceRef - preserves all values, and generates an error if a disallowed value is - specified. - * While dataSource only allows local objects, dataSourceRef allows objects - in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. - (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: |- - resources represents the minimum resources the volume should have. - If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements - that are lower than previous value but must still be higher than capacity recorded in the - status field of the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Requests describes the minimum amount of compute resources required. - If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 - type: string - volumeAttributesClassName: - description: |- - volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. - If specified, the CSI driver will create or update the volume with the attributes defined - in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string or nil value indicates that no - VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, - this field can be reset to its previous value (including nil) to cancel the modification. - If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be - set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource - exists. - More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - type: string - volumeMode: - description: |- - volumeMode defines what type of volume is required by the claim. - Value of Filesystem is implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to - the PersistentVolume backing this claim. - type: string - type: object - status: - description: |- - status represents the current information/status of a persistent volume claim. - Read-only. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the actual access modes the volume backing the PVC has. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - allocatedResourceStatuses: - additionalProperties: - description: |- - When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource - that it does not recognizes, then it should ignore that update and let other controllers - handle it. - type: string - description: "allocatedResourceStatuses stores status - of resource being resized for the given PVC.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nClaimResourceStatus - can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState - set when resize controller starts resizing the volume - in control-plane.\n\t- ControllerResizeFailed:\n\t\tState - set when resize has failed in resize controller - with a terminal error.\n\t- NodeResizePending:\n\t\tState - set when resize controller has finished resizing - the volume but further resizing of\n\t\tvolume is - needed on the node.\n\t- NodeResizeInProgress:\n\t\tState - set when kubelet starts resizing the volume.\n\t- - NodeResizeFailed:\n\t\tState set when resizing has - failed in kubelet with a terminal error. Transient - errors don't set\n\t\tNodeResizeFailed.\nFor example: - if expanding a PVC for more capacity - this field - can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeFailed\"\nWhen this field is not set, - it means that no resize operation is in progress - for the given PVC.\n\nA controller that receives - PVC update with previously unknown resourceName - or ClaimResourceStatus\nshould ignore the update - for the purpose it was designed. For example - a - controller that\nonly is responsible for resizing - capacity of the volume, should ignore PVC updates - that change other valid\nresources associated with - PVC.\n\nThis is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature." - type: object - x-kubernetes-map-type: granular - allocatedResources: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: "allocatedResources tracks the resources - allocated to a PVC including its capacity.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nCapacity reported - here may be larger than the actual capacity when - a volume expansion operation\nis requested.\nFor - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used.\nIf allocatedResources - is not set, PVC.spec.resources alone is used for - quota calculation.\nIf a volume expansion capacity - request is lowered, allocatedResources is only\nlowered - if there are no expansion operations in progress - and if the actual volume capacity\nis equal or lower - than the requested capacity.\n\nA controller that - receives PVC update with previously unknown resourceName\nshould - ignore the update for the purpose it was designed. - For example - a controller that\nonly is responsible - for resizing capacity of the volume, should ignore - PVC updates that change other valid\nresources associated - with PVC.\n\nThis is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature." - type: object - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: capacity represents the actual resources - of the underlying volume. - type: object - conditions: - description: |- - conditions is the current Condition of persistent volume claim. If underlying persistent volume is being - resized then the Condition will be set to 'Resizing'. - items: - description: PersistentVolumeClaimCondition contains - details about state of pvc - properties: - lastProbeTime: - description: lastProbeTime is the time we probed - the condition. - format: date-time - type: string - lastTransitionTime: - description: lastTransitionTime is the time - the condition transitioned from one status - to another. - format: date-time - type: string - message: - description: message is the human-readable message - indicating details about last transition. - type: string - reason: - description: |- - reason is a unique, this should be a short, machine understandable string that gives the reason - for condition's last transition. If it reports "Resizing" that means the underlying - persistent volume is being resized. - type: string - status: - description: |- - Status is the status of the condition. - Can be True, False, Unknown. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=state%20of%20pvc-,conditions.status,-(string)%2C%20required - type: string - type: - description: |- - Type is the type of the condition. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=set%20to%20%27ResizeStarted%27.-,PersistentVolumeClaimCondition,-contains%20details%20about - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - currentVolumeAttributesClassName: - description: |- - currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. - When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - type: string - modifyVolumeStatus: - description: |- - ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. - When this is unset, there is no ModifyVolume operation being attempted. - properties: - status: - description: "status is the status of the ControllerModifyVolume - operation. It can be in any of following states:\n - - Pending\n Pending indicates that the PersistentVolumeClaim - cannot be modified due to unmet requirements, - such as\n the specified VolumeAttributesClass - not existing.\n - InProgress\n InProgress - indicates that the volume is being modified.\n - - Infeasible\n Infeasible indicates that the - request has been rejected as invalid by the - CSI driver. To\n\t resolve the error, a valid - VolumeAttributesClass needs to be specified.\nNote: - New statuses can be added in the future. Consumers - should check for unknown statuses and fail appropriately." - type: string - targetVolumeAttributesClassName: - description: targetVolumeAttributesClassName is - the name of the VolumeAttributesClass the PVC - currently being reconciled - type: string - required: - - status - type: object - phase: - description: phase represents the current phase of - PersistentVolumeClaim. - type: string - type: object - type: object - type: object - deploymentMode: - description: |- - deploymentMode determines whether the default Alertmanager instance should be deployed - as part of the monitoring stack. - Allowed values are Disabled, DefaultConfig, and CustomConfig. - When set to Disabled, the Alertmanager instance will not be deployed. - When set to DefaultConfig, the platform will deploy Alertmanager with default settings. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - enum: - - Disabled - - DefaultConfig - - CustomConfig - type: string - required: - - deploymentMode - type: object - x-kubernetes-validations: - - message: customConfig is required when deploymentMode is CustomConfig, - and forbidden otherwise - rule: 'self.deploymentMode == ''CustomConfig'' ? has(self.customConfig) - : !has(self.customConfig)' - metricsServerConfig: - description: |- - metricsServerConfig is an optional field that can be used to configure the Kubernetes Metrics Server that runs in the openshift-monitoring namespace. - Specifically, it can configure how the Metrics Server instance is deployed, pod scheduling, its audit policy and log verbosity. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - audit: - description: |- - audit defines the audit configuration used by the Metrics Server instance. - audit is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default sets audit.profile to Metadata - properties: - profile: - description: |- - profile is a required field for configuring the audit log level of the Kubernetes Metrics Server. - Allowed values are None, Metadata, Request, or RequestResponse. - When set to None, audit logging is disabled and no audit events are recorded. - When set to Metadata, only request metadata (such as requesting user, timestamp, resource, verb, etc.) is logged, but not the request or response body. - When set to Request, event metadata and the request body are logged, but not the response body. - When set to RequestResponse, event metadata, request body, and response body are all logged, providing the most detailed audit information. - - See: https://kubernetes.io/docs/tasks/debug-application-cluster/audit/#audit-policy - for more information about auditing and log levels. - enum: - - None - - Metadata - - Request - - RequestResponse - type: string - required: - - profile - type: object - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Metrics Server container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Metrics Server Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - verbosity: - description: |- - verbosity defines the verbosity of log messages for Metrics Server. - Valid values are Errors, Info, Trace, TraceAll and omitted. - When set to Errors, only critical messages and errors are logged. - When set to Info, only basic information messages are logged. - When set to Trace, information useful for general debugging is logged. - When set to TraceAll, detailed information about metric scraping is logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Errors` - enum: - - Errors - - Info - - Trace - - TraceAll - type: string - type: object - prometheusOperatorConfig: - description: |- - prometheusOperatorConfig is an optional field that can be used to configure the Prometheus Operator component. - Specifically, it can configure how the Prometheus Operator instance is deployed, pod scheduling, and resource allocation. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Prometheus Operator. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - When specified, nodeSelector must contain at least 1 entry and must not contain more than 10 entries. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Prometheus Operator container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Prometheus Operator Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - type: object - userDefined: - description: |- - userDefined set the deployment mode for user-defined monitoring in addition to the default platform monitoring. - userDefined is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default value is `Disabled`. - properties: - mode: - description: |- - mode defines the different configurations of UserDefinedMonitoring - Valid values are Disabled and NamespaceIsolated - Disabled disables monitoring for user-defined projects. This restricts the default monitoring stack, installed in the openshift-monitoring project, to monitor only platform namespaces, which prevents any custom monitoring configurations or resources from being applied to user-defined namespaces. - NamespaceIsolated enables monitoring for user-defined projects with namespace-scoped tenancy. This ensures that metrics, alerts, and monitoring data are isolated at the namespace level. - The current default value is `Disabled`. - enum: - - Disabled - - NamespaceIsolated - type: string - required: - - mode - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_clustermonitorings-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings.crd.yaml similarity index 99% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-CustomNoUpgrade.crd.yaml rename to config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings.crd.yaml index d19655e7783..11156bf39d3 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-CustomNoUpgrade.crd.yaml +++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings.crd.yaml @@ -7,7 +7,7 @@ metadata: description: Cluster Monitoring Operators configuration API include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: clustermonitorings.config.openshift.io spec: group: config.openshift.io diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 22f14eb091c..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,214 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2557 - 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/feature-set: TechPreviewNoUpgrade - name: criocredentialproviderconfigs.config.openshift.io -spec: - group: config.openshift.io - names: - kind: CRIOCredentialProviderConfig - listKind: CRIOCredentialProviderConfigList - plural: criocredentialproviderconfigs - singular: criocredentialproviderconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - CRIOCredentialProviderConfig holds cluster-wide singleton resource configurations for CRI-O credential provider, the name of this instance is "cluster". CRI-O credential provider is a binary shipped with CRI-O that provides a way to obtain container image pull credentials from external sources. - For example, it can be used to fetch mirror registry credentials from secrets resources in the cluster within the same namespace the pod will be running in. - CRIOCredentialProviderConfig configuration specifies the pod image sources registries that should trigger the CRI-O credential provider execution, which will resolve the CRI-O mirror configurations and obtain the necessary credentials for pod creation. - Note: Configuration changes will only take effect after the kubelet restarts, which is automatically managed by the cluster during rollout. - - The resource is a singleton named "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 defines the desired configuration of the CRI-O Credential Provider. - This field is required and must be provided when creating the resource. - minProperties: 0 - properties: - matchImages: - description: |- - matchImages is a list of string patterns used to determine whether - the CRI-O credential provider should be invoked for a given image. This list is - passed to the kubelet CredentialProviderConfig, and if any pattern matches - the requested image, CRI-O credential provider will be invoked to obtain credentials for pulling - that image or its mirrors. - Depending on the platform, the CRI-O credential provider may be installed alongside an existing platform specific provider. - Conflicts between the existing platform specific provider image match configuration and this list will be handled by - the following precedence rule: credentials from built-in kubelet providers (e.g., ECR, GCR, ACR) take precedence over those - from the CRIOCredentialProviderConfig when both match the same image. - To avoid uncertainty, it is recommended to avoid configuring your private image patterns to overlap with - existing platform specific provider config(e.g., the entries from https://github.com/openshift/machine-config-operator/blob/main/templates/common/aws/files/etc-kubernetes-credential-providers-ecr-credential-provider.yaml). - You can check the resource's Status conditions - to see if any entries were ignored due to exact matches with known built-in provider patterns. - - This field is optional, the items of the list must contain between 1 and 50 entries. - The list is treated as a set, so duplicate entries are not allowed. - - For more details, see: - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-credential-provider/ - https://github.com/cri-o/crio-credential-provider#architecture - - Each entry in matchImages is a pattern which can optionally contain a port and a path. Each entry must be no longer than 512 characters. - Wildcards ('*') are supported for full subdomain labels, such as '*.k8s.io' or 'k8s.*.io', - and for top-level domains, such as 'k8s.*' (which matches 'k8s.io' or 'k8s.net'). - A global wildcard '*' (matching any domain) is not allowed. - Wildcards may replace an entire hostname label (e.g., *.example.com), but they cannot appear within a label (e.g., f*oo.example.com) and are not allowed in the port or path. - For example, 'example.*.com' is valid, but 'exa*mple.*.com' is not. - Each wildcard matches only a single domain label, - so '*.io' does **not** match '*.k8s.io'. - - A match exists between an image and a matchImage when all of the below are true: - Both contain the same number of domain parts and each part matches. - The URL path of an matchImages must be a prefix of the target image URL path. - If the matchImages contains a port, then the port must match in the image as well. - - Example values of matchImages: - - 123456789.dkr.ecr.us-east-1.amazonaws.com - - *.azurecr.io - - gcr.io - - *.*.registry.io - - registry.io:8080/path - items: - description: |- - MatchImage is a string pattern used to match container image registry addresses. - It must be a valid fully qualified domain name with optional wildcard, port, and path. - The maximum length is 512 characters. - - Wildcards ('*') are supported for full subdomain labels and top-level domains. - Each entry can optionally contain a port (e.g., :8080) and a path (e.g., /path). - Wildcards are not allowed in the port or path portions. - - Examples: - - "registry.io" - matches exactly registry.io - - "*.azurecr.io" - matches any single subdomain of azurecr.io - - "registry.io:8080/path" - matches with specific port and path prefix - maxLength: 512 - minLength: 1 - type: string - x-kubernetes-validations: - - message: global wildcard '*' is not allowed - rule: self != '*' - - message: invalid matchImages value, must be a valid fully qualified - domain name in lowercase with optional wildcard, port, and path - rule: self.matches('^((\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?)(\\.(\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?))*)(:[0-9]+)?(/[-a-z0-9._/]*)?$') - maxItems: 50 - minItems: 1 - type: array - x-kubernetes-list-type: set - type: object - status: - description: |- - status represents the current state of the CRIOCredentialProviderConfig. - When omitted or nil, it indicates that the status has not yet been set by the controller. - The controller will populate this field with validation conditions and operational state. - minProperties: 1 - properties: - conditions: - description: |- - conditions represent the latest available observations of the configuration state. - When omitted, it indicates that no conditions have been reported yet. - The maximum number of conditions is 16. - Conditions are stored as a map keyed by condition type, ensuring uniqueness. - - Expected condition types include: - "Validated": indicates whether the matchImages configuration is valid - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: criocredentialproviderconfig is a singleton, .metadata.name must - be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml similarity index 99% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml rename to config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml index 6971ccce42e..0e12b8cc45b 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml +++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: criocredentialproviderconfigs.config.openshift.io spec: group: config.openshift.io diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 28bbb740c55..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,164 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1245 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the the Insights Operator. - - 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 - properties: - gatherConfig: - description: gatherConfig spec attribute includes all the configuration - options related to gathering of the Insights data and its uploading - to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy allows user to enable additional global obfuscation of the IP addresses and base domain in the Insights archive data. - Valid values are "None" and "ObfuscateNetworking". - When set to None the data is not obfuscated. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - enum: - - "" - - None - - ObfuscateNetworking - type: string - disabledGatherers: - description: |- - disabledGatherers is a list of gatherers to be excluded from the gathering. All the gatherers can be disabled by providing "all" value. - If all the gatherers are disabled, the Insights operator does not gather any data. - The format for the disabledGatherer should be: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - An example of disabling gatherers looks like this: `disabledGatherers: ["clusterconfig/machine_configs", "workloads/workload_info"]` - items: - description: disabledGatherer is a string that represents a - gatherer that should be disabled - maxLength: 256 - type: string - x-kubernetes-validations: - - message: disabledGatherer must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters only - that may include underscores (_) and are separated by a - forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - maxItems: 100 - type: array - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 70cd51ad565..00000000000 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,164 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1245 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the the Insights Operator. - - 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 - properties: - gatherConfig: - description: gatherConfig spec attribute includes all the configuration - options related to gathering of the Insights data and its uploading - to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy allows user to enable additional global obfuscation of the IP addresses and base domain in the Insights archive data. - Valid values are "None" and "ObfuscateNetworking". - When set to None the data is not obfuscated. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - enum: - - "" - - None - - ObfuscateNetworking - type: string - disabledGatherers: - description: |- - disabledGatherers is a list of gatherers to be excluded from the gathering. All the gatherers can be disabled by providing "all" value. - If all the gatherers are disabled, the Insights operator does not gather any data. - The format for the disabledGatherer should be: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - An example of disabling gatherers looks like this: `disabledGatherers: ["clusterconfig/machine_configs", "workloads/workload_info"]` - items: - description: disabledGatherer is a string that represents a - gatherer that should be disabled - maxLength: 256 - type: string - x-kubernetes-validations: - - message: disabledGatherer must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters only - that may include underscores (_) and are separated by a - forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - maxItems: 100 - type: array - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml similarity index 99% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml rename to config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml index 92f6de4884b..849e910de82 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml +++ b/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: insightsdatagathers.config.openshift.io spec: group: config.openshift.io diff --git a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml b/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml deleted file mode 100644 index c656518b308..00000000000 --- a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,232 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2195 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the the Insights Operator. - - 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 - properties: - gatherConfig: - description: gatherConfig is an optional spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: dataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers wil run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml b/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index de4681b67cc..00000000000 --- a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,232 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2195 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the the Insights Operator. - - 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 - properties: - gatherConfig: - description: gatherConfig is an optional spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: dataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers wil run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml b/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml similarity index 99% rename from config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml rename to config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml index 1f58fe39cc1..54610f12034 100644 --- a/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml +++ b/config/v1alpha2/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: insightsdatagathers.config.openshift.io spec: group: config.openshift.io diff --git a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml b/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 3e1f27cfa5e..00000000000 --- a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,632 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2544 - 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/feature-set: TechPreviewNoUpgrade - name: pacemakerclusters.etcd.openshift.io -spec: - group: etcd.openshift.io - names: - kind: PacemakerCluster - listKind: PacemakerClusterList - plural: pacemakerclusters - singular: pacemakercluster - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - PacemakerCluster represents the current state of the pacemaker cluster as reported by the pcs status command. - PacemakerCluster is a cluster-scoped singleton resource. The name of this instance is "cluster". This - resource provides a view into the health and status of a pacemaker-managed cluster in Two Node OpenShift with Fencing deployments. - - 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 - status: - description: |- - status contains the actual pacemaker cluster status information collected from the cluster. - The goal of this status is to be able to quickly identify if pacemaker is in a healthy state. - In Two Node OpenShift with Fencing, a healthy pacemaker cluster has 2 nodes, both of which have healthy kubelet, etcd, and fencing resources. - This field is optional on creation - the status collector populates it immediately after creating - the resource via the status subresource. - properties: - conditions: - description: |- - conditions represent the observations of the pacemaker cluster's current state. - Known condition types are: "Healthy", "InService", "NodeCountAsExpected". - The "Healthy" condition is an aggregate that tracks the overall health of the cluster. - The "InService" condition tracks whether the cluster is in service (not in maintenance mode). - The "NodeCountAsExpected" condition tracks whether the expected number of nodes are present. - Each of these conditions is required, so the array must contain at least 3 items. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 3 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type NodeCountAsExpected - rule: self.exists(c, c.type == 'NodeCountAsExpected') - lastUpdated: - description: |- - lastUpdated is the timestamp when this status was last updated. This is useful for identifying - stale status reports. It must be a valid timestamp in RFC3339 format. Once set, this field cannot - be removed and cannot be set to an earlier timestamp than the current value. - format: date-time - type: string - nodes: - description: |- - nodes provides detailed status for each control-plane node in the Pacemaker cluster. - While Pacemaker supports up to 32 nodes, the limit is set to 5 (max OpenShift control-plane nodes). - For Two Node OpenShift with Fencing, exactly 2 nodes are expected in a healthy cluster. - An empty list indicates a catastrophic failure where Pacemaker reports no nodes. - items: - description: |- - PacemakerClusterNodeStatus represents the status of a single node in the pacemaker cluster including - the node's conditions and the health of critical resources running on that node. - properties: - addresses: - description: |- - addresses is a list of IP addresses for the node. - Pacemaker allows multiple IP addresses for Corosync communication between nodes. - The first address in this list is used for IP-based peer URLs for etcd membership. - Each address must be a valid global unicast IPv4 or IPv6 address in canonical form - (e.g., "192.168.1.1" not "192.168.001.001", or "2001:db8::1" not "2001:0db8::1"). - This excludes loopback, link-local, and multicast addresses. - items: - description: |- - PacemakerNodeAddress contains information for a node's address. - This is similar to corev1.NodeAddress but adds validation for IP addresses. - properties: - address: - description: |- - address is the node address. - For InternalIP, this must be a valid global unicast IPv4 or IPv6 address in canonical form. - Canonical form means the shortest standard representation (e.g., "192.168.1.1" not "192.168.001.001", - or "2001:db8::1" not "2001:0db8::1"). Maximum length is 39 characters (full IPv6 address). - Global unicast includes private/RFC1918 addresses but excludes loopback, link-local, and multicast. - maxLength: 39 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be a valid global unicast IPv4 or IPv6 - address in canonical form - rule: isIP(self) && ip.isCanonical(self) && ip(self).isGlobalUnicast() - type: - description: |- - type is the type of node address. - Currently only "InternalIP" is supported. - enum: - - InternalIP - type: string - required: - - address - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - conditions: - description: |- - conditions represent the observations of the node's current state. - Known condition types are: "Healthy", "Online", "InService", "Active", "Ready", "Clean", "Member", - "FencingAvailable", "FencingHealthy". - The "Healthy" condition is an aggregate that tracks the overall health of the node. - The "Online" condition tracks whether the node is online. - The "InService" condition tracks whether the node is in service (not in maintenance mode). - The "Active" condition tracks whether the node is active (not in standby mode). - The "Ready" condition tracks whether the node is ready (not in a pending state). - The "Clean" condition tracks whether the node is in a clean (status known) state. - The "Member" condition tracks whether the node is a member of the cluster. - The "FencingAvailable" condition tracks whether this node can be fenced by at least one healthy agent. - The "FencingHealthy" condition tracks whether all fencing agents for this node are healthy. - Each of these conditions is required, so the array must contain at least 9 items. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 9 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type Online - rule: self.exists(c, c.type == 'Online') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type Ready - rule: self.exists(c, c.type == 'Ready') - - message: conditions must contain a condition of type Clean - rule: self.exists(c, c.type == 'Clean') - - message: conditions must contain a condition of type Member - rule: self.exists(c, c.type == 'Member') - - message: conditions must contain a condition of type FencingAvailable - rule: self.exists(c, c.type == 'FencingAvailable') - - message: conditions must contain a condition of type FencingHealthy - rule: self.exists(c, c.type == 'FencingHealthy') - fencingAgents: - description: |- - fencingAgents contains the status of fencing agents that can fence this node. - Unlike resources (which are scheduled to run on this node), fencing agents are mapped - to the node they can fence (their target), not the node where monitoring operations run. - Each fencing agent entry includes a unique name, fencing type, target node, and health conditions. - A node is considered fence-capable if at least one fencing agent is healthy. - Expected to have 1 fencing agent per node, but up to 8 are supported for redundancy. - Names must be unique within this array. - items: - description: |- - PacemakerClusterFencingAgentStatus represents the status of a fencing agent that can fence a node. - Fencing agents are STONITH (Shoot The Other Node In The Head) devices used to isolate failed nodes. - Unlike regular pacemaker resources, fencing agents are mapped to their target node (the node they - can fence), not the node where their monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the fencing agent's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the fencing agent. - The "InService" condition tracks whether the fencing agent is in service (not in maintenance mode). - The "Managed" condition tracks whether the fencing agent is managed by pacemaker. - The "Enabled" condition tracks whether the fencing agent is enabled. - The "Operational" condition tracks whether the fencing agent is operational (not failed). - The "Active" condition tracks whether the fencing agent is active (available to be used). - The "Started" condition tracks whether the fencing agent is started. - The "Schedulable" condition tracks whether the fencing agent is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - method: - description: |- - method is the fencing method used by this agent. - Valid values are "Redfish" and "IPMI". - Redfish is a standard RESTful API for server management. - IPMI (Intelligent Platform Management Interface) is a hardware management interface. - enum: - - Redfish - - IPMI - type: string - name: - description: |- - name is the unique identifier for this fencing agent (e.g., "master-0_redfish"). - The name must be unique within the fencingAgents array for this node. - It may contain alphanumeric characters, dots, hyphens, and underscores. - Maximum length is 300 characters, providing headroom beyond the typical format of - _ (253 for RFC 1123 node name + 1 underscore + type). - maxLength: 300 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must contain only alphanumeric characters, - dots, hyphens, and underscores - rule: self.matches('^[a-zA-Z0-9._-]+$') - required: - - conditions - - method - - name - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: fencing agent names must be unique - rule: self.all(x, self.exists_one(y, x.name == y.name)) - nodeName: - description: |- - nodeName is the name of the node. This is expected to match the Kubernetes node's name, which must be a lowercase - RFC 1123 subdomain consisting of lowercase alphanumeric characters, '-' or '.', starting and ending with - an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: nodeName must be a lowercase RFC 1123 subdomain consisting - of lowercase alphanumeric characters, '-' or '.', and must - start and end with an alphanumeric character - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resources: - description: |- - resources contains the status of pacemaker resources scheduled on this node. - Each resource entry includes the resource name and its health conditions. - For Two Node OpenShift with Fencing, we track Kubelet and Etcd resources per node. - Both resources are required to be present, so the array must contain at least 2 items. - Valid resource names are "Kubelet" and "Etcd". - Fencing agents are tracked separately in the fencingAgents field. - items: - description: |- - PacemakerClusterResourceStatus represents the status of a pacemaker resource scheduled on a node. - A pacemaker resource is a unit of work managed by pacemaker. In pacemaker terminology, resources are services or - applications that pacemaker monitors, starts, stops, and moves between nodes to maintain high availability. - For Two Node OpenShift with Fencing, we track two resources per node: - - Kubelet (the Kubernetes node agent and a prerequisite for etcd) - - Etcd (the distributed key-value store) - - Fencing agents are tracked separately in the fencingAgents field because they are mapped to - their target node (the node they can fence), not the node where monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the resource's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the resource. - The "InService" condition tracks whether the resource is in service (not in maintenance mode). - The "Managed" condition tracks whether the resource is managed by pacemaker. - The "Enabled" condition tracks whether the resource is enabled. - The "Operational" condition tracks whether the resource is operational (not failed). - The "Active" condition tracks whether the resource is active (available to be used). - The "Started" condition tracks whether the resource is started. - The "Schedulable" condition tracks whether the resource is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - name: - description: |- - name is the name of the pacemaker resource. - Valid values are "Kubelet" and "Etcd". - The Kubelet resource is a prerequisite for etcd in Two Node OpenShift with Fencing deployments. - The Etcd resource may temporarily transition to stopped during pacemaker quorum-recovery operations. - Fencing agents are tracked separately in the node's fencingAgents field. - enum: - - Kubelet - - Etcd - type: string - required: - - conditions - - name - type: object - maxItems: 8 - minItems: 2 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: resources must contain a resource named Kubelet - rule: self.exists(r, r.name == 'Kubelet') - - message: resources must contain a resource named Etcd - rule: self.exists(r, r.name == 'Etcd') - required: - - addresses - - conditions - - fencingAgents - - nodeName - - resources - type: object - maxItems: 5 - minItems: 0 - type: array - x-kubernetes-list-map-keys: - - nodeName - x-kubernetes-list-type: map - required: - - conditions - - lastUpdated - - nodes - type: object - x-kubernetes-validations: - - message: lastUpdated may not be set to an earlier timestamp - rule: '!has(oldSelf.lastUpdated) || self.lastUpdated >= oldSelf.lastUpdated' - required: - - metadata - type: object - x-kubernetes-validations: - - message: PacemakerCluster must be named 'cluster' - rule: self.metadata.name == 'cluster' - - message: status may not be removed once set - rule: '!has(oldSelf.status) || has(self.status)' - served: true - storage: true - subresources: - status: {} diff --git a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml b/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters.crd.yaml similarity index 99% rename from etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml rename to etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters.crd.yaml index 3f28324091d..370cd8ab1f8 100644 --- a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml +++ b/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: pacemakerclusters.etcd.openshift.io spec: group: etcd.openshift.io diff --git a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-CustomNoUpgrade.crd.yaml b/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 454f553be18..00000000000 --- a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,126 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/xxx - 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/feature-set: CustomNoUpgrade - name: notstableconfigtypes.example.openshift.io -spec: - group: example.openshift.io - names: - kind: NotStableConfigType - listKind: NotStableConfigTypeList - plural: notstableconfigtypes - singular: notstableconfigtype - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - NotStableConfigType is a stable config type that is TechPreviewNoUpgrade only. - - 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 is the specification of the desired behavior of the - NotStableConfigType. - properties: - newField: - description: newField is a field that is tech preview, but because - the entire type is gated, there is no marker on the field. - type: string - required: - - newField - type: object - status: - description: status is the most recently observed status of the NotStableConfigType. - properties: - conditions: - description: |- - Represents the observations of a foo's current state. - Known .status.conditions.type are: "Available", "Progressing", and "Degraded" - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-DevPreviewNoUpgrade.crd.yaml b/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index c285c2c1933..00000000000 --- a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,126 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/xxx - 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/feature-set: DevPreviewNoUpgrade - name: notstableconfigtypes.example.openshift.io -spec: - group: example.openshift.io - names: - kind: NotStableConfigType - listKind: NotStableConfigTypeList - plural: notstableconfigtypes - singular: notstableconfigtype - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - NotStableConfigType is a stable config type that is TechPreviewNoUpgrade only. - - 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 is the specification of the desired behavior of the - NotStableConfigType. - properties: - newField: - description: newField is a field that is tech preview, but because - the entire type is gated, there is no marker on the field. - type: string - required: - - newField - type: object - status: - description: status is the most recently observed status of the NotStableConfigType. - properties: - conditions: - description: |- - Represents the observations of a foo's current state. - Known .status.conditions.type are: "Available", "Progressing", and "Degraded" - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-TechPreviewNoUpgrade.crd.yaml b/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes.crd.yaml similarity index 98% rename from example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-TechPreviewNoUpgrade.crd.yaml rename to example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes.crd.yaml index c9078c6f22b..32ef7f0475c 100644 --- a/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes-TechPreviewNoUpgrade.crd.yaml +++ b/example/v1alpha1/zz_generated.crd-manifests/0000_50_my-operator_01_notstableconfigtypes.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: notstableconfigtypes.example.openshift.io spec: group: example.openshift.io diff --git a/features/features.go b/features/features.go index 4504ddb8c30..588f39e7f3b 100644 --- a/features/features.go +++ b/features/features.go @@ -1,46 +1,83 @@ package features import ( - "fmt" - configv1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/util/sets" ) -func FeatureSets(clusterProfile ClusterProfileName, featureSet configv1.FeatureSet) (*FeatureGateEnabledDisabled, error) { - byFeatureSet, ok := allFeatureGates[clusterProfile] - if !ok { - return nil, fmt.Errorf("no information found for ClusterProfile=%q", clusterProfile) - } - featureGates, ok := byFeatureSet[featureSet] - if !ok { - return nil, fmt.Errorf("no information found for FeatureSet=%q under ClusterProfile=%q", featureSet, clusterProfile) +// Generating this many versions future proofs us until at least 2040. +const minOpenshiftVersion uint64 = 4 +const maxOpenshiftVersion uint64 = 10 + +func FeatureSets(version uint64, clusterProfile ClusterProfileName, featureSet configv1.FeatureSet) *FeatureGateEnabledDisabled { + enabledDisabled := &FeatureGateEnabledDisabled{} + + for name, statuses := range allFeatureGates { + enabled := false + + for _, status := range statuses { + if status.isEnabled(version, clusterProfile, featureSet) { + enabled = true + break + } + } + + if enabled { + enabledDisabled.Enabled = append(enabledDisabled.Enabled, FeatureGateDescription{ + FeatureGateAttributes: configv1.FeatureGateAttributes{ + Name: name, + }, + }) + } else { + enabledDisabled.Disabled = append(enabledDisabled.Disabled, FeatureGateDescription{ + FeatureGateAttributes: configv1.FeatureGateAttributes{ + Name: name, + }, + }) + } } - return featureGates.DeepCopy(), nil + + return enabledDisabled } -func AllFeatureSets() map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled { - ret := map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} +func AllFeatureSets() map[uint64]map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled { + versions := sets.New[uint64]() + for version := minOpenshiftVersion; version <= maxOpenshiftVersion; version++ { + versions.Insert(version) + } + + clusterProfiles := sets.New[ClusterProfileName](AllClusterProfiles...) + featureSets := sets.New[configv1.FeatureSet](configv1.AllFixedFeatureSets...) - for clusterProfile, byFeatureSet := range allFeatureGates { - newByFeatureSet := map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} + // Check for versions explicitly being set among the gates. + for _, statuses := range allFeatureGates { + for _, status := range statuses { + versions.Insert(status.version.UnsortedList()...) + } + } - for featureSet, enabledDisabled := range byFeatureSet { - newByFeatureSet[featureSet] = enabledDisabled.DeepCopy() + ret := map[uint64]map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} + for version := range versions { + ret[version] = map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} + for clusterProfile := range clusterProfiles { + ret[version][clusterProfile] = map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} + for featureSet := range featureSets { + ret[version][clusterProfile][featureSet] = FeatureSets(version, clusterProfile, featureSet) + } } - ret[clusterProfile] = newByFeatureSet } return ret } var ( - allFeatureGates = map[ClusterProfileName]map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} + allFeatureGates = map[configv1.FeatureGateName][]featureGateStatus{} FeatureGateConsolePluginCSP = newFeatureGate("ConsolePluginContentSecurityPolicy"). reportProblemsToJiraComponent("Management Console"). contactPerson("jhadvig"). productScope(ocpSpecific). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). enhancementPR("https://github.com/openshift/enhancements/pull/1706"). mustRegister() @@ -49,7 +86,7 @@ var ( contactPerson("ibihim"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/4193"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMutatingAdmissionPolicy = newFeatureGate("MutatingAdmissionPolicy"). @@ -57,7 +94,7 @@ var ( contactPerson("benluddy"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/3962"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateGatewayAPI = newFeatureGate("GatewayAPI"). @@ -65,7 +102,7 @@ var ( contactPerson("miciah"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateOpenShiftPodSecurityAdmission = newFeatureGate("OpenShiftPodSecurityAdmission"). @@ -73,7 +110,7 @@ var ( contactPerson("ibihim"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/899"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateBuildCSIVolumes = newFeatureGate("BuildCSIVolumes"). @@ -81,7 +118,7 @@ var ( contactPerson("adkaplan"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAzureWorkloadIdentity = newFeatureGate("AzureWorkloadIdentity"). @@ -89,7 +126,7 @@ var ( contactPerson("abutcher"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAzureDedicatedHosts = newFeatureGate("AzureDedicatedHosts"). @@ -97,7 +134,7 @@ var ( contactPerson("rvanderp3"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1783"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMaxUnavailableStatefulSet = newFeatureGate("MaxUnavailableStatefulSet"). @@ -105,7 +142,7 @@ var ( contactPerson("atiratree"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/961"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateEventedPLEG = newFeatureGate("EventedPLEG"). @@ -120,7 +157,7 @@ var ( contactPerson("sgrunert"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateSigstoreImageVerificationPKI = newFeatureGate("SigstoreImageVerificationPKI"). @@ -128,7 +165,7 @@ var ( contactPerson("QiWang"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1658"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateCRIOCredentialProviderConfig = newFeatureGate("CRIOCredentialProviderConfig"). @@ -136,7 +173,7 @@ var ( contactPerson("QiWang"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1861"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateVSphereHostVMGroupZonal = newFeatureGate("VSphereHostVMGroupZonal"). @@ -144,7 +181,7 @@ var ( contactPerson("jcpowermac"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1677"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateVSphereMultiDisk = newFeatureGate("VSphereMultiDisk"). @@ -152,7 +189,7 @@ var ( contactPerson("vr4manta"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1709"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateRouteExternalCertificate = newFeatureGate("RouteExternalCertificate"). @@ -160,7 +197,7 @@ var ( contactPerson("chiragkyal"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNetworkConnect = newFeatureGate("NetworkConnect"). @@ -168,7 +205,7 @@ var ( contactPerson("tssurya"). productScope(ocpSpecific). enhancementPR("https://github.com/ovn-kubernetes/ovn-kubernetes/pull/5246"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateEVPN = newFeatureGate("EVPN"). @@ -176,7 +213,7 @@ var ( contactPerson("jcaamano"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1862"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateOVNObservability = newFeatureGate("OVNObservability"). @@ -184,7 +221,7 @@ var ( contactPerson("npinaeva"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateBackendQuotaGiB = newFeatureGate("EtcdBackendQuota"). @@ -192,7 +229,7 @@ var ( contactPerson("hasbro17"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAutomatedEtcdBackup = newFeatureGate("AutomatedEtcdBackup"). @@ -200,7 +237,7 @@ var ( contactPerson("hasbro17"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMachineAPIOperatorDisableMachineHealthCheckController = newFeatureGate("MachineAPIOperatorDisableMachineHealthCheckController"). @@ -215,7 +252,7 @@ var ( contactPerson("miciah"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMachineConfigNodes = newFeatureGate("MachineConfigNodes"). @@ -223,7 +260,7 @@ var ( contactPerson("ijanssen"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1765"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateImageModeStatusReporting = newFeatureGate("ImageModeStatusReporting"). @@ -231,7 +268,7 @@ var ( contactPerson("ijanssen"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1809"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIInstall = newFeatureGate("ClusterAPIInstall"). @@ -246,7 +283,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAWSClusterHostedDNS = newFeatureGate("AWSClusterHostedDNS"). @@ -254,7 +291,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAzureClusterHostedDNSInstall = newFeatureGate("AzureClusterHostedDNSInstall"). @@ -262,7 +299,7 @@ var ( contactPerson("sadasu"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1468"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMixedCPUsAllocation = newFeatureGate("MixedCPUsAllocation"). @@ -270,7 +307,7 @@ var ( contactPerson("titzhak"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateManagedBootImages = newFeatureGate("ManagedBootImages"). @@ -278,7 +315,7 @@ var ( contactPerson("djoshy"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateManagedBootImagesAWS = newFeatureGate("ManagedBootImagesAWS"). @@ -286,7 +323,7 @@ var ( contactPerson("djoshy"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateManagedBootImagesvSphere = newFeatureGate("ManagedBootImagesvSphere"). @@ -294,7 +331,7 @@ var ( contactPerson("rsaini"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1496"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateManagedBootImagesAzure = newFeatureGate("ManagedBootImagesAzure"). @@ -302,7 +339,7 @@ var ( contactPerson("djoshy"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1761"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateManagedBootImagesCPMS = newFeatureGate("ManagedBootImagesCPMS"). @@ -310,7 +347,7 @@ var ( contactPerson("djoshy"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1818"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateBootImageSkewEnforcement = newFeatureGate("BootImageSkewEnforcement"). @@ -318,7 +355,7 @@ var ( contactPerson("djoshy"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1761"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateBootcNodeManagement = newFeatureGate("BootcNodeManagement"). @@ -326,7 +363,7 @@ var ( contactPerson("inesqyx"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateSignatureStores = newFeatureGate("SignatureStores"). @@ -334,7 +371,7 @@ var ( contactPerson("lmohanty"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateKMSv1 = newFeatureGate("KMSv1"). @@ -342,7 +379,7 @@ var ( contactPerson("dgrisonnet"). productScope(kubernetes). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGatePinnedImages = newFeatureGate("PinnedImages"). @@ -350,7 +387,7 @@ var ( contactPerson("RishabhSaini"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateUpgradeStatus = newFeatureGate("UpgradeStatus"). @@ -358,7 +395,7 @@ var ( contactPerson("pmuller"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateVolumeGroupSnapshot = newFeatureGate("VolumeGroupSnapshot"). @@ -366,7 +403,7 @@ var ( contactPerson("fbertina"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/3476"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateExternalSnapshotMetadata = newFeatureGate("ExternalSnapshotMetadata"). @@ -374,7 +411,7 @@ var ( contactPerson("jdobson"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/3314"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateExternalOIDC = newFeatureGate("ExternalOIDC"). @@ -382,7 +419,7 @@ var ( contactPerson("liouk"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1596"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateExternalOIDCWithAdditionalClaimMappings = newFeatureGate("ExternalOIDCWithUIDAndExtraClaimMappings"). @@ -390,7 +427,7 @@ var ( contactPerson("bpalmer"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1777"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateExternalOIDCWithUpstreamParity = newFeatureGate("ExternalOIDCWithUpstreamParity"). @@ -398,7 +435,7 @@ var ( contactPerson("saldawam"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1763"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateExample = newFeatureGate("Example"). @@ -406,7 +443,7 @@ var ( contactPerson("deads"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateExample2 = newFeatureGate("Example2"). @@ -414,7 +451,7 @@ var ( contactPerson("JoelSpeed"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLM = newFeatureGate("NewOLM"). @@ -422,7 +459,7 @@ var ( contactPerson("joe"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableForClusterProfile(SelfManaged, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inClusterProfile(SelfManaged), inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLMCatalogdAPIV1Metas = newFeatureGate("NewOLMCatalogdAPIV1Metas"). @@ -430,7 +467,7 @@ var ( contactPerson("jordank"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1749"). - enableForClusterProfile(SelfManaged, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLMPreflightPermissionChecks = newFeatureGate("NewOLMPreflightPermissionChecks"). @@ -438,7 +475,7 @@ var ( contactPerson("tshort"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1768"). - enableForClusterProfile(SelfManaged, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLMOwnSingleNamespace = newFeatureGate("NewOLMOwnSingleNamespace"). @@ -446,7 +483,7 @@ var ( contactPerson("nschieder"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1849"). - enableForClusterProfile(SelfManaged, configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLMWebhookProviderOpenshiftServiceCA = newFeatureGate("NewOLMWebhookProviderOpenshiftServiceCA"). @@ -454,7 +491,7 @@ var ( contactPerson("pegoncal"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1844"). - enableForClusterProfile(SelfManaged, configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNewOLMBoxCutterRuntime = newFeatureGate("NewOLMBoxCutterRuntime"). @@ -462,7 +499,7 @@ var ( contactPerson("pegoncal"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1890"). - enableForClusterProfile(SelfManaged, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateInsightsOnDemandDataGather = newFeatureGate("InsightsOnDemandDataGather"). @@ -470,7 +507,7 @@ var ( contactPerson("tremes"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateInsightsConfig = newFeatureGate("InsightsConfig"). @@ -478,7 +515,7 @@ var ( contactPerson("tremes"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMetricsCollectionProfiles = newFeatureGate("MetricsCollectionProfiles"). @@ -486,7 +523,7 @@ var ( contactPerson("rexagod"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIInstallIBMCloud = newFeatureGate("ClusterAPIInstallIBMCloud"). @@ -494,7 +531,7 @@ var ( contactPerson("cjschaef"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMachineAPIMigration = newFeatureGate("MachineAPIMigration"). @@ -502,7 +539,7 @@ var ( contactPerson("jspeed"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIMachineManagement = newFeatureGate("ClusterAPIMachineManagement"). @@ -510,7 +547,7 @@ var ( contactPerson("ddonati"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1465"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIMachineManagementVSphere = newFeatureGate("ClusterAPIMachineManagementVSphere"). @@ -518,7 +555,7 @@ var ( contactPerson("jcpowermac"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1465"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterMonitoringConfig = newFeatureGate("ClusterMonitoringConfig"). @@ -526,7 +563,7 @@ var ( contactPerson("marioferh"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMultiArchInstallAzure = newFeatureGate("MultiArchInstallAzure"). @@ -541,7 +578,7 @@ var ( contactPerson("psundara"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateUserNamespacesSupport = newFeatureGate("UserNamespacesSupport"). @@ -549,7 +586,7 @@ var ( contactPerson("haircommander"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/127"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() // Note: this feature is perma-alpha, but it is safe and desireable to enable. @@ -560,7 +597,7 @@ var ( contactPerson("haircommander"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/127"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateVSphereMultiNetworks = newFeatureGate("VSphereMultiNetworks"). @@ -568,7 +605,7 @@ var ( contactPerson("rvanderp"). productScope(ocpSpecific). enhancementPR(legacyFeatureGateWithoutEnhancement). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateIngressControllerDynamicConfigurationManager = newFeatureGate("IngressControllerDynamicConfigurationManager"). @@ -576,14 +613,14 @@ var ( contactPerson("miciah"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1687"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateMinimumKubeletVersion = newFeatureGate("MinimumKubeletVersion"). reportProblemsToJiraComponent("Node"). contactPerson("haircommander"). productScope(ocpSpecific). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). enhancementPR("https://github.com/openshift/enhancements/pull/1697"). mustRegister() @@ -592,7 +629,7 @@ var ( contactPerson("yanhli"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1711"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateKMSEncryptionProvider = newFeatureGate("KMSEncryptionProvider"). @@ -600,7 +637,7 @@ var ( contactPerson("swghosh"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1682"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateKMSEncryption = newFeatureGate("KMSEncryption"). @@ -608,7 +645,7 @@ var ( contactPerson("ardaguclu"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1900"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateHighlyAvailableArbiter = newFeatureGate("HighlyAvailableArbiter"). @@ -616,7 +653,7 @@ var ( contactPerson("eggfoobar"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1674"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateCVOConfiguration = newFeatureGate("ClusterVersionOperatorConfiguration"). @@ -624,7 +661,7 @@ var ( contactPerson("dhurta"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1492"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterUpdateAcceptRisks = newFeatureGate("ClusterUpdateAcceptRisks"). @@ -632,7 +669,7 @@ var ( contactPerson("hongkliu"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1807"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateGCPCustomAPIEndpoints = newFeatureGate("GCPCustomAPIEndpoints"). @@ -640,7 +677,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1492"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateDyanmicServiceEndpointIBMCloud = newFeatureGate("DyanmicServiceEndpointIBMCloud"). @@ -648,7 +685,7 @@ var ( contactPerson("jared-hayes-dev"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1712"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateSELinuxMount = newFeatureGate("SELinuxMount"). @@ -656,7 +693,7 @@ var ( contactPerson("jsafrane"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/1710"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateDualReplica = newFeatureGate("DualReplica"). @@ -664,7 +701,7 @@ var ( contactPerson("jaypoulz"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1675"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateGatewayAPIController = newFeatureGate("GatewayAPIController"). @@ -677,7 +714,7 @@ var ( // A dedicated feature gate now controls the Gateway Controller to distinguish // its production readiness from that of the CRDs. enhancementPR("https://github.com/openshift/enhancements/pull/1756"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureShortCertRotation = newFeatureGate("ShortCertRotation"). @@ -692,7 +729,7 @@ var ( contactPerson("rbednar"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1748"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAzureMultiDisk = newFeatureGate("AzureMultiDisk"). @@ -700,7 +737,7 @@ var ( contactPerson("jcpowermac"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1779"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateStoragePerformantSecurityPolicy = newFeatureGate("StoragePerformantSecurityPolicy"). @@ -708,7 +745,7 @@ var ( contactPerson("hekumar"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1804"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMultiDiskSetup = newFeatureGate("MultiDiskSetup"). @@ -716,7 +753,7 @@ var ( contactPerson("jcpowermac"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1805"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAWSDedicatedHosts = newFeatureGate("AWSDedicatedHosts"). @@ -724,7 +761,7 @@ var ( contactPerson("rvanderp3"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1781"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateVSphereMixedNodeEnv = newFeatureGate("VSphereMixedNodeEnv"). @@ -732,7 +769,7 @@ var ( contactPerson("vr4manta"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1772"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAWSServiceLBNetworkSecurityGroup = newFeatureGate("AWSServiceLBNetworkSecurityGroup"). @@ -740,7 +777,7 @@ var ( contactPerson("mtulio"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1802"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateImageVolume = newFeatureGate("ImageVolume"). @@ -748,7 +785,7 @@ var ( contactPerson("haircommander"). productScope(kubernetes). enhancementPR("https://github.com/openshift/enhancements/pull/1792"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateNoRegistryClusterInstall = newFeatureGate("NoRegistryClusterInstall"). @@ -756,7 +793,7 @@ var ( contactPerson("andfasano"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1821"). - enableForClusterProfile(SelfManaged, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inClusterProfile(SelfManaged), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateGCPClusterHostedDNSInstall = newFeatureGate("GCPClusterHostedDNSInstall"). @@ -764,7 +801,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1468"). - enableIn(configv1.Default, configv1.OKD, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAWSClusterHostedDNSInstall = newFeatureGate("AWSClusterHostedDNSInstall"). @@ -772,7 +809,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1468"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateGCPCustomAPIEndpointsInstall = newFeatureGate("GCPCustomAPIEndpointsInstall"). @@ -780,7 +817,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1492"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateIrreconcilableMachineConfig = newFeatureGate("IrreconcilableMachineConfig"). @@ -788,14 +825,14 @@ var ( contactPerson("pabrodri"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1785"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAWSDualStackInstall = newFeatureGate("AWSDualStackInstall"). reportProblemsToJiraComponent("Installer"). contactPerson("sadasu"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1806"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateAzureDualStackInstall = newFeatureGate("AzureDualStackInstall"). @@ -803,7 +840,7 @@ var ( contactPerson("jhixson74"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1806"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateGCPDualStackInstall = newFeatureGate("GCPDualStackInstall"). @@ -811,7 +848,7 @@ var ( contactPerson("barbacbd"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1806"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureCBORServingAndStorage = newFeatureGate("CBORServingAndStorage"). @@ -819,7 +856,7 @@ var ( contactPerson("benluddy"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/4222"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureCBORClientsAllowCBOR = newFeatureGate("ClientsAllowCBOR"). @@ -834,7 +871,7 @@ var ( contactPerson("benluddy"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/4222"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureEventTTL = newFeatureGate("EventTTL"). @@ -842,7 +879,7 @@ var ( contactPerson("tjungblu"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1857"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateMutableCSINodeAllocatableCount = newFeatureGate("MutableCSINodeAllocatableCount"). @@ -850,14 +887,14 @@ var ( contactPerson("jsafrane"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/4876"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade(), inDefault(), inOKD()). mustRegister() FeatureGateOSStreams = newFeatureGate("OSStreams"). reportProblemsToJiraComponent("MachineConfigOperator"). contactPerson("pabrodri"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1874"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateCRDCompatibilityRequirementOperator = newFeatureGate("CRDCompatibilityRequirementOperator"). @@ -865,14 +902,14 @@ var ( contactPerson("ddonati"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1845"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateOnPremDNSRecords = newFeatureGate("OnPremDNSRecords"). reportProblemsToJiraComponent("Networking / On-Prem DNS"). contactPerson("bnemec"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1803"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateProvisioningRequestAvailable = newFeatureGate("ProvisioningRequestAvailable"). @@ -880,7 +917,7 @@ var ( contactPerson("elmiko"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1752"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateHyperShiftOnlyDynamicResourceAllocation = newFeatureGate("HyperShiftOnlyDynamicResourceAllocation"). @@ -888,7 +925,7 @@ var ( contactPerson("csrwng"). productScope(ocpSpecific). enhancementPR("https://github.com/kubernetes/enhancements/issues/4381"). - enableForClusterProfile(Hypershift, configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade, configv1.Default, configv1.OKD). + enable(inClusterProfile(Hypershift), inDefault(), inOKD(), inTechPreviewNoUpgrade(), inDevPreviewNoUpgrade()). mustRegister() FeatureGateDRAPartitionableDevices = newFeatureGate("DRAPartitionableDevices"). @@ -896,7 +933,7 @@ var ( contactPerson("harche"). productScope(kubernetes). enhancementPR("https://github.com/kubernetes/enhancements/issues/4815"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateConfigurablePKI = newFeatureGate("ConfigurablePKI"). @@ -904,7 +941,7 @@ var ( contactPerson("sanchezl"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1882"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIControlPlaneInstall = newFeatureGate("ClusterAPIControlPlaneInstall"). @@ -912,7 +949,7 @@ var ( contactPerson("patrickdillon"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1465"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateClusterAPIComputeInstall = newFeatureGate("ClusterAPIComputeInstall"). @@ -920,15 +957,14 @@ var ( contactPerson("patrickdillon"). productScope(ocpSpecific). enhancementPR("https://github.com/openshift/enhancements/pull/1465"). - enableIn(configv1.DevPreviewNoUpgrade). + enable(inDevPreviewNoUpgrade()). mustRegister() FeatureGateGatewayAPIWithoutOLM = newFeatureGate("GatewayAPIWithoutOLM"). - reportProblemsToJiraComponent("Routing"). - contactPerson("miciah"). - productScope(ocpSpecific). - enhancementPR("https://github.com/openshift/enhancements/pull/1933"). - enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade). - mustRegister() + reportProblemsToJiraComponent("Routing"). + contactPerson("miciah"). + productScope(ocpSpecific). + enhancementPR("https://github.com/openshift/enhancements/pull/1933"). + enable(inDevPreviewNoUpgrade(), inTechPreviewNoUpgrade()). + mustRegister() ) - diff --git a/features/okd_featureset_parity_test.go b/features/okd_featureset_parity_test.go index d2fe2e7face..76aeca06864 100644 --- a/features/okd_featureset_parity_test.go +++ b/features/okd_featureset_parity_test.go @@ -16,38 +16,40 @@ import ( func TestOKDHasAllDefaultFeatureGates(t *testing.T) { allFeatureSets := AllFeatureSets() - // Check each cluster profile - for clusterProfile, byFeatureSet := range allFeatureSets { - defaultGates, hasDefault := byFeatureSet[configv1.Default] - okdGates, hasOKD := byFeatureSet[configv1.OKD] - - if !hasOKD || !hasDefault { - continue - } - - // Collect enabled feature gate names from Default and OKD - defaultEnabled := sets.NewString() - for _, gate := range defaultGates.Enabled { - defaultEnabled.Insert(string(gate.FeatureGateAttributes.Name)) - } - - okdEnabled := sets.NewString() - for _, gate := range okdGates.Enabled { - okdEnabled.Insert(string(gate.FeatureGateAttributes.Name)) - } - - // Check that all Default featuregates are in OKD - missingInOKD := defaultEnabled.Difference(okdEnabled) - - if missingInOKD.Len() > 0 { - missingList := missingInOKD.List() - sort.Strings(missingList) - - t.Errorf("ClusterProfile %q: OKD featureset is missing %d featuregate(s) that are enabled in Default:\n - %s\n\nAll featuregates enabled in Default must also be enabled in OKD.", - clusterProfile, - missingInOKD.Len(), - strings.Join(missingList, "\n - "), - ) + for _, byClusterProfileByFeatureSet := range allFeatureSets { + // Check each cluster profile + for clusterProfile, byFeatureSet := range byClusterProfileByFeatureSet { + defaultGates, hasDefault := byFeatureSet[configv1.Default] + okdGates, hasOKD := byFeatureSet[configv1.OKD] + + if !hasOKD || !hasDefault { + continue + } + + // Collect enabled feature gate names from Default and OKD + defaultEnabled := sets.NewString() + for _, gate := range defaultGates.Enabled { + defaultEnabled.Insert(string(gate.FeatureGateAttributes.Name)) + } + + okdEnabled := sets.NewString() + for _, gate := range okdGates.Enabled { + okdEnabled.Insert(string(gate.FeatureGateAttributes.Name)) + } + + // Check that all Default featuregates are in OKD + missingInOKD := defaultEnabled.Difference(okdEnabled) + + if missingInOKD.Len() > 0 { + missingList := missingInOKD.List() + sort.Strings(missingList) + + t.Errorf("ClusterProfile %q: OKD featureset is missing %d featuregate(s) that are enabled in Default:\n - %s\n\nAll featuregates enabled in Default must also be enabled in OKD.", + clusterProfile, + missingInOKD.Len(), + strings.Join(missingList, "\n - "), + ) + } } } } diff --git a/features/util.go b/features/util.go index 8606b6befd5..243b325be98 100644 --- a/features/util.go +++ b/features/util.go @@ -6,6 +6,7 @@ import ( "strings" configv1 "github.com/openshift/api/config/v1" + "k8s.io/apimachinery/pkg/util/sets" ) // FeatureGateDescription is a golang-only interface used to contains details for a feature gate. @@ -45,6 +46,77 @@ var ( kubernetes = OwningProduct("Kubernetes") ) +type featureGateEnableOption func(s *featureGateStatus) + +type versionOperator string + +var ( + equal = versionOperator("=") + greaterThan = versionOperator(">") + greaterThanOrEqual = versionOperator(">=") + lessThan = versionOperator("<") + lessThanOrEqual = versionOperator("<=") +) + +func inVersion(version uint64, op versionOperator) featureGateEnableOption { + return func(s *featureGateStatus) { + switch op { + case equal: + s.version.Insert(version) + case greaterThan: + for v := version + 1; v <= maxOpenshiftVersion; v++ { + s.version.Insert(v) + } + case greaterThanOrEqual: + for v := version; v <= maxOpenshiftVersion; v++ { + s.version.Insert(v) + } + case lessThan: + for v := minOpenshiftVersion; v < version; v++ { + s.version.Insert(v) + } + case lessThanOrEqual: + for v := minOpenshiftVersion; v <= version; v++ { + s.version.Insert(v) + } + default: + panic(fmt.Sprintf("invalid version operator: %s", op)) + } + } +} + +func inClusterProfile(clusterProfile ClusterProfileName) featureGateEnableOption { + return func(s *featureGateStatus) { + s.clusterProfile.Insert(clusterProfile) + } +} + +func withFeatureSet(featureSet configv1.FeatureSet) featureGateEnableOption { + return func(s *featureGateStatus) { + s.featureSets.Insert(featureSet) + } +} + +func inDefault() featureGateEnableOption { + return withFeatureSet(configv1.Default) +} + +func inTechPreviewNoUpgrade() featureGateEnableOption { + return withFeatureSet(configv1.TechPreviewNoUpgrade) +} + +func inDevPreviewNoUpgrade() featureGateEnableOption { + return withFeatureSet(configv1.DevPreviewNoUpgrade) +} + +func inCustomNoUpgrade() featureGateEnableOption { + return withFeatureSet(configv1.CustomNoUpgrade) +} + +func inOKD() featureGateEnableOption { + return withFeatureSet(configv1.OKD) +} + type featureGateBuilder struct { name string owningJiraComponent string @@ -52,7 +124,22 @@ type featureGateBuilder struct { owningProduct OwningProduct enhancementPRURL string - statusByClusterProfileByFeatureSet map[ClusterProfileName]map[configv1.FeatureSet]bool + status []featureGateStatus +} +type featureGateStatus struct { + version sets.Set[uint64] + clusterProfile sets.Set[ClusterProfileName] + featureSets sets.Set[configv1.FeatureSet] +} + +func (s *featureGateStatus) isEnabled(version uint64, clusterProfile ClusterProfileName, featureSet configv1.FeatureSet) bool { + // If either version or clusterprofile are empty, match all. + matchesVersion := len(s.version) == 0 || s.version.Has(version) + matchesClusterProfile := len(s.clusterProfile) == 0 || s.clusterProfile.Has(clusterProfile) + + matchesFeatureSet := s.featureSets.Has(featureSet) + + return matchesVersion && matchesClusterProfile && matchesFeatureSet } const ( @@ -61,18 +148,9 @@ const ( // newFeatureGate featuregate are disabled in every FeatureSet and selectively enabled func newFeatureGate(name string) *featureGateBuilder { - b := &featureGateBuilder{ - name: name, - statusByClusterProfileByFeatureSet: map[ClusterProfileName]map[configv1.FeatureSet]bool{}, - } - for _, clusterProfile := range AllClusterProfiles { - byFeatureSet := map[configv1.FeatureSet]bool{} - for _, featureSet := range configv1.AllFixedFeatureSets { - byFeatureSet[featureSet] = false - } - b.statusByClusterProfileByFeatureSet[clusterProfile] = byFeatureSet + return &featureGateBuilder{ + name: name, } - return b } func (b *featureGateBuilder) reportProblemsToJiraComponent(owningJiraComponent string) *featureGateBuilder { @@ -95,19 +173,19 @@ func (b *featureGateBuilder) enhancementPR(url string) *featureGateBuilder { return b } -func (b *featureGateBuilder) enableIn(featureSets ...configv1.FeatureSet) *featureGateBuilder { - for clusterProfile := range b.statusByClusterProfileByFeatureSet { - for _, featureSet := range featureSets { - b.statusByClusterProfileByFeatureSet[clusterProfile][featureSet] = true - } +func (b *featureGateBuilder) enable(opts ...featureGateEnableOption) *featureGateBuilder { + status := featureGateStatus{ + version: sets.New[uint64](), + clusterProfile: sets.New[ClusterProfileName](), + featureSets: sets.New[configv1.FeatureSet](), } - return b -} -func (b *featureGateBuilder) enableForClusterProfile(clusterProfile ClusterProfileName, featureSets ...configv1.FeatureSet) *featureGateBuilder { - for _, featureSet := range featureSets { - b.statusByClusterProfileByFeatureSet[clusterProfile][featureSet] = true + for _, opt := range opts { + opt(&status) } + + b.status = append(b.status, status) + return b } @@ -144,33 +222,8 @@ func (b *featureGateBuilder) register() (configv1.FeatureGateName, error) { } featureGateName := configv1.FeatureGateName(b.name) - description := FeatureGateDescription{ - FeatureGateAttributes: configv1.FeatureGateAttributes{ - Name: featureGateName, - }, - OwningJiraComponent: b.owningJiraComponent, - ResponsiblePerson: b.responsiblePerson, - OwningProduct: b.owningProduct, - EnhancementPR: b.enhancementPRURL, - } - - // statusByClusterProfileByFeatureSet is initialized by constructor to be false for every combination - for clusterProfile, byFeatureSet := range b.statusByClusterProfileByFeatureSet { - for featureSet, enabled := range byFeatureSet { - if _, ok := allFeatureGates[clusterProfile]; !ok { - allFeatureGates[clusterProfile] = map[configv1.FeatureSet]*FeatureGateEnabledDisabled{} - } - if _, ok := allFeatureGates[clusterProfile][featureSet]; !ok { - allFeatureGates[clusterProfile][featureSet] = &FeatureGateEnabledDisabled{} - } - if enabled { - allFeatureGates[clusterProfile][featureSet].Enabled = append(allFeatureGates[clusterProfile][featureSet].Enabled, description) - } else { - allFeatureGates[clusterProfile][featureSet].Disabled = append(allFeatureGates[clusterProfile][featureSet].Disabled, description) - } - } - } + allFeatureGates[featureGateName] = b.status return featureGateName, nil } diff --git a/go.mod b/go.mod index 2aaaa3a4ba7..fae4c403d8d 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/openshift/api go 1.24.0 require ( + github.com/blang/semver/v4 v4.0.0 github.com/gogo/protobuf v1.3.2 golang.org/x/tools v0.26.0 k8s.io/api v0.34.1 diff --git a/go.sum b/go.sum index 4f6574fe053..ec57e923e2c 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/hack/update-payload-crds.sh b/hack/update-payload-crds.sh index 3f0ebc98d77..e1a2c2bb338 100755 --- a/hack/update-payload-crds.sh +++ b/hack/update-payload-crds.sh @@ -23,8 +23,8 @@ crd_globs="\ config/v1/zz_generated.crd-manifests/0000_10_openshift-controller-manager_01_builds*.crd.yaml operator/v1/zz_generated.crd-manifests/0000_50_openshift-controller-manager_02_openshiftcontrollermanagers*.crd.yaml machineconfiguration/v1/zz_generated.crd-manifests/*.crd.yaml - machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-*.crd.yaml - machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-*.crd.yaml + machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages*.crd.yaml + machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams*.crd.yaml operator/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfigurations*.crd.yaml config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitoring*.crd.yaml config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs*.crd.yaml diff --git a/hack/update-payload-featuregates.sh b/hack/update-payload-featuregates.sh index 2c916fb4333..e96a14c73c1 100755 --- a/hack/update-payload-featuregates.sh +++ b/hack/update-payload-featuregates.sh @@ -2,6 +2,7 @@ source "$(dirname "${BASH_SOURCE}")/lib/init.sh" +rm -f ./payload-manifests/featuregates/* go run --mod=vendor -trimpath github.com/openshift/api/payload-command/cmd/write-available-featuresets --asset-output-dir=./payload-manifests/featuregates # Build codegen-crds when it's not present and not overridden for a specific file. diff --git a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml b/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 8dc51203bc9..00000000000 --- a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,628 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - - description: DataGather age - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the configuration - of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers will run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - minProperties: 1 - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering successfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - GathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: downloadedTime is a required field that specifies - when the Insights report was last downloaded. - format: date-time - type: string - healthChecks: - description: |- - healthChecks is an optional field that provides basic information about active Insights - recommendations, which serve as proactive notifications for potential issues in the cluster. - When omitted, it means that there are no active recommendations in the cluster. - items: - description: HealthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healthcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Moderate, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is a required field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - required: - - downloadedTime - - uri - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - minLength: 0 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml b/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index b0dc6cb1df5..00000000000 --- a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,628 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - - description: DataGather age - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the configuration - of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers will run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - minProperties: 1 - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering successfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - GathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: downloadedTime is a required field that specifies - when the Insights report was last downloaded. - format: date-time - type: string - healthChecks: - description: |- - healthChecks is an optional field that provides basic information about active Insights - recommendations, which serve as proactive notifications for potential issues in the cluster. - When omitted, it means that there are no active recommendations in the cluster. - items: - description: HealthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healthcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Moderate, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is a required field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - required: - - downloadedTime - - uri - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - minLength: 0 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml b/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml similarity index 99% rename from payload-manifests/crds/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml rename to insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml index 8dc51203bc9..9fb6eeb3b6f 100644 --- a/payload-manifests/crds/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml +++ b/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: datagathers.insights.openshift.io spec: group: insights.openshift.io diff --git a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml b/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 3e9982ae5d3..00000000000 --- a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,530 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1365 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather job state - jsonPath: .status.dataGatherState - name: State - type: string - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - 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 - properties: - dataPolicy: - description: |- - dataPolicy allows user to enable additional global obfuscation of the IP addresses and base domain - in the Insights archive data. Valid values are "ClearText" and "ObfuscateNetworking". - When set to ClearText the data is not obfuscated. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default is ClearText. - enum: - - "" - - ClearText - - ObfuscateNetworking - type: string - gatherers: - description: |- - gatherers is an optional list of gatherers configurations. - The list must not exceed 100 items. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific gatherers - properties: - name: - description: |- - name is the required name of specific gatherer - It must be at most 256 characters in length. - The format for the gatherer name should be: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters only - that may include underscores (_) and are separated by a - forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state allows you to configure specific gatherer. Valid values are "Enabled", "Disabled" and omitted. - When omitted, this means no opinion and the platform is left to choose a reasonable default. - The current default is Enabled. - enum: - - "" - - Enabled - - Disabled - type: string - required: - - name - type: object - maxItems: 100 - type: array - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - conditions: - description: conditions provide details on the status of the gatherer - job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - dataGatherState: - description: dataGatherState reflects the current state of the data - gathering process. - enum: - - Running - - Completed - - Failed - - Pending - type: string - x-kubernetes-validations: - - message: dataGatherState cannot transition from Running to Pending - rule: '!(oldSelf == ''Running'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Completed to Pending - rule: '!(oldSelf == ''Completed'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Failed to Pending - rule: '!(oldSelf == ''Failed'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Completed to Running - rule: '!(oldSelf == ''Completed'' && self == ''Running'')' - - message: dataGatherState cannot transition from Failed to Running - rule: '!(oldSelf == ''Failed'' && self == ''Running'')' - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - gathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: conditions provide details on the status of each - gatherer. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherDuration: - description: lastGatherDuration represents the time spent gathering. - pattern: ^(([0-9]+(?:\.[0-9]+)?(ns|us|µs|μs|ms|s|m|h))+)$ - type: string - name: - description: name is the name of the gatherer. - maxLength: 256 - minLength: 5 - type: string - required: - - conditions - - lastGatherDuration - - name - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedAt: - description: |- - downloadedAt is the time when the last Insights report was downloaded. - An empty value means that there has not been any Insights report downloaded yet and - it usually appears in disconnected clusters (or clusters when the Insights data gathering is disabled). - format: date-time - type: string - healthChecks: - description: |- - healthChecks provides basic information about active Insights health checks - in a cluster. - items: - description: healthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: description provides basic description of the - healtcheck. - maxLength: 2048 - minLength: 10 - type: string - state: - description: |- - state determines what the current state of the health check is. - Health check is enabled by default and can be disabled - by the user in the Insights advisor user interface. - enum: - - Enabled - - Disabled - type: string - totalRisk: - description: |- - totalRisk of the healthcheck. Indicator of the total risk posed - by the detected issue; combination of impact and likelihood. The values can be from 1 to 4, - and the higher the number, the more important the issue. - format: int32 - maximum: 4 - minimum: 1 - type: integer - required: - - advisorURI - - description - - state - - totalRisk - type: object - maxItems: 100 - type: array - x-kubernetes-list-type: atomic - uri: - description: |- - uri is optional field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - type: object - insightsRequestID: - description: |- - insightsRequestID is an Insights request ID to track the status of the - Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is a list of resources which are useful when debugging or inspecting the data - gathering Pod - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is the API Group of the Resource. - Enter empty string for the core group. - This value is empty or should follow the DNS1123 subdomain format and it must be at most 253 characters in length. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name of the referent that follows the DNS1123 subdomain format. - It must be at most 256 characters in length. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace of the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced. - It is normally the plural form of the resource kind in lowercase. - This value should consist of only lowercase alphanumeric characters and hyphens. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 512 - type: string - x-kubernetes-validations: - - message: resource must consist of only lowercase alphanumeric - characters and hyphens - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") - required: - - group - - name - - resource - type: object - maxItems: 100 - type: array - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - - message: cannot remove dataGatherState attribute from status - rule: (!has(oldSelf.dataGatherState) || has(self.dataGatherState)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml b/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 1999de84d43..00000000000 --- a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,530 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1365 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather job state - jsonPath: .status.dataGatherState - name: State - type: string - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - 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 - properties: - dataPolicy: - description: |- - dataPolicy allows user to enable additional global obfuscation of the IP addresses and base domain - in the Insights archive data. Valid values are "ClearText" and "ObfuscateNetworking". - When set to ClearText the data is not obfuscated. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default is ClearText. - enum: - - "" - - ClearText - - ObfuscateNetworking - type: string - gatherers: - description: |- - gatherers is an optional list of gatherers configurations. - The list must not exceed 100 items. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific gatherers - properties: - name: - description: |- - name is the required name of specific gatherer - It must be at most 256 characters in length. - The format for the gatherer name should be: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters only - that may include underscores (_) and are separated by a - forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state allows you to configure specific gatherer. Valid values are "Enabled", "Disabled" and omitted. - When omitted, this means no opinion and the platform is left to choose a reasonable default. - The current default is Enabled. - enum: - - "" - - Enabled - - Disabled - type: string - required: - - name - type: object - maxItems: 100 - type: array - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - conditions: - description: conditions provide details on the status of the gatherer - job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - dataGatherState: - description: dataGatherState reflects the current state of the data - gathering process. - enum: - - Running - - Completed - - Failed - - Pending - type: string - x-kubernetes-validations: - - message: dataGatherState cannot transition from Running to Pending - rule: '!(oldSelf == ''Running'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Completed to Pending - rule: '!(oldSelf == ''Completed'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Failed to Pending - rule: '!(oldSelf == ''Failed'' && self == ''Pending'')' - - message: dataGatherState cannot transition from Completed to Running - rule: '!(oldSelf == ''Completed'' && self == ''Running'')' - - message: dataGatherState cannot transition from Failed to Running - rule: '!(oldSelf == ''Failed'' && self == ''Running'')' - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - gathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: conditions provide details on the status of each - gatherer. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherDuration: - description: lastGatherDuration represents the time spent gathering. - pattern: ^(([0-9]+(?:\.[0-9]+)?(ns|us|µs|μs|ms|s|m|h))+)$ - type: string - name: - description: name is the name of the gatherer. - maxLength: 256 - minLength: 5 - type: string - required: - - conditions - - lastGatherDuration - - name - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedAt: - description: |- - downloadedAt is the time when the last Insights report was downloaded. - An empty value means that there has not been any Insights report downloaded yet and - it usually appears in disconnected clusters (or clusters when the Insights data gathering is disabled). - format: date-time - type: string - healthChecks: - description: |- - healthChecks provides basic information about active Insights health checks - in a cluster. - items: - description: healthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: description provides basic description of the - healtcheck. - maxLength: 2048 - minLength: 10 - type: string - state: - description: |- - state determines what the current state of the health check is. - Health check is enabled by default and can be disabled - by the user in the Insights advisor user interface. - enum: - - Enabled - - Disabled - type: string - totalRisk: - description: |- - totalRisk of the healthcheck. Indicator of the total risk posed - by the detected issue; combination of impact and likelihood. The values can be from 1 to 4, - and the higher the number, the more important the issue. - format: int32 - maximum: 4 - minimum: 1 - type: integer - required: - - advisorURI - - description - - state - - totalRisk - type: object - maxItems: 100 - type: array - x-kubernetes-list-type: atomic - uri: - description: |- - uri is optional field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - type: object - insightsRequestID: - description: |- - insightsRequestID is an Insights request ID to track the status of the - Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is a list of resources which are useful when debugging or inspecting the data - gathering Pod - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is the API Group of the Resource. - Enter empty string for the core group. - This value is empty or should follow the DNS1123 subdomain format and it must be at most 253 characters in length. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name of the referent that follows the DNS1123 subdomain format. - It must be at most 256 characters in length. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace of the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced. - It is normally the plural form of the resource kind in lowercase. - This value should consist of only lowercase alphanumeric characters and hyphens. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 512 - type: string - x-kubernetes-validations: - - message: resource must consist of only lowercase alphanumeric - characters and hyphens - rule: self.matches("^[a-z0-9]([-a-z0-9]*[a-z0-9])?$") - required: - - group - - name - - resource - type: object - maxItems: 100 - type: array - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - - message: cannot remove dataGatherState attribute from status - rule: (!has(oldSelf.dataGatherState) || has(self.dataGatherState)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml b/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml similarity index 99% rename from insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml rename to insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml index db3fdce62e2..2ad29a056ae 100644 --- a/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml +++ b/insights/v1alpha1/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: datagathers.insights.openshift.io spec: group: insights.openshift.io diff --git a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml b/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index fa34c6de2bb..00000000000 --- a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,603 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2248 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: dataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: |- - gatherers is an optional field that specifies the configuration of the gatherers. - If omitted, all gatherers will be run. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers wil run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering succesfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - gathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: |- - downloadedTime is an optional time when the last Insights report was downloaded. - An empty value means that there has not been any Insights report downloaded yet and - it usually appears in disconnected clusters (or clusters when the Insights data gathering is disabled). - format: date-time - type: string - healthChecks: - description: |- - healthChecks provides basic information about active Insights health checks - in a cluster. - items: - description: healthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healtcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Medium, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is optional field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml b/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 9f9bc50ef06..00000000000 --- a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,603 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2248 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: dataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: |- - gatherers is an optional field that specifies the configuration of the gatherers. - If omitted, all gatherers will be run. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: gathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers wil run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering succesfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - gathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: |- - downloadedTime is an optional time when the last Insights report was downloaded. - An empty value means that there has not been any Insights report downloaded yet and - it usually appears in disconnected clusters (or clusters when the Insights data gathering is disabled). - format: date-time - type: string - healthChecks: - description: |- - healthChecks provides basic information about active Insights health checks - in a cluster. - items: - description: healthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healtcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Medium, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is optional field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml b/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml similarity index 99% rename from insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml rename to insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml index 288414e8fde..ebca530b517 100644 --- a/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers-CustomNoUpgrade.crd.yaml +++ b/insights/v1alpha2/zz_generated.crd-manifests/0000_10_insights_01_datagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: datagathers.insights.openshift.io spec: group: insights.openshift.io diff --git a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml similarity index 99% rename from machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml rename to machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml index 84e5ff76260..4e96be5ea9e 100644 --- a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml +++ b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml @@ -4,6 +4,7 @@ metadata: annotations: api-approved.openshift.io: https://github.com/openshift/api/pull/2255 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/feature-set: Default labels: diff --git a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml deleted file mode 100644 index b05742e01ee..00000000000 --- a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml +++ /dev/null @@ -1,383 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2255 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/ibm-cloud-managed: "true" - release.openshift.io/feature-set: Default - labels: - openshift.io/operator-managed: "" - name: machineconfignodes.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: MachineConfigNode - listKind: MachineConfigNodeList - plural: machineconfignodes - singular: machineconfignode - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.pool.name - name: PoolName - type: string - - jsonPath: .spec.configVersion.desired - name: DesiredConfig - type: string - - jsonPath: .status.configVersion.current - name: CurrentConfig - type: string - - jsonPath: .status.conditions[?(@.type=="Updated")].status - name: Updated - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .status.conditions[?(@.type=="UpdatePrepared")].status - name: UpdatePrepared - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateExecuted")].status - name: UpdateExecuted - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdatePostActionComplete")].status - name: UpdatePostActionComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateComplete")].status - name: UpdateComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Resumed")].status - name: Resumed - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="AppliedFilesAndOS")].status - name: UpdatedFilesAndOS - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Cordoned")].status - name: CordonedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Drained")].status - name: DrainedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="RebootedNode")].status - name: RebootedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Uncordoned")].status - name: UncordonedNode - priority: 1 - type: string - name: v1 - schema: - openAPIV3Schema: - description: |- - MachineConfigNode describes the health of the Machines on the system - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 describes the configuration of the machine config node. - properties: - configVersion: - description: |- - configVersion holds the desired config version for the node targeted by this machine config node resource. - The desired version represents the machine config the node will attempt to update to and gets set before the machine config operator validates - the new machine config against the current machine config. - properties: - desired: - description: |- - desired is the name of the machine config that the the node should be upgraded to. - This value is set when the machine config pool generates a new version of its rendered configuration. - When this value is changed, the machine config daemon starts the node upgrade process. - This value gets set in the machine config node spec once the machine config has been targeted for upgrade and before it is validated. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - node: - description: node contains a reference to the node for this machine - config node. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - pool: - description: |- - pool contains a reference to the machine config pool that this machine config node's - referenced node belongs to. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - required: - - configVersion - - node - - pool - type: object - status: - description: status describes the last observed state of this machine - config node. - properties: - conditions: - description: |- - conditions represent the observations of a machine config node's current state. Valid types are: - UpdatePrepared, UpdateExecuted, UpdatePostActionComplete, UpdateComplete, Updated, Resumed, - Drained, AppliedFilesAndOS, Cordoned, Uncordoned, RebootedNode, NodeDegraded, PinnedImageSetsProgressing, - and PinnedImageSetsDegraded. - The following types are only available when the ImageModeStatusReporting feature gate is enabled: ImagePulledFromRegistry, - AppliedOSImage, AppliedFiles - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - configVersion: - description: configVersion describes the current and desired machine - config version for this node. - properties: - current: - description: |- - current is the name of the machine config currently in use on the node. - This value is updated once the machine config daemon has completed the update of the configuration for the node. - This value should match the desired version unless an upgrade is in progress. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - desired: - description: |- - desired is the MachineConfig the node wants to upgrade to. - This value gets set in the machine config node status once the machine config has been validated - against the current machine config. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - observedGeneration: - description: |- - observedGeneration represents the generation of the MachineConfigNode object observed by the Machine Config Operator's controller. - This field is updated when the controller observes a change to the desiredConfig in the configVersion of the machine config node spec. - format: int64 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: observedGeneration must not decrease - rule: self >= oldSelf - pinnedImageSets: - description: pinnedImageSets describes the current and desired pinned - image sets for this node. - items: - description: MachineConfigNodeStatusPinnedImageSet holds information - about the current, desired, and failed pinned image sets for the - observed machine config node. - properties: - currentGeneration: - description: currentGeneration is the generation of the pinned - image set that has most recently been successfully pulled - and pinned on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: currentGeneration must not decrease - rule: self >= oldSelf - desiredGeneration: - description: desiredGeneration is the generation of the pinned - image set that is targeted to be pulled and pinned on this - node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: desiredGeneration must not decrease - rule: self >= oldSelf - lastFailedGeneration: - description: lastFailedGeneration is the generation of the most - recent pinned image set that failed to be pulled and pinned - on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: lastFailedGeneration must not decrease - rule: self >= oldSelf - lastFailedGenerationError: - description: |- - lastFailedGenerationError is the error explaining why the desired images failed to be pulled and pinned. - The error is an empty string if the image pull and pin is successful. - maxLength: 32768 - type: string - name: - description: |- - name is the name of the pinned image set. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - x-kubernetes-validations: - - message: desired generation must be greater than or equal to the - current generation - rule: 'has(self.desiredGeneration) && has(self.currentGeneration) - ? self.desiredGeneration >= self.currentGeneration : true' - - message: desired generation must be greater than or equal to the - last failed generation - rule: 'has(self.lastFailedGeneration) && has(self.desiredGeneration) - ? self.desiredGeneration >= self.lastFailedGeneration : true' - - message: last failed generation error must be defined on image - pull and pin failure - rule: 'has(self.lastFailedGeneration) ? has(self.lastFailedGenerationError) - : true' - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: spec.node.name should match metadata.name - rule: self.metadata.name == self.spec.node.name - served: true - storage: true - subresources: - status: {} diff --git a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml deleted file mode 100644 index e2009b641fc..00000000000 --- a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml +++ /dev/null @@ -1,383 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2255 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/ibm-cloud-managed: "true" - release.openshift.io/feature-set: OKD - labels: - openshift.io/operator-managed: "" - name: machineconfignodes.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: MachineConfigNode - listKind: MachineConfigNodeList - plural: machineconfignodes - singular: machineconfignode - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.pool.name - name: PoolName - type: string - - jsonPath: .spec.configVersion.desired - name: DesiredConfig - type: string - - jsonPath: .status.configVersion.current - name: CurrentConfig - type: string - - jsonPath: .status.conditions[?(@.type=="Updated")].status - name: Updated - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .status.conditions[?(@.type=="UpdatePrepared")].status - name: UpdatePrepared - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateExecuted")].status - name: UpdateExecuted - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdatePostActionComplete")].status - name: UpdatePostActionComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateComplete")].status - name: UpdateComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Resumed")].status - name: Resumed - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="AppliedFilesAndOS")].status - name: UpdatedFilesAndOS - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Cordoned")].status - name: CordonedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Drained")].status - name: DrainedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="RebootedNode")].status - name: RebootedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Uncordoned")].status - name: UncordonedNode - priority: 1 - type: string - name: v1 - schema: - openAPIV3Schema: - description: |- - MachineConfigNode describes the health of the Machines on the system - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 describes the configuration of the machine config node. - properties: - configVersion: - description: |- - configVersion holds the desired config version for the node targeted by this machine config node resource. - The desired version represents the machine config the node will attempt to update to and gets set before the machine config operator validates - the new machine config against the current machine config. - properties: - desired: - description: |- - desired is the name of the machine config that the the node should be upgraded to. - This value is set when the machine config pool generates a new version of its rendered configuration. - When this value is changed, the machine config daemon starts the node upgrade process. - This value gets set in the machine config node spec once the machine config has been targeted for upgrade and before it is validated. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - node: - description: node contains a reference to the node for this machine - config node. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - pool: - description: |- - pool contains a reference to the machine config pool that this machine config node's - referenced node belongs to. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - required: - - configVersion - - node - - pool - type: object - status: - description: status describes the last observed state of this machine - config node. - properties: - conditions: - description: |- - conditions represent the observations of a machine config node's current state. Valid types are: - UpdatePrepared, UpdateExecuted, UpdatePostActionComplete, UpdateComplete, Updated, Resumed, - Drained, AppliedFilesAndOS, Cordoned, Uncordoned, RebootedNode, NodeDegraded, PinnedImageSetsProgressing, - and PinnedImageSetsDegraded. - The following types are only available when the ImageModeStatusReporting feature gate is enabled: ImagePulledFromRegistry, - AppliedOSImage, AppliedFiles - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - configVersion: - description: configVersion describes the current and desired machine - config version for this node. - properties: - current: - description: |- - current is the name of the machine config currently in use on the node. - This value is updated once the machine config daemon has completed the update of the configuration for the node. - This value should match the desired version unless an upgrade is in progress. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - desired: - description: |- - desired is the MachineConfig the node wants to upgrade to. - This value gets set in the machine config node status once the machine config has been validated - against the current machine config. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - observedGeneration: - description: |- - observedGeneration represents the generation of the MachineConfigNode object observed by the Machine Config Operator's controller. - This field is updated when the controller observes a change to the desiredConfig in the configVersion of the machine config node spec. - format: int64 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: observedGeneration must not decrease - rule: self >= oldSelf - pinnedImageSets: - description: pinnedImageSets describes the current and desired pinned - image sets for this node. - items: - description: MachineConfigNodeStatusPinnedImageSet holds information - about the current, desired, and failed pinned image sets for the - observed machine config node. - properties: - currentGeneration: - description: currentGeneration is the generation of the pinned - image set that has most recently been successfully pulled - and pinned on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: currentGeneration must not decrease - rule: self >= oldSelf - desiredGeneration: - description: desiredGeneration is the generation of the pinned - image set that is targeted to be pulled and pinned on this - node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: desiredGeneration must not decrease - rule: self >= oldSelf - lastFailedGeneration: - description: lastFailedGeneration is the generation of the most - recent pinned image set that failed to be pulled and pinned - on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: lastFailedGeneration must not decrease - rule: self >= oldSelf - lastFailedGenerationError: - description: |- - lastFailedGenerationError is the error explaining why the desired images failed to be pulled and pinned. - The error is an empty string if the image pull and pin is successful. - maxLength: 32768 - type: string - name: - description: |- - name is the name of the pinned image set. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - x-kubernetes-validations: - - message: desired generation must be greater than or equal to the - current generation - rule: 'has(self.desiredGeneration) && has(self.currentGeneration) - ? self.desiredGeneration >= self.currentGeneration : true' - - message: desired generation must be greater than or equal to the - last failed generation - rule: 'has(self.lastFailedGeneration) && has(self.desiredGeneration) - ? self.desiredGeneration >= self.lastFailedGeneration : true' - - message: last failed generation error must be defined on image - pull and pin failure - rule: 'has(self.lastFailedGeneration) ? has(self.lastFailedGenerationError) - : true' - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: spec.node.name should match metadata.name - rule: self.metadata.name == self.spec.node.name - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml similarity index 99% rename from payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml rename to machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml index f81e2329757..42bfba9a7d4 100644 --- a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml +++ b/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml @@ -4,6 +4,7 @@ metadata: annotations: api-approved.openshift.io: https://github.com/openshift/api/pull/2255 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/feature-set: OKD labels: diff --git a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml similarity index 99% rename from payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml rename to machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml index c74586c5ca1..5bac70ef2cc 100644 --- a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml +++ b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml @@ -5,7 +5,6 @@ metadata: api-approved.openshift.io: https://github.com/openshift/api/pull/2510 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/feature-set: CustomNoUpgrade labels: openshift.io/operator-managed: "" diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml similarity index 99% rename from machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml rename to machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml index 69153b31c06..c28df43cb11 100644 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml +++ b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml @@ -5,7 +5,7 @@ metadata: api-approved.openshift.io: https://github.com/openshift/api/pull/2510 api.openshift.io/merged-by-featuregates: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade labels: openshift.io/operator-managed: "" name: internalreleaseimages.machineconfiguration.openshift.io diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 49fdd02b1b9..00000000000 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,190 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2555 - 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/feature-set: CustomNoUpgrade - labels: - openshift.io/operator-managed: "" - name: osimagestreams.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: OSImageStream - listKind: OSImageStreamList - plural: osimagestreams - singular: osimagestream - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - OSImageStream describes a set of streams and associated images available - for the MachineConfigPools to be used as base OS images. - - The resource is a singleton named "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 contains the desired OSImageStream config configuration. - properties: - defaultStream: - description: |- - defaultStream is the desired name of the stream that should be used as the - default when no specific stream is requested by a MachineConfigPool. - - This field is set by the installer during installation. Users may need to - update it if the currently selected stream is no longer available, for - example when the stream has reached its End of Life. - The MachineConfigOperator uses this value to determine which stream from - status.availableStreams to apply as the default for MachineConfigPools - that do not specify a stream override. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - type: object - status: - description: |- - status describes the last observed state of this OSImageStream. - Populated by the MachineConfigOperator after reading release metadata. - When not present, the controller has not yet reconciled this resource. - properties: - availableStreams: - description: |- - availableStreams is a list of the available OS Image Streams that can be - used as the base image for MachineConfigPools. - availableStreams is required, must have at least one item, must not exceed - 100 items, and must have unique entries keyed on the name field. - items: - properties: - name: - description: |- - name is the required identifier of the stream. - - name is determined by the operator based on the OCI label of the - discovered OS or Extension Image. - - Must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - osExtensionsImage: - description: |- - osExtensionsImage is a required OS Extensions Image referenced by digest. - - osExtensionsImage bundles the extra repositories used to enable extensions, augmenting - the base operating system without modifying the underlying immutable osImage. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - osImage: - description: |- - osImage is a required OS Image referenced by digest. - - osImage contains the immutable, fundamental operating system components, including the kernel - and base utilities, that define the core environment for the node's host operating system. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - required: - - name - - osExtensionsImage - - osImage - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - defaultStream: - description: |- - defaultStream is the name of the stream that should be used as the default - when no specific stream is requested by a MachineConfigPool. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'), - and must reference the name of one of the streams in availableStreams. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - availableStreams - - defaultStream - type: object - x-kubernetes-validations: - - message: defaultStream must reference a stream name from availableStreams - rule: self.defaultStream in self.availableStreams.map(s, s.name) - required: - - spec - type: object - x-kubernetes-validations: - - message: osimagestream is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 73deb8c9d83..00000000000 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,190 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2555 - 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/feature-set: DevPreviewNoUpgrade - labels: - openshift.io/operator-managed: "" - name: osimagestreams.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: OSImageStream - listKind: OSImageStreamList - plural: osimagestreams - singular: osimagestream - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - OSImageStream describes a set of streams and associated images available - for the MachineConfigPools to be used as base OS images. - - The resource is a singleton named "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 contains the desired OSImageStream config configuration. - properties: - defaultStream: - description: |- - defaultStream is the desired name of the stream that should be used as the - default when no specific stream is requested by a MachineConfigPool. - - This field is set by the installer during installation. Users may need to - update it if the currently selected stream is no longer available, for - example when the stream has reached its End of Life. - The MachineConfigOperator uses this value to determine which stream from - status.availableStreams to apply as the default for MachineConfigPools - that do not specify a stream override. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - type: object - status: - description: |- - status describes the last observed state of this OSImageStream. - Populated by the MachineConfigOperator after reading release metadata. - When not present, the controller has not yet reconciled this resource. - properties: - availableStreams: - description: |- - availableStreams is a list of the available OS Image Streams that can be - used as the base image for MachineConfigPools. - availableStreams is required, must have at least one item, must not exceed - 100 items, and must have unique entries keyed on the name field. - items: - properties: - name: - description: |- - name is the required identifier of the stream. - - name is determined by the operator based on the OCI label of the - discovered OS or Extension Image. - - Must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - osExtensionsImage: - description: |- - osExtensionsImage is a required OS Extensions Image referenced by digest. - - osExtensionsImage bundles the extra repositories used to enable extensions, augmenting - the base operating system without modifying the underlying immutable osImage. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - osImage: - description: |- - osImage is a required OS Image referenced by digest. - - osImage contains the immutable, fundamental operating system components, including the kernel - and base utilities, that define the core environment for the node's host operating system. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - required: - - name - - osExtensionsImage - - osImage - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - defaultStream: - description: |- - defaultStream is the name of the stream that should be used as the default - when no specific stream is requested by a MachineConfigPool. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'), - and must reference the name of one of the streams in availableStreams. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - availableStreams - - defaultStream - type: object - x-kubernetes-validations: - - message: defaultStream must reference a stream name from availableStreams - rule: self.defaultStream in self.availableStreams.map(s, s.name) - required: - - spec - type: object - x-kubernetes-validations: - - message: osimagestream is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams.crd.yaml similarity index 99% rename from payload-manifests/crds/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml rename to machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams.crd.yaml index 49fdd02b1b9..50a36f06d4d 100644 --- a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-CustomNoUpgrade.crd.yaml +++ b/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade labels: openshift.io/operator-managed: "" name: osimagestreams.machineconfiguration.openshift.io diff --git a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-CustomNoUpgrade.crd.yaml b/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 61608265279..00000000000 --- a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,223 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1524 - 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/feature-set: CustomNoUpgrade - name: dnsnameresolvers.network.openshift.io -spec: - group: network.openshift.io - names: - kind: DNSNameResolver - listKind: DNSNameResolverList - plural: dnsnameresolvers - singular: dnsnameresolver - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - DNSNameResolver stores the DNS name resolution information of a DNS name. It can be enabled by the TechPreviewNoUpgrade feature set. - It can also be enabled by the feature gate DNSNameResolver when using CustomNoUpgrade feature set. - - 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 is the specification of the desired behavior of the - DNSNameResolver. - properties: - name: - description: |- - name is the DNS name for which the DNS name resolution information will be stored. - For a regular DNS name, only the DNS name resolution information of the regular DNS - name will be stored. For a wildcard DNS name, the DNS name resolution information - of all the DNS names that match the wildcard DNS name will be stored. - For a wildcard DNS name, the '*' will match only one label. Additionally, only a single - '*' can be used at the beginning of the wildcard DNS name. For example, '*.example.com.' - will match 'sub1.example.com.' but won't match 'sub2.sub1.example.com.' - maxLength: 254 - pattern: ^(\*\.)?([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.){2,}$ - type: string - x-kubernetes-validations: - - message: spec.name is immutable - rule: self == oldSelf - required: - - name - type: object - status: - description: status is the most recently observed status of the DNSNameResolver. - properties: - resolvedNames: - description: |- - resolvedNames contains a list of matching DNS names and their corresponding IP addresses - along with their TTL and last DNS lookup times. - items: - description: DNSNameResolverResolvedName describes the details of - a resolved DNS name. - properties: - conditions: - description: |- - conditions provide information about the state of the DNS name. - Known .status.conditions.type is: "Degraded". - "Degraded" is true when the last resolution failed for the DNS name, - and false otherwise. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - dnsName: - description: |- - dnsName is the resolved DNS name matching the name field of DNSNameResolverSpec. This field can - store both regular and wildcard DNS names which match the spec.name field. When the spec.name - field contains a regular DNS name, this field will store the same regular DNS name after it is - successfully resolved. When the spec.name field contains a wildcard DNS name, each resolvedName.dnsName - will store the regular DNS names which match the wildcard DNS name and have been successfully resolved. - If the wildcard DNS name can also be successfully resolved, then this field will store the wildcard - DNS name as well. - maxLength: 254 - pattern: ^(\*\.)?([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.){2,}$ - type: string - resolutionFailures: - description: |- - resolutionFailures keeps the count of how many consecutive times the DNS resolution failed - for the dnsName. If the DNS resolution succeeds then the field will be set to zero. Upon - every failure, the value of the field will be incremented by one. The details about the DNS - name will be removed, if the value of resolutionFailures reaches 5 and the TTL of all the - associated IP addresses have expired. - format: int32 - type: integer - resolvedAddresses: - description: |- - resolvedAddresses gives the list of associated IP addresses and their corresponding TTLs and last - lookup times for the dnsName. - items: - description: DNSNameResolverResolvedAddress describes the - details of an IP address for a resolved DNS name. - properties: - ip: - anyOf: - - format: ipv4 - - format: ipv6 - description: |- - ip is an IP address associated with the dnsName. The validity of the IP address expires after - lastLookupTime + ttlSeconds. To refresh the information, a DNS lookup will be performed upon - the expiration of the IP address's validity. If the information is not refreshed then it will - be removed with a grace period after the expiration of the IP address's validity. - type: string - lastLookupTime: - description: |- - lastLookupTime is the timestamp when the last DNS lookup was completed successfully. The validity of - the IP address expires after lastLookupTime + ttlSeconds. The value of this field will be updated to - the current time on a successful DNS lookup. If the information is not refreshed then it will be - removed with a grace period after the expiration of the IP address's validity. - format: date-time - type: string - ttlSeconds: - description: |- - ttlSeconds is the time-to-live value of the IP address. The validity of the IP address expires after - lastLookupTime + ttlSeconds. On a successful DNS lookup the value of this field will be updated with - the current time-to-live value. If the information is not refreshed then it will be removed with a - grace period after the expiration of the IP address's validity. - format: int32 - type: integer - required: - - ip - - lastLookupTime - - ttlSeconds - type: object - type: array - x-kubernetes-list-map-keys: - - ip - x-kubernetes-list-type: map - required: - - dnsName - - resolvedAddresses - type: object - type: array - x-kubernetes-list-map-keys: - - dnsName - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-DevPreviewNoUpgrade.crd.yaml b/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index d7541e96416..00000000000 --- a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,223 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1524 - 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/feature-set: DevPreviewNoUpgrade - name: dnsnameresolvers.network.openshift.io -spec: - group: network.openshift.io - names: - kind: DNSNameResolver - listKind: DNSNameResolverList - plural: dnsnameresolvers - singular: dnsnameresolver - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - DNSNameResolver stores the DNS name resolution information of a DNS name. It can be enabled by the TechPreviewNoUpgrade feature set. - It can also be enabled by the feature gate DNSNameResolver when using CustomNoUpgrade feature set. - - 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 is the specification of the desired behavior of the - DNSNameResolver. - properties: - name: - description: |- - name is the DNS name for which the DNS name resolution information will be stored. - For a regular DNS name, only the DNS name resolution information of the regular DNS - name will be stored. For a wildcard DNS name, the DNS name resolution information - of all the DNS names that match the wildcard DNS name will be stored. - For a wildcard DNS name, the '*' will match only one label. Additionally, only a single - '*' can be used at the beginning of the wildcard DNS name. For example, '*.example.com.' - will match 'sub1.example.com.' but won't match 'sub2.sub1.example.com.' - maxLength: 254 - pattern: ^(\*\.)?([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.){2,}$ - type: string - x-kubernetes-validations: - - message: spec.name is immutable - rule: self == oldSelf - required: - - name - type: object - status: - description: status is the most recently observed status of the DNSNameResolver. - properties: - resolvedNames: - description: |- - resolvedNames contains a list of matching DNS names and their corresponding IP addresses - along with their TTL and last DNS lookup times. - items: - description: DNSNameResolverResolvedName describes the details of - a resolved DNS name. - properties: - conditions: - description: |- - conditions provide information about the state of the DNS name. - Known .status.conditions.type is: "Degraded". - "Degraded" is true when the last resolution failed for the DNS name, - and false otherwise. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - dnsName: - description: |- - dnsName is the resolved DNS name matching the name field of DNSNameResolverSpec. This field can - store both regular and wildcard DNS names which match the spec.name field. When the spec.name - field contains a regular DNS name, this field will store the same regular DNS name after it is - successfully resolved. When the spec.name field contains a wildcard DNS name, each resolvedName.dnsName - will store the regular DNS names which match the wildcard DNS name and have been successfully resolved. - If the wildcard DNS name can also be successfully resolved, then this field will store the wildcard - DNS name as well. - maxLength: 254 - pattern: ^(\*\.)?([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.){2,}$ - type: string - resolutionFailures: - description: |- - resolutionFailures keeps the count of how many consecutive times the DNS resolution failed - for the dnsName. If the DNS resolution succeeds then the field will be set to zero. Upon - every failure, the value of the field will be incremented by one. The details about the DNS - name will be removed, if the value of resolutionFailures reaches 5 and the TTL of all the - associated IP addresses have expired. - format: int32 - type: integer - resolvedAddresses: - description: |- - resolvedAddresses gives the list of associated IP addresses and their corresponding TTLs and last - lookup times for the dnsName. - items: - description: DNSNameResolverResolvedAddress describes the - details of an IP address for a resolved DNS name. - properties: - ip: - anyOf: - - format: ipv4 - - format: ipv6 - description: |- - ip is an IP address associated with the dnsName. The validity of the IP address expires after - lastLookupTime + ttlSeconds. To refresh the information, a DNS lookup will be performed upon - the expiration of the IP address's validity. If the information is not refreshed then it will - be removed with a grace period after the expiration of the IP address's validity. - type: string - lastLookupTime: - description: |- - lastLookupTime is the timestamp when the last DNS lookup was completed successfully. The validity of - the IP address expires after lastLookupTime + ttlSeconds. The value of this field will be updated to - the current time on a successful DNS lookup. If the information is not refreshed then it will be - removed with a grace period after the expiration of the IP address's validity. - format: date-time - type: string - ttlSeconds: - description: |- - ttlSeconds is the time-to-live value of the IP address. The validity of the IP address expires after - lastLookupTime + ttlSeconds. On a successful DNS lookup the value of this field will be updated with - the current time-to-live value. If the information is not refreshed then it will be removed with a - grace period after the expiration of the IP address's validity. - format: int32 - type: integer - required: - - ip - - lastLookupTime - - ttlSeconds - type: object - type: array - x-kubernetes-list-map-keys: - - ip - x-kubernetes-list-type: map - required: - - dnsName - - resolvedAddresses - type: object - type: array - x-kubernetes-list-map-keys: - - dnsName - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-TechPreviewNoUpgrade.crd.yaml b/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers.crd.yaml similarity index 99% rename from network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-TechPreviewNoUpgrade.crd.yaml rename to network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers.crd.yaml index 969b26f94dc..cc33fd83f48 100644 --- a/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers-TechPreviewNoUpgrade.crd.yaml +++ b/network/v1alpha1/zz_generated.crd-manifests/0000_70_dns_00_dnsnameresolvers.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: dnsnameresolvers.network.openshift.io spec: group: network.openshift.io diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-CustomNoUpgrade.crd.yaml b/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 53b1377cb4c..00000000000 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,90 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2044 - 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/feature-set: CustomNoUpgrade - name: clusterversionoperators.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: ClusterVersionOperator - listKind: ClusterVersionOperatorList - plural: clusterversionoperators - singular: clusterversionoperator - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterVersionOperator holds cluster-wide information about the Cluster Version Operator. - - 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 is the specification of the desired behavior of the - Cluster Version Operator. - properties: - operatorLogLevel: - default: Normal - description: |- - operatorLogLevel is an intent based logging for the operator itself. It does not give fine grained control, but it is a - simple way to manage coarse grained logging choices that operators have to interpret for themselves. - - Valid values are: "Normal", "Debug", "Trace", "TraceAll". - Defaults to "Normal". - enum: - - "" - - Normal - - Debug - - Trace - - TraceAll - type: string - type: object - status: - description: status is the most recently observed status of the Cluster - Version Operator. - properties: - observedGeneration: - description: |- - observedGeneration represents the most recent generation observed by the operator and specifies the version of - the spec field currently being synced. - format: int64 - type: integer - x-kubernetes-validations: - - message: observedGeneration must only increase - rule: self >= oldSelf - type: object - required: - - metadata - - spec - type: object - x-kubernetes-validations: - - message: ClusterVersionOperator is a singleton; the .metadata.name field - must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-DevPreviewNoUpgrade.crd.yaml b/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 0ddb0e63521..00000000000 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,90 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2044 - 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/feature-set: DevPreviewNoUpgrade - name: clusterversionoperators.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: ClusterVersionOperator - listKind: ClusterVersionOperatorList - plural: clusterversionoperators - singular: clusterversionoperator - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterVersionOperator holds cluster-wide information about the Cluster Version Operator. - - 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 is the specification of the desired behavior of the - Cluster Version Operator. - properties: - operatorLogLevel: - default: Normal - description: |- - operatorLogLevel is an intent based logging for the operator itself. It does not give fine grained control, but it is a - simple way to manage coarse grained logging choices that operators have to interpret for themselves. - - Valid values are: "Normal", "Debug", "Trace", "TraceAll". - Defaults to "Normal". - enum: - - "" - - Normal - - Debug - - Trace - - TraceAll - type: string - type: object - status: - description: status is the most recently observed status of the Cluster - Version Operator. - properties: - observedGeneration: - description: |- - observedGeneration represents the most recent generation observed by the operator and specifies the version of - the spec field currently being synced. - format: int64 - type: integer - x-kubernetes-validations: - - message: observedGeneration must only increase - rule: self >= oldSelf - type: object - required: - - metadata - - spec - type: object - x-kubernetes-validations: - - message: ClusterVersionOperator is a singleton; the .metadata.name field - must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-TechPreviewNoUpgrade.crd.yaml b/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators.crd.yaml similarity index 97% rename from operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-TechPreviewNoUpgrade.crd.yaml rename to operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators.crd.yaml index 5aaf4580d20..82458ef148c 100644 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators-TechPreviewNoUpgrade.crd.yaml +++ b/operator/v1alpha1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversionoperators.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: clusterversionoperators.operator.openshift.io spec: group: operator.openshift.io diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml b/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 9d56894fdbb..00000000000 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,154 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: TechPreviewNoUpgrade - name: etcdbackups.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: EtcdBackup - listKind: EtcdBackupList - plural: etcdbackups - singular: etcdbackup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - # EtcdBackup provides configuration options and status for a one-time backup attempt of the etcd 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 - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup file would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - x-kubernetes-validations: - - message: pvcName is immutable once set - rule: self == oldSelf - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - backupJob: - description: |- - backupJob is the reference to the Job that executes the backup. - Optional - properties: - name: - description: |- - name is the name of the Job. - Required - type: string - namespace: - description: |- - namespace is the namespace of the Job. - this is always expected to be "openshift-etcd" since the user provided PVC - is also required to be in "openshift-etcd" - Required - pattern: ^openshift-etcd$ - type: string - required: - - name - - namespace - type: object - conditions: - description: conditions provide details on the status of the etcd - backup job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml b/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups.crd.yaml similarity index 98% rename from operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml rename to operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups.crd.yaml index 49bba6f6cb3..37ed90bc05c 100644 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml +++ b/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: CustomNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: etcdbackups.operator.openshift.io spec: group: operator.openshift.io diff --git a/payload-command/render/render.go b/payload-command/render/render.go index 3fa9c4bc6a3..58d74b53a1c 100644 --- a/payload-command/render/render.go +++ b/payload-command/render/render.go @@ -3,12 +3,14 @@ package render import ( "flag" "fmt" - "github.com/openshift/api/features" "os" "path/filepath" "sort" "strings" + "github.com/blang/semver/v4" + "github.com/openshift/api/features" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" @@ -68,6 +70,11 @@ func (o *RenderOpts) Run() error { } clusterProfileAnnotationName := fmt.Sprintf("include.release.openshift.io/%s", o.UnprefixedClusterProfile) + version, err := semver.ParseTolerant(o.PayloadVersion) + if err != nil { + return fmt.Errorf("problem parsing payload version: %w", err) + } + for _, featureGateFile := range featureGateFiles { uncastObj, err := featureGateFile.GetDecodedObj() if err != nil { @@ -84,7 +91,7 @@ func (o *RenderOpts) Run() error { if featureGates.Spec.FeatureSet == configv1.CustomNoUpgrade { featureSet = string(featureGates.Spec.FeatureSet) - renderedFeatureGates, err := renderCustomNoUpgradeFeatureGate(featureGates, features.ClusterProfileName(clusterProfileAnnotationName), o.PayloadVersion) + renderedFeatureGates, err := renderCustomNoUpgradeFeatureGate(featureGates, features.ClusterProfileName(clusterProfileAnnotationName), o.PayloadVersion, version.Major) if err != nil { return err } @@ -105,10 +112,7 @@ func (o *RenderOpts) Run() error { featureGates.Annotations[clusterProfileAnnotationName] = "true" } - featureGateStatus, err := features.FeatureSets(features.ClusterProfileName(clusterProfileAnnotationName), featureGates.Spec.FeatureSet) - if err != nil { - return fmt.Errorf("unable to resolve featureGateStatus: %w", err) - } + featureGateStatus := features.FeatureSets(version.Major, features.ClusterProfileName(clusterProfileAnnotationName), featureGates.Spec.FeatureSet) currentDetails := FeaturesGateDetailsFromFeatureSets(featureGateStatus, o.PayloadVersion) featureGates.Status.FeatureGates = []configv1.FeatureGateDetails{*currentDetails} @@ -133,7 +137,7 @@ func (o *RenderOpts) Run() error { return nil } -func renderCustomNoUpgradeFeatureGate(in *configv1.FeatureGate, clusterProfile features.ClusterProfileName, payloadVersion string) (*configv1.FeatureGate, error) { +func renderCustomNoUpgradeFeatureGate(in *configv1.FeatureGate, clusterProfile features.ClusterProfileName, payloadVersion string, payloadMajorVersion uint64) (*configv1.FeatureGate, error) { if in.Spec.FeatureSet != configv1.CustomNoUpgrade { return nil, fmt.Errorf("not CustomNoUpgrade") } @@ -162,10 +166,7 @@ func renderCustomNoUpgradeFeatureGate(in *configv1.FeatureGate, clusterProfile f }) } - defaultFeatureGates, err := features.FeatureSets(clusterProfile, configv1.Default) - if err != nil { - return nil, err - } + defaultFeatureGates := features.FeatureSets(payloadMajorVersion, clusterProfile, configv1.Default) enabled := []configv1.FeatureGateAttributes{} disabled := []configv1.FeatureGateAttributes{} diff --git a/payload-command/render/write_featureset.go b/payload-command/render/write_featureset.go index 009d31f6b78..9568edd4722 100644 --- a/payload-command/render/write_featureset.go +++ b/payload-command/render/write_featureset.go @@ -3,13 +3,15 @@ package render import ( "flag" "fmt" + "os" + "path/filepath" + "sort" + "strings" + configv1 "github.com/openshift/api/config/v1" "github.com/openshift/api/features" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" - "os" - "path/filepath" - "strings" ) var ( @@ -19,6 +21,126 @@ var ( } ) +// versionGroup represents a group of consecutive versions with identical FeatureGate content +type versionGroup struct { + startVersion uint64 + endVersion uint64 + content *features.FeatureGateEnabledDisabled +} + +// versionRangeString returns a string representation of the version range for filenames +func (vg versionGroup) versionRangeString() string { + if vg.startVersion == vg.endVersion { + return fmt.Sprintf("%d", vg.startVersion) + } + return fmt.Sprintf("%d-%d", vg.startVersion, vg.endVersion) +} + +func (vg versionGroup) versions() []string { + versions := []string{} + + for version := vg.startVersion; version <= vg.endVersion; version++ { + versions = append(versions, fmt.Sprintf("%d", version)) + } + return versions +} + +// featureGateContentEqual compares two FeatureGateEnabledDisabled structs for content equality +func featureGateContentEqual(a, b *features.FeatureGateEnabledDisabled) bool { + if a == nil && b == nil { + return true + } + if a == nil || b == nil { + return false + } + + // Create sorted slices of feature gate names for comparison + aEnabledNames := sets.New(a.Enabled...) + bEnabledNames := sets.New(b.Enabled...) + + if !aEnabledNames.Equal(bEnabledNames) { + return false + } + + aDisabledNames := sets.New(a.Disabled...) + bDisabledNames := sets.New(b.Disabled...) + if !aDisabledNames.Equal(bDisabledNames) { + return false + } + + return true +} + +// consolidateVersions groups consecutive versions with identical content +func consolidateVersions( + statusByVersionByClusterProfileByFeatureSet map[uint64]map[features.ClusterProfileName]map[configv1.FeatureSet]*features.FeatureGateEnabledDisabled, + clusterProfile features.ClusterProfileName, + featureSetName configv1.FeatureSet, +) []versionGroup { + var versionContents []versionGroup + for version, byClusterProfile := range statusByVersionByClusterProfileByFeatureSet { + if byFeatureSet, exists := byClusterProfile[clusterProfile]; exists { + if content, exists := byFeatureSet[featureSetName]; exists { + versionContents = append(versionContents, versionGroup{ + startVersion: version, + content: content, + }) + } + } + } + + // Sort by version + sort.Slice(versionContents, func(i, j int) bool { + return versionContents[i].startVersion < versionContents[j].startVersion + }) + + var groups []versionGroup + + currentGroup := versionContents[0] + currentGroup.endVersion = currentGroup.startVersion + + for i := 1; i < len(versionContents); i++ { + curr := versionContents[i] + + // Check if current version has same content as current group and is consecutive + if featureGateContentEqual(currentGroup.content, curr.content) && + curr.startVersion == currentGroup.endVersion+1 { + // Extend current group + currentGroup.endVersion = curr.startVersion + } else { + // Finalize current group and start new one + groups = append(groups, currentGroup) + currentGroup = curr + currentGroup.endVersion = currentGroup.startVersion + } + } + + // Add the final group + groups = append(groups, currentGroup) + + return groups +} + +// generateConsolidatedFilename creates filename for a version group +func generateConsolidatedFilename(group versionGroup, clusterProfile features.ClusterProfileName, featureSet configv1.FeatureSet) string { + clusterProfileShort := clusterProfileToShortName[clusterProfile] + featureSetStr := featureSetName(featureSet) + + return fmt.Sprintf("featureGate-%s-%s-%s.yaml", group.versionRangeString(), clusterProfileShort, featureSetStr) +} + +func featureSetName(featureSetName configv1.FeatureSet) string { + if featureSetName == "" { + return "Default" + } + return string(featureSetName) +} + +type profileFeatureSet struct { + clusterProfile features.ClusterProfileName + featureSetName configv1.FeatureSet +} + // WriteFeatureSets holds values to drive the render command. type WriteFeatureSets struct { PayloadVersion string @@ -47,21 +169,51 @@ func (o *WriteFeatureSets) Run() error { return err } - statusByClusterProfileByFeatureSet := features.AllFeatureSets() + statusByVersionByClusterProfileByFeatureSet := features.AllFeatureSets() newLegacyFeatureGates := sets.Set[string]{} - for clusterProfile, byFeatureSet := range statusByClusterProfileByFeatureSet { - for featureSetName, featureGateStatuses := range byFeatureSet { - for _, curr := range featureGateStatuses.Enabled { - if curr.EnhancementPR == "FeatureGate predates 4.18" { - newLegacyFeatureGates.Insert(string(curr.FeatureGateAttributes.Name)) + + // First, collect legacy feature gates from all versions (unchanged from original logic) + for _, statusByClusterProfileByFeatureSet := range statusByVersionByClusterProfileByFeatureSet { + for _, byFeatureSet := range statusByClusterProfileByFeatureSet { + for _, featureGateStatuses := range byFeatureSet { + for _, curr := range featureGateStatuses.Enabled { + if curr.EnhancementPR == "FeatureGate predates 4.18" { + newLegacyFeatureGates.Insert(string(curr.FeatureGateAttributes.Name)) + } } - } - for _, curr := range featureGateStatuses.Disabled { - if curr.EnhancementPR == "FeatureGate predates 4.18" { - newLegacyFeatureGates.Insert(string(curr.FeatureGateAttributes.Name)) + for _, curr := range featureGateStatuses.Disabled { + if curr.EnhancementPR == "FeatureGate predates 4.18" { + newLegacyFeatureGates.Insert(string(curr.FeatureGateAttributes.Name)) + } } } - currentDetails := FeaturesGateDetailsFromFeatureSets(featureGateStatuses, o.PayloadVersion) + } + } + + // Create consolidated groups by combining cluster profiles and feature sets + consolidatedGroups := make(map[profileFeatureSet][]versionGroup) + + // Gather all cluster profiles and feature sets to iterate over + allClusterProfiles := features.AllClusterProfiles + allFeatureSets := configv1.AllFixedFeatureSets + + for _, clusterProfile := range allClusterProfiles { + for _, featureSetName := range allFeatureSets { + key := profileFeatureSet{ + clusterProfile: clusterProfile, + featureSetName: featureSetName, + } + groups := consolidateVersions(statusByVersionByClusterProfileByFeatureSet, clusterProfile, featureSetName) + if len(groups) > 0 { + consolidatedGroups[key] = groups + } + } + } + + // Generate files for each consolidated group + for groupKey, versionGroups := range consolidatedGroups { + for _, group := range versionGroups { + currentDetails := FeaturesGateDetailsFromFeatureSets(group.content, o.PayloadVersion) featureGateInstance := &configv1.FeatureGate{ ObjectMeta: metav1.ObjectMeta{ @@ -70,12 +222,14 @@ func (o *WriteFeatureSets) Run() error { // we can't do this because it will get the manifest included by the CVO and that isn't what we want // this makes it interesting to indicate which cluster-profile the cluster-config-operator should use //string(clusterProfile): "true", - string(clusterProfile): "false-except-for-the-config-operator", + string(groupKey.clusterProfile): "false-except-for-the-config-operator", + "release.openshift.io/major-version": strings.Join(group.versions(), ","), + "release.openshift.io/feature-set": featureSetName(groupKey.featureSetName), }, }, Spec: configv1.FeatureGateSpec{ FeatureGateSelection: configv1.FeatureGateSelection{ - FeatureSet: featureSetName, + FeatureSet: groupKey.featureSetName, }, }, Status: configv1.FeatureGateStatus{ @@ -86,10 +240,7 @@ func (o *WriteFeatureSets) Run() error { } featureGateOutBytes := writeFeatureGateV1OrDie(featureGateInstance) - featureSetFileName := fmt.Sprintf("featureGate-%s-%s.yaml", clusterProfileToShortName[clusterProfile], featureSetName) - if len(featureSetName) == 0 { - featureSetFileName = fmt.Sprintf("featureGate-%s-%s.yaml", clusterProfileToShortName[clusterProfile], "Default") - } + featureSetFileName := generateConsolidatedFilename(group, groupKey.clusterProfile, groupKey.featureSetName) destFile := filepath.Join(o.AssetOutputDir, featureSetFileName) if err := os.WriteFile(destFile, []byte(featureGateOutBytes), 0644); err != nil { diff --git a/payload-manifests/crds/0000_10_config-operator_01_backups-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_backups-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 46ea3189f55..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_backups-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,139 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: DevPreviewNoUpgrade - name: backups.config.openshift.io -spec: - group: config.openshift.io - names: - kind: Backup - listKind: BackupList - plural: backups - singular: backup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - Backup provides configuration for performing backups of the openshift 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 - properties: - etcd: - description: etcd specifies the configuration for periodic backups - of the etcd cluster - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup files would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - retentionPolicy: - description: retentionPolicy defines the retention policy for - retaining and deleting existing backups. - properties: - retentionNumber: - description: retentionNumber configures the retention policy - based on the number of backups - properties: - maxNumberOfBackups: - description: |- - maxNumberOfBackups defines the maximum number of backups to retain. - If the existing number of backups saved is equal to MaxNumberOfBackups then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxNumberOfBackups - type: object - retentionSize: - description: retentionSize configures the retention policy - based on the size of backups - properties: - maxSizeOfBackupsGb: - description: |- - maxSizeOfBackupsGb defines the total size in GB of backups to retain. - If the current total size backups exceeds MaxSizeOfBackupsGb then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxSizeOfBackupsGb - type: object - retentionType: - description: |- - retentionType sets the type of retention policy. - Currently, the only valid policies are retention by number of backups (RetentionNumber), by the size of backups (RetentionSize). More policies or types may be added in the future. - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is RetentionNumber with 15 backups kept. - enum: - - RetentionNumber - - RetentionSize - type: string - required: - - retentionType - type: object - schedule: - description: |- - schedule defines the recurring backup schedule in Cron format - every 2 hours: 0 */2 * * * - every day at 3am: 0 3 * * * - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is "no backups", but will change in the future. - pattern: ^(@(annually|yearly|monthly|weekly|daily|hourly))|(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*)) - (\*|(?:\*|(?:\*|(?:[0-9]|1[0-9]|2[0-3])))\/(?:[0-9]|1[0-9]|2[0-3])|(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*)) - (\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*)) - (\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*)) - (\*|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))$ - type: string - timeZone: - description: |- - The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - If not specified, this will default to the time zone of the kube-controller-manager process. - See https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones - pattern: ^([A-Za-z_]+([+-]*0)*|[A-Za-z_]+(\/[A-Za-z_]+){1,2})(\/GMT[+-]\d{1,2})?$ - type: string - type: object - required: - - etcd - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_backups-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_backups-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 75b882873cb..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_backups-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,139 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: TechPreviewNoUpgrade - name: backups.config.openshift.io -spec: - group: config.openshift.io - names: - kind: Backup - listKind: BackupList - plural: backups - singular: backup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - Backup provides configuration for performing backups of the openshift 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 - properties: - etcd: - description: etcd specifies the configuration for periodic backups - of the etcd cluster - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup files would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - retentionPolicy: - description: retentionPolicy defines the retention policy for - retaining and deleting existing backups. - properties: - retentionNumber: - description: retentionNumber configures the retention policy - based on the number of backups - properties: - maxNumberOfBackups: - description: |- - maxNumberOfBackups defines the maximum number of backups to retain. - If the existing number of backups saved is equal to MaxNumberOfBackups then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxNumberOfBackups - type: object - retentionSize: - description: retentionSize configures the retention policy - based on the size of backups - properties: - maxSizeOfBackupsGb: - description: |- - maxSizeOfBackupsGb defines the total size in GB of backups to retain. - If the current total size backups exceeds MaxSizeOfBackupsGb then - the oldest backup will be removed before a new backup is initiated. - minimum: 1 - type: integer - required: - - maxSizeOfBackupsGb - type: object - retentionType: - description: |- - retentionType sets the type of retention policy. - Currently, the only valid policies are retention by number of backups (RetentionNumber), by the size of backups (RetentionSize). More policies or types may be added in the future. - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is RetentionNumber with 15 backups kept. - enum: - - RetentionNumber - - RetentionSize - type: string - required: - - retentionType - type: object - schedule: - description: |- - schedule defines the recurring backup schedule in Cron format - every 2 hours: 0 */2 * * * - every day at 3am: 0 3 * * * - Empty string means no opinion and the platform is left to choose a reasonable default which is subject to change without notice. - The current default is "no backups", but will change in the future. - pattern: ^(@(annually|yearly|monthly|weekly|daily|hourly))|(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*)) - (\*|(?:\*|(?:\*|(?:[0-9]|1[0-9]|2[0-3])))\/(?:[0-9]|1[0-9]|2[0-3])|(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*)) - (\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*)) - (\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*)) - (\*|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))$ - type: string - timeZone: - description: |- - The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - If not specified, this will default to the time zone of the kube-controller-manager process. - See https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#time-zones - pattern: ^([A-Za-z_]+([+-]*0)*|[A-Za-z_]+(\/[A-Za-z_]+){1,2})(\/GMT[+-]\d{1,2})?$ - type: string - type: object - required: - - etcd - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_backups-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_backups.crd.yaml similarity index 98% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_config-operator_01_backups.crd.yaml index 46ea3189f55..7cffedaa00e 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_backups-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_config-operator_01_backups.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: backups.config.openshift.io spec: group: config.openshift.io diff --git a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-CustomNoUpgrade.crd.yaml deleted file mode 100644 index d19655e7783..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,1685 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1929 - api.openshift.io/merged-by-featuregates: "true" - description: Cluster Monitoring Operators configuration API - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade - name: clustermonitorings.config.openshift.io -spec: - group: config.openshift.io - names: - kind: ClusterMonitoring - listKind: ClusterMonitoringList - plural: clustermonitorings - singular: clustermonitoring - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterMonitoring is the Custom Resource object which holds the current status of Cluster Monitoring Operator. CMO is a central component of the monitoring stack. - - 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. - ClusterMonitoring is the Schema for the Cluster Monitoring Operators API - 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 configuration for the Cluster Monitoring - Operator - minProperties: 1 - properties: - alertmanagerConfig: - description: |- - alertmanagerConfig allows users to configure how the default Alertmanager instance - should be deployed in the `openshift-monitoring` namespace. - alertmanagerConfig is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `DefaultConfig`. - properties: - customConfig: - description: |- - customConfig must be set when deploymentMode is CustomConfig, and must be unset otherwise. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Alertmanager. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Alertmanager container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource - requirement for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an - alphanumeric character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - secrets: - description: |- - secrets defines a list of secrets that need to be mounted into the Alertmanager. - The secrets must reside within the same namespace as the Alertmanager object. - They will be added as volumes named secret- and mounted at - /etc/alertmanager/secrets/ within the 'alertmanager' container of - the Alertmanager Pods. - - These secrets can be used to authenticate Alertmanager with endpoint receivers. - For example, you can use secrets to: - - Provide certificates for TLS authentication with receivers that require private CA certificates - - Store credentials for Basic HTTP authentication with receivers that require password-based auth - - Store any other authentication credentials needed by your alert receivers - - This field is optional. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries in this list must be unique. - items: - description: |- - SecretName is a type that represents the name of a Secret in the same namespace. - It must be at most 253 characters in length. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of - lower case alphanumeric characters, '-' or '.', and - must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: set - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Alertmanager Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumeClaimTemplate: - description: |- - volumeClaimTemplate Defines persistent storage for Alertmanager. Use this setting to - configure the persistent volume claim, including storage class, volume - size, and name. - If omitted, the Pod uses ephemeral storage and alert data will not persist - across restarts. - This field is optional. - 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: |- - Standard object's metadata. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - type: object - spec: - description: |- - spec defines the desired characteristics of a volume requested by a pod author. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) - If the provisioner or an external controller can support the specified data source, - it will create a new volume based on the contents of the specified data source. - When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, - and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. - If the namespace is specified, then dataSourceRef will not be copied to dataSource. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a non-empty API group (non - core object) or a PersistentVolumeClaim object. - When this field is specified, volume binding will only succeed if the type of - the specified object matches some installed volume populator or dynamic - provisioner. - This field will replace the functionality of the dataSource field and as such - if both fields are non-empty, they must have the same value. For backwards - compatibility, when namespace isn't specified in dataSourceRef, - both fields (dataSource and dataSourceRef) will be set to the same - value automatically if one of them is empty and the other is non-empty. - When namespace is specified in dataSourceRef, - dataSource isn't set to the same value and must be empty. - There are three important differences between dataSource and dataSourceRef: - * While dataSource only allows two specific types of objects, dataSourceRef - allows any non-core object, as well as PersistentVolumeClaim objects. - * While dataSource ignores disallowed values (dropping them), dataSourceRef - preserves all values, and generates an error if a disallowed value is - specified. - * While dataSource only allows local objects, dataSourceRef allows objects - in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. - (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: |- - resources represents the minimum resources the volume should have. - If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements - that are lower than previous value but must still be higher than capacity recorded in the - status field of the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Requests describes the minimum amount of compute resources required. - If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 - type: string - volumeAttributesClassName: - description: |- - volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. - If specified, the CSI driver will create or update the volume with the attributes defined - in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string or nil value indicates that no - VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, - this field can be reset to its previous value (including nil) to cancel the modification. - If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be - set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource - exists. - More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - type: string - volumeMode: - description: |- - volumeMode defines what type of volume is required by the claim. - Value of Filesystem is implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to - the PersistentVolume backing this claim. - type: string - type: object - status: - description: |- - status represents the current information/status of a persistent volume claim. - Read-only. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the actual access modes the volume backing the PVC has. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - allocatedResourceStatuses: - additionalProperties: - description: |- - When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource - that it does not recognizes, then it should ignore that update and let other controllers - handle it. - type: string - description: "allocatedResourceStatuses stores status - of resource being resized for the given PVC.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nClaimResourceStatus - can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState - set when resize controller starts resizing the volume - in control-plane.\n\t- ControllerResizeFailed:\n\t\tState - set when resize has failed in resize controller - with a terminal error.\n\t- NodeResizePending:\n\t\tState - set when resize controller has finished resizing - the volume but further resizing of\n\t\tvolume is - needed on the node.\n\t- NodeResizeInProgress:\n\t\tState - set when kubelet starts resizing the volume.\n\t- - NodeResizeFailed:\n\t\tState set when resizing has - failed in kubelet with a terminal error. Transient - errors don't set\n\t\tNodeResizeFailed.\nFor example: - if expanding a PVC for more capacity - this field - can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeFailed\"\nWhen this field is not set, - it means that no resize operation is in progress - for the given PVC.\n\nA controller that receives - PVC update with previously unknown resourceName - or ClaimResourceStatus\nshould ignore the update - for the purpose it was designed. For example - a - controller that\nonly is responsible for resizing - capacity of the volume, should ignore PVC updates - that change other valid\nresources associated with - PVC.\n\nThis is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature." - type: object - x-kubernetes-map-type: granular - allocatedResources: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: "allocatedResources tracks the resources - allocated to a PVC including its capacity.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nCapacity reported - here may be larger than the actual capacity when - a volume expansion operation\nis requested.\nFor - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used.\nIf allocatedResources - is not set, PVC.spec.resources alone is used for - quota calculation.\nIf a volume expansion capacity - request is lowered, allocatedResources is only\nlowered - if there are no expansion operations in progress - and if the actual volume capacity\nis equal or lower - than the requested capacity.\n\nA controller that - receives PVC update with previously unknown resourceName\nshould - ignore the update for the purpose it was designed. - For example - a controller that\nonly is responsible - for resizing capacity of the volume, should ignore - PVC updates that change other valid\nresources associated - with PVC.\n\nThis is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature." - type: object - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: capacity represents the actual resources - of the underlying volume. - type: object - conditions: - description: |- - conditions is the current Condition of persistent volume claim. If underlying persistent volume is being - resized then the Condition will be set to 'Resizing'. - items: - description: PersistentVolumeClaimCondition contains - details about state of pvc - properties: - lastProbeTime: - description: lastProbeTime is the time we probed - the condition. - format: date-time - type: string - lastTransitionTime: - description: lastTransitionTime is the time - the condition transitioned from one status - to another. - format: date-time - type: string - message: - description: message is the human-readable message - indicating details about last transition. - type: string - reason: - description: |- - reason is a unique, this should be a short, machine understandable string that gives the reason - for condition's last transition. If it reports "Resizing" that means the underlying - persistent volume is being resized. - type: string - status: - description: |- - Status is the status of the condition. - Can be True, False, Unknown. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=state%20of%20pvc-,conditions.status,-(string)%2C%20required - type: string - type: - description: |- - Type is the type of the condition. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=set%20to%20%27ResizeStarted%27.-,PersistentVolumeClaimCondition,-contains%20details%20about - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - currentVolumeAttributesClassName: - description: |- - currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. - When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - type: string - modifyVolumeStatus: - description: |- - ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. - When this is unset, there is no ModifyVolume operation being attempted. - properties: - status: - description: "status is the status of the ControllerModifyVolume - operation. It can be in any of following states:\n - - Pending\n Pending indicates that the PersistentVolumeClaim - cannot be modified due to unmet requirements, - such as\n the specified VolumeAttributesClass - not existing.\n - InProgress\n InProgress - indicates that the volume is being modified.\n - - Infeasible\n Infeasible indicates that the - request has been rejected as invalid by the - CSI driver. To\n\t resolve the error, a valid - VolumeAttributesClass needs to be specified.\nNote: - New statuses can be added in the future. Consumers - should check for unknown statuses and fail appropriately." - type: string - targetVolumeAttributesClassName: - description: targetVolumeAttributesClassName is - the name of the VolumeAttributesClass the PVC - currently being reconciled - type: string - required: - - status - type: object - phase: - description: phase represents the current phase of - PersistentVolumeClaim. - type: string - type: object - type: object - type: object - deploymentMode: - description: |- - deploymentMode determines whether the default Alertmanager instance should be deployed - as part of the monitoring stack. - Allowed values are Disabled, DefaultConfig, and CustomConfig. - When set to Disabled, the Alertmanager instance will not be deployed. - When set to DefaultConfig, the platform will deploy Alertmanager with default settings. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - enum: - - Disabled - - DefaultConfig - - CustomConfig - type: string - required: - - deploymentMode - type: object - x-kubernetes-validations: - - message: customConfig is required when deploymentMode is CustomConfig, - and forbidden otherwise - rule: 'self.deploymentMode == ''CustomConfig'' ? has(self.customConfig) - : !has(self.customConfig)' - metricsServerConfig: - description: |- - metricsServerConfig is an optional field that can be used to configure the Kubernetes Metrics Server that runs in the openshift-monitoring namespace. - Specifically, it can configure how the Metrics Server instance is deployed, pod scheduling, its audit policy and log verbosity. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - audit: - description: |- - audit defines the audit configuration used by the Metrics Server instance. - audit is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default sets audit.profile to Metadata - properties: - profile: - description: |- - profile is a required field for configuring the audit log level of the Kubernetes Metrics Server. - Allowed values are None, Metadata, Request, or RequestResponse. - When set to None, audit logging is disabled and no audit events are recorded. - When set to Metadata, only request metadata (such as requesting user, timestamp, resource, verb, etc.) is logged, but not the request or response body. - When set to Request, event metadata and the request body are logged, but not the response body. - When set to RequestResponse, event metadata, request body, and response body are all logged, providing the most detailed audit information. - - See: https://kubernetes.io/docs/tasks/debug-application-cluster/audit/#audit-policy - for more information about auditing and log levels. - enum: - - None - - Metadata - - Request - - RequestResponse - type: string - required: - - profile - type: object - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Metrics Server container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Metrics Server Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - verbosity: - description: |- - verbosity defines the verbosity of log messages for Metrics Server. - Valid values are Errors, Info, Trace, TraceAll and omitted. - When set to Errors, only critical messages and errors are logged. - When set to Info, only basic information messages are logged. - When set to Trace, information useful for general debugging is logged. - When set to TraceAll, detailed information about metric scraping is logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Errors` - enum: - - Errors - - Info - - Trace - - TraceAll - type: string - type: object - prometheusOperatorConfig: - description: |- - prometheusOperatorConfig is an optional field that can be used to configure the Prometheus Operator component. - Specifically, it can configure how the Prometheus Operator instance is deployed, pod scheduling, and resource allocation. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Prometheus Operator. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - When specified, nodeSelector must contain at least 1 entry and must not contain more than 10 entries. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Prometheus Operator container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Prometheus Operator Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - type: object - userDefined: - description: |- - userDefined set the deployment mode for user-defined monitoring in addition to the default platform monitoring. - userDefined is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default value is `Disabled`. - properties: - mode: - description: |- - mode defines the different configurations of UserDefinedMonitoring - Valid values are Disabled and NamespaceIsolated - Disabled disables monitoring for user-defined projects. This restricts the default monitoring stack, installed in the openshift-monitoring project, to monitor only platform namespaces, which prevents any custom monitoring configurations or resources from being applied to user-defined namespaces. - NamespaceIsolated enables monitoring for user-defined projects with namespace-scoped tenancy. This ensures that metrics, alerts, and monitoring data are isolated at the namespace level. - The current default value is `Disabled`. - enum: - - Disabled - - NamespaceIsolated - type: string - required: - - mode - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 070f78e1f1d..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,1685 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1929 - api.openshift.io/merged-by-featuregates: "true" - description: Cluster Monitoring Operators configuration API - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: clustermonitorings.config.openshift.io -spec: - group: config.openshift.io - names: - kind: ClusterMonitoring - listKind: ClusterMonitoringList - plural: clustermonitorings - singular: clustermonitoring - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterMonitoring is the Custom Resource object which holds the current status of Cluster Monitoring Operator. CMO is a central component of the monitoring stack. - - 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. - ClusterMonitoring is the Schema for the Cluster Monitoring Operators API - 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 configuration for the Cluster Monitoring - Operator - minProperties: 1 - properties: - alertmanagerConfig: - description: |- - alertmanagerConfig allows users to configure how the default Alertmanager instance - should be deployed in the `openshift-monitoring` namespace. - alertmanagerConfig is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `DefaultConfig`. - properties: - customConfig: - description: |- - customConfig must be set when deploymentMode is CustomConfig, and must be unset otherwise. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Alertmanager. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Alertmanager container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource - requirement for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an - alphanumeric character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - secrets: - description: |- - secrets defines a list of secrets that need to be mounted into the Alertmanager. - The secrets must reside within the same namespace as the Alertmanager object. - They will be added as volumes named secret- and mounted at - /etc/alertmanager/secrets/ within the 'alertmanager' container of - the Alertmanager Pods. - - These secrets can be used to authenticate Alertmanager with endpoint receivers. - For example, you can use secrets to: - - Provide certificates for TLS authentication with receivers that require private CA certificates - - Store credentials for Basic HTTP authentication with receivers that require password-based auth - - Store any other authentication credentials needed by your alert receivers - - This field is optional. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries in this list must be unique. - items: - description: |- - SecretName is a type that represents the name of a Secret in the same namespace. - It must be at most 253 characters in length. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of - lower case alphanumeric characters, '-' or '.', and - must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: set - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Alertmanager Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumeClaimTemplate: - description: |- - volumeClaimTemplate Defines persistent storage for Alertmanager. Use this setting to - configure the persistent volume claim, including storage class, volume - size, and name. - If omitted, the Pod uses ephemeral storage and alert data will not persist - across restarts. - This field is optional. - 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: |- - Standard object's metadata. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - type: object - spec: - description: |- - spec defines the desired characteristics of a volume requested by a pod author. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) - If the provisioner or an external controller can support the specified data source, - it will create a new volume based on the contents of the specified data source. - When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, - and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. - If the namespace is specified, then dataSourceRef will not be copied to dataSource. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a non-empty API group (non - core object) or a PersistentVolumeClaim object. - When this field is specified, volume binding will only succeed if the type of - the specified object matches some installed volume populator or dynamic - provisioner. - This field will replace the functionality of the dataSource field and as such - if both fields are non-empty, they must have the same value. For backwards - compatibility, when namespace isn't specified in dataSourceRef, - both fields (dataSource and dataSourceRef) will be set to the same - value automatically if one of them is empty and the other is non-empty. - When namespace is specified in dataSourceRef, - dataSource isn't set to the same value and must be empty. - There are three important differences between dataSource and dataSourceRef: - * While dataSource only allows two specific types of objects, dataSourceRef - allows any non-core object, as well as PersistentVolumeClaim objects. - * While dataSource ignores disallowed values (dropping them), dataSourceRef - preserves all values, and generates an error if a disallowed value is - specified. - * While dataSource only allows local objects, dataSourceRef allows objects - in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. - (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: |- - resources represents the minimum resources the volume should have. - If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements - that are lower than previous value but must still be higher than capacity recorded in the - status field of the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Requests describes the minimum amount of compute resources required. - If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 - type: string - volumeAttributesClassName: - description: |- - volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. - If specified, the CSI driver will create or update the volume with the attributes defined - in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string or nil value indicates that no - VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, - this field can be reset to its previous value (including nil) to cancel the modification. - If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be - set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource - exists. - More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - type: string - volumeMode: - description: |- - volumeMode defines what type of volume is required by the claim. - Value of Filesystem is implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to - the PersistentVolume backing this claim. - type: string - type: object - status: - description: |- - status represents the current information/status of a persistent volume claim. - Read-only. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the actual access modes the volume backing the PVC has. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - allocatedResourceStatuses: - additionalProperties: - description: |- - When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource - that it does not recognizes, then it should ignore that update and let other controllers - handle it. - type: string - description: "allocatedResourceStatuses stores status - of resource being resized for the given PVC.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nClaimResourceStatus - can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState - set when resize controller starts resizing the volume - in control-plane.\n\t- ControllerResizeFailed:\n\t\tState - set when resize has failed in resize controller - with a terminal error.\n\t- NodeResizePending:\n\t\tState - set when resize controller has finished resizing - the volume but further resizing of\n\t\tvolume is - needed on the node.\n\t- NodeResizeInProgress:\n\t\tState - set when kubelet starts resizing the volume.\n\t- - NodeResizeFailed:\n\t\tState set when resizing has - failed in kubelet with a terminal error. Transient - errors don't set\n\t\tNodeResizeFailed.\nFor example: - if expanding a PVC for more capacity - this field - can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeFailed\"\nWhen this field is not set, - it means that no resize operation is in progress - for the given PVC.\n\nA controller that receives - PVC update with previously unknown resourceName - or ClaimResourceStatus\nshould ignore the update - for the purpose it was designed. For example - a - controller that\nonly is responsible for resizing - capacity of the volume, should ignore PVC updates - that change other valid\nresources associated with - PVC.\n\nThis is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature." - type: object - x-kubernetes-map-type: granular - allocatedResources: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: "allocatedResources tracks the resources - allocated to a PVC including its capacity.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nCapacity reported - here may be larger than the actual capacity when - a volume expansion operation\nis requested.\nFor - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used.\nIf allocatedResources - is not set, PVC.spec.resources alone is used for - quota calculation.\nIf a volume expansion capacity - request is lowered, allocatedResources is only\nlowered - if there are no expansion operations in progress - and if the actual volume capacity\nis equal or lower - than the requested capacity.\n\nA controller that - receives PVC update with previously unknown resourceName\nshould - ignore the update for the purpose it was designed. - For example - a controller that\nonly is responsible - for resizing capacity of the volume, should ignore - PVC updates that change other valid\nresources associated - with PVC.\n\nThis is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature." - type: object - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: capacity represents the actual resources - of the underlying volume. - type: object - conditions: - description: |- - conditions is the current Condition of persistent volume claim. If underlying persistent volume is being - resized then the Condition will be set to 'Resizing'. - items: - description: PersistentVolumeClaimCondition contains - details about state of pvc - properties: - lastProbeTime: - description: lastProbeTime is the time we probed - the condition. - format: date-time - type: string - lastTransitionTime: - description: lastTransitionTime is the time - the condition transitioned from one status - to another. - format: date-time - type: string - message: - description: message is the human-readable message - indicating details about last transition. - type: string - reason: - description: |- - reason is a unique, this should be a short, machine understandable string that gives the reason - for condition's last transition. If it reports "Resizing" that means the underlying - persistent volume is being resized. - type: string - status: - description: |- - Status is the status of the condition. - Can be True, False, Unknown. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=state%20of%20pvc-,conditions.status,-(string)%2C%20required - type: string - type: - description: |- - Type is the type of the condition. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=set%20to%20%27ResizeStarted%27.-,PersistentVolumeClaimCondition,-contains%20details%20about - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - currentVolumeAttributesClassName: - description: |- - currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. - When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - type: string - modifyVolumeStatus: - description: |- - ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. - When this is unset, there is no ModifyVolume operation being attempted. - properties: - status: - description: "status is the status of the ControllerModifyVolume - operation. It can be in any of following states:\n - - Pending\n Pending indicates that the PersistentVolumeClaim - cannot be modified due to unmet requirements, - such as\n the specified VolumeAttributesClass - not existing.\n - InProgress\n InProgress - indicates that the volume is being modified.\n - - Infeasible\n Infeasible indicates that the - request has been rejected as invalid by the - CSI driver. To\n\t resolve the error, a valid - VolumeAttributesClass needs to be specified.\nNote: - New statuses can be added in the future. Consumers - should check for unknown statuses and fail appropriately." - type: string - targetVolumeAttributesClassName: - description: targetVolumeAttributesClassName is - the name of the VolumeAttributesClass the PVC - currently being reconciled - type: string - required: - - status - type: object - phase: - description: phase represents the current phase of - PersistentVolumeClaim. - type: string - type: object - type: object - type: object - deploymentMode: - description: |- - deploymentMode determines whether the default Alertmanager instance should be deployed - as part of the monitoring stack. - Allowed values are Disabled, DefaultConfig, and CustomConfig. - When set to Disabled, the Alertmanager instance will not be deployed. - When set to DefaultConfig, the platform will deploy Alertmanager with default settings. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - enum: - - Disabled - - DefaultConfig - - CustomConfig - type: string - required: - - deploymentMode - type: object - x-kubernetes-validations: - - message: customConfig is required when deploymentMode is CustomConfig, - and forbidden otherwise - rule: 'self.deploymentMode == ''CustomConfig'' ? has(self.customConfig) - : !has(self.customConfig)' - metricsServerConfig: - description: |- - metricsServerConfig is an optional field that can be used to configure the Kubernetes Metrics Server that runs in the openshift-monitoring namespace. - Specifically, it can configure how the Metrics Server instance is deployed, pod scheduling, its audit policy and log verbosity. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - audit: - description: |- - audit defines the audit configuration used by the Metrics Server instance. - audit is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default sets audit.profile to Metadata - properties: - profile: - description: |- - profile is a required field for configuring the audit log level of the Kubernetes Metrics Server. - Allowed values are None, Metadata, Request, or RequestResponse. - When set to None, audit logging is disabled and no audit events are recorded. - When set to Metadata, only request metadata (such as requesting user, timestamp, resource, verb, etc.) is logged, but not the request or response body. - When set to Request, event metadata and the request body are logged, but not the response body. - When set to RequestResponse, event metadata, request body, and response body are all logged, providing the most detailed audit information. - - See: https://kubernetes.io/docs/tasks/debug-application-cluster/audit/#audit-policy - for more information about auditing and log levels. - enum: - - None - - Metadata - - Request - - RequestResponse - type: string - required: - - profile - type: object - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Metrics Server container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Metrics Server Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - verbosity: - description: |- - verbosity defines the verbosity of log messages for Metrics Server. - Valid values are Errors, Info, Trace, TraceAll and omitted. - When set to Errors, only critical messages and errors are logged. - When set to Info, only basic information messages are logged. - When set to Trace, information useful for general debugging is logged. - When set to TraceAll, detailed information about metric scraping is logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Errors` - enum: - - Errors - - Info - - Trace - - TraceAll - type: string - type: object - prometheusOperatorConfig: - description: |- - prometheusOperatorConfig is an optional field that can be used to configure the Prometheus Operator component. - Specifically, it can configure how the Prometheus Operator instance is deployed, pod scheduling, and resource allocation. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Prometheus Operator. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - When specified, nodeSelector must contain at least 1 entry and must not contain more than 10 entries. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Prometheus Operator container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Prometheus Operator Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - type: object - userDefined: - description: |- - userDefined set the deployment mode for user-defined monitoring in addition to the default platform monitoring. - userDefined is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default value is `Disabled`. - properties: - mode: - description: |- - mode defines the different configurations of UserDefinedMonitoring - Valid values are Disabled and NamespaceIsolated - Disabled disables monitoring for user-defined projects. This restricts the default monitoring stack, installed in the openshift-monitoring project, to monitor only platform namespaces, which prevents any custom monitoring configurations or resources from being applied to user-defined namespaces. - NamespaceIsolated enables monitoring for user-defined projects with namespace-scoped tenancy. This ensures that metrics, alerts, and monitoring data are isolated at the namespace level. - The current default value is `Disabled`. - enum: - - Disabled - - NamespaceIsolated - type: string - required: - - mode - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index af85a050e3c..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,1685 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1929 - api.openshift.io/merged-by-featuregates: "true" - description: Cluster Monitoring Operators configuration API - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: clustermonitorings.config.openshift.io -spec: - group: config.openshift.io - names: - kind: ClusterMonitoring - listKind: ClusterMonitoringList - plural: clustermonitorings - singular: clustermonitoring - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - ClusterMonitoring is the Custom Resource object which holds the current status of Cluster Monitoring Operator. CMO is a central component of the monitoring stack. - - 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. - ClusterMonitoring is the Schema for the Cluster Monitoring Operators API - 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 configuration for the Cluster Monitoring - Operator - minProperties: 1 - properties: - alertmanagerConfig: - description: |- - alertmanagerConfig allows users to configure how the default Alertmanager instance - should be deployed in the `openshift-monitoring` namespace. - alertmanagerConfig is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `DefaultConfig`. - properties: - customConfig: - description: |- - customConfig must be set when deploymentMode is CustomConfig, and must be unset otherwise. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Alertmanager. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Alertmanager container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource - requirement for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an - alphanumeric character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - secrets: - description: |- - secrets defines a list of secrets that need to be mounted into the Alertmanager. - The secrets must reside within the same namespace as the Alertmanager object. - They will be added as volumes named secret- and mounted at - /etc/alertmanager/secrets/ within the 'alertmanager' container of - the Alertmanager Pods. - - These secrets can be used to authenticate Alertmanager with endpoint receivers. - For example, you can use secrets to: - - Provide certificates for TLS authentication with receivers that require private CA certificates - - Store credentials for Basic HTTP authentication with receivers that require password-based auth - - Store any other authentication credentials needed by your alert receivers - - This field is optional. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries in this list must be unique. - items: - description: |- - SecretName is a type that represents the name of a Secret in the same namespace. - It must be at most 253 characters in length. - maxLength: 63 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of - lower case alphanumeric characters, '-' or '.', and - must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: set - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Alertmanager Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - volumeClaimTemplate: - description: |- - volumeClaimTemplate Defines persistent storage for Alertmanager. Use this setting to - configure the persistent volume claim, including storage class, volume - size, and name. - If omitted, the Pod uses ephemeral storage and alert data will not persist - across restarts. - This field is optional. - 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: |- - Standard object's metadata. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - type: object - spec: - description: |- - spec defines the desired characteristics of a volume requested by a pod author. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) - * An existing PVC (PersistentVolumeClaim) - If the provisioner or an external controller can support the specified data source, - it will create a new volume based on the contents of the specified data source. - When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, - and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. - If the namespace is specified, then dataSourceRef will not be copied to dataSource. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. This may be any object from a non-empty API group (non - core object) or a PersistentVolumeClaim object. - When this field is specified, volume binding will only succeed if the type of - the specified object matches some installed volume populator or dynamic - provisioner. - This field will replace the functionality of the dataSource field and as such - if both fields are non-empty, they must have the same value. For backwards - compatibility, when namespace isn't specified in dataSourceRef, - both fields (dataSource and dataSourceRef) will be set to the same - value automatically if one of them is empty and the other is non-empty. - When namespace is specified in dataSourceRef, - dataSource isn't set to the same value and must be empty. - There are three important differences between dataSource and dataSourceRef: - * While dataSource only allows two specific types of objects, dataSourceRef - allows any non-core object, as well as PersistentVolumeClaim objects. - * While dataSource ignores disallowed values (dropping them), dataSourceRef - preserves all values, and generates an error if a disallowed value is - specified. - * While dataSource only allows local objects, dataSourceRef allows objects - in any namespaces. - (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. - (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - properties: - apiGroup: - description: |- - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being - referenced - type: string - name: - description: Name is the name of resource being - referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled. - type: string - required: - - kind - - name - type: object - resources: - description: |- - resources represents the minimum resources the volume should have. - If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements - that are lower than previous value but must still be higher than capacity recorded in the - status field of the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Requests describes the minimum amount of compute resources required. - If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, - otherwise to an implementation-defined value. Requests cannot exceed Limits. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - type: object - type: object - selector: - description: selector is a label query over volumes - to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list of label - selector requirements. The requirements are - ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the - selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1 - type: string - volumeAttributesClassName: - description: |- - volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. - If specified, the CSI driver will create or update the volume with the attributes defined - in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string or nil value indicates that no - VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, - this field can be reset to its previous value (including nil) to cancel the modification. - If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be - set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource - exists. - More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - type: string - volumeMode: - description: |- - volumeMode defines what type of volume is required by the claim. - Value of Filesystem is implied when not included in claim spec. - type: string - volumeName: - description: volumeName is the binding reference to - the PersistentVolume backing this claim. - type: string - type: object - status: - description: |- - status represents the current information/status of a persistent volume claim. - Read-only. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - properties: - accessModes: - description: |- - accessModes contains the actual access modes the volume backing the PVC has. - More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1 - items: - type: string - type: array - x-kubernetes-list-type: atomic - allocatedResourceStatuses: - additionalProperties: - description: |- - When a controller receives persistentvolume claim update with ClaimResourceStatus for a resource - that it does not recognizes, then it should ignore that update and let other controllers - handle it. - type: string - description: "allocatedResourceStatuses stores status - of resource being resized for the given PVC.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nClaimResourceStatus - can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState - set when resize controller starts resizing the volume - in control-plane.\n\t- ControllerResizeFailed:\n\t\tState - set when resize has failed in resize controller - with a terminal error.\n\t- NodeResizePending:\n\t\tState - set when resize controller has finished resizing - the volume but further resizing of\n\t\tvolume is - needed on the node.\n\t- NodeResizeInProgress:\n\t\tState - set when kubelet starts resizing the volume.\n\t- - NodeResizeFailed:\n\t\tState set when resizing has - failed in kubelet with a terminal error. Transient - errors don't set\n\t\tNodeResizeFailed.\nFor example: - if expanding a PVC for more capacity - this field - can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] - = \"NodeResizeFailed\"\nWhen this field is not set, - it means that no resize operation is in progress - for the given PVC.\n\nA controller that receives - PVC update with previously unknown resourceName - or ClaimResourceStatus\nshould ignore the update - for the purpose it was designed. For example - a - controller that\nonly is responsible for resizing - capacity of the volume, should ignore PVC updates - that change other valid\nresources associated with - PVC.\n\nThis is an alpha field and requires enabling - RecoverVolumeExpansionFailure feature." - type: object - x-kubernetes-map-type: granular - allocatedResources: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: "allocatedResources tracks the resources - allocated to a PVC including its capacity.\nKey - names follow standard Kubernetes label syntax. Valid - values are either:\n\t* Un-prefixed keys:\n\t\t- - storage - the capacity of the volume.\n\t* Custom - resources must use implementation-defined prefixed - names such as \"example.com/my-custom-resource\"\nApart - from above values - keys that are unprefixed or - have kubernetes.io prefix are considered\nreserved - and hence may not be used.\n\nCapacity reported - here may be larger than the actual capacity when - a volume expansion operation\nis requested.\nFor - storage quota, the larger value from allocatedResources - and PVC.spec.resources is used.\nIf allocatedResources - is not set, PVC.spec.resources alone is used for - quota calculation.\nIf a volume expansion capacity - request is lowered, allocatedResources is only\nlowered - if there are no expansion operations in progress - and if the actual volume capacity\nis equal or lower - than the requested capacity.\n\nA controller that - receives PVC update with previously unknown resourceName\nshould - ignore the update for the purpose it was designed. - For example - a controller that\nonly is responsible - for resizing capacity of the volume, should ignore - PVC updates that change other valid\nresources associated - with PVC.\n\nThis is an alpha field and requires - enabling RecoverVolumeExpansionFailure feature." - type: object - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: capacity represents the actual resources - of the underlying volume. - type: object - conditions: - description: |- - conditions is the current Condition of persistent volume claim. If underlying persistent volume is being - resized then the Condition will be set to 'Resizing'. - items: - description: PersistentVolumeClaimCondition contains - details about state of pvc - properties: - lastProbeTime: - description: lastProbeTime is the time we probed - the condition. - format: date-time - type: string - lastTransitionTime: - description: lastTransitionTime is the time - the condition transitioned from one status - to another. - format: date-time - type: string - message: - description: message is the human-readable message - indicating details about last transition. - type: string - reason: - description: |- - reason is a unique, this should be a short, machine understandable string that gives the reason - for condition's last transition. If it reports "Resizing" that means the underlying - persistent volume is being resized. - type: string - status: - description: |- - Status is the status of the condition. - Can be True, False, Unknown. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=state%20of%20pvc-,conditions.status,-(string)%2C%20required - type: string - type: - description: |- - Type is the type of the condition. - More info: https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/#:~:text=set%20to%20%27ResizeStarted%27.-,PersistentVolumeClaimCondition,-contains%20details%20about - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - currentVolumeAttributesClassName: - description: |- - currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. - When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - type: string - modifyVolumeStatus: - description: |- - ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. - When this is unset, there is no ModifyVolume operation being attempted. - properties: - status: - description: "status is the status of the ControllerModifyVolume - operation. It can be in any of following states:\n - - Pending\n Pending indicates that the PersistentVolumeClaim - cannot be modified due to unmet requirements, - such as\n the specified VolumeAttributesClass - not existing.\n - InProgress\n InProgress - indicates that the volume is being modified.\n - - Infeasible\n Infeasible indicates that the - request has been rejected as invalid by the - CSI driver. To\n\t resolve the error, a valid - VolumeAttributesClass needs to be specified.\nNote: - New statuses can be added in the future. Consumers - should check for unknown statuses and fail appropriately." - type: string - targetVolumeAttributesClassName: - description: targetVolumeAttributesClassName is - the name of the VolumeAttributesClass the PVC - currently being reconciled - type: string - required: - - status - type: object - phase: - description: phase represents the current phase of - PersistentVolumeClaim. - type: string - type: object - type: object - type: object - deploymentMode: - description: |- - deploymentMode determines whether the default Alertmanager instance should be deployed - as part of the monitoring stack. - Allowed values are Disabled, DefaultConfig, and CustomConfig. - When set to Disabled, the Alertmanager instance will not be deployed. - When set to DefaultConfig, the platform will deploy Alertmanager with default settings. - When set to CustomConfig, the Alertmanager will be deployed with custom configuration. - enum: - - Disabled - - DefaultConfig - - CustomConfig - type: string - required: - - deploymentMode - type: object - x-kubernetes-validations: - - message: customConfig is required when deploymentMode is CustomConfig, - and forbidden otherwise - rule: 'self.deploymentMode == ''CustomConfig'' ? has(self.customConfig) - : !has(self.customConfig)' - metricsServerConfig: - description: |- - metricsServerConfig is an optional field that can be used to configure the Kubernetes Metrics Server that runs in the openshift-monitoring namespace. - Specifically, it can configure how the Metrics Server instance is deployed, pod scheduling, its audit policy and log verbosity. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - audit: - description: |- - audit defines the audit configuration used by the Metrics Server instance. - audit is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default sets audit.profile to Metadata - properties: - profile: - description: |- - profile is a required field for configuring the audit log level of the Kubernetes Metrics Server. - Allowed values are None, Metadata, Request, or RequestResponse. - When set to None, audit logging is disabled and no audit events are recorded. - When set to Metadata, only request metadata (such as requesting user, timestamp, resource, verb, etc.) is logged, but not the request or response body. - When set to Request, event metadata and the request body are logged, but not the response body. - When set to RequestResponse, event metadata, request body, and response body are all logged, providing the most detailed audit information. - - See: https://kubernetes.io/docs/tasks/debug-application-cluster/audit/#audit-policy - for more information about auditing and log levels. - enum: - - None - - Metadata - - Request - - RequestResponse - type: string - required: - - profile - type: object - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Metrics Server container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Metrics Server Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - verbosity: - description: |- - verbosity defines the verbosity of log messages for Metrics Server. - Valid values are Errors, Info, Trace, TraceAll and omitted. - When set to Errors, only critical messages and errors are logged. - When set to Info, only basic information messages are logged. - When set to Trace, information useful for general debugging is logged. - When set to TraceAll, detailed information about metric scraping is logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Errors` - enum: - - Errors - - Info - - Trace - - TraceAll - type: string - type: object - prometheusOperatorConfig: - description: |- - prometheusOperatorConfig is an optional field that can be used to configure the Prometheus Operator component. - Specifically, it can configure how the Prometheus Operator instance is deployed, pod scheduling, and resource allocation. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - minProperties: 1 - properties: - logLevel: - description: |- - logLevel defines the verbosity of logs emitted by Prometheus Operator. - This field allows users to control the amount and severity of logs generated, which can be useful - for debugging issues or reducing noise in production environments. - Allowed values are Error, Warn, Info, and Debug. - When set to Error, only errors will be logged. - When set to Warn, both warnings and errors will be logged. - When set to Info, general information, warnings, and errors will all be logged. - When set to Debug, detailed debugging information will be logged. - When omitted, this means no opinion and the platform is left to choose a reasonable default, that is subject to change over time. - The current default value is `Info`. - enum: - - Error - - Warn - - Info - - Debug - type: string - nodeSelector: - additionalProperties: - type: string - description: |- - nodeSelector defines the nodes on which the Pods are scheduled - nodeSelector is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - The current default value is `kubernetes.io/os: linux`. - When specified, nodeSelector must contain at least 1 entry and must not contain more than 10 entries. - maxProperties: 10 - minProperties: 1 - type: object - resources: - description: |- - resources defines the compute resource requests and limits for the Prometheus Operator container. - This includes CPU, memory and HugePages constraints to help control scheduling and resource usage. - When not specified, defaults are used by the platform. Requests cannot exceed limits. - This field is optional. - More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - This is a simplified API that maps to Kubernetes ResourceRequirements. - The current default values are: - resources: - - name: cpu - request: 4m - limit: null - - name: memory - request: 40Mi - limit: null - Maximum length for this list is 10. - Minimum length for this list is 1. - Each resource name must be unique within this list. - items: - description: ContainerResource defines a single resource requirement - for a container. - properties: - limit: - anyOf: - - type: integer - - type: string - description: |- - limit is the maximum amount of the resource allowed (e.g. "2Mi", "1Gi"). - This field is optional. - When request is specified, limit cannot be less than request. - The value must be greater than 0 when specified. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: limit must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - name: - description: |- - name of the resource (e.g. "cpu", "memory", "hugepages-2Mi"). - This field is required. - name must consist only of alphanumeric characters, `-`, `_` and `.` and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must consist only of alphanumeric characters, - `-`, `_` and `.` and must start and end with an alphanumeric - character - rule: '!format.qualifiedName().validate(self).hasValue()' - request: - anyOf: - - type: integer - - type: string - description: |- - request is the minimum amount of the resource required (e.g. "2Mi", "1Gi"). - This field is optional. - When limit is specified, request cannot be greater than limit. - maxLength: 20 - minLength: 1 - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - x-kubernetes-validations: - - message: request must be a positive, non-zero quantity - rule: isQuantity(self) && quantity(self).isGreaterThan(quantity('0')) - required: - - name - type: object - x-kubernetes-validations: - - message: at least one of request or limit must be set - rule: has(self.request) || has(self.limit) - - message: limit must be greater than or equal to request - rule: '!(has(self.request) && has(self.limit)) || quantity(self.limit).compareTo(quantity(self.request)) - >= 0' - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tolerations: - description: |- - tolerations defines tolerations for the pods. - tolerations is optional. - - When omitted, this means the user has no opinion and the platform is left - to choose reasonable defaults. These defaults are subject to change over time. - Defaults are empty/unset. - Maximum length for this list is 10. - Minimum length for this list is 1. - items: - description: |- - The pod this Toleration is attached to tolerates any taint that matches - the triple using the matching operator . - properties: - effect: - description: |- - Effect indicates the taint effect to match. Empty means match all taint effects. - When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: |- - Key is the taint key that the toleration applies to. Empty means match all taint keys. - If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: |- - Operator represents a key's relationship to the value. - Valid operators are Exists and Equal. Defaults to Equal. - Exists is equivalent to wildcard for value, so that a pod can - tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: |- - TolerationSeconds represents the period of time the toleration (which must be - of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, - it is not set, which means tolerate the taint forever (do not evict). Zero and - negative values will be treated as 0 (evict immediately) by the system. - format: int64 - type: integer - value: - description: |- - Value is the taint value the toleration matches to. - If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - topologySpreadConstraints: - description: |- - topologySpreadConstraints defines rules for how Prometheus Operator Pods should be distributed - across topology domains such as zones, nodes, or other user-defined labels. - topologySpreadConstraints is optional. - This helps improve high availability and resource efficiency by avoiding placing - too many replicas in the same failure domain. - - When omitted, this means no opinion and the platform is left to choose a default, which is subject to change over time. - This field maps directly to the `topologySpreadConstraints` field in the Pod spec. - Default is empty list. - Maximum length for this list is 10. - Minimum length for this list is 1. - Entries must have unique topologyKey and whenUnsatisfiable pairs. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: |- - LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine the number of pods - in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: |- - matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - map is equivalent to an element of matchExpressions, whose key field is "key", the - operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - matchLabelKeys: - description: |- - MatchLabelKeys is a set of pod label keys to select the pods over which - spreading will be calculated. The keys are used to lookup values from the - incoming pod labels, those key-value labels are ANDed with labelSelector - to select the group of existing pods over which spreading will be calculated - for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. - MatchLabelKeys cannot be set when LabelSelector isn't set. - Keys that don't exist in the incoming pod labels will - be ignored. A null or empty list means only match against labelSelector. - - This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). - items: - type: string - type: array - x-kubernetes-list-type: atomic - maxSkew: - description: |- - MaxSkew describes the degree to which pods may be unevenly distributed. - When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference - between the number of matching pods in the target topology and the global minimum. - The global minimum is the minimum number of matching pods in an eligible domain - or zero if the number of eligible domains is less than MinDomains. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 2/2/1: - In this case, the global minimum is 1. - | zone1 | zone2 | zone3 | - | P P | P P | P | - - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; - scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) - violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any zone. - When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence - to topologies that satisfy it. - It's a required field. Default value is 1 and 0 is not allowed. - format: int32 - type: integer - minDomains: - description: |- - MinDomains indicates a minimum number of eligible domains. - When the number of eligible domains with matching topology keys is less than minDomains, - Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. - And when the number of eligible domains with matching topology keys equals or greater than minDomains, - this value has no effect on scheduling. - As a result, when the number of eligible domains is less than minDomains, - scheduler won't schedule more than maxSkew Pods to those domains. - If value is nil, the constraint behaves as if MinDomains is equal to 1. - Valid values are integers greater than 0. - When value is not nil, WhenUnsatisfiable must be DoNotSchedule. - - For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same - labelSelector spread as 2/2/2: - | zone1 | zone2 | zone3 | - | P P | P P | P P | - The number of domains is less than 5(MinDomains), so "global minimum" is treated as 0. - In this situation, new pod with the same labelSelector cannot be scheduled, - because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, - it will violate MaxSkew. - format: int32 - type: integer - nodeAffinityPolicy: - description: |- - NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector - when calculating pod topology spread skew. Options are: - - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. - - If this value is nil, the behavior is equivalent to the Honor policy. - type: string - nodeTaintsPolicy: - description: |- - NodeTaintsPolicy indicates how we will treat node taints when calculating - pod topology spread skew. Options are: - - Honor: nodes without taints, along with tainted nodes for which the incoming pod - has a toleration, are included. - - Ignore: node taints are ignored. All nodes are included. - - If this value is nil, the behavior is equivalent to the Ignore policy. - type: string - topologyKey: - description: |- - TopologyKey is the key of node labels. Nodes that have a label with this key - and identical values are considered to be in the same topology. - We consider each as a "bucket", and try to put balanced number - of pods into each bucket. - We define a domain as a particular instance of a topology. - Also, we define an eligible domain as a domain whose nodes meet the requirements of - nodeAffinityPolicy and nodeTaintsPolicy. - e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. - And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. - It's a required field. - type: string - whenUnsatisfiable: - description: |- - WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy - the spread constraint. - - DoNotSchedule (default) tells the scheduler not to schedule it. - - ScheduleAnyway tells the scheduler to schedule the pod in any location, - but giving higher precedence to topologies that would help reduce the - skew. - A constraint is considered "Unsatisfiable" for an incoming pod - if and only if every possible node assignment for that pod would violate - "MaxSkew" on some topology. - For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same - labelSelector spread as 3/1/1: - | zone1 | zone2 | zone3 | - | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled - to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies - MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler - won't make it *more* imbalanced. - It's a required field. - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - maxItems: 10 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - topologyKey - - whenUnsatisfiable - x-kubernetes-list-type: map - type: object - userDefined: - description: |- - userDefined set the deployment mode for user-defined monitoring in addition to the default platform monitoring. - userDefined is optional. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default value is `Disabled`. - properties: - mode: - description: |- - mode defines the different configurations of UserDefinedMonitoring - Valid values are Disabled and NamespaceIsolated - Disabled disables monitoring for user-defined projects. This restricts the default monitoring stack, installed in the openshift-monitoring project, to monitor only platform namespaces, which prevents any custom monitoring configurations or resources from being applied to user-defined namespaces. - NamespaceIsolated enables monitoring for user-defined projects with namespace-scoped tenancy. This ensures that metrics, alerts, and monitoring data are isolated at the namespace level. - The current default value is `Disabled`. - enum: - - Disabled - - NamespaceIsolated - type: string - required: - - mode - type: object - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - 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_clustermonitorings-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings.crd.yaml similarity index 99% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_config-operator_01_clustermonitorings.crd.yaml index 070f78e1f1d..11156bf39d3 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_clustermonitorings-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_config-operator_01_clustermonitorings.crd.yaml @@ -7,7 +7,7 @@ metadata: description: Cluster Monitoring Operators configuration API include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: clustermonitorings.config.openshift.io spec: group: config.openshift.io diff --git a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 6971ccce42e..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,214 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2557 - 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/feature-set: CustomNoUpgrade - name: criocredentialproviderconfigs.config.openshift.io -spec: - group: config.openshift.io - names: - kind: CRIOCredentialProviderConfig - listKind: CRIOCredentialProviderConfigList - plural: criocredentialproviderconfigs - singular: criocredentialproviderconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - CRIOCredentialProviderConfig holds cluster-wide singleton resource configurations for CRI-O credential provider, the name of this instance is "cluster". CRI-O credential provider is a binary shipped with CRI-O that provides a way to obtain container image pull credentials from external sources. - For example, it can be used to fetch mirror registry credentials from secrets resources in the cluster within the same namespace the pod will be running in. - CRIOCredentialProviderConfig configuration specifies the pod image sources registries that should trigger the CRI-O credential provider execution, which will resolve the CRI-O mirror configurations and obtain the necessary credentials for pod creation. - Note: Configuration changes will only take effect after the kubelet restarts, which is automatically managed by the cluster during rollout. - - The resource is a singleton named "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 defines the desired configuration of the CRI-O Credential Provider. - This field is required and must be provided when creating the resource. - minProperties: 0 - properties: - matchImages: - description: |- - matchImages is a list of string patterns used to determine whether - the CRI-O credential provider should be invoked for a given image. This list is - passed to the kubelet CredentialProviderConfig, and if any pattern matches - the requested image, CRI-O credential provider will be invoked to obtain credentials for pulling - that image or its mirrors. - Depending on the platform, the CRI-O credential provider may be installed alongside an existing platform specific provider. - Conflicts between the existing platform specific provider image match configuration and this list will be handled by - the following precedence rule: credentials from built-in kubelet providers (e.g., ECR, GCR, ACR) take precedence over those - from the CRIOCredentialProviderConfig when both match the same image. - To avoid uncertainty, it is recommended to avoid configuring your private image patterns to overlap with - existing platform specific provider config(e.g., the entries from https://github.com/openshift/machine-config-operator/blob/main/templates/common/aws/files/etc-kubernetes-credential-providers-ecr-credential-provider.yaml). - You can check the resource's Status conditions - to see if any entries were ignored due to exact matches with known built-in provider patterns. - - This field is optional, the items of the list must contain between 1 and 50 entries. - The list is treated as a set, so duplicate entries are not allowed. - - For more details, see: - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-credential-provider/ - https://github.com/cri-o/crio-credential-provider#architecture - - Each entry in matchImages is a pattern which can optionally contain a port and a path. Each entry must be no longer than 512 characters. - Wildcards ('*') are supported for full subdomain labels, such as '*.k8s.io' or 'k8s.*.io', - and for top-level domains, such as 'k8s.*' (which matches 'k8s.io' or 'k8s.net'). - A global wildcard '*' (matching any domain) is not allowed. - Wildcards may replace an entire hostname label (e.g., *.example.com), but they cannot appear within a label (e.g., f*oo.example.com) and are not allowed in the port or path. - For example, 'example.*.com' is valid, but 'exa*mple.*.com' is not. - Each wildcard matches only a single domain label, - so '*.io' does **not** match '*.k8s.io'. - - A match exists between an image and a matchImage when all of the below are true: - Both contain the same number of domain parts and each part matches. - The URL path of an matchImages must be a prefix of the target image URL path. - If the matchImages contains a port, then the port must match in the image as well. - - Example values of matchImages: - - 123456789.dkr.ecr.us-east-1.amazonaws.com - - *.azurecr.io - - gcr.io - - *.*.registry.io - - registry.io:8080/path - items: - description: |- - MatchImage is a string pattern used to match container image registry addresses. - It must be a valid fully qualified domain name with optional wildcard, port, and path. - The maximum length is 512 characters. - - Wildcards ('*') are supported for full subdomain labels and top-level domains. - Each entry can optionally contain a port (e.g., :8080) and a path (e.g., /path). - Wildcards are not allowed in the port or path portions. - - Examples: - - "registry.io" - matches exactly registry.io - - "*.azurecr.io" - matches any single subdomain of azurecr.io - - "registry.io:8080/path" - matches with specific port and path prefix - maxLength: 512 - minLength: 1 - type: string - x-kubernetes-validations: - - message: global wildcard '*' is not allowed - rule: self != '*' - - message: invalid matchImages value, must be a valid fully qualified - domain name in lowercase with optional wildcard, port, and path - rule: self.matches('^((\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?)(\\.(\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?))*)(:[0-9]+)?(/[-a-z0-9._/]*)?$') - maxItems: 50 - minItems: 1 - type: array - x-kubernetes-list-type: set - type: object - status: - description: |- - status represents the current state of the CRIOCredentialProviderConfig. - When omitted or nil, it indicates that the status has not yet been set by the controller. - The controller will populate this field with validation conditions and operational state. - minProperties: 1 - properties: - conditions: - description: |- - conditions represent the latest available observations of the configuration state. - When omitted, it indicates that no conditions have been reported yet. - The maximum number of conditions is 16. - Conditions are stored as a map keyed by condition type, ensuring uniqueness. - - Expected condition types include: - "Validated": indicates whether the matchImages configuration is valid - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: criocredentialproviderconfig is a singleton, .metadata.name must - be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 3b7c84afff4..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,214 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2557 - 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/feature-set: DevPreviewNoUpgrade - name: criocredentialproviderconfigs.config.openshift.io -spec: - group: config.openshift.io - names: - kind: CRIOCredentialProviderConfig - listKind: CRIOCredentialProviderConfigList - plural: criocredentialproviderconfigs - singular: criocredentialproviderconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - CRIOCredentialProviderConfig holds cluster-wide singleton resource configurations for CRI-O credential provider, the name of this instance is "cluster". CRI-O credential provider is a binary shipped with CRI-O that provides a way to obtain container image pull credentials from external sources. - For example, it can be used to fetch mirror registry credentials from secrets resources in the cluster within the same namespace the pod will be running in. - CRIOCredentialProviderConfig configuration specifies the pod image sources registries that should trigger the CRI-O credential provider execution, which will resolve the CRI-O mirror configurations and obtain the necessary credentials for pod creation. - Note: Configuration changes will only take effect after the kubelet restarts, which is automatically managed by the cluster during rollout. - - The resource is a singleton named "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 defines the desired configuration of the CRI-O Credential Provider. - This field is required and must be provided when creating the resource. - minProperties: 0 - properties: - matchImages: - description: |- - matchImages is a list of string patterns used to determine whether - the CRI-O credential provider should be invoked for a given image. This list is - passed to the kubelet CredentialProviderConfig, and if any pattern matches - the requested image, CRI-O credential provider will be invoked to obtain credentials for pulling - that image or its mirrors. - Depending on the platform, the CRI-O credential provider may be installed alongside an existing platform specific provider. - Conflicts between the existing platform specific provider image match configuration and this list will be handled by - the following precedence rule: credentials from built-in kubelet providers (e.g., ECR, GCR, ACR) take precedence over those - from the CRIOCredentialProviderConfig when both match the same image. - To avoid uncertainty, it is recommended to avoid configuring your private image patterns to overlap with - existing platform specific provider config(e.g., the entries from https://github.com/openshift/machine-config-operator/blob/main/templates/common/aws/files/etc-kubernetes-credential-providers-ecr-credential-provider.yaml). - You can check the resource's Status conditions - to see if any entries were ignored due to exact matches with known built-in provider patterns. - - This field is optional, the items of the list must contain between 1 and 50 entries. - The list is treated as a set, so duplicate entries are not allowed. - - For more details, see: - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-credential-provider/ - https://github.com/cri-o/crio-credential-provider#architecture - - Each entry in matchImages is a pattern which can optionally contain a port and a path. Each entry must be no longer than 512 characters. - Wildcards ('*') are supported for full subdomain labels, such as '*.k8s.io' or 'k8s.*.io', - and for top-level domains, such as 'k8s.*' (which matches 'k8s.io' or 'k8s.net'). - A global wildcard '*' (matching any domain) is not allowed. - Wildcards may replace an entire hostname label (e.g., *.example.com), but they cannot appear within a label (e.g., f*oo.example.com) and are not allowed in the port or path. - For example, 'example.*.com' is valid, but 'exa*mple.*.com' is not. - Each wildcard matches only a single domain label, - so '*.io' does **not** match '*.k8s.io'. - - A match exists between an image and a matchImage when all of the below are true: - Both contain the same number of domain parts and each part matches. - The URL path of an matchImages must be a prefix of the target image URL path. - If the matchImages contains a port, then the port must match in the image as well. - - Example values of matchImages: - - 123456789.dkr.ecr.us-east-1.amazonaws.com - - *.azurecr.io - - gcr.io - - *.*.registry.io - - registry.io:8080/path - items: - description: |- - MatchImage is a string pattern used to match container image registry addresses. - It must be a valid fully qualified domain name with optional wildcard, port, and path. - The maximum length is 512 characters. - - Wildcards ('*') are supported for full subdomain labels and top-level domains. - Each entry can optionally contain a port (e.g., :8080) and a path (e.g., /path). - Wildcards are not allowed in the port or path portions. - - Examples: - - "registry.io" - matches exactly registry.io - - "*.azurecr.io" - matches any single subdomain of azurecr.io - - "registry.io:8080/path" - matches with specific port and path prefix - maxLength: 512 - minLength: 1 - type: string - x-kubernetes-validations: - - message: global wildcard '*' is not allowed - rule: self != '*' - - message: invalid matchImages value, must be a valid fully qualified - domain name in lowercase with optional wildcard, port, and path - rule: self.matches('^((\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?)(\\.(\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?))*)(:[0-9]+)?(/[-a-z0-9._/]*)?$') - maxItems: 50 - minItems: 1 - type: array - x-kubernetes-list-type: set - type: object - status: - description: |- - status represents the current state of the CRIOCredentialProviderConfig. - When omitted or nil, it indicates that the status has not yet been set by the controller. - The controller will populate this field with validation conditions and operational state. - minProperties: 1 - properties: - conditions: - description: |- - conditions represent the latest available observations of the configuration state. - When omitted, it indicates that no conditions have been reported yet. - The maximum number of conditions is 16. - Conditions are stored as a map keyed by condition type, ensuring uniqueness. - - Expected condition types include: - "Validated": indicates whether the matchImages configuration is valid - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: criocredentialproviderconfig is a singleton, .metadata.name must - be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 22f14eb091c..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,214 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2557 - 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/feature-set: TechPreviewNoUpgrade - name: criocredentialproviderconfigs.config.openshift.io -spec: - group: config.openshift.io - names: - kind: CRIOCredentialProviderConfig - listKind: CRIOCredentialProviderConfigList - plural: criocredentialproviderconfigs - singular: criocredentialproviderconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - CRIOCredentialProviderConfig holds cluster-wide singleton resource configurations for CRI-O credential provider, the name of this instance is "cluster". CRI-O credential provider is a binary shipped with CRI-O that provides a way to obtain container image pull credentials from external sources. - For example, it can be used to fetch mirror registry credentials from secrets resources in the cluster within the same namespace the pod will be running in. - CRIOCredentialProviderConfig configuration specifies the pod image sources registries that should trigger the CRI-O credential provider execution, which will resolve the CRI-O mirror configurations and obtain the necessary credentials for pod creation. - Note: Configuration changes will only take effect after the kubelet restarts, which is automatically managed by the cluster during rollout. - - The resource is a singleton named "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 defines the desired configuration of the CRI-O Credential Provider. - This field is required and must be provided when creating the resource. - minProperties: 0 - properties: - matchImages: - description: |- - matchImages is a list of string patterns used to determine whether - the CRI-O credential provider should be invoked for a given image. This list is - passed to the kubelet CredentialProviderConfig, and if any pattern matches - the requested image, CRI-O credential provider will be invoked to obtain credentials for pulling - that image or its mirrors. - Depending on the platform, the CRI-O credential provider may be installed alongside an existing platform specific provider. - Conflicts between the existing platform specific provider image match configuration and this list will be handled by - the following precedence rule: credentials from built-in kubelet providers (e.g., ECR, GCR, ACR) take precedence over those - from the CRIOCredentialProviderConfig when both match the same image. - To avoid uncertainty, it is recommended to avoid configuring your private image patterns to overlap with - existing platform specific provider config(e.g., the entries from https://github.com/openshift/machine-config-operator/blob/main/templates/common/aws/files/etc-kubernetes-credential-providers-ecr-credential-provider.yaml). - You can check the resource's Status conditions - to see if any entries were ignored due to exact matches with known built-in provider patterns. - - This field is optional, the items of the list must contain between 1 and 50 entries. - The list is treated as a set, so duplicate entries are not allowed. - - For more details, see: - https://kubernetes.io/docs/tasks/administer-cluster/kubelet-credential-provider/ - https://github.com/cri-o/crio-credential-provider#architecture - - Each entry in matchImages is a pattern which can optionally contain a port and a path. Each entry must be no longer than 512 characters. - Wildcards ('*') are supported for full subdomain labels, such as '*.k8s.io' or 'k8s.*.io', - and for top-level domains, such as 'k8s.*' (which matches 'k8s.io' or 'k8s.net'). - A global wildcard '*' (matching any domain) is not allowed. - Wildcards may replace an entire hostname label (e.g., *.example.com), but they cannot appear within a label (e.g., f*oo.example.com) and are not allowed in the port or path. - For example, 'example.*.com' is valid, but 'exa*mple.*.com' is not. - Each wildcard matches only a single domain label, - so '*.io' does **not** match '*.k8s.io'. - - A match exists between an image and a matchImage when all of the below are true: - Both contain the same number of domain parts and each part matches. - The URL path of an matchImages must be a prefix of the target image URL path. - If the matchImages contains a port, then the port must match in the image as well. - - Example values of matchImages: - - 123456789.dkr.ecr.us-east-1.amazonaws.com - - *.azurecr.io - - gcr.io - - *.*.registry.io - - registry.io:8080/path - items: - description: |- - MatchImage is a string pattern used to match container image registry addresses. - It must be a valid fully qualified domain name with optional wildcard, port, and path. - The maximum length is 512 characters. - - Wildcards ('*') are supported for full subdomain labels and top-level domains. - Each entry can optionally contain a port (e.g., :8080) and a path (e.g., /path). - Wildcards are not allowed in the port or path portions. - - Examples: - - "registry.io" - matches exactly registry.io - - "*.azurecr.io" - matches any single subdomain of azurecr.io - - "registry.io:8080/path" - matches with specific port and path prefix - maxLength: 512 - minLength: 1 - type: string - x-kubernetes-validations: - - message: global wildcard '*' is not allowed - rule: self != '*' - - message: invalid matchImages value, must be a valid fully qualified - domain name in lowercase with optional wildcard, port, and path - rule: self.matches('^((\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?)(\\.(\\*|[a-z0-9]([a-z0-9-]*[a-z0-9])?))*)(:[0-9]+)?(/[-a-z0-9._/]*)?$') - maxItems: 50 - minItems: 1 - type: array - x-kubernetes-list-type: set - type: object - status: - description: |- - status represents the current state of the CRIOCredentialProviderConfig. - When omitted or nil, it indicates that the status has not yet been set by the controller. - The controller will populate this field with validation conditions and operational state. - minProperties: 1 - properties: - conditions: - description: |- - conditions represent the latest available observations of the configuration state. - When omitted, it indicates that no conditions have been reported yet. - The maximum number of conditions is 16. - Conditions are stored as a map keyed by condition type, ensuring uniqueness. - - Expected condition types include: - "Validated": indicates whether the matchImages configuration is valid - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: criocredentialproviderconfig is a singleton, .metadata.name must - be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml similarity index 99% rename from config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml index 3b7c84afff4..0e12b8cc45b 100644 --- a/config/v1alpha1/zz_generated.crd-manifests/0000_10_config-operator_01_criocredentialproviderconfigs-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_config-operator_01_criocredentialproviderconfigs.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: criocredentialproviderconfigs.config.openshift.io spec: group: config.openshift.io diff --git a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 97698ce0bec..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,234 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: CustomNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the Insights Operator. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - gatherConfig: - description: gatherConfig is a required spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers will run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - required: - - gatherConfig - type: object - required: - - spec - type: object - served: true - storage: true diff --git a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 1400f1a654f..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,234 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the Insights Operator. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - gatherConfig: - description: gatherConfig is a required spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers will run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - required: - - gatherConfig - type: object - required: - - spec - type: object - served: true - storage: true diff --git a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index d537572823d..00000000000 --- a/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,234 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: insightsdatagathers.config.openshift.io -spec: - group: config.openshift.io - names: - kind: InsightsDataGather - listKind: InsightsDataGatherList - plural: insightsdatagathers - singular: insightsdatagather - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: |- - InsightsDataGather provides data gather configuration options for the Insights Operator. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - gatherConfig: - description: gatherConfig is a required spec attribute that includes - all the configuration options related to gathering of the Insights - data and its uploading to the ingress. - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy options - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the - configuration of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of - {gatherer}/{function} where the gatherer and - function are lowercase letters only that may - include underscores (_) and are separated by - a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. - When set to All, all gatherers will run and gather data. - When set to None, all gatherers will be disabled and no data will be gathered. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - None - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden - otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or - '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - required: - - gatherConfig - type: object - required: - - spec - type: object - served: true - storage: true diff --git a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers.crd.yaml similarity index 99% rename from config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers.crd.yaml index 1400f1a654f..ff8ce547e38 100644 --- a/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_config-operator_01_insightsdatagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: insightsdatagathers.config.openshift.io spec: group: config.openshift.io diff --git a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 49bba6f6cb3..00000000000 --- a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,154 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: CustomNoUpgrade - name: etcdbackups.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: EtcdBackup - listKind: EtcdBackupList - plural: etcdbackups - singular: etcdbackup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - # EtcdBackup provides configuration options and status for a one-time backup attempt of the etcd 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 - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup file would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - x-kubernetes-validations: - - message: pvcName is immutable once set - rule: self == oldSelf - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - backupJob: - description: |- - backupJob is the reference to the Job that executes the backup. - Optional - properties: - name: - description: |- - name is the name of the Job. - Required - type: string - namespace: - description: |- - namespace is the namespace of the Job. - this is always expected to be "openshift-etcd" since the user provided PVC - is also required to be in "openshift-etcd" - Required - pattern: ^openshift-etcd$ - type: string - required: - - name - - namespace - type: object - conditions: - description: conditions provide details on the status of the etcd - backup job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index d015b811ce5..00000000000 --- a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,154 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: DevPreviewNoUpgrade - name: etcdbackups.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: EtcdBackup - listKind: EtcdBackupList - plural: etcdbackups - singular: etcdbackup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - # EtcdBackup provides configuration options and status for a one-time backup attempt of the etcd 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 - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup file would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - x-kubernetes-validations: - - message: pvcName is immutable once set - rule: self == oldSelf - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - backupJob: - description: |- - backupJob is the reference to the Job that executes the backup. - Optional - properties: - name: - description: |- - name is the name of the Job. - Required - type: string - namespace: - description: |- - namespace is the namespace of the Job. - this is always expected to be "openshift-etcd" since the user provided PVC - is also required to be in "openshift-etcd" - Required - pattern: ^openshift-etcd$ - type: string - required: - - name - - namespace - type: object - conditions: - description: conditions provide details on the status of the etcd - backup job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 9d56894fdbb..00000000000 --- a/payload-manifests/crds/0000_10_etcd_01_etcdbackups-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,154 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/1482 - 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/feature-set: TechPreviewNoUpgrade - name: etcdbackups.operator.openshift.io -spec: - group: operator.openshift.io - names: - kind: EtcdBackup - listKind: EtcdBackupList - plural: etcdbackups - singular: etcdbackup - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - # EtcdBackup provides configuration options and status for a one-time backup attempt of the etcd 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 - properties: - pvcName: - description: |- - pvcName specifies the name of the PersistentVolumeClaim (PVC) which binds a PersistentVolume where the - etcd backup file would be saved - The PVC itself must always be created in the "openshift-etcd" namespace - If the PVC is left unspecified "" then the platform will choose a reasonable default location to save the backup. - In the future this would be backups saved across the control-plane master nodes. - type: string - x-kubernetes-validations: - - message: pvcName is immutable once set - rule: self == oldSelf - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - properties: - backupJob: - description: |- - backupJob is the reference to the Job that executes the backup. - Optional - properties: - name: - description: |- - name is the name of the Job. - Required - type: string - namespace: - description: |- - namespace is the namespace of the Job. - this is always expected to be "openshift-etcd" since the user provided PVC - is also required to be in "openshift-etcd" - Required - pattern: ^openshift-etcd$ - type: string - required: - - name - - namespace - type: object - conditions: - description: conditions provide details on the status of the etcd - backup job. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_etcd_01_etcdbackups.crd.yaml similarity index 98% rename from operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_etcd_01_etcdbackups.crd.yaml index d015b811ce5..37ed90bc05c 100644 --- a/operator/v1alpha1/zz_generated.crd-manifests/0000_10_etcd_01_etcdbackups-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_etcd_01_etcdbackups.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: etcdbackups.operator.openshift.io spec: group: operator.openshift.io diff --git a/payload-manifests/crds/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index c35ebb5217c..00000000000 --- a/payload-manifests/crds/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,628 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - - description: DataGather age - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the configuration - of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers will run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - minProperties: 1 - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering successfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - GathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: downloadedTime is a required field that specifies - when the Insights report was last downloaded. - format: date-time - type: string - healthChecks: - description: |- - healthChecks is an optional field that provides basic information about active Insights - recommendations, which serve as proactive notifications for potential issues in the cluster. - When omitted, it means that there are no active recommendations in the cluster. - items: - description: HealthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healthcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Moderate, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is a required field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - required: - - downloadedTime - - uri - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - minLength: 0 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index b0dc6cb1df5..00000000000 --- a/payload-manifests/crds/0000_10_insights_01_datagathers-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,628 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2448 - api.openshift.io/merged-by-featuregates: "true" - capability.openshift.io/name: Insights - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - name: datagathers.insights.openshift.io -spec: - group: insights.openshift.io - names: - kind: DataGather - listKind: DataGatherList - plural: datagathers - singular: datagather - scope: Cluster - versions: - - additionalPrinterColumns: - - description: DataGather start time - jsonPath: .status.startTime - name: StartTime - type: date - - description: DataGather finish time - jsonPath: .status.finishTime - name: FinishTime - type: date - - description: DataGather age - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: |- - DataGather provides data gather configuration options and status for the particular Insights data gathering. - - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 - properties: - dataPolicy: - description: |- - dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. - It may not exceed 2 items and must not contain duplicates. - Valid values are ObfuscateNetworking and WorkloadNames. - When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. - When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. - When omitted no obfuscation is applied. - items: - description: DataPolicyOption declares valid data policy types - enum: - - ObfuscateNetworking - - WorkloadNames - type: string - maxItems: 2 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - x-kubernetes-validations: - - message: dataPolicy items must be unique - rule: self.all(x, self.exists_one(y, x == y)) - gatherers: - description: gatherers is a required field that specifies the configuration - of the gatherers. - properties: - custom: - description: |- - custom provides gathering configuration. - It is required when mode is Custom, and forbidden otherwise. - Custom configuration allows user to disable only a subset of gatherers. - Gatherers that are not explicitly disabled in custom configuration will run. - properties: - configs: - description: |- - configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. - It may not exceed 100 items and each gatherer can be present only once. - It is possible to disable an entire set of gatherers while allowing a specific function within that set. - The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - items: - description: GathererConfig allows to configure specific - gatherers - properties: - name: - description: |- - name is the required name of a specific gatherer. - It may not exceed 256 characters. - The format for a gatherer name is: {gatherer}/{function} where the function is optional. - Gatherer consists of a lowercase letters only that may include underscores (_). - Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). - The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. - Run the following command to get the names of last active gatherers: - "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: gatherer name must be in the format of {gatherer}/{function} - where the gatherer and function are lowercase letters - only that may include underscores (_) and are separated - by a forward slash (/) if the function is provided - rule: self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$") - state: - description: |- - state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". - When set to Enabled the gatherer will run. - When set to Disabled the gatherer will not run. - enum: - - Enabled - - Disabled - type: string - required: - - name - - state - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - configs - type: object - mode: - description: |- - mode is a required field that specifies the mode for gatherers. Allowed values are All and Custom. - When set to All, all gatherers will run and gather data. - When set to Custom, the custom configuration from the custom field will be applied. - enum: - - All - - Custom - type: string - required: - - mode - type: object - x-kubernetes-validations: - - message: custom is required when mode is Custom, and forbidden otherwise - rule: 'has(self.mode) && self.mode == ''Custom'' ? has(self.custom) - : !has(self.custom)' - storage: - description: |- - storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. - If omitted, the gathering job will use ephemeral storage. - properties: - persistentVolume: - description: |- - persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. - The PersistentVolume must be created in the openshift-insights namespace. - properties: - claim: - description: |- - claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. - The PersistentVolumeClaim must be created in the openshift-insights namespace. - properties: - name: - description: |- - name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. - It is a string that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist - of lower case alphanumeric characters, '-' or '.', - and must start and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - mountPath: - description: |- - mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. - When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. - The current default mount path is /var/lib/insights-operator - The path may not exceed 1024 characters and must not contain a colon. - maxLength: 1024 - minLength: 1 - type: string - x-kubernetes-validations: - - message: mountPath must not contain a colon - rule: '!self.contains('':'')' - required: - - claim - type: object - type: - description: |- - type is a required field that specifies the type of storage that will be used to store the Insights data archive. - Valid values are "PersistentVolume" and "Ephemeral". - When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. - When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is - defined by the PersistentVolume field. - enum: - - PersistentVolume - - Ephemeral - type: string - required: - - type - type: object - x-kubernetes-validations: - - message: persistentVolume is required when type is PersistentVolume, - and forbidden otherwise - rule: 'has(self.type) && self.type == ''PersistentVolume'' ? has(self.persistentVolume) - : !has(self.persistentVolume)' - required: - - gatherers - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - minProperties: 1 - properties: - conditions: - description: |- - conditions is an optional field that provides details on the status of the gatherer job. - It may not exceed 100 items and must not contain duplicates. - - The current condition types are DataUploaded, DataRecorded, DataProcessed, RemoteConfigurationNotAvailable, RemoteConfigurationInvalid - - The DataUploaded condition is used to represent whether or not the archive was successfully uploaded for further processing. - When it has a status of True and a reason of Succeeded, the archive was successfully uploaded. - When it has a status of Unknown and a reason of NoUploadYet, the upload has not occurred, or there was no data to upload. - When it has a status of False and a reason Failed, the upload failed. The accompanying message will include the specific error encountered. - - The DataRecorded condition is used to represent whether or not the archive was successfully recorded. - When it has a status of True and a reason of Succeeded, the archive was recorded successfully. - When it has a status of Unknown and a reason of NoDataGatheringYet, the data gathering process has not started yet. - When it has a status of False and a reason of RecordingFailed, the recording failed and a message will include the specific error encountered. - - The DataProcessed condition is used to represent whether or not the archive was processed by the processing service. - When it has a status of True and a reason of Processed, the data was processed successfully. - When it has a status of Unknown and a reason of NothingToProcessYet, there is no data to process at the moment. - When it has a status of False and a reason of Failure, processing failed and a message will include the specific error encountered. - - The RemoteConfigurationAvailable condition is used to represent whether the remote configuration is available. - When it has a status of Unknown and a reason of Unknown or RemoteConfigNotRequestedYet, the state of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is available. - When it has a status of False and a reason of NoToken, the configuration was disabled by removing the cloud.openshift.com field from the pull secret. - When it has a status of False and a reason of DisabledByConfiguration, the configuration was disabled in insightsdatagather.config.openshift.io. - - The RemoteConfigurationValid condition is used to represent whether the remote configuration is valid. - When it has a status of Unknown and a reason of Unknown or NoValidationYet, the validity of the remote configuration is unknown—typically at startup. - When it has a status of True and a reason of Succeeded, the configuration is valid. - When it has a status of False and a reason of Invalid, the configuration is invalid. - - The Progressing condition is used to represent the phase of gathering - When it has a status of False and the reason is DataGatherPending, the gathering has not started yet. - When it has a status of True and reason is Gathering, the gathering is running. - When it has a status of False and reason is GatheringSucceeded, the gathering successfully finished. - When it has a status of False and reason is GatheringFailed, the gathering failed. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - finishTime: - description: finishTime is the time when Insights data gathering finished. - format: date-time - type: string - x-kubernetes-validations: - - message: finishTime is immutable once set - rule: self == oldSelf - gatherers: - description: gatherers is a list of active gatherers (and their statuses) - in the last gathering. - items: - description: |- - GathererStatus represents information about a particular - data gatherer. - properties: - conditions: - description: |- - conditions provide details on the status of each gatherer. - - The current condition type is DataGathered - - The DataGathered condition is used to represent whether or not the data was gathered by a gatherer specified by name. - When it has a status of True and a reason of GatheredOK, the data has been successfully gathered as expected. - When it has a status of False and a reason of NoData, no data was gathered—for example, when the resource is not present in the cluster. - When it has a status of False and a reason of GatherError, an error occurred and no data was gathered. - When it has a status of False and a reason of GatherPanic, a panic occurred during gathering and no data was collected. - When it has a status of False and a reason of GatherWithErrorReason, data was partially gathered or gathered with an error message. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - lastGatherSeconds: - description: lastGatherSeconds is required field that represents - the time spent gathering in seconds - format: int32 - minimum: 0 - type: integer - name: - description: |- - name is the required name of the gatherer. - It must contain at least 5 characters and may not exceed 256 characters. - maxLength: 256 - minLength: 5 - type: string - required: - - lastGatherSeconds - - name - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - insightsReport: - description: |- - insightsReport provides general Insights analysis results. - When omitted, this means no data gathering has taken place yet or the - corresponding Insights analysis (identified by "insightsRequestID") is not available. - properties: - downloadedTime: - description: downloadedTime is a required field that specifies - when the Insights report was last downloaded. - format: date-time - type: string - healthChecks: - description: |- - healthChecks is an optional field that provides basic information about active Insights - recommendations, which serve as proactive notifications for potential issues in the cluster. - When omitted, it means that there are no active recommendations in the cluster. - items: - description: HealthCheck represents an Insights health check - attributes. - properties: - advisorURI: - description: |- - advisorURI is required field that provides the URL link to the Insights Advisor. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: advisorURI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - description: - description: |- - description is required field that provides basic description of the healthcheck. - It must contain at least 10 characters and may not exceed 2048 characters. - maxLength: 2048 - minLength: 10 - type: string - totalRisk: - description: |- - totalRisk is the required field of the healthcheck. - It is indicator of the total risk posed by the detected issue; combination of impact and likelihood. - Allowed values are Low, Moderate, Important and Critical. - The value represents the severity of the issue. - enum: - - Low - - Moderate - - Important - - Critical - type: string - required: - - advisorURI - - description - - totalRisk - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - advisorURI - - totalRisk - - description - x-kubernetes-list-type: map - uri: - description: |- - uri is a required field that provides the URL link from which the report was downloaded. - The link must be a valid HTTPS URL and the maximum length is 2048 characters. - maxLength: 2048 - minLength: 1 - type: string - x-kubernetes-validations: - - message: URI must be a valid HTTPS URL (e.g., https://example.com) - rule: isURL(self) && url(self).getScheme() == "https" - required: - - downloadedTime - - uri - type: object - insightsRequestID: - description: |- - insightsRequestID is an optional Insights request ID to track the status of the Insights analysis (in console.redhat.com processing pipeline) for the corresponding Insights data archive. - It may not exceed 256 characters and is immutable once set. - maxLength: 256 - minLength: 1 - type: string - x-kubernetes-validations: - - message: insightsRequestID is immutable once set - rule: self == oldSelf - relatedObjects: - description: |- - relatedObjects is an optional list of resources which are useful when debugging or inspecting the data gathering Pod - It may not exceed 100 items and must not contain duplicates. - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - properties: - group: - description: |- - group is required field that specifies the API Group of the Resource. - Enter empty string for the core group. - This value is empty or it should follow the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character. - Example: "", "apps", "build.openshift.io", etc. - maxLength: 253 - minLength: 0 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: self.size() == 0 || !format.dns1123Subdomain().validate(self).hasValue() - name: - description: |- - name is required field that specifies the referent that follows the DNS1123 subdomain format. - It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start with an alphabetic character and end with an alphanumeric character.. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - with an alphabetic character and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - namespace: - description: |- - namespace if required field of the referent that follows the DNS1123 labels format. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1123Label().validate(self).hasValue()' - resource: - description: |- - resource is required field of the type that is being referenced and follows the DNS1035 format. - It is normally the plural form of the resource kind in lowercase. - It must be at most 63 characters in length, and must must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character. - Example: "deployments", "deploymentconfigs", "pods", etc. - maxLength: 63 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the value must consist of only lowercase alphanumeric - characters and hyphens, and must start with an alphabetic - character and end with an alphanumeric character. - rule: '!format.dns1035Label().validate(self).hasValue()' - required: - - group - - name - - namespace - - resource - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - - namespace - x-kubernetes-list-type: map - startTime: - description: startTime is the time when Insights data gathering started. - format: date-time - type: string - x-kubernetes-validations: - - message: startTime is immutable once set - rule: self == oldSelf - type: object - x-kubernetes-validations: - - message: cannot remove insightsRequestID attribute from status - rule: (!has(oldSelf.insightsRequestID) || has(self.insightsRequestID)) - - message: cannot remove startTime attribute from status - rule: (!has(oldSelf.startTime) || has(self.startTime)) - - message: cannot remove finishTime attribute from status - rule: (!has(oldSelf.finishTime) || has(self.finishTime)) - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_insights_01_datagathers.crd.yaml similarity index 99% rename from insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_10_insights_01_datagathers.crd.yaml index c35ebb5217c..9fb6eeb3b6f 100644 --- a/insights/v1/zz_generated.crd-manifests/0000_10_insights_01_datagathers-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_10_insights_01_datagathers.crd.yaml @@ -7,7 +7,7 @@ metadata: capability.openshift.io/name: Insights include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: datagathers.insights.openshift.io spec: group: insights.openshift.io diff --git a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml deleted file mode 100644 index 3f28324091d..00000000000 --- a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-CustomNoUpgrade.crd.yaml +++ /dev/null @@ -1,632 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2544 - 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/feature-set: CustomNoUpgrade - name: pacemakerclusters.etcd.openshift.io -spec: - group: etcd.openshift.io - names: - kind: PacemakerCluster - listKind: PacemakerClusterList - plural: pacemakerclusters - singular: pacemakercluster - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - PacemakerCluster represents the current state of the pacemaker cluster as reported by the pcs status command. - PacemakerCluster is a cluster-scoped singleton resource. The name of this instance is "cluster". This - resource provides a view into the health and status of a pacemaker-managed cluster in Two Node OpenShift with Fencing deployments. - - 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 - status: - description: |- - status contains the actual pacemaker cluster status information collected from the cluster. - The goal of this status is to be able to quickly identify if pacemaker is in a healthy state. - In Two Node OpenShift with Fencing, a healthy pacemaker cluster has 2 nodes, both of which have healthy kubelet, etcd, and fencing resources. - This field is optional on creation - the status collector populates it immediately after creating - the resource via the status subresource. - properties: - conditions: - description: |- - conditions represent the observations of the pacemaker cluster's current state. - Known condition types are: "Healthy", "InService", "NodeCountAsExpected". - The "Healthy" condition is an aggregate that tracks the overall health of the cluster. - The "InService" condition tracks whether the cluster is in service (not in maintenance mode). - The "NodeCountAsExpected" condition tracks whether the expected number of nodes are present. - Each of these conditions is required, so the array must contain at least 3 items. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 3 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type NodeCountAsExpected - rule: self.exists(c, c.type == 'NodeCountAsExpected') - lastUpdated: - description: |- - lastUpdated is the timestamp when this status was last updated. This is useful for identifying - stale status reports. It must be a valid timestamp in RFC3339 format. Once set, this field cannot - be removed and cannot be set to an earlier timestamp than the current value. - format: date-time - type: string - nodes: - description: |- - nodes provides detailed status for each control-plane node in the Pacemaker cluster. - While Pacemaker supports up to 32 nodes, the limit is set to 5 (max OpenShift control-plane nodes). - For Two Node OpenShift with Fencing, exactly 2 nodes are expected in a healthy cluster. - An empty list indicates a catastrophic failure where Pacemaker reports no nodes. - items: - description: |- - PacemakerClusterNodeStatus represents the status of a single node in the pacemaker cluster including - the node's conditions and the health of critical resources running on that node. - properties: - addresses: - description: |- - addresses is a list of IP addresses for the node. - Pacemaker allows multiple IP addresses for Corosync communication between nodes. - The first address in this list is used for IP-based peer URLs for etcd membership. - Each address must be a valid global unicast IPv4 or IPv6 address in canonical form - (e.g., "192.168.1.1" not "192.168.001.001", or "2001:db8::1" not "2001:0db8::1"). - This excludes loopback, link-local, and multicast addresses. - items: - description: |- - PacemakerNodeAddress contains information for a node's address. - This is similar to corev1.NodeAddress but adds validation for IP addresses. - properties: - address: - description: |- - address is the node address. - For InternalIP, this must be a valid global unicast IPv4 or IPv6 address in canonical form. - Canonical form means the shortest standard representation (e.g., "192.168.1.1" not "192.168.001.001", - or "2001:db8::1" not "2001:0db8::1"). Maximum length is 39 characters (full IPv6 address). - Global unicast includes private/RFC1918 addresses but excludes loopback, link-local, and multicast. - maxLength: 39 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be a valid global unicast IPv4 or IPv6 - address in canonical form - rule: isIP(self) && ip.isCanonical(self) && ip(self).isGlobalUnicast() - type: - description: |- - type is the type of node address. - Currently only "InternalIP" is supported. - enum: - - InternalIP - type: string - required: - - address - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - conditions: - description: |- - conditions represent the observations of the node's current state. - Known condition types are: "Healthy", "Online", "InService", "Active", "Ready", "Clean", "Member", - "FencingAvailable", "FencingHealthy". - The "Healthy" condition is an aggregate that tracks the overall health of the node. - The "Online" condition tracks whether the node is online. - The "InService" condition tracks whether the node is in service (not in maintenance mode). - The "Active" condition tracks whether the node is active (not in standby mode). - The "Ready" condition tracks whether the node is ready (not in a pending state). - The "Clean" condition tracks whether the node is in a clean (status known) state. - The "Member" condition tracks whether the node is a member of the cluster. - The "FencingAvailable" condition tracks whether this node can be fenced by at least one healthy agent. - The "FencingHealthy" condition tracks whether all fencing agents for this node are healthy. - Each of these conditions is required, so the array must contain at least 9 items. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 9 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type Online - rule: self.exists(c, c.type == 'Online') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type Ready - rule: self.exists(c, c.type == 'Ready') - - message: conditions must contain a condition of type Clean - rule: self.exists(c, c.type == 'Clean') - - message: conditions must contain a condition of type Member - rule: self.exists(c, c.type == 'Member') - - message: conditions must contain a condition of type FencingAvailable - rule: self.exists(c, c.type == 'FencingAvailable') - - message: conditions must contain a condition of type FencingHealthy - rule: self.exists(c, c.type == 'FencingHealthy') - fencingAgents: - description: |- - fencingAgents contains the status of fencing agents that can fence this node. - Unlike resources (which are scheduled to run on this node), fencing agents are mapped - to the node they can fence (their target), not the node where monitoring operations run. - Each fencing agent entry includes a unique name, fencing type, target node, and health conditions. - A node is considered fence-capable if at least one fencing agent is healthy. - Expected to have 1 fencing agent per node, but up to 8 are supported for redundancy. - Names must be unique within this array. - items: - description: |- - PacemakerClusterFencingAgentStatus represents the status of a fencing agent that can fence a node. - Fencing agents are STONITH (Shoot The Other Node In The Head) devices used to isolate failed nodes. - Unlike regular pacemaker resources, fencing agents are mapped to their target node (the node they - can fence), not the node where their monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the fencing agent's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the fencing agent. - The "InService" condition tracks whether the fencing agent is in service (not in maintenance mode). - The "Managed" condition tracks whether the fencing agent is managed by pacemaker. - The "Enabled" condition tracks whether the fencing agent is enabled. - The "Operational" condition tracks whether the fencing agent is operational (not failed). - The "Active" condition tracks whether the fencing agent is active (available to be used). - The "Started" condition tracks whether the fencing agent is started. - The "Schedulable" condition tracks whether the fencing agent is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - method: - description: |- - method is the fencing method used by this agent. - Valid values are "Redfish" and "IPMI". - Redfish is a standard RESTful API for server management. - IPMI (Intelligent Platform Management Interface) is a hardware management interface. - enum: - - Redfish - - IPMI - type: string - name: - description: |- - name is the unique identifier for this fencing agent (e.g., "master-0_redfish"). - The name must be unique within the fencingAgents array for this node. - It may contain alphanumeric characters, dots, hyphens, and underscores. - Maximum length is 300 characters, providing headroom beyond the typical format of - _ (253 for RFC 1123 node name + 1 underscore + type). - maxLength: 300 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must contain only alphanumeric characters, - dots, hyphens, and underscores - rule: self.matches('^[a-zA-Z0-9._-]+$') - required: - - conditions - - method - - name - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: fencing agent names must be unique - rule: self.all(x, self.exists_one(y, x.name == y.name)) - nodeName: - description: |- - nodeName is the name of the node. This is expected to match the Kubernetes node's name, which must be a lowercase - RFC 1123 subdomain consisting of lowercase alphanumeric characters, '-' or '.', starting and ending with - an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: nodeName must be a lowercase RFC 1123 subdomain consisting - of lowercase alphanumeric characters, '-' or '.', and must - start and end with an alphanumeric character - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resources: - description: |- - resources contains the status of pacemaker resources scheduled on this node. - Each resource entry includes the resource name and its health conditions. - For Two Node OpenShift with Fencing, we track Kubelet and Etcd resources per node. - Both resources are required to be present, so the array must contain at least 2 items. - Valid resource names are "Kubelet" and "Etcd". - Fencing agents are tracked separately in the fencingAgents field. - items: - description: |- - PacemakerClusterResourceStatus represents the status of a pacemaker resource scheduled on a node. - A pacemaker resource is a unit of work managed by pacemaker. In pacemaker terminology, resources are services or - applications that pacemaker monitors, starts, stops, and moves between nodes to maintain high availability. - For Two Node OpenShift with Fencing, we track two resources per node: - - Kubelet (the Kubernetes node agent and a prerequisite for etcd) - - Etcd (the distributed key-value store) - - Fencing agents are tracked separately in the fencingAgents field because they are mapped to - their target node (the node they can fence), not the node where monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the resource's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the resource. - The "InService" condition tracks whether the resource is in service (not in maintenance mode). - The "Managed" condition tracks whether the resource is managed by pacemaker. - The "Enabled" condition tracks whether the resource is enabled. - The "Operational" condition tracks whether the resource is operational (not failed). - The "Active" condition tracks whether the resource is active (available to be used). - The "Started" condition tracks whether the resource is started. - The "Schedulable" condition tracks whether the resource is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - name: - description: |- - name is the name of the pacemaker resource. - Valid values are "Kubelet" and "Etcd". - The Kubelet resource is a prerequisite for etcd in Two Node OpenShift with Fencing deployments. - The Etcd resource may temporarily transition to stopped during pacemaker quorum-recovery operations. - Fencing agents are tracked separately in the node's fencingAgents field. - enum: - - Kubelet - - Etcd - type: string - required: - - conditions - - name - type: object - maxItems: 8 - minItems: 2 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: resources must contain a resource named Kubelet - rule: self.exists(r, r.name == 'Kubelet') - - message: resources must contain a resource named Etcd - rule: self.exists(r, r.name == 'Etcd') - required: - - addresses - - conditions - - fencingAgents - - nodeName - - resources - type: object - maxItems: 5 - minItems: 0 - type: array - x-kubernetes-list-map-keys: - - nodeName - x-kubernetes-list-type: map - required: - - conditions - - lastUpdated - - nodes - type: object - x-kubernetes-validations: - - message: lastUpdated may not be set to an earlier timestamp - rule: '!has(oldSelf.lastUpdated) || self.lastUpdated >= oldSelf.lastUpdated' - required: - - metadata - type: object - x-kubernetes-validations: - - message: PacemakerCluster must be named 'cluster' - rule: self.metadata.name == 'cluster' - - message: status may not be removed once set - rule: '!has(oldSelf.status) || has(self.status)' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index e750c4ae374..00000000000 --- a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,632 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2544 - 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/feature-set: DevPreviewNoUpgrade - name: pacemakerclusters.etcd.openshift.io -spec: - group: etcd.openshift.io - names: - kind: PacemakerCluster - listKind: PacemakerClusterList - plural: pacemakerclusters - singular: pacemakercluster - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - PacemakerCluster represents the current state of the pacemaker cluster as reported by the pcs status command. - PacemakerCluster is a cluster-scoped singleton resource. The name of this instance is "cluster". This - resource provides a view into the health and status of a pacemaker-managed cluster in Two Node OpenShift with Fencing deployments. - - 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 - status: - description: |- - status contains the actual pacemaker cluster status information collected from the cluster. - The goal of this status is to be able to quickly identify if pacemaker is in a healthy state. - In Two Node OpenShift with Fencing, a healthy pacemaker cluster has 2 nodes, both of which have healthy kubelet, etcd, and fencing resources. - This field is optional on creation - the status collector populates it immediately after creating - the resource via the status subresource. - properties: - conditions: - description: |- - conditions represent the observations of the pacemaker cluster's current state. - Known condition types are: "Healthy", "InService", "NodeCountAsExpected". - The "Healthy" condition is an aggregate that tracks the overall health of the cluster. - The "InService" condition tracks whether the cluster is in service (not in maintenance mode). - The "NodeCountAsExpected" condition tracks whether the expected number of nodes are present. - Each of these conditions is required, so the array must contain at least 3 items. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 3 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type NodeCountAsExpected - rule: self.exists(c, c.type == 'NodeCountAsExpected') - lastUpdated: - description: |- - lastUpdated is the timestamp when this status was last updated. This is useful for identifying - stale status reports. It must be a valid timestamp in RFC3339 format. Once set, this field cannot - be removed and cannot be set to an earlier timestamp than the current value. - format: date-time - type: string - nodes: - description: |- - nodes provides detailed status for each control-plane node in the Pacemaker cluster. - While Pacemaker supports up to 32 nodes, the limit is set to 5 (max OpenShift control-plane nodes). - For Two Node OpenShift with Fencing, exactly 2 nodes are expected in a healthy cluster. - An empty list indicates a catastrophic failure where Pacemaker reports no nodes. - items: - description: |- - PacemakerClusterNodeStatus represents the status of a single node in the pacemaker cluster including - the node's conditions and the health of critical resources running on that node. - properties: - addresses: - description: |- - addresses is a list of IP addresses for the node. - Pacemaker allows multiple IP addresses for Corosync communication between nodes. - The first address in this list is used for IP-based peer URLs for etcd membership. - Each address must be a valid global unicast IPv4 or IPv6 address in canonical form - (e.g., "192.168.1.1" not "192.168.001.001", or "2001:db8::1" not "2001:0db8::1"). - This excludes loopback, link-local, and multicast addresses. - items: - description: |- - PacemakerNodeAddress contains information for a node's address. - This is similar to corev1.NodeAddress but adds validation for IP addresses. - properties: - address: - description: |- - address is the node address. - For InternalIP, this must be a valid global unicast IPv4 or IPv6 address in canonical form. - Canonical form means the shortest standard representation (e.g., "192.168.1.1" not "192.168.001.001", - or "2001:db8::1" not "2001:0db8::1"). Maximum length is 39 characters (full IPv6 address). - Global unicast includes private/RFC1918 addresses but excludes loopback, link-local, and multicast. - maxLength: 39 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be a valid global unicast IPv4 or IPv6 - address in canonical form - rule: isIP(self) && ip.isCanonical(self) && ip(self).isGlobalUnicast() - type: - description: |- - type is the type of node address. - Currently only "InternalIP" is supported. - enum: - - InternalIP - type: string - required: - - address - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - conditions: - description: |- - conditions represent the observations of the node's current state. - Known condition types are: "Healthy", "Online", "InService", "Active", "Ready", "Clean", "Member", - "FencingAvailable", "FencingHealthy". - The "Healthy" condition is an aggregate that tracks the overall health of the node. - The "Online" condition tracks whether the node is online. - The "InService" condition tracks whether the node is in service (not in maintenance mode). - The "Active" condition tracks whether the node is active (not in standby mode). - The "Ready" condition tracks whether the node is ready (not in a pending state). - The "Clean" condition tracks whether the node is in a clean (status known) state. - The "Member" condition tracks whether the node is a member of the cluster. - The "FencingAvailable" condition tracks whether this node can be fenced by at least one healthy agent. - The "FencingHealthy" condition tracks whether all fencing agents for this node are healthy. - Each of these conditions is required, so the array must contain at least 9 items. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 9 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type Online - rule: self.exists(c, c.type == 'Online') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type Ready - rule: self.exists(c, c.type == 'Ready') - - message: conditions must contain a condition of type Clean - rule: self.exists(c, c.type == 'Clean') - - message: conditions must contain a condition of type Member - rule: self.exists(c, c.type == 'Member') - - message: conditions must contain a condition of type FencingAvailable - rule: self.exists(c, c.type == 'FencingAvailable') - - message: conditions must contain a condition of type FencingHealthy - rule: self.exists(c, c.type == 'FencingHealthy') - fencingAgents: - description: |- - fencingAgents contains the status of fencing agents that can fence this node. - Unlike resources (which are scheduled to run on this node), fencing agents are mapped - to the node they can fence (their target), not the node where monitoring operations run. - Each fencing agent entry includes a unique name, fencing type, target node, and health conditions. - A node is considered fence-capable if at least one fencing agent is healthy. - Expected to have 1 fencing agent per node, but up to 8 are supported for redundancy. - Names must be unique within this array. - items: - description: |- - PacemakerClusterFencingAgentStatus represents the status of a fencing agent that can fence a node. - Fencing agents are STONITH (Shoot The Other Node In The Head) devices used to isolate failed nodes. - Unlike regular pacemaker resources, fencing agents are mapped to their target node (the node they - can fence), not the node where their monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the fencing agent's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the fencing agent. - The "InService" condition tracks whether the fencing agent is in service (not in maintenance mode). - The "Managed" condition tracks whether the fencing agent is managed by pacemaker. - The "Enabled" condition tracks whether the fencing agent is enabled. - The "Operational" condition tracks whether the fencing agent is operational (not failed). - The "Active" condition tracks whether the fencing agent is active (available to be used). - The "Started" condition tracks whether the fencing agent is started. - The "Schedulable" condition tracks whether the fencing agent is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - method: - description: |- - method is the fencing method used by this agent. - Valid values are "Redfish" and "IPMI". - Redfish is a standard RESTful API for server management. - IPMI (Intelligent Platform Management Interface) is a hardware management interface. - enum: - - Redfish - - IPMI - type: string - name: - description: |- - name is the unique identifier for this fencing agent (e.g., "master-0_redfish"). - The name must be unique within the fencingAgents array for this node. - It may contain alphanumeric characters, dots, hyphens, and underscores. - Maximum length is 300 characters, providing headroom beyond the typical format of - _ (253 for RFC 1123 node name + 1 underscore + type). - maxLength: 300 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must contain only alphanumeric characters, - dots, hyphens, and underscores - rule: self.matches('^[a-zA-Z0-9._-]+$') - required: - - conditions - - method - - name - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: fencing agent names must be unique - rule: self.all(x, self.exists_one(y, x.name == y.name)) - nodeName: - description: |- - nodeName is the name of the node. This is expected to match the Kubernetes node's name, which must be a lowercase - RFC 1123 subdomain consisting of lowercase alphanumeric characters, '-' or '.', starting and ending with - an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: nodeName must be a lowercase RFC 1123 subdomain consisting - of lowercase alphanumeric characters, '-' or '.', and must - start and end with an alphanumeric character - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resources: - description: |- - resources contains the status of pacemaker resources scheduled on this node. - Each resource entry includes the resource name and its health conditions. - For Two Node OpenShift with Fencing, we track Kubelet and Etcd resources per node. - Both resources are required to be present, so the array must contain at least 2 items. - Valid resource names are "Kubelet" and "Etcd". - Fencing agents are tracked separately in the fencingAgents field. - items: - description: |- - PacemakerClusterResourceStatus represents the status of a pacemaker resource scheduled on a node. - A pacemaker resource is a unit of work managed by pacemaker. In pacemaker terminology, resources are services or - applications that pacemaker monitors, starts, stops, and moves between nodes to maintain high availability. - For Two Node OpenShift with Fencing, we track two resources per node: - - Kubelet (the Kubernetes node agent and a prerequisite for etcd) - - Etcd (the distributed key-value store) - - Fencing agents are tracked separately in the fencingAgents field because they are mapped to - their target node (the node they can fence), not the node where monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the resource's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the resource. - The "InService" condition tracks whether the resource is in service (not in maintenance mode). - The "Managed" condition tracks whether the resource is managed by pacemaker. - The "Enabled" condition tracks whether the resource is enabled. - The "Operational" condition tracks whether the resource is operational (not failed). - The "Active" condition tracks whether the resource is active (available to be used). - The "Started" condition tracks whether the resource is started. - The "Schedulable" condition tracks whether the resource is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - name: - description: |- - name is the name of the pacemaker resource. - Valid values are "Kubelet" and "Etcd". - The Kubelet resource is a prerequisite for etcd in Two Node OpenShift with Fencing deployments. - The Etcd resource may temporarily transition to stopped during pacemaker quorum-recovery operations. - Fencing agents are tracked separately in the node's fencingAgents field. - enum: - - Kubelet - - Etcd - type: string - required: - - conditions - - name - type: object - maxItems: 8 - minItems: 2 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: resources must contain a resource named Kubelet - rule: self.exists(r, r.name == 'Kubelet') - - message: resources must contain a resource named Etcd - rule: self.exists(r, r.name == 'Etcd') - required: - - addresses - - conditions - - fencingAgents - - nodeName - - resources - type: object - maxItems: 5 - minItems: 0 - type: array - x-kubernetes-list-map-keys: - - nodeName - x-kubernetes-list-type: map - required: - - conditions - - lastUpdated - - nodes - type: object - x-kubernetes-validations: - - message: lastUpdated may not be set to an earlier timestamp - rule: '!has(oldSelf.lastUpdated) || self.lastUpdated >= oldSelf.lastUpdated' - required: - - metadata - type: object - x-kubernetes-validations: - - message: PacemakerCluster must be named 'cluster' - rule: self.metadata.name == 'cluster' - - message: status may not be removed once set - rule: '!has(oldSelf.status) || has(self.status)' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 3e1f27cfa5e..00000000000 --- a/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,632 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2544 - 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/feature-set: TechPreviewNoUpgrade - name: pacemakerclusters.etcd.openshift.io -spec: - group: etcd.openshift.io - names: - kind: PacemakerCluster - listKind: PacemakerClusterList - plural: pacemakerclusters - singular: pacemakercluster - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - PacemakerCluster represents the current state of the pacemaker cluster as reported by the pcs status command. - PacemakerCluster is a cluster-scoped singleton resource. The name of this instance is "cluster". This - resource provides a view into the health and status of a pacemaker-managed cluster in Two Node OpenShift with Fencing deployments. - - 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 - status: - description: |- - status contains the actual pacemaker cluster status information collected from the cluster. - The goal of this status is to be able to quickly identify if pacemaker is in a healthy state. - In Two Node OpenShift with Fencing, a healthy pacemaker cluster has 2 nodes, both of which have healthy kubelet, etcd, and fencing resources. - This field is optional on creation - the status collector populates it immediately after creating - the resource via the status subresource. - properties: - conditions: - description: |- - conditions represent the observations of the pacemaker cluster's current state. - Known condition types are: "Healthy", "InService", "NodeCountAsExpected". - The "Healthy" condition is an aggregate that tracks the overall health of the cluster. - The "InService" condition tracks whether the cluster is in service (not in maintenance mode). - The "NodeCountAsExpected" condition tracks whether the expected number of nodes are present. - Each of these conditions is required, so the array must contain at least 3 items. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 3 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type NodeCountAsExpected - rule: self.exists(c, c.type == 'NodeCountAsExpected') - lastUpdated: - description: |- - lastUpdated is the timestamp when this status was last updated. This is useful for identifying - stale status reports. It must be a valid timestamp in RFC3339 format. Once set, this field cannot - be removed and cannot be set to an earlier timestamp than the current value. - format: date-time - type: string - nodes: - description: |- - nodes provides detailed status for each control-plane node in the Pacemaker cluster. - While Pacemaker supports up to 32 nodes, the limit is set to 5 (max OpenShift control-plane nodes). - For Two Node OpenShift with Fencing, exactly 2 nodes are expected in a healthy cluster. - An empty list indicates a catastrophic failure where Pacemaker reports no nodes. - items: - description: |- - PacemakerClusterNodeStatus represents the status of a single node in the pacemaker cluster including - the node's conditions and the health of critical resources running on that node. - properties: - addresses: - description: |- - addresses is a list of IP addresses for the node. - Pacemaker allows multiple IP addresses for Corosync communication between nodes. - The first address in this list is used for IP-based peer URLs for etcd membership. - Each address must be a valid global unicast IPv4 or IPv6 address in canonical form - (e.g., "192.168.1.1" not "192.168.001.001", or "2001:db8::1" not "2001:0db8::1"). - This excludes loopback, link-local, and multicast addresses. - items: - description: |- - PacemakerNodeAddress contains information for a node's address. - This is similar to corev1.NodeAddress but adds validation for IP addresses. - properties: - address: - description: |- - address is the node address. - For InternalIP, this must be a valid global unicast IPv4 or IPv6 address in canonical form. - Canonical form means the shortest standard representation (e.g., "192.168.1.1" not "192.168.001.001", - or "2001:db8::1" not "2001:0db8::1"). Maximum length is 39 characters (full IPv6 address). - Global unicast includes private/RFC1918 addresses but excludes loopback, link-local, and multicast. - maxLength: 39 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be a valid global unicast IPv4 or IPv6 - address in canonical form - rule: isIP(self) && ip.isCanonical(self) && ip(self).isGlobalUnicast() - type: - description: |- - type is the type of node address. - Currently only "InternalIP" is supported. - enum: - - InternalIP - type: string - required: - - address - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-type: atomic - conditions: - description: |- - conditions represent the observations of the node's current state. - Known condition types are: "Healthy", "Online", "InService", "Active", "Ready", "Clean", "Member", - "FencingAvailable", "FencingHealthy". - The "Healthy" condition is an aggregate that tracks the overall health of the node. - The "Online" condition tracks whether the node is online. - The "InService" condition tracks whether the node is in service (not in maintenance mode). - The "Active" condition tracks whether the node is active (not in standby mode). - The "Ready" condition tracks whether the node is ready (not in a pending state). - The "Clean" condition tracks whether the node is in a clean (status known) state. - The "Member" condition tracks whether the node is a member of the cluster. - The "FencingAvailable" condition tracks whether this node can be fenced by at least one healthy agent. - The "FencingHealthy" condition tracks whether all fencing agents for this node are healthy. - Each of these conditions is required, so the array must contain at least 9 items. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 9 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type Online - rule: self.exists(c, c.type == 'Online') - - message: conditions must contain a condition of type InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type Ready - rule: self.exists(c, c.type == 'Ready') - - message: conditions must contain a condition of type Clean - rule: self.exists(c, c.type == 'Clean') - - message: conditions must contain a condition of type Member - rule: self.exists(c, c.type == 'Member') - - message: conditions must contain a condition of type FencingAvailable - rule: self.exists(c, c.type == 'FencingAvailable') - - message: conditions must contain a condition of type FencingHealthy - rule: self.exists(c, c.type == 'FencingHealthy') - fencingAgents: - description: |- - fencingAgents contains the status of fencing agents that can fence this node. - Unlike resources (which are scheduled to run on this node), fencing agents are mapped - to the node they can fence (their target), not the node where monitoring operations run. - Each fencing agent entry includes a unique name, fencing type, target node, and health conditions. - A node is considered fence-capable if at least one fencing agent is healthy. - Expected to have 1 fencing agent per node, but up to 8 are supported for redundancy. - Names must be unique within this array. - items: - description: |- - PacemakerClusterFencingAgentStatus represents the status of a fencing agent that can fence a node. - Fencing agents are STONITH (Shoot The Other Node In The Head) devices used to isolate failed nodes. - Unlike regular pacemaker resources, fencing agents are mapped to their target node (the node they - can fence), not the node where their monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the fencing agent's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the fencing agent. - The "InService" condition tracks whether the fencing agent is in service (not in maintenance mode). - The "Managed" condition tracks whether the fencing agent is managed by pacemaker. - The "Enabled" condition tracks whether the fencing agent is enabled. - The "Operational" condition tracks whether the fencing agent is operational (not failed). - The "Active" condition tracks whether the fencing agent is active (available to be used). - The "Started" condition tracks whether the fencing agent is started. - The "Schedulable" condition tracks whether the fencing agent is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - method: - description: |- - method is the fencing method used by this agent. - Valid values are "Redfish" and "IPMI". - Redfish is a standard RESTful API for server management. - IPMI (Intelligent Platform Management Interface) is a hardware management interface. - enum: - - Redfish - - IPMI - type: string - name: - description: |- - name is the unique identifier for this fencing agent (e.g., "master-0_redfish"). - The name must be unique within the fencingAgents array for this node. - It may contain alphanumeric characters, dots, hyphens, and underscores. - Maximum length is 300 characters, providing headroom beyond the typical format of - _ (253 for RFC 1123 node name + 1 underscore + type). - maxLength: 300 - minLength: 1 - type: string - x-kubernetes-validations: - - message: name must contain only alphanumeric characters, - dots, hyphens, and underscores - rule: self.matches('^[a-zA-Z0-9._-]+$') - required: - - conditions - - method - - name - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: fencing agent names must be unique - rule: self.all(x, self.exists_one(y, x.name == y.name)) - nodeName: - description: |- - nodeName is the name of the node. This is expected to match the Kubernetes node's name, which must be a lowercase - RFC 1123 subdomain consisting of lowercase alphanumeric characters, '-' or '.', starting and ending with - an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: nodeName must be a lowercase RFC 1123 subdomain consisting - of lowercase alphanumeric characters, '-' or '.', and must - start and end with an alphanumeric character - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - resources: - description: |- - resources contains the status of pacemaker resources scheduled on this node. - Each resource entry includes the resource name and its health conditions. - For Two Node OpenShift with Fencing, we track Kubelet and Etcd resources per node. - Both resources are required to be present, so the array must contain at least 2 items. - Valid resource names are "Kubelet" and "Etcd". - Fencing agents are tracked separately in the fencingAgents field. - items: - description: |- - PacemakerClusterResourceStatus represents the status of a pacemaker resource scheduled on a node. - A pacemaker resource is a unit of work managed by pacemaker. In pacemaker terminology, resources are services or - applications that pacemaker monitors, starts, stops, and moves between nodes to maintain high availability. - For Two Node OpenShift with Fencing, we track two resources per node: - - Kubelet (the Kubernetes node agent and a prerequisite for etcd) - - Etcd (the distributed key-value store) - - Fencing agents are tracked separately in the fencingAgents field because they are mapped to - their target node (the node they can fence), not the node where monitoring operations are scheduled. - properties: - conditions: - description: |- - conditions represent the observations of the resource's current state. - Known condition types are: "Healthy", "InService", "Managed", "Enabled", "Operational", - "Active", "Started", "Schedulable". - The "Healthy" condition is an aggregate that tracks the overall health of the resource. - The "InService" condition tracks whether the resource is in service (not in maintenance mode). - The "Managed" condition tracks whether the resource is managed by pacemaker. - The "Enabled" condition tracks whether the resource is enabled. - The "Operational" condition tracks whether the resource is operational (not failed). - The "Active" condition tracks whether the resource is active (available to be used). - The "Started" condition tracks whether the resource is started. - The "Schedulable" condition tracks whether the resource is schedulable (not blocked). - Each of these conditions is required, so the array must contain at least 8 items. - items: - description: Condition contains details for one aspect - of the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, - False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in - foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 16 - minItems: 8 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: conditions must contain a condition of type - Healthy - rule: self.exists(c, c.type == 'Healthy') - - message: conditions must contain a condition of type - InService - rule: self.exists(c, c.type == 'InService') - - message: conditions must contain a condition of type - Managed - rule: self.exists(c, c.type == 'Managed') - - message: conditions must contain a condition of type - Enabled - rule: self.exists(c, c.type == 'Enabled') - - message: conditions must contain a condition of type - Operational - rule: self.exists(c, c.type == 'Operational') - - message: conditions must contain a condition of type - Active - rule: self.exists(c, c.type == 'Active') - - message: conditions must contain a condition of type - Started - rule: self.exists(c, c.type == 'Started') - - message: conditions must contain a condition of type - Schedulable - rule: self.exists(c, c.type == 'Schedulable') - name: - description: |- - name is the name of the pacemaker resource. - Valid values are "Kubelet" and "Etcd". - The Kubelet resource is a prerequisite for etcd in Two Node OpenShift with Fencing deployments. - The Etcd resource may temporarily transition to stopped during pacemaker quorum-recovery operations. - Fencing agents are tracked separately in the node's fencingAgents field. - enum: - - Kubelet - - Etcd - type: string - required: - - conditions - - name - type: object - maxItems: 8 - minItems: 2 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - x-kubernetes-validations: - - message: resources must contain a resource named Kubelet - rule: self.exists(r, r.name == 'Kubelet') - - message: resources must contain a resource named Etcd - rule: self.exists(r, r.name == 'Etcd') - required: - - addresses - - conditions - - fencingAgents - - nodeName - - resources - type: object - maxItems: 5 - minItems: 0 - type: array - x-kubernetes-list-map-keys: - - nodeName - x-kubernetes-list-type: map - required: - - conditions - - lastUpdated - - nodes - type: object - x-kubernetes-validations: - - message: lastUpdated may not be set to an earlier timestamp - rule: '!has(oldSelf.lastUpdated) || self.lastUpdated >= oldSelf.lastUpdated' - required: - - metadata - type: object - x-kubernetes-validations: - - message: PacemakerCluster must be named 'cluster' - rule: self.metadata.name == 'cluster' - - message: status may not be removed once set - rule: '!has(oldSelf.status) || has(self.status)' - served: true - storage: true - subresources: - status: {} diff --git a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters.crd.yaml similarity index 99% rename from etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_25_etcd_01_pacemakerclusters.crd.yaml index e750c4ae374..370cd8ab1f8 100644 --- a/etcd/v1alpha1/zz_generated.crd-manifests/0000_25_etcd_01_pacemakerclusters-DevPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_25_etcd_01_pacemakerclusters.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: DevPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade name: pacemakerclusters.etcd.openshift.io spec: group: etcd.openshift.io diff --git a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 69153b31c06..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,289 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2510 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: DevPreviewNoUpgrade - labels: - openshift.io/operator-managed: "" - name: internalreleaseimages.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: InternalReleaseImage - listKind: InternalReleaseImageList - plural: internalreleaseimages - singular: internalreleaseimage - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - InternalReleaseImage is used to keep track and manage a set - of release bundles (OCP and OLM operators images) that are stored - into the control planes nodes. - - 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 describes the configuration of this internal release - image. - properties: - releases: - description: |- - releases is a list of release bundle identifiers that the user wants to - add/remove to/from the control plane nodes. - Entries must be unique, keyed on the name field. - releases must contain at least one entry and must not exceed 16 entries. - items: - description: |- - InternalReleaseImageRef is used to provide a simple reference for a release - bundle. Currently it contains only the name field. - properties: - name: - description: |- - name indicates the desired release bundle identifier. This field is required and must be between 1 and 64 characters long. - The expected name format is ocp-release-bundle--. - maxLength: 64 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be ocp-release-bundle-- - and <= 64 chars - rule: self.matches('^ocp-release-bundle-[0-9]+\\.[0-9]+\\.[0-9]+-[A-Za-z0-9._-]+$') - required: - - name - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - releases - type: object - status: - description: status describes the last observed state of this internal - release image. - properties: - conditions: - description: |- - conditions represent the observations of the InternalReleaseImage controller current state. - Valid types are: Degraded. - If Degraded is true, that means something has gone wrong in the controller. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - releases: - description: |- - releases is a list of the release bundles currently owned and managed by the - cluster. - A release bundle content could be safely pulled only when its Conditions field - contains at least an Available entry set to "True" and Degraded to "False". - Entries must be unique, keyed on the name field. - releases must contain at least one entry and must not exceed 32 entries. - items: - properties: - conditions: - description: |- - conditions represent the observations of an internal release image current state. Valid types are: - Mounted, Installing, Available, Removing and Degraded. - - If Mounted is true, that means that a valid ISO has been discovered and mounted on one of the cluster nodes. - If Installing is true, that means that a new release bundle is currently being copied on one (or more) cluster nodes, and not yet completed. - If Available is true, it means that the release has been previously installed on all the cluster nodes, and it can be used. - If Removing is true, it means that a release deletion is in progress on one (or more) cluster nodes, and not yet completed. - If Degraded is true, that means something has gone wrong (possibly on one or more cluster nodes). - - In general, after installing a new release bundle, it is required to wait for the Conditions "Available" to become "True" (and all - the other conditions to be equal to "False") before being able to pull its content. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 5 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - image: - description: |- - image is an OCP release image referenced by digest. - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - The field is optional, and it will be provided after a release will be successfully installed. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - name: - description: |- - name indicates the desired release bundle identifier. This field is required and must be between 1 and 64 characters long. - The expected name format is ocp-release-bundle--. - maxLength: 64 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be ocp-release-bundle-- - and <= 64 chars - rule: self.matches('^ocp-release-bundle-[0-9]+\\.[0-9]+\\.[0-9]+-[A-Za-z0-9._-]+$') - required: - - name - type: object - maxItems: 32 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - releases - type: object - required: - - metadata - - spec - type: object - x-kubernetes-validations: - - message: internalreleaseimage is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml similarity index 99% rename from machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml index c74586c5ca1..5bac70ef2cc 100644 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-CustomNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-Hypershift.crd.yaml @@ -5,7 +5,6 @@ metadata: api-approved.openshift.io: https://github.com/openshift/api/pull/2510 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/feature-set: CustomNoUpgrade labels: openshift.io/operator-managed: "" diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml similarity index 99% rename from machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml index 6c01040a915..c28df43cb11 100644 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-SelfManagedHA.crd.yaml @@ -5,7 +5,7 @@ metadata: api-approved.openshift.io: https://github.com/openshift/api/pull/2510 api.openshift.io/merged-by-featuregates: "true" include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade labels: openshift.io/operator-managed: "" name: internalreleaseimages.machineconfiguration.openshift.io diff --git a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 6c01040a915..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_internalreleaseimages-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,289 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2510 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/self-managed-high-availability: "true" - release.openshift.io/feature-set: TechPreviewNoUpgrade - labels: - openshift.io/operator-managed: "" - name: internalreleaseimages.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: InternalReleaseImage - listKind: InternalReleaseImageList - plural: internalreleaseimages - singular: internalreleaseimage - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - InternalReleaseImage is used to keep track and manage a set - of release bundles (OCP and OLM operators images) that are stored - into the control planes nodes. - - 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 describes the configuration of this internal release - image. - properties: - releases: - description: |- - releases is a list of release bundle identifiers that the user wants to - add/remove to/from the control plane nodes. - Entries must be unique, keyed on the name field. - releases must contain at least one entry and must not exceed 16 entries. - items: - description: |- - InternalReleaseImageRef is used to provide a simple reference for a release - bundle. Currently it contains only the name field. - properties: - name: - description: |- - name indicates the desired release bundle identifier. This field is required and must be between 1 and 64 characters long. - The expected name format is ocp-release-bundle--. - maxLength: 64 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be ocp-release-bundle-- - and <= 64 chars - rule: self.matches('^ocp-release-bundle-[0-9]+\\.[0-9]+\\.[0-9]+-[A-Za-z0-9._-]+$') - required: - - name - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - releases - type: object - status: - description: status describes the last observed state of this internal - release image. - properties: - conditions: - description: |- - conditions represent the observations of the InternalReleaseImage controller current state. - Valid types are: Degraded. - If Degraded is true, that means something has gone wrong in the controller. - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - releases: - description: |- - releases is a list of the release bundles currently owned and managed by the - cluster. - A release bundle content could be safely pulled only when its Conditions field - contains at least an Available entry set to "True" and Degraded to "False". - Entries must be unique, keyed on the name field. - releases must contain at least one entry and must not exceed 32 entries. - items: - properties: - conditions: - description: |- - conditions represent the observations of an internal release image current state. Valid types are: - Mounted, Installing, Available, Removing and Degraded. - - If Mounted is true, that means that a valid ISO has been discovered and mounted on one of the cluster nodes. - If Installing is true, that means that a new release bundle is currently being copied on one (or more) cluster nodes, and not yet completed. - If Available is true, it means that the release has been previously installed on all the cluster nodes, and it can be used. - If Removing is true, it means that a release deletion is in progress on one (or more) cluster nodes, and not yet completed. - If Degraded is true, that means something has gone wrong (possibly on one or more cluster nodes). - - In general, after installing a new release bundle, it is required to wait for the Conditions "Available" to become "True" (and all - the other conditions to be equal to "False") before being able to pull its content. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 5 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - image: - description: |- - image is an OCP release image referenced by digest. - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - The field is optional, and it will be provided after a release will be successfully installed. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - name: - description: |- - name indicates the desired release bundle identifier. This field is required and must be between 1 and 64 characters long. - The expected name format is ocp-release-bundle--. - maxLength: 64 - minLength: 1 - type: string - x-kubernetes-validations: - - message: must be ocp-release-bundle-- - and <= 64 chars - rule: self.matches('^ocp-release-bundle-[0-9]+\\.[0-9]+\\.[0-9]+-[A-Za-z0-9._-]+$') - required: - - name - type: object - maxItems: 32 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - releases - type: object - required: - - metadata - - spec - type: object - x-kubernetes-validations: - - message: internalreleaseimage is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml similarity index 99% rename from payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml rename to payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml index 84e5ff76260..4e96be5ea9e 100644 --- a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-Default.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Default.crd.yaml @@ -4,6 +4,7 @@ metadata: annotations: api-approved.openshift.io: https://github.com/openshift/api/pull/2255 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/feature-set: Default labels: diff --git a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml deleted file mode 100644 index b05742e01ee..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-Default.crd.yaml +++ /dev/null @@ -1,383 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2255 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/ibm-cloud-managed: "true" - release.openshift.io/feature-set: Default - labels: - openshift.io/operator-managed: "" - name: machineconfignodes.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: MachineConfigNode - listKind: MachineConfigNodeList - plural: machineconfignodes - singular: machineconfignode - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.pool.name - name: PoolName - type: string - - jsonPath: .spec.configVersion.desired - name: DesiredConfig - type: string - - jsonPath: .status.configVersion.current - name: CurrentConfig - type: string - - jsonPath: .status.conditions[?(@.type=="Updated")].status - name: Updated - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .status.conditions[?(@.type=="UpdatePrepared")].status - name: UpdatePrepared - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateExecuted")].status - name: UpdateExecuted - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdatePostActionComplete")].status - name: UpdatePostActionComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateComplete")].status - name: UpdateComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Resumed")].status - name: Resumed - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="AppliedFilesAndOS")].status - name: UpdatedFilesAndOS - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Cordoned")].status - name: CordonedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Drained")].status - name: DrainedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="RebootedNode")].status - name: RebootedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Uncordoned")].status - name: UncordonedNode - priority: 1 - type: string - name: v1 - schema: - openAPIV3Schema: - description: |- - MachineConfigNode describes the health of the Machines on the system - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 describes the configuration of the machine config node. - properties: - configVersion: - description: |- - configVersion holds the desired config version for the node targeted by this machine config node resource. - The desired version represents the machine config the node will attempt to update to and gets set before the machine config operator validates - the new machine config against the current machine config. - properties: - desired: - description: |- - desired is the name of the machine config that the the node should be upgraded to. - This value is set when the machine config pool generates a new version of its rendered configuration. - When this value is changed, the machine config daemon starts the node upgrade process. - This value gets set in the machine config node spec once the machine config has been targeted for upgrade and before it is validated. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - node: - description: node contains a reference to the node for this machine - config node. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - pool: - description: |- - pool contains a reference to the machine config pool that this machine config node's - referenced node belongs to. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - required: - - configVersion - - node - - pool - type: object - status: - description: status describes the last observed state of this machine - config node. - properties: - conditions: - description: |- - conditions represent the observations of a machine config node's current state. Valid types are: - UpdatePrepared, UpdateExecuted, UpdatePostActionComplete, UpdateComplete, Updated, Resumed, - Drained, AppliedFilesAndOS, Cordoned, Uncordoned, RebootedNode, NodeDegraded, PinnedImageSetsProgressing, - and PinnedImageSetsDegraded. - The following types are only available when the ImageModeStatusReporting feature gate is enabled: ImagePulledFromRegistry, - AppliedOSImage, AppliedFiles - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - configVersion: - description: configVersion describes the current and desired machine - config version for this node. - properties: - current: - description: |- - current is the name of the machine config currently in use on the node. - This value is updated once the machine config daemon has completed the update of the configuration for the node. - This value should match the desired version unless an upgrade is in progress. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - desired: - description: |- - desired is the MachineConfig the node wants to upgrade to. - This value gets set in the machine config node status once the machine config has been validated - against the current machine config. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - observedGeneration: - description: |- - observedGeneration represents the generation of the MachineConfigNode object observed by the Machine Config Operator's controller. - This field is updated when the controller observes a change to the desiredConfig in the configVersion of the machine config node spec. - format: int64 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: observedGeneration must not decrease - rule: self >= oldSelf - pinnedImageSets: - description: pinnedImageSets describes the current and desired pinned - image sets for this node. - items: - description: MachineConfigNodeStatusPinnedImageSet holds information - about the current, desired, and failed pinned image sets for the - observed machine config node. - properties: - currentGeneration: - description: currentGeneration is the generation of the pinned - image set that has most recently been successfully pulled - and pinned on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: currentGeneration must not decrease - rule: self >= oldSelf - desiredGeneration: - description: desiredGeneration is the generation of the pinned - image set that is targeted to be pulled and pinned on this - node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: desiredGeneration must not decrease - rule: self >= oldSelf - lastFailedGeneration: - description: lastFailedGeneration is the generation of the most - recent pinned image set that failed to be pulled and pinned - on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: lastFailedGeneration must not decrease - rule: self >= oldSelf - lastFailedGenerationError: - description: |- - lastFailedGenerationError is the error explaining why the desired images failed to be pulled and pinned. - The error is an empty string if the image pull and pin is successful. - maxLength: 32768 - type: string - name: - description: |- - name is the name of the pinned image set. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - x-kubernetes-validations: - - message: desired generation must be greater than or equal to the - current generation - rule: 'has(self.desiredGeneration) && has(self.currentGeneration) - ? self.desiredGeneration >= self.currentGeneration : true' - - message: desired generation must be greater than or equal to the - last failed generation - rule: 'has(self.lastFailedGeneration) && has(self.desiredGeneration) - ? self.desiredGeneration >= self.lastFailedGeneration : true' - - message: last failed generation error must be defined on image - pull and pin failure - rule: 'has(self.lastFailedGeneration) ? has(self.lastFailedGenerationError) - : true' - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: spec.node.name should match metadata.name - rule: self.metadata.name == self.spec.node.name - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml deleted file mode 100644 index e2009b641fc..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-Hypershift-OKD.crd.yaml +++ /dev/null @@ -1,383 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2255 - api.openshift.io/merged-by-featuregates: "true" - include.release.openshift.io/ibm-cloud-managed: "true" - release.openshift.io/feature-set: OKD - labels: - openshift.io/operator-managed: "" - name: machineconfignodes.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: MachineConfigNode - listKind: MachineConfigNodeList - plural: machineconfignodes - singular: machineconfignode - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.pool.name - name: PoolName - type: string - - jsonPath: .spec.configVersion.desired - name: DesiredConfig - type: string - - jsonPath: .status.configVersion.current - name: CurrentConfig - type: string - - jsonPath: .status.conditions[?(@.type=="Updated")].status - name: Updated - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .status.conditions[?(@.type=="UpdatePrepared")].status - name: UpdatePrepared - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateExecuted")].status - name: UpdateExecuted - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdatePostActionComplete")].status - name: UpdatePostActionComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="UpdateComplete")].status - name: UpdateComplete - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Resumed")].status - name: Resumed - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="AppliedFilesAndOS")].status - name: UpdatedFilesAndOS - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Cordoned")].status - name: CordonedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Drained")].status - name: DrainedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="RebootedNode")].status - name: RebootedNode - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Uncordoned")].status - name: UncordonedNode - priority: 1 - type: string - name: v1 - schema: - openAPIV3Schema: - description: |- - MachineConfigNode describes the health of the Machines on the system - Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). - 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 describes the configuration of the machine config node. - properties: - configVersion: - description: |- - configVersion holds the desired config version for the node targeted by this machine config node resource. - The desired version represents the machine config the node will attempt to update to and gets set before the machine config operator validates - the new machine config against the current machine config. - properties: - desired: - description: |- - desired is the name of the machine config that the the node should be upgraded to. - This value is set when the machine config pool generates a new version of its rendered configuration. - When this value is changed, the machine config daemon starts the node upgrade process. - This value gets set in the machine config node spec once the machine config has been targeted for upgrade and before it is validated. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - node: - description: node contains a reference to the node for this machine - config node. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - pool: - description: |- - pool contains a reference to the machine config pool that this machine config node's - referenced node belongs to. - properties: - name: - description: |- - name is the name of the object being referenced. For example, this can represent a machine - config pool or node name. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - required: - - configVersion - - node - - pool - type: object - status: - description: status describes the last observed state of this machine - config node. - properties: - conditions: - description: |- - conditions represent the observations of a machine config node's current state. Valid types are: - UpdatePrepared, UpdateExecuted, UpdatePostActionComplete, UpdateComplete, Updated, Resumed, - Drained, AppliedFilesAndOS, Cordoned, Uncordoned, RebootedNode, NodeDegraded, PinnedImageSetsProgressing, - and PinnedImageSetsDegraded. - The following types are only available when the ImageModeStatusReporting feature gate is enabled: ImagePulledFromRegistry, - AppliedOSImage, AppliedFiles - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 20 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - configVersion: - description: configVersion describes the current and desired machine - config version for this node. - properties: - current: - description: |- - current is the name of the machine config currently in use on the node. - This value is updated once the machine config daemon has completed the update of the configuration for the node. - This value should match the desired version unless an upgrade is in progress. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - desired: - description: |- - desired is the MachineConfig the node wants to upgrade to. - This value gets set in the machine config node status once the machine config has been validated - against the current machine config. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start and - end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - desired - type: object - observedGeneration: - description: |- - observedGeneration represents the generation of the MachineConfigNode object observed by the Machine Config Operator's controller. - This field is updated when the controller observes a change to the desiredConfig in the configVersion of the machine config node spec. - format: int64 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: observedGeneration must not decrease - rule: self >= oldSelf - pinnedImageSets: - description: pinnedImageSets describes the current and desired pinned - image sets for this node. - items: - description: MachineConfigNodeStatusPinnedImageSet holds information - about the current, desired, and failed pinned image sets for the - observed machine config node. - properties: - currentGeneration: - description: currentGeneration is the generation of the pinned - image set that has most recently been successfully pulled - and pinned on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: currentGeneration must not decrease - rule: self >= oldSelf - desiredGeneration: - description: desiredGeneration is the generation of the pinned - image set that is targeted to be pulled and pinned on this - node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: desiredGeneration must not decrease - rule: self >= oldSelf - lastFailedGeneration: - description: lastFailedGeneration is the generation of the most - recent pinned image set that failed to be pulled and pinned - on this node. - format: int32 - minimum: 1 - type: integer - x-kubernetes-validations: - - message: lastFailedGeneration must not decrease - rule: self >= oldSelf - lastFailedGenerationError: - description: |- - lastFailedGenerationError is the error explaining why the desired images failed to be pulled and pinned. - The error is an empty string if the image pull and pin is successful. - maxLength: 32768 - type: string - name: - description: |- - name is the name of the pinned image set. - Must be a lowercase RFC-1123 subdomain name (https://tools.ietf.org/html/rfc1123) consisting - of only lowercase alphanumeric characters, hyphens (-), and periods (.), and must start and end - with an alphanumeric character, and be at most 253 characters in length. - maxLength: 253 - type: string - x-kubernetes-validations: - - message: a lowercase RFC 1123 subdomain must consist of lower - case alphanumeric characters, '-' or '.', and must start - and end with an alphanumeric character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - name - type: object - x-kubernetes-validations: - - message: desired generation must be greater than or equal to the - current generation - rule: 'has(self.desiredGeneration) && has(self.currentGeneration) - ? self.desiredGeneration >= self.currentGeneration : true' - - message: desired generation must be greater than or equal to the - last failed generation - rule: 'has(self.lastFailedGeneration) && has(self.desiredGeneration) - ? self.desiredGeneration >= self.lastFailedGeneration : true' - - message: last failed generation error must be defined on image - pull and pin failure - rule: 'has(self.lastFailedGeneration) ? has(self.lastFailedGenerationError) - : true' - maxItems: 100 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - required: - - spec - type: object - x-kubernetes-validations: - - message: spec.node.name should match metadata.name - rule: self.metadata.name == self.spec.node.name - served: true - storage: true - subresources: - status: {} diff --git a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml similarity index 99% rename from machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml rename to payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml index f81e2329757..42bfba9a7d4 100644 --- a/machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineconfignodes-SelfManagedHA-OKD.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_machineconfignodes-OKD.crd.yaml @@ -4,6 +4,7 @@ metadata: annotations: api-approved.openshift.io: https://github.com/openshift/api/pull/2255 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/feature-set: OKD labels: diff --git a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml deleted file mode 100644 index 73deb8c9d83..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-DevPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,190 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2555 - 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/feature-set: DevPreviewNoUpgrade - labels: - openshift.io/operator-managed: "" - name: osimagestreams.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: OSImageStream - listKind: OSImageStreamList - plural: osimagestreams - singular: osimagestream - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - OSImageStream describes a set of streams and associated images available - for the MachineConfigPools to be used as base OS images. - - The resource is a singleton named "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 contains the desired OSImageStream config configuration. - properties: - defaultStream: - description: |- - defaultStream is the desired name of the stream that should be used as the - default when no specific stream is requested by a MachineConfigPool. - - This field is set by the installer during installation. Users may need to - update it if the currently selected stream is no longer available, for - example when the stream has reached its End of Life. - The MachineConfigOperator uses this value to determine which stream from - status.availableStreams to apply as the default for MachineConfigPools - that do not specify a stream override. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - type: object - status: - description: |- - status describes the last observed state of this OSImageStream. - Populated by the MachineConfigOperator after reading release metadata. - When not present, the controller has not yet reconciled this resource. - properties: - availableStreams: - description: |- - availableStreams is a list of the available OS Image Streams that can be - used as the base image for MachineConfigPools. - availableStreams is required, must have at least one item, must not exceed - 100 items, and must have unique entries keyed on the name field. - items: - properties: - name: - description: |- - name is the required identifier of the stream. - - name is determined by the operator based on the OCI label of the - discovered OS or Extension Image. - - Must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - osExtensionsImage: - description: |- - osExtensionsImage is a required OS Extensions Image referenced by digest. - - osExtensionsImage bundles the extra repositories used to enable extensions, augmenting - the base operating system without modifying the underlying immutable osImage. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - osImage: - description: |- - osImage is a required OS Image referenced by digest. - - osImage contains the immutable, fundamental operating system components, including the kernel - and base utilities, that define the core environment for the node's host operating system. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - required: - - name - - osExtensionsImage - - osImage - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - defaultStream: - description: |- - defaultStream is the name of the stream that should be used as the default - when no specific stream is requested by a MachineConfigPool. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'), - and must reference the name of one of the streams in availableStreams. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - availableStreams - - defaultStream - type: object - x-kubernetes-validations: - - message: defaultStream must reference a stream name from availableStreams - rule: self.defaultStream in self.availableStreams.map(s, s.name) - required: - - spec - type: object - x-kubernetes-validations: - - message: osimagestream is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml deleted file mode 100644 index bbc92dd5f2e..00000000000 --- a/payload-manifests/crds/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml +++ /dev/null @@ -1,190 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.openshift.io: https://github.com/openshift/api/pull/2555 - 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/feature-set: TechPreviewNoUpgrade - labels: - openshift.io/operator-managed: "" - name: osimagestreams.machineconfiguration.openshift.io -spec: - group: machineconfiguration.openshift.io - names: - kind: OSImageStream - listKind: OSImageStreamList - plural: osimagestreams - singular: osimagestream - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: |- - OSImageStream describes a set of streams and associated images available - for the MachineConfigPools to be used as base OS images. - - The resource is a singleton named "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 contains the desired OSImageStream config configuration. - properties: - defaultStream: - description: |- - defaultStream is the desired name of the stream that should be used as the - default when no specific stream is requested by a MachineConfigPool. - - This field is set by the installer during installation. Users may need to - update it if the currently selected stream is no longer available, for - example when the stream has reached its End of Life. - The MachineConfigOperator uses this value to determine which stream from - status.availableStreams to apply as the default for MachineConfigPools - that do not specify a stream override. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - type: object - status: - description: |- - status describes the last observed state of this OSImageStream. - Populated by the MachineConfigOperator after reading release metadata. - When not present, the controller has not yet reconciled this resource. - properties: - availableStreams: - description: |- - availableStreams is a list of the available OS Image Streams that can be - used as the base image for MachineConfigPools. - availableStreams is required, must have at least one item, must not exceed - 100 items, and must have unique entries keyed on the name field. - items: - properties: - name: - description: |- - name is the required identifier of the stream. - - name is determined by the operator based on the OCI label of the - discovered OS or Extension Image. - - Must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'). - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - osExtensionsImage: - description: |- - osExtensionsImage is a required OS Extensions Image referenced by digest. - - osExtensionsImage bundles the extra repositories used to enable extensions, augmenting - the base operating system without modifying the underlying immutable osImage. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - osImage: - description: |- - osImage is a required OS Image referenced by digest. - - osImage contains the immutable, fundamental operating system components, including the kernel - and base utilities, that define the core environment for the node's host operating system. - - The format of the image pull spec is: host[:port][/namespace]/name@sha256:, - where the digest must be 64 characters long, and consist only of lowercase hexadecimal characters, a-f and 0-9. - The length of the whole spec must be between 1 to 447 characters. - maxLength: 447 - minLength: 1 - type: string - x-kubernetes-validations: - - message: the OCI Image reference must end with a valid '@sha256:' - suffix, where '' is 64 characters long - rule: (self.split('@').size() == 2 && self.split('@')[1].matches('^sha256:[a-f0-9]{64}$')) - - message: the OCI Image name should follow the host[:port][/namespace]/name - format, resembling a valid URL without the scheme - rule: (self.split('@')[0].matches('^([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+(:[0-9]{2,5})?/([a-zA-Z0-9-_]{0,61}/)?[a-zA-Z0-9-_.]*?$')) - required: - - name - - osExtensionsImage - - osImage - type: object - maxItems: 100 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - defaultStream: - description: |- - defaultStream is the name of the stream that should be used as the default - when no specific stream is requested by a MachineConfigPool. - - It must be a valid RFC 1123 subdomain between 1 and 253 characters in length, - consisting of lowercase alphanumeric characters, hyphens ('-'), and periods ('.'), - and must reference the name of one of the streams in availableStreams. - maxLength: 253 - minLength: 1 - type: string - x-kubernetes-validations: - - message: a RFC 1123 subdomain must consist of lower case alphanumeric - characters, '-' or '.', and must start and end with an alphanumeric - character. - rule: '!format.dns1123Subdomain().validate(self).hasValue()' - required: - - availableStreams - - defaultStream - type: object - x-kubernetes-validations: - - message: defaultStream must reference a stream name from availableStreams - rule: self.defaultStream in self.availableStreams.map(s, s.name) - required: - - spec - type: object - x-kubernetes-validations: - - message: osimagestream is a singleton, .metadata.name must be 'cluster' - rule: self.metadata.name == 'cluster' - served: true - storage: true - subresources: - status: {} diff --git a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_80_machine-config_01_osimagestreams.crd.yaml similarity index 99% rename from machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml rename to payload-manifests/crds/0000_80_machine-config_01_osimagestreams.crd.yaml index bbc92dd5f2e..50a36f06d4d 100644 --- a/machineconfiguration/v1alpha1/zz_generated.crd-manifests/0000_80_machine-config_01_osimagestreams-TechPreviewNoUpgrade.crd.yaml +++ b/payload-manifests/crds/0000_80_machine-config_01_osimagestreams.crd.yaml @@ -6,7 +6,7 @@ metadata: 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/feature-set: TechPreviewNoUpgrade + release.openshift.io/feature-set: CustomNoUpgrade,DevPreviewNoUpgrade,TechPreviewNoUpgrade labels: openshift.io/operator-managed: "" name: osimagestreams.machineconfiguration.openshift.io diff --git a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-Hypershift-Default.yaml rename to payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml index 17caf4f0c04..16be81b8dab 100644 --- a/payload-manifests/featuregates/featureGate-Hypershift-Default.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-Default.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator" + "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "Default", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml rename to payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml index 481393ee841..1c1eab911c6 100644 --- a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-DevPreviewNoUpgrade.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator" + "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "DevPreviewNoUpgrade", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml rename to payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml index ea3e6f2a366..5858e3ae87c 100644 --- a/payload-manifests/featuregates/featureGate-Hypershift-OKD.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-OKD.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator" + "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "OKD", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml rename to payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml index 24ac4e062e3..b85844bc149 100644 --- a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-Hypershift-TechPreviewNoUpgrade.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator" + "include.release.openshift.io/ibm-cloud-managed": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "TechPreviewNoUpgrade", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml rename to payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml index 2d988f4b40c..8dfb8b67188 100644 --- a/payload-manifests/featuregates/featureGate-SelfManagedHA-Default.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-Default.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator" + "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "Default", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml rename to payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml index 10525863cd1..3a0d70d983a 100644 --- a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-DevPreviewNoUpgrade.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator" + "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "DevPreviewNoUpgrade", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml rename to payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml index ba9f6f806f9..c2e2d383345 100644 --- a/payload-manifests/featuregates/featureGate-SelfManagedHA-OKD.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-OKD.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator" + "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "OKD", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml similarity index 98% rename from payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml rename to payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml index d1211a6b098..cc4a51b97c2 100644 --- a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml +++ b/payload-manifests/featuregates/featureGate-4-10-SelfManagedHA-TechPreviewNoUpgrade.yaml @@ -3,7 +3,9 @@ "kind": "FeatureGate", "metadata": { "annotations": { - "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator" + "include.release.openshift.io/self-managed-high-availability": "false-except-for-the-config-operator", + "release.openshift.io/feature-set": "TechPreviewNoUpgrade", + "release.openshift.io/major-version": "4,5,6,7,8,9,10" }, "name": "cluster" }, diff --git a/tests/crd_filter.go b/tests/crd_filter.go index ba49cd60099..243d42f2feb 100644 --- a/tests/crd_filter.go +++ b/tests/crd_filter.go @@ -2,9 +2,10 @@ package tests import ( "fmt" + "io/fs" "os" - "path" "path/filepath" + "strconv" "strings" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -51,8 +52,15 @@ func perTestRuntimeInfo(suitePath, crdName string, featureGates []string) (*PerT continue } - featureSet := currCRD.Annotations["release.openshift.io/feature-set"] - if featureSet == "CustomNoUpgrade" { + featureSetAnnotation := currCRD.Annotations["release.openshift.io/feature-set"] + featureSets := sets.New[string]() + if featureSetAnnotation != "" { + for _, featureSet := range strings.Split(featureSetAnnotation, ",") { + featureSets.Insert(featureSet) + } + } + + if featureSets.Has("CustomNoUpgrade") { // CustomNoUpgrade includes every field if anyRequireDisabledFeatureGate(featureGates) { continue @@ -66,11 +74,12 @@ func perTestRuntimeInfo(suitePath, crdName string, featureGates []string) (*PerT crdFilesToCheck = append(crdFilesToCheck, filename) continue } + versionsForCRD := versionsFrom(currCRD.Annotations) // if the manifest has more than one clusterProfile, then the crd schema must have been the same no matter which // featuregates were used. Simply select the first one to check. clusterProfileToCheck := clusterProfilesForCRD.List()[0] - featureGateStatus, err := featureGatesForClusterProfileFeatureSet("../payload-manifests/featuregates", clusterProfileToCheck, featureSet) + featureGateStatus, err := featureGatesForClusterProfileFeatureSetVersion("../payload-manifests/featuregates", clusterProfileToCheck, featureSets, versionsForCRD) if err != nil { return nil, fmt.Errorf("unable to find featureGates to check for %v: %w", filename, err) } @@ -138,6 +147,27 @@ func clusterProfilesFrom(annotations map[string]string) sets.String { return ret } +func versionsFrom(annotations map[string]string) sets.Set[uint64] { + var versionString string + for k, v := range annotations { + if strings.HasPrefix(k, "release.openshift.io/major-version") { + versionString = v + break + } + } + + versions := sets.New[uint64]() + for _, version := range strings.Split(versionString, ",") { + versionInt, err := strconv.ParseUint(strings.TrimSpace(version), 10, 64) + if err != nil { + continue + } + versions.Insert(versionInt) + } + + return versions +} + func clusterProfilesShortNamesFrom(annotations map[string]string) sets.String { ret := sets.NewString() for k, v := range annotations { @@ -148,25 +178,51 @@ func clusterProfilesShortNamesFrom(annotations map[string]string) sets.String { return ret } -func featureGatesForClusterProfileFeatureSet(payloadFeatureGatePath, clusterProfile, featureSetName string) (map[string]bool, error) { - if len(featureSetName) == 0 { +func featureGatesForClusterProfileFeatureSetVersion(payloadFeatureGatePath, clusterProfile string, featureSetNames sets.Set[string], crdVersions sets.Set[uint64]) (map[string]bool, error) { + if len(featureSetNames) == 0 { // if the featureSetName is ungated, then all CRD schemas for every featureset on this clusterProfile must be the same. // Choose Default so that we get a valid manifest to check. - featureSetName = "Default" + featureSetNames.Insert("Default") } - featureGateFilename := path.Join( - payloadFeatureGatePath, - fmt.Sprintf("featureGate-%s-%s.yaml", clusterProfileToShortName[clusterProfile], featureSetName), - ) - featureGateBytes, err := os.ReadFile(featureGateFilename) - if err != nil { + var uncastFeatureGate map[string]interface{} + + if err := filepath.WalkDir(payloadFeatureGatePath, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("unable to walk directory %q: %w", payloadFeatureGatePath, err) + } + + if d.IsDir() { + return nil + } + + rawFile, err := os.ReadFile(path) + if err != nil { + return err + } + featureGate := map[string]interface{}{} + if err := kyaml.Unmarshal(rawFile, &featureGate); err != nil { + return err + } + + annotations, _, err := unstructured.NestedStringMap(featureGate, "metadata", "annotations") + if err != nil { + return err + } + + if matchesClusterProfile(annotations, clusterProfile) && matchesFeatureSet(annotations, featureSetNames) && matchesVersions(annotations, crdVersions) { + uncastFeatureGate = featureGate + // We've found a matching feature gate yaml, so stop walking. + return filepath.SkipAll + } + + return nil + }); err != nil { return nil, err } - // use unstructured to pull this information to avoid vendoring openshift/api - uncastFeatureGate := map[string]interface{}{} - if err := kyaml.Unmarshal(featureGateBytes, &uncastFeatureGate); err != nil { - return nil, fmt.Errorf("unable to parse featuregate %q: %w", featureGateFilename, err) + + if uncastFeatureGate == nil { + return nil, fmt.Errorf("no feature gate found for cluster profile %q, feature set %q, and versions %v", clusterProfile, strings.Join(featureSetNames.UnsortedList(), ","), crdVersions) } uncastFeatureGateSlice, _, err := unstructured.NestedSlice(uncastFeatureGate, "status", "featureGates") @@ -200,3 +256,20 @@ func featureGatesForClusterProfileFeatureSet(payloadFeatureGatePath, clusterProf return featureGateMapping, nil } + +func matchesClusterProfile(annotations map[string]string, clusterProfile string) bool { + _, ok := annotations[clusterProfile] + return ok +} + +func matchesFeatureSet(annotations map[string]string, crdFeatureSets sets.Set[string]) bool { + featureSet := annotations["release.openshift.io/feature-set"] + + return crdFeatureSets.Has(featureSet) +} + +func matchesVersions(annotations map[string]string, crdVersions sets.Set[uint64]) bool { + // When the CRD specified no versions, the we assume there is no variance across versions. + // So we match all versions. + return len(crdVersions) == 0 || versionsFrom(annotations).Intersection(crdVersions).Len() > 0 +} diff --git a/tools/codegen/pkg/manifestmerge/filters.go b/tools/codegen/pkg/manifestmerge/filters.go index b50c6e8d26c..f6dc82a9089 100644 --- a/tools/codegen/pkg/manifestmerge/filters.go +++ b/tools/codegen/pkg/manifestmerge/filters.go @@ -5,6 +5,10 @@ import ( "os" "path" "path/filepath" + "reflect" + "slices" + "sort" + "strconv" "strings" "github.com/openshift/api/tools/codegen/pkg/utils" @@ -14,8 +18,8 @@ import ( kyaml "sigs.k8s.io/yaml" ) -func AllKnownFeatureSets(payloadFeatureGatePath string) (sets.String, error) { - allFeatureSets := sets.String{} +func AllKnownFeatureSets(payloadFeatureGatePath string) (sets.Set[string], error) { + allFeatureSets := sets.Set[string]{} allFeatureSets.Insert("CustomNoUpgrade") // this one won't have a rendered version since we don't know the gates featureSetManifestFiles, err := os.ReadDir(payloadFeatureGatePath) @@ -48,13 +52,273 @@ func AllKnownFeatureSets(payloadFeatureGatePath string) (sets.String, error) { return allFeatureSets, nil } +// VersionedFeatureSet represents a feature set with its version information +type VersionedFeatureSet struct { + FeatureSet string + ClusterProfile string + VersionRange VersionRange + FeatureGateFile string +} + +// VersionRange represents a list of major versions (may not be consecutive) +type VersionRange []uint64 + +// String returns a string representation of the version range +func (vr VersionRange) String() string { + if len(vr) == 0 { + return "" + } + if len(vr) == 1 { + return fmt.Sprintf("%d", vr[0]) + } + + // Check if versions are consecutive to display as range + allConsecutive := true + for i := 1; i < len(vr); i++ { + if vr[i] != vr[i-1]+1 { + allConsecutive = false + break + } + } + + if allConsecutive { + return fmt.Sprintf("%d-%d", vr[0], vr[len(vr)-1]) + } + + // Display as comma-separated list + versionStrs := make([]string, len(vr)) + for i, v := range vr { + versionStrs[i] = fmt.Sprintf("%d", v) + } + return strings.Join(versionStrs, ",") +} + +// Contains checks if a version is within this range +func (vr VersionRange) Contains(version uint64) bool { + for _, v := range vr { + if v == version { + return true + } + } + return false +} + +// StartVersion returns the lowest version in the range +func (vr VersionRange) StartVersion() uint64 { + if len(vr) == 0 { + return 0 + } + + return vr[0] +} + +// EndVersion returns the highest version in the range +func (vr VersionRange) EndVersion() uint64 { + if len(vr) == 0 { + return 0 + } + + return vr[len(vr)-1] +} + +// parseFeatureGateFile reads and parses a featureGate file to extract version information from annotations +// Returns VersionedFeatureSet with parsed information, or error if format doesn't match +func parseFeatureGateFile(filePath string) (*VersionedFeatureSet, error) { + filename := filepath.Base(filePath) + + // Read the file content + fileBytes, err := os.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("failed to read file %s: %w", filePath, err) + } + + // Parse YAML to extract annotations + featureGateMap := map[string]interface{}{} + if err := kyaml.Unmarshal(fileBytes, &featureGateMap); err != nil { + return nil, fmt.Errorf("unable to parse featuregate %s: %w", filename, err) + } + + uncastFeatureGate := unstructured.Unstructured{ + Object: featureGateMap, + } + + // Extract cluster profile from annotations + annotations := uncastFeatureGate.GetAnnotations() + if annotations == nil { + return nil, fmt.Errorf("no annotations found in %s", filename) + } + + // Extract version information from annotation + versionStr, found := annotations["release.openshift.io/major-version"] + if !found { + return nil, fmt.Errorf("no version annotation found in %s", filename) + } + + // Parse comma-separated version list + versionRange, err := parseVersionsFromAnnotation(versionStr) + if err != nil { + return nil, fmt.Errorf("invalid version annotation in %s: %w", filename, err) + } + + // Determine cluster profile from the annotations + var clusterProfile string + for annotationKey, annotationValue := range annotations { + if annotationValue == "false-except-for-the-config-operator" { + // Convert long cluster profile names to short names + switch annotationKey { + case "include.release.openshift.io/ibm-cloud-managed": + clusterProfile = "Hypershift" + case "include.release.openshift.io/self-managed-high-availability": + clusterProfile = "SelfManagedHA" + default: + clusterProfile = annotationKey // fallback to the key itself + } + break + } + } + + if clusterProfile == "" { + return nil, fmt.Errorf("no cluster profile annotation found in %s", filename) + } + + // Extract feature set from spec + featureSet, _, _ := unstructured.NestedString(uncastFeatureGate.Object, "spec", "featureSet") + if featureSet == "" { + featureSet = "Default" + } + + return &VersionedFeatureSet{ + FeatureSet: featureSet, + ClusterProfile: clusterProfile, + VersionRange: versionRange, + FeatureGateFile: filename, + }, nil +} + +// parseVersionsFromAnnotation parses a comma-separated list of versions like "4,5,6,7,8,9,10" +func parseVersionsFromAnnotation(versionStr string) (VersionRange, error) { + versionStr = strings.TrimSpace(versionStr) + if versionStr == "" { + return nil, fmt.Errorf("empty version string") + } + + // Split by comma and parse each version + versionParts := strings.Split(versionStr, ",") + var versions VersionRange + + for _, part := range versionParts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + + version, err := strconv.ParseUint(part, 10, 64) + if err != nil { + return nil, fmt.Errorf("invalid version '%s': %w", part, err) + } + versions = append(versions, version) + } + + if len(versions) == 0 { + return nil, fmt.Errorf("no valid versions found") + } + + // Sort versions + slices.Sort(versions) + + return versions, nil +} + +// AllVersionedFeatureSets returns all versioned feature sets found in the payload directory +func AllVersionedFeatureSets(payloadFeatureGatePath string) ([]VersionedFeatureSet, error) { + var versionedFeatureSets []VersionedFeatureSet + + featureSetManifestFiles, err := os.ReadDir(payloadFeatureGatePath) + if err != nil { + return nil, fmt.Errorf("cannot read FeatureSetManifestDir: %w", err) + } + + for _, currFeatureSetManifestFile := range featureSetManifestFiles { + if !strings.HasSuffix(currFeatureSetManifestFile.Name(), ".yaml") { + continue + } + + filePath := filepath.Join(payloadFeatureGatePath, currFeatureSetManifestFile.Name()) + versionedFeatureSet, err := parseFeatureGateFile(filePath) + if err != nil { + // Skip files that don't contain version annotations or can't be parsed + // This allows for backward compatibility with other files in the directory + continue + } + + versionedFeatureSets = append(versionedFeatureSets, *versionedFeatureSet) + } + + // Sort by version range start, then by cluster profile, then by feature set + sort.Slice(versionedFeatureSets, func(i, j int) bool { + a, b := versionedFeatureSets[i], versionedFeatureSets[j] + if a.VersionRange.StartVersion() != b.VersionRange.StartVersion() { + return a.VersionRange.StartVersion() < b.VersionRange.StartVersion() + } + if a.ClusterProfile != b.ClusterProfile { + return a.ClusterProfile < b.ClusterProfile + } + return a.FeatureSet < b.FeatureSet + }) + + return versionedFeatureSets, nil +} + +// GetVersionedFeatureSets returns versioned feature sets for a specific version +func GetVersionedFeatureSets(payloadFeatureGatePath string, targetVersion uint64) ([]VersionedFeatureSet, error) { + allVersioned, err := AllVersionedFeatureSets(payloadFeatureGatePath) + if err != nil { + return nil, err + } + + var applicable []VersionedFeatureSet + for _, vfs := range allVersioned { + if vfs.VersionRange.Contains(targetVersion) { + applicable = append(applicable, vfs) + } + } + + return applicable, nil +} + +// AllKnownVersions returns all versions found in versioned feature sets +func AllKnownVersions(payloadFeatureGatePath string) ([]uint64, error) { + allVersioned, err := AllVersionedFeatureSets(payloadFeatureGatePath) + if err != nil { + return nil, err + } + + versionSet := sets.New[uint64]() + for _, vfs := range allVersioned { + for _, version := range vfs.VersionRange { + versionSet.Insert(version) + } + } + + versions := make([]uint64, 0, versionSet.Len()) + for _, v := range versionSet.UnsortedList() { + versions = append(versions, v) + } + + sort.Slice(versions, func(i, j int) bool { + return versions[i] < versions[j] + }) + + return versions, nil +} + func FilterForFeatureSet(payloadFeatureGatePath, clusterProfile, featureSetName string) (ManifestFilter, error) { if featureSetName == "CustomNoUpgrade" { return &AndManifestFilter{ filters: []ManifestFilter{ &CustomNoUpgrade{}, &ClusterProfileFilter{ - clusterProfile: clusterProfile, + clusterProfile: sets.New[string](clusterProfile), }, }, }, nil @@ -67,17 +331,39 @@ func FilterForFeatureSet(payloadFeatureGatePath, clusterProfile, featureSetName if !allKnownFeatureSets.Has(featureSetName) { return nil, fmt.Errorf("unrecognized featureset name %q", featureSetName) } + // First, try to find versioned feature gate files for this combination + versionedFeatureSets, err := AllVersionedFeatureSets(payloadFeatureGatePath) + if err != nil { + return nil, fmt.Errorf("failed reading versioned featuresets from %q: %w", payloadFeatureGatePath, err) + } + clusterProfileShortName, err := utils.ClusterProfileToShortName(clusterProfile) if err != nil { return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", clusterProfile, err) } - featureGateFilename := path.Join(payloadFeatureGatePath, fmt.Sprintf("featureGate-%s-%s.yaml", clusterProfileShortName, featureSetName)) + + // Look for versioned files that match this cluster profile and feature set + var matchingVersionedFiles []string + for _, vfs := range versionedFeatureSets { + if vfs.ClusterProfile == clusterProfileShortName && vfs.FeatureSet == featureSetName { + matchingVersionedFiles = append(matchingVersionedFiles, vfs.FeatureGateFile) + } + } + + var featureGateFilename string + if len(matchingVersionedFiles) > 0 { + // Use the first matching versioned file (they should have identical content if properly consolidated) + featureGateFilename = path.Join(payloadFeatureGatePath, matchingVersionedFiles[0]) + } else { + // Fallback to legacy filename pattern for backward compatibility + featureGateFilename = path.Join(payloadFeatureGatePath, fmt.Sprintf("featureGate-%s-%s.yaml", clusterProfileShortName, featureSetName)) + } enabledFeatureGatesSet := sets.NewString() featureGateBytes, err := os.ReadFile(featureGateFilename) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to read feature gate file %s: %w", featureGateFilename, err) } // use unstructured to pull this information to avoid vendoring openshift/api @@ -108,7 +394,89 @@ func FilterForFeatureSet(payloadFeatureGatePath, clusterProfile, featureSetName allowedFeatureGates: enabledFeatureGatesSet, }, &ClusterProfileFilter{ - clusterProfile: clusterProfile, + clusterProfile: sets.New[string](clusterProfile), + }, + }, + }, nil +} + +// FilterForVersionedFeatureSet returns a filter for a specific version, cluster profile, and feature set +func FilterForVersionedFeatureSet(payloadFeatureGatePath, clusterProfile, featureSetName string, targetVersion uint64) (ManifestFilter, error) { + if featureSetName == "CustomNoUpgrade" { + return &AndManifestFilter{ + filters: []ManifestFilter{ + &CustomNoUpgrade{}, + &ClusterProfileFilter{ + clusterProfile: sets.New[string](clusterProfile), + }, + }, + }, nil + } + + // Get versioned feature sets for the target version + versionedFeatureSets, err := GetVersionedFeatureSets(payloadFeatureGatePath, targetVersion) + if err != nil { + return nil, fmt.Errorf("failed reading versioned featuresets for version %d from %q: %w", targetVersion, payloadFeatureGatePath, err) + } + + clusterProfileShortName, err := utils.ClusterProfileToShortName(clusterProfile) + if err != nil { + return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", clusterProfile, err) + } + + // Find the specific versioned feature set for this combination + var matchingFeatureGateFile string + for _, vfs := range versionedFeatureSets { + if vfs.ClusterProfile == clusterProfileShortName && vfs.FeatureSet == featureSetName { + matchingFeatureGateFile = vfs.FeatureGateFile + break + } + } + + if matchingFeatureGateFile == "" { + return nil, fmt.Errorf("no feature gate file found for version %d, cluster profile %s, feature set %s", targetVersion, clusterProfile, featureSetName) + } + + featureGateFilename := path.Join(payloadFeatureGatePath, matchingFeatureGateFile) + enabledFeatureGatesSet := sets.NewString() + + featureGateBytes, err := os.ReadFile(featureGateFilename) + if err != nil { + return nil, fmt.Errorf("unable to read feature gate file %s: %w", featureGateFilename, err) + } + + // use unstructured to pull this information to avoid vendoring openshift/api + uncastFeatureGate := map[string]interface{}{} + if err := kyaml.Unmarshal(featureGateBytes, &uncastFeatureGate); err != nil { + return nil, fmt.Errorf("unable to parse featuregate %q: %w", featureGateFilename, err) + } + + uncastFeatureGateSlice, _, err := unstructured.NestedSlice(uncastFeatureGate, "status", "featureGates") + if err != nil { + return nil, fmt.Errorf("no slice found %w", err) + } + enabledFeatureGates, _, err := unstructured.NestedSlice(uncastFeatureGateSlice[0].(map[string]interface{}), "enabled") + if err != nil { + return nil, fmt.Errorf("no enabled found %w", err) + } + for _, currGate := range enabledFeatureGates { + featureGateName, _, err := unstructured.NestedString(currGate.(map[string]interface{}), "name") + if err != nil { + return nil, fmt.Errorf("no gate name found %w", err) + } + enabledFeatureGatesSet.Insert(featureGateName) + } + + return &AndManifestFilter{ + filters: []ManifestFilter{ + &ForFeatureGates{ + allowedFeatureGates: enabledFeatureGatesSet, + }, + &ClusterProfileFilter{ + clusterProfile: sets.New[string](clusterProfile), + }, + &VersionFilter{ + targetVersion: sets.New[uint64](targetVersion), }, }, }, nil @@ -169,7 +537,7 @@ func featureGatesFromManifest(manifest metav1.Object) sets.String { } type ClusterProfileFilter struct { - clusterProfile string + clusterProfile sets.Set[string] } func (f *ClusterProfileFilter) UseManifest(data []byte) (bool, error) { @@ -182,18 +550,53 @@ func (f *ClusterProfileFilter) UseManifest(data []byte) (bool, error) { return true, nil } - forThisProfile := partialObject.GetAnnotations()[f.clusterProfile] == "true" - return forThisProfile, nil + for _, currClusterProfile := range f.clusterProfile.UnsortedList() { + if partialObject.GetAnnotations()[currClusterProfile] == "true" { + return true, nil + } + } + return false, nil } func (f *ClusterProfileFilter) UseCRD(metadata crdForFeatureSet) bool { - return metadata.clusterProfile == f.clusterProfile + return metadata.clusterProfile.Equal(f.clusterProfile) } func (f *ClusterProfileFilter) String() string { return fmt.Sprintf("clusterProfile=%v", f.clusterProfile) } +type VersionFilter struct { + targetVersion sets.Set[uint64] +} + +func (f *VersionFilter) UseManifest(data []byte) (bool, error) { + partialObject := &metav1.PartialObjectMetadata{} + if err := kyaml.Unmarshal(data, partialObject); err != nil { + return false, err + } + + versionStr, found := partialObject.GetAnnotations()["release.openshift.io/major-version"] + if !found { + // If the manifest doesn't restrict itself to a specific version, we must include it. + return true, nil + } + + versionRange, err := parseVersionsFromAnnotation(versionStr) + if err != nil { + return false, fmt.Errorf("invalid version annotation in %s: %w", partialObject.GetName(), err) + } + return f.targetVersion.Equal(sets.New[uint64](versionRange...)), nil +} + +func (f *VersionFilter) UseCRD(metadata crdForFeatureSet) bool { + return f.targetVersion.Equal(metadata.version) +} + +func (f *VersionFilter) String() string { + return fmt.Sprintf("version=%v", f.targetVersion.UnsortedList()) +} + type AndManifestFilter struct { filters []ManifestFilter } @@ -248,7 +651,7 @@ func (f *AndCRDFilter) String() string { } type FeatureSetFilter struct { - featureSetName string + featureSetName sets.Set[string] } func (f *FeatureSetFilter) UseManifest(data []byte) (bool, error) { @@ -257,12 +660,12 @@ func (f *FeatureSetFilter) UseManifest(data []byte) (bool, error) { return false, err } - forThisFeatureSet := partialObject.GetAnnotations()["release.openshift.io/feature-set"] == f.featureSetName - return forThisFeatureSet, nil + manifestFeatureSet := partialObject.GetAnnotations()["release.openshift.io/feature-set"] + return f.featureSetName.Has(manifestFeatureSet), nil } func (f *FeatureSetFilter) UseCRD(metadata crdForFeatureSet) bool { - return metadata.featureSet == f.featureSetName + return metadata.featureSet.Equal(f.featureSetName) } func (f *FeatureSetFilter) String() string { @@ -280,6 +683,18 @@ func (f *HasData) String() string { return "HasData" } +type EqualData struct { + data *unstructured.Unstructured +} + +func (f *EqualData) UseCRD(metadata crdForFeatureSet) bool { + return reflect.DeepEqual(metadata.crd, f.data) +} + +func (f *EqualData) String() string { + return fmt.Sprintf("EqualData=%v", f.data) +} + type Everything struct { } diff --git a/tools/codegen/pkg/manifestmerge/generator.go b/tools/codegen/pkg/manifestmerge/generator.go index dc3149ae45a..f200708c0ed 100644 --- a/tools/codegen/pkg/manifestmerge/generator.go +++ b/tools/codegen/pkg/manifestmerge/generator.go @@ -63,7 +63,7 @@ type generator struct { disabled bool verify bool payloadFeatureGatePath string - allKnownFeatureSets sets.String + allKnownFeatureSets sets.Set[string] } // NewGenerator builds a new schemapatch generator. @@ -95,8 +95,9 @@ func (g *generator) ApplyConfig(config *generation.Config) generation.Generator return NewGenerator( Options{ - Disabled: config.ManifestMerge.Disabled, - Verify: g.verify, + Disabled: config.ManifestMerge.Disabled, + Verify: g.verify, + PayloadFeatureGatePath: g.payloadFeatureGatePath, }, ) } @@ -181,103 +182,119 @@ func (g *generator) genGroupVersion(group string, version generation.APIVersionC // this assumption works for everything *except* for authentication. resultingCRDs := []crdForFeatureSet{} crdFilenamePattern := "" - for _, clusterProfile := range allClusterProfiles { - for _, featureSetName := range g.allKnownFeatureSets.List() { - partialManifestFilter, err := FilterForFeatureSet(g.payloadFeatureGatePath, clusterProfile, featureSetName) - if err != nil { - errs = append(errs, err) - continue - } - - var mergeErrors []error - resultingCRD, mergeErrors := mergeAllPertinentCRDsInDirs(allResourcePaths, partialManifestFilter) - if len(mergeErrors) > 0 { - errs = append(errs, mergeErrors...) - continue - } - // TODO the filename is carried on the CRD, need to work out how to clean up. probably easier once we have a dedicated directory - if resultingCRD == nil { // this means we didn't find any file that matched the filter this is ok, we have nothing to do. - unstructuredResultingCRD := &unstructured.Unstructured{} - unstructuredResultingCRD.GetObjectKind().SetGroupVersionKind(apiextensionsv1.SchemeGroupVersion.WithKind("CustomResourceDefinition")) - unstructuredResultingCRD.SetAnnotations(map[string]string{ - "CRDNotPresent": fmt.Sprintf("%d", rand.Int31()), // ensures they won't be equal - }) + // Get all known versions from the versioned feature sets + targetVersions, err := AllKnownVersions(g.payloadFeatureGatePath) + if err != nil { + errs = append(errs, fmt.Errorf("failed to get known versions: %w", err)) + continue + } - resultingCRDs = append(resultingCRDs, crdForFeatureSet{ - crd: unstructuredResultingCRD, - featureSet: featureSetName, - clusterProfile: clusterProfile, - outputFile: "", - noData: true, - }) - continue - } + for _, version := range targetVersions { + for _, clusterProfile := range allClusterProfiles { + for _, featureSetName := range g.allKnownFeatureSets.UnsortedList() { + partialManifestFilter, err := FilterForVersionedFeatureSet(g.payloadFeatureGatePath, clusterProfile, featureSetName, version) + if err != nil { + // Skip if no feature gate file found for this version/profile/featureset combination + continue + } - pluralCRDName, _, _ := unstructured.NestedString(resultingCRD.Object, "spec", "names", "plural") - fileCVORunLevel := resultingCRD.GetAnnotations()["api.openshift.io/filename-cvo-runlevel"] - fileOperatorName := resultingCRD.GetAnnotations()["api.openshift.io/filename-operator"] - fileOperatorOrdering := resultingCRD.GetAnnotations()["api.openshift.io/filename-ordering"] - outputFilePattern := "" - switch { - case len(fileCVORunLevel) > 0 && len(fileOperatorName) > 0 && len(fileOperatorOrdering) > 0: - outputFilePattern = fmt.Sprintf("%s_%s_%s_%sMARKERS.crd.yaml", fileCVORunLevel, fileOperatorName, fileOperatorOrdering, pluralCRDName) - case len(fileOperatorName) > 0 && len(fileOperatorOrdering) > 0: - outputFilePattern = fmt.Sprintf("%s_%s_%sMARKERS.crd.yaml", fileOperatorName, fileOperatorOrdering, pluralCRDName) - case len(fileOperatorName) > 0: - outputFilePattern = fmt.Sprintf("%s_%sMARKERS.crd.yaml", fileOperatorName, pluralCRDName) - case len(fileOperatorOrdering) > 0: - outputFilePattern = fmt.Sprintf("%s_%sMARKERS.crd.yaml", fileOperatorOrdering, pluralCRDName) - default: - outputFilePattern = fmt.Sprintf("%sMARKERS.crd.yaml", pluralCRDName) - } - fileMarker := fmt.Sprintf("-%s-%s", clusterProfile, featureSetName) - outputFileBaseName := strings.ReplaceAll(outputFilePattern, "MARKERS", fileMarker) + var mergeErrors []error + resultingCRD, mergeErrors := mergeAllPertinentCRDsInDirs(allResourcePaths, partialManifestFilter) + if len(mergeErrors) > 0 { + errs = append(errs, mergeErrors...) + continue + } - if len(crdFilenamePattern) == 0 { - crdFilenamePattern = outputFilePattern - } - if len(outputFileBaseName) == 0 { - errs = append(errs, fmt.Errorf("crd %q needs '// +openshift:file-pattern=' %v", crdName, resultingCRD.GetAnnotations())) - continue - } + // TODO the filename is carried on the CRD, need to work out how to clean up. probably easier once we have a dedicated directory + if resultingCRD == nil { // this means we didn't find any file that matched the filter this is ok, we have nothing to do. + unstructuredResultingCRD := &unstructured.Unstructured{} + unstructuredResultingCRD.GetObjectKind().SetGroupVersionKind(apiextensionsv1.SchemeGroupVersion.WithKind("CustomResourceDefinition")) + unstructuredResultingCRD.SetAnnotations(map[string]string{ + "CRDNotPresent": fmt.Sprintf("%d", rand.Int31()), // ensures they won't be equal + }) + + resultingCRDs = append(resultingCRDs, crdForFeatureSet{ + crd: unstructuredResultingCRD, + featureSet: sets.New[string](featureSetName), + clusterProfile: sets.New[string](clusterProfile), + outputFile: "", + noData: true, + version: sets.New[uint64](version), + }) + continue + } - resultingCRD.SetManagedFields(nil) + pluralCRDName, _, _ := unstructured.NestedString(resultingCRD.Object, "spec", "names", "plural") + fileCVORunLevel := resultingCRD.GetAnnotations()["api.openshift.io/filename-cvo-runlevel"] + fileOperatorName := resultingCRD.GetAnnotations()["api.openshift.io/filename-operator"] + fileOperatorOrdering := resultingCRD.GetAnnotations()["api.openshift.io/filename-ordering"] + outputFilePattern := "" + switch { + case len(fileCVORunLevel) > 0 && len(fileOperatorName) > 0 && len(fileOperatorOrdering) > 0: + outputFilePattern = fmt.Sprintf("%s_%s_%s_%sMARKERS.crd.yaml", fileCVORunLevel, fileOperatorName, fileOperatorOrdering, pluralCRDName) + case len(fileOperatorName) > 0 && len(fileOperatorOrdering) > 0: + outputFilePattern = fmt.Sprintf("%s_%s_%sMARKERS.crd.yaml", fileOperatorName, fileOperatorOrdering, pluralCRDName) + case len(fileOperatorName) > 0: + outputFilePattern = fmt.Sprintf("%s_%sMARKERS.crd.yaml", fileOperatorName, pluralCRDName) + case len(fileOperatorOrdering) > 0: + outputFilePattern = fmt.Sprintf("%s_%sMARKERS.crd.yaml", fileOperatorOrdering, pluralCRDName) + default: + outputFilePattern = fmt.Sprintf("%sMARKERS.crd.yaml", pluralCRDName) + } + fileMarker := fmt.Sprintf("-v%d-%s-%s", version, clusterProfile, featureSetName) + outputFileBaseName := strings.ReplaceAll(outputFilePattern, "MARKERS", fileMarker) - annotations := resultingCRD.GetAnnotations() - for key := range annotations { - if strings.HasPrefix(key, "api.openshift.io/filename") { - delete(annotations, key) + if len(crdFilenamePattern) == 0 { + crdFilenamePattern = outputFilePattern } - if strings.HasPrefix(key, "feature-gate.release.openshift.io/") { - delete(annotations, key) + if len(outputFileBaseName) == 0 { + errs = append(errs, fmt.Errorf("crd %q needs '// +openshift:file-pattern=' %v", crdName, resultingCRD.GetAnnotations())) + continue } - if strings.HasPrefix(key, "include.release.openshift.io/") { - delete(annotations, key) + + resultingCRD.SetManagedFields(nil) + + annotations := resultingCRD.GetAnnotations() + if annotations == nil { + annotations = make(map[string]string) } - if strings.HasPrefix(key, "partial-filename.release.openshift.io/") { - delete(annotations, key) + + for key := range annotations { + if strings.HasPrefix(key, "api.openshift.io/filename") { + delete(annotations, key) + } + if strings.HasPrefix(key, "feature-gate.release.openshift.io/") { + delete(annotations, key) + } + if strings.HasPrefix(key, "include.release.openshift.io/") { + delete(annotations, key) + } + if strings.HasPrefix(key, "partial-filename.release.openshift.io/") { + delete(annotations, key) + } } - } - for key := range annotations { - if strings.HasSuffix(key, "-") { - toRemove := key[:len(key)-1] - delete(annotations, toRemove) - delete(annotations, key) + for key := range annotations { + if strings.HasSuffix(key, "-") { + toRemove := key[:len(key)-1] + delete(annotations, toRemove) + delete(annotations, key) + } } - } - resultingCRD.SetAnnotations(annotations) + resultingCRD.SetAnnotations(annotations) - resultingCRDs = append(resultingCRDs, crdForFeatureSet{ - crd: resultingCRD, - featureSet: featureSetName, - clusterProfile: clusterProfile, - }) + resultingCRDs = append(resultingCRDs, crdForFeatureSet{ + crd: resultingCRD, + featureSet: sets.New[string](featureSetName), + clusterProfile: sets.New[string](clusterProfile), + version: sets.New[uint64](version), + }) + } } } // check to see if all the resultingCRDs are the same - crdsToRender, err := getCRDsToRender(resultingCRDs, crdFilenamePattern, generatedOutputPath, g.allKnownFeatureSets) + crdsToRender, err := getCRDsToRender(resultingCRDs, crdFilenamePattern, generatedOutputPath, g.allKnownFeatureSets, targetVersions) if err != nil { errs = append(errs, fmt.Errorf("crd %q failed to compute CRDs to render: %w", crdName, err)) continue @@ -379,187 +396,306 @@ func (g *generator) genGroupVersion(group string, version generation.APIVersionC return kerrors.NewAggregate(errs) } -func getCRDsToRender(resultingCRDs []crdForFeatureSet, crdFilenamePattern, outputPath string, allKnownFeatureSets sets.String) ([]crdForFeatureSet, error) { +func getCRDsToRender(resultingCRDs []crdForFeatureSet, crdFilenamePattern, outputPath string, allPossibleFeatureSets sets.Set[string], targetVersions []uint64) ([]crdForFeatureSet, error) { allCRDsWithData := filterCRDs(resultingCRDs, &HasData{}) - sameSchemaInAllCRDs := areCRDsTheSame(allCRDsWithData) - hasAllFeatureSets := featureSetsFromCRDs(allCRDsWithData).Equal(allKnownFeatureSets) + allKnownClusterProfies := clusterProfilesFromCRDs(allCRDsWithData) + allKnownFeatureSets := featureSetsFromCRDs(allCRDsWithData) + allKnownFeatureSetsByClusterProfile := featureSetsFromCRDsByClusterProfile(allCRDsWithData, allKnownClusterProfies) + + // Merge CRDs by version. + // If the data, featureset and clusterprofile are the same, merge the versions to eliminate that dimension + // as much as possible. + aggregatedByVersion := []crdForFeatureSet{} + for _, crd := range allCRDsWithData { + filtered := filterCRDs(allCRDsWithData, &AndCRDFilter{ + filters: []CRDFilter{ + &HasData{}, + &FeatureSetFilter{ + featureSetName: crd.featureSet, + }, + &ClusterProfileFilter{ + clusterProfile: crd.clusterProfile, + }, + &EqualData{ + data: crd.crd, + }, + }, + }) - if len(allCRDsWithData) == 0 { - // No CRDs with data found, so we don't need to generate anything. - return nil, nil - } + // Everything in filtered now has the same data, featureset and clusterprofile. + // This means we can aggregate the versions. + toWrite := crd.deepCopy() + for _, curr := range filtered { + toWrite.version.Insert(curr.version.UnsortedList()...) + } - // The feature gate annotation can only ever exist with one value in the generated partial manifests. - // It's added as an annotation at the top level of the CRD and is generally only used when the CRD - // is brand new and being introduced behind a specific gate. - isFeatureGated := allCRDsWithData[0].crd.GetAnnotations()["release.openshift.io/feature-gate"] != "" - if isFeatureGated { - // If the feature is on by default, all feature sets are the same, so we will generate based on whether cluster profiles differ. - // If the feature is not on by default, we would normally only generate based on the feature sets that the feature is enabled in. - // Instead, force generation as if all the feature sets are the same to generate a manifest that deploys solely based on the - // feature gate status. CVO will then correctly apply the CRD without the need for feature setting. - hasAllFeatureSets = true + if !hasMatchingCRD(aggregatedByVersion, *toWrite) { + aggregatedByVersion = append(aggregatedByVersion, *toWrite) + } } - if sameSchemaInAllCRDs && hasAllFeatureSets { - crdFilename := strings.ReplaceAll(crdFilenamePattern, "MARKERS", "") - crdFullPath := filepath.Join(outputPath, crdFilename) - crdToWrite := allCRDsWithData[0].crd.DeepCopy() + // Next aggregate by featureset. + // If the data, version and clusterprofile are the same, merge the featuresets to eliminate that dimension + // as much as possible. + aggregatedByFeatureSet := []crdForFeatureSet{} + for _, crd := range aggregatedByVersion { + filtered := filterCRDs(aggregatedByVersion, &AndCRDFilter{ + filters: []CRDFilter{ + &HasData{}, + &ClusterProfileFilter{ + clusterProfile: crd.clusterProfile, + }, + &VersionFilter{ + targetVersion: crd.version, + }, + &EqualData{ + data: crd.crd, + }, + }, + }) - clusterProfilesToAdd := clusterProfilesFromCRDs(allCRDsWithData) - if len(clusterProfilesToAdd) == 0 { - clusterProfilesToAdd = sets.NewString(allClusterProfiles...) + // Everything in filtered now has the same data, version and clusterprofile. + // This means we can aggregate the featuresets. + toWrite := crd.deepCopy() + for _, curr := range filtered { + toWrite.featureSet.Insert(curr.featureSet.UnsortedList()...) } - annotations := crdToWrite.GetAnnotations() - for _, clusterProfile := range clusterProfilesToAdd.List() { - annotations[clusterProfile] = "true" + if !hasMatchingCRD(aggregatedByFeatureSet, *toWrite) { + aggregatedByFeatureSet = append(aggregatedByFeatureSet, *toWrite) } - crdToWrite.SetAnnotations(annotations) - - return []crdForFeatureSet{ - { - crd: crdToWrite, - outputFile: crdFullPath, - }, - }, nil } - // so they aren't all the same. Check first to see if they're the same for FeatureSet across all ClusterProfiles - // then check if they're the same for all featuresets on clusterProfile. - // if they only vary by featureset, then featureset files only - // if they only vary by clusterprofile, then clusterprofile files only - // if they vary by both, slice by clusterprofile first, then by featureset - eachFeatureSetTheSameForAllClusterProfiles := true - for _, featureSet := range allKnownFeatureSets.List() { - filter := &AndCRDFilter{ + // Next aggregate by clusterprofile. + // If the data, featureset and version are the same, merge the clusterprofiles to eliminate that dimension + // as much as possible. + aggregatedByClusterProfile := []crdForFeatureSet{} + for _, crd := range aggregatedByFeatureSet { + filtered := filterCRDs(aggregatedByFeatureSet, &AndCRDFilter{ filters: []CRDFilter{ &HasData{}, - &FeatureSetFilter{featureSetName: featureSet}, + &FeatureSetFilter{ + featureSetName: crd.featureSet, + }, + &VersionFilter{ + targetVersion: crd.version, + }, + &EqualData{ + data: crd.crd, + }, }, + }) + + // Everything in filtered now has the same data, featureset and version. + // This means we can aggregate the clusterprofiles. + toWrite := crd.deepCopy() + for _, curr := range filtered { + toWrite.clusterProfile.Insert(curr.clusterProfile.UnsortedList()...) } - filteredCRDs := filterCRDs(resultingCRDs, filter) - sameSchema := areCRDsTheSame(filteredCRDs) - if len(filteredCRDs) > 0 && !sameSchema { - eachFeatureSetTheSameForAllClusterProfiles = false + if !hasMatchingCRD(aggregatedByClusterProfile, *toWrite) { + aggregatedByClusterProfile = append(aggregatedByClusterProfile, *toWrite) } } - if eachFeatureSetTheSameForAllClusterProfiles { - crdsToWrite := []crdForFeatureSet{} - for _, featureSet := range allKnownFeatureSets.List() { - filter := &AndCRDFilter{ - filters: []CRDFilter{ - &HasData{}, - &FeatureSetFilter{featureSetName: featureSet}, - }, - } - filteredCRDs := filterCRDs(resultingCRDs, filter) - if len(filteredCRDs) == 0 { - continue + + crdsToWrite := []crdForFeatureSet{} + + for _, crd := range aggregatedByClusterProfile { + nameComponents := []string{} + + allVersionsSame := crd.version.Equal(sets.New[uint64](targetVersions...)) + if len(crd.version) > 0 && !allVersionsSame { + versions := crd.version.UnsortedList() + slices.Sort(versions) + nameComponents = append(nameComponents, VersionRange(versions).String()) + } else { + crd.version = sets.New[uint64]() + } + + allFeatureSetsSame := crd.featureSet.Equal(allKnownFeatureSets) + allClusterProfilesSame := crd.clusterProfile.Equal(allKnownClusterProfies) + + if !allClusterProfilesSame { + // In some cases, the feature sets are different across cluster profiles. + // We might be able to optimise output for a particular cluster profile if the feature sets are the same + // within the cluster profile. + allFeatureSetsSame = true + for _, clusterProfile := range crd.clusterProfile.UnsortedList() { + allFeatureSetsSame = allFeatureSetsSame && crd.featureSet.Equal(allKnownFeatureSetsByClusterProfile[clusterProfile]) } - crdFilename := strings.ReplaceAll(crdFilenamePattern, "MARKERS", fmt.Sprintf("-%s", featureSet)) - crdFullPath := filepath.Join(outputPath, crdFilename) - crdToWrite := filteredCRDs[0].crd.DeepCopy() + } - clusterProfilesToAdd := clusterProfilesFromCRDs(filteredCRDs) - annotations := crdToWrite.GetAnnotations() - annotations["release.openshift.io/feature-set"] = featureSet - for _, clusterProfile := range clusterProfilesToAdd.List() { - annotations[clusterProfile] = "true" + ann := crd.crd.GetAnnotations() + _, hasFeatureGateAnnotation := ann["release.openshift.io/feature-gate"] + if hasFeatureGateAnnotation && allFeatureSetsSame { + // If all feature sets represent the same data, and there is a feature gate annotation, + // use this as the preferred way for the CVO to selectively apply the manifest. + // Clear the feature set here so that manifests are not annotated with the feature set + // as the two annotations are mutually exclusive.. + crd.featureSet = sets.New[string]() + } else { + // If the feature sets are different, then we must output multiple manifests based on the feature set differences. + // The feature gate annotation (if present) would conflict with this so we must remove it. + if ann != nil { + delete(ann, "release.openshift.io/feature-gate") } - crdToWrite.SetAnnotations(annotations) + } + crd.crd.SetAnnotations(ann) + + if crd.featureSet.Equal(allPossibleFeatureSets) { + // If the CRD covers all possible feature sets, then clear the feature set so we don't apply an annotation that is redundant. + crd.featureSet = sets.New[string]() + } + + switch { + case allFeatureSetsSame && allClusterProfilesSame: + crdFilename := getCRDFilename(crdFilenamePattern, nameComponents) + crdFullPath := filepath.Join(outputPath, crdFilename) crdsToWrite = append(crdsToWrite, crdForFeatureSet{ - crd: crdToWrite, - featureSet: featureSet, - outputFile: crdFullPath, + crd: crd.crd.DeepCopy(), + featureSet: crd.featureSet, + clusterProfile: crd.clusterProfile, // Write the clusterprofiles as these must be written to the annotations. + version: crd.version, + outputFile: crdFullPath, }) + case allFeatureSetsSame: + for _, clusterProfile := range crd.clusterProfile.UnsortedList() { + clusterProfileShortName, err := utils.ClusterProfileToShortName(clusterProfile) + if err != nil { + return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", clusterProfile, err) + } + nameComponents = append(nameComponents, clusterProfileShortName) + crdFilename := getCRDFilename(crdFilenamePattern, nameComponents) + crdFullPath := filepath.Join(outputPath, crdFilename) + + crdsToWrite = append(crdsToWrite, crdForFeatureSet{ + crd: crd.crd.DeepCopy(), + featureSet: crd.featureSet, + clusterProfile: sets.New[string](clusterProfile), + version: crd.version, + outputFile: crdFullPath, + }) + } + case allClusterProfilesSame: + for _, featureSet := range crd.featureSet.UnsortedList() { + nameComponents := append(nameComponents, featureSet) + crdFilename := getCRDFilename(crdFilenamePattern, nameComponents) + crdFullPath := filepath.Join(outputPath, crdFilename) + crdsToWrite = append(crdsToWrite, crdForFeatureSet{ + crd: crd.crd.DeepCopy(), + featureSet: sets.New[string](featureSet), + clusterProfile: crd.clusterProfile, // Write the clusterprofiles as these must be written to the annotations. + version: crd.version, + outputFile: crdFullPath, + }) + } + default: + for _, clusterProfile := range crd.clusterProfile.UnsortedList() { + clusterProfileShortName, err := utils.ClusterProfileToShortName(clusterProfile) + if err != nil { + return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", clusterProfile, err) + } + + for _, featureSet := range crd.featureSet.UnsortedList() { + nameComponents := append(nameComponents, clusterProfileShortName, featureSet) + crdFilename := getCRDFilename(crdFilenamePattern, nameComponents) + crdFullPath := filepath.Join(outputPath, crdFilename) + + crdsToWrite = append(crdsToWrite, crdForFeatureSet{ + crd: crd.crd.DeepCopy(), + featureSet: sets.New[string](featureSet), + clusterProfile: sets.New[string](clusterProfile), + version: crd.version, + outputFile: crdFullPath, + }) + } + } } - return crdsToWrite, nil } - eachClusterProfiletheSameForAllFeatureSets := true - notHandled := []crdForFeatureSet{} - crdsToWrite := []crdForFeatureSet{} - for _, clusterProfile := range allClusterProfiles { - filter := &AndCRDFilter{ - filters: []CRDFilter{ - &HasData{}, - &ClusterProfileFilter{clusterProfile: clusterProfile}, - }, + for i := range crdsToWrite { + annotations := crdsToWrite[i].crd.GetAnnotations() + if annotations == nil { + annotations = make(map[string]string) } - filteredCRDs := filterCRDs(resultingCRDs, filter) - sameSchema := areCRDsTheSame(filteredCRDs) - if !sameSchema { - eachClusterProfiletheSameForAllFeatureSets = false - notHandled = append(notHandled, filteredCRDs...) - continue + for _, clusterProfile := range crdsToWrite[i].clusterProfile.UnsortedList() { + annotations[clusterProfile] = "true" } - clusterProfileShortName, err := utils.ClusterProfileToShortName(clusterProfile) - if err != nil { - return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", clusterProfile, err) + if len(crdsToWrite[i].version) > 0 { + versions := crdsToWrite[i].version.UnsortedList() + slices.Sort(versions) + + versionStrings := []string{} + for _, version := range versions { + versionStrings = append(versionStrings, fmt.Sprintf("%d", version)) + } + + annotations["release.openshift.io/major-version"] = strings.Join(versionStrings, ",") } - crdFilename := strings.ReplaceAll(crdFilenamePattern, "MARKERS", fmt.Sprintf("-%s", clusterProfileShortName)) - crdFullPath := filepath.Join(outputPath, crdFilename) - crdToWrite := filteredCRDs[0].crd.DeepCopy() - annotations := crdToWrite.GetAnnotations() - annotations[clusterProfile] = "true" - crdToWrite.SetAnnotations(annotations) + if len(crdsToWrite[i].featureSet) > 0 { + featureSetStrings := []string{} + for _, featureSet := range crdsToWrite[i].featureSet.UnsortedList() { + featureSetStrings = append(featureSetStrings, featureSet) + } + slices.Sort(featureSetStrings) - crdsToWrite = append(crdsToWrite, crdForFeatureSet{ - crd: crdToWrite, - clusterProfile: clusterProfile, - outputFile: crdFullPath, - }) - } + annotations["release.openshift.io/feature-set"] = strings.Join(featureSetStrings, ",") + } - if eachClusterProfiletheSameForAllFeatureSets { - return crdsToWrite, nil + crdsToWrite[i].crd.SetAnnotations(annotations) } - // at this point, write each clusterProfile that IS unique, then write the remainder + return crdsToWrite, nil +} - for i, curr := range notHandled { - if curr.noData { - continue +func getCRDFilename(crdFilenamePattern string, nameComponents []string) string { + if len(nameComponents) == 0 { + return strings.ReplaceAll(crdFilenamePattern, "MARKERS", "") + } + return strings.ReplaceAll(crdFilenamePattern, "MARKERS", fmt.Sprintf("-%s", strings.Join(nameComponents, "-"))) +} + +func hasMatchingCRD(crds []crdForFeatureSet, crd crdForFeatureSet) bool { + for _, curr := range crds { + if equality.Semantic.DeepEqual(*curr.crd, *crd.crd) && + curr.featureSet.Equal(crd.featureSet) && + curr.clusterProfile.Equal(crd.clusterProfile) && + curr.version.Equal(crd.version) { + return true } - clusterProfileShortName, err := utils.ClusterProfileToShortName(curr.clusterProfile) - if err != nil { - return nil, fmt.Errorf("unrecognized clusterprofile name %q: %w", curr.clusterProfile, err) - } - crdFilename := strings.ReplaceAll(crdFilenamePattern, "MARKERS", fmt.Sprintf("-%s-%s", clusterProfileShortName, curr.featureSet)) - crdFullPath := filepath.Join(outputPath, crdFilename) - - crdToWrite := notHandled[i].crd.DeepCopy() - annotations := crdToWrite.GetAnnotations() - annotations["release.openshift.io/feature-set"] = curr.featureSet - annotations[curr.clusterProfile] = "true" - crdToWrite.SetAnnotations(annotations) - crdsToWrite = append(crdsToWrite, crdForFeatureSet{ - crd: crdToWrite, - featureSet: curr.featureSet, - clusterProfile: curr.clusterProfile, - outputFile: crdFullPath, - }) } - return crdsToWrite, nil + + return false } -func clusterProfilesFromCRDs(resultingCRDs []crdForFeatureSet) sets.String { - ret := sets.String{} +func clusterProfilesFromCRDs(resultingCRDs []crdForFeatureSet) sets.Set[string] { + ret := sets.Set[string]{} for _, currCRD := range resultingCRDs { - ret.Insert(currCRD.clusterProfile) + for _, clusterProfile := range currCRD.clusterProfile.UnsortedList() { + ret.Insert(clusterProfile) + } } return ret } -func featureSetsFromCRDs(resultingCRDs []crdForFeatureSet) sets.String { - ret := sets.String{} +func featureSetsFromCRDs(resultingCRDs []crdForFeatureSet) sets.Set[string] { + ret := sets.Set[string]{} for _, currCRD := range resultingCRDs { - ret.Insert(currCRD.featureSet) + for _, featureSet := range currCRD.featureSet.UnsortedList() { + ret.Insert(featureSet) + } + } + return ret +} + +func featureSetsFromCRDsByClusterProfile(resultingCRDs []crdForFeatureSet, allKnownClusterProfiles sets.Set[string]) map[string]sets.Set[string] { + ret := map[string]sets.Set[string]{} + + for _, clusterProfile := range allKnownClusterProfiles.UnsortedList() { + ret[clusterProfile] = featureSetsFromCRDs(filterCRDs(resultingCRDs, &ClusterProfileFilter{clusterProfile: sets.New[string](clusterProfile)})) } return ret @@ -576,33 +712,24 @@ func filterCRDs(resultingCRDs []crdForFeatureSet, filter CRDFilter) []crdForFeat return ret } -func areCRDsTheSame(resultingCRDs []crdForFeatureSet) bool { - if len(resultingCRDs) == 0 { - return false - } - - var prevCRDMinusIdentifier *unstructured.Unstructured - for _, currCRD := range resultingCRDs { - currCRDMinusIdentifier := currCRD.crd.DeepCopy() - - if prevCRDMinusIdentifier == nil { - prevCRDMinusIdentifier = currCRDMinusIdentifier - continue - } - if !equality.Semantic.DeepEqual(*prevCRDMinusIdentifier, *currCRDMinusIdentifier) { - return false - } - } - - return true -} - type crdForFeatureSet struct { crd *unstructured.Unstructured - featureSet string - clusterProfile string + featureSet sets.Set[string] + clusterProfile sets.Set[string] outputFile string noData bool + version sets.Set[uint64] // Major version for versioned generation +} + +func (c *crdForFeatureSet) deepCopy() *crdForFeatureSet { + return &crdForFeatureSet{ + crd: c.crd.DeepCopy(), + featureSet: c.featureSet.Clone(), + clusterProfile: c.clusterProfile.Clone(), + outputFile: c.outputFile, + noData: c.noData, + version: c.version.Clone(), + } } // pertinent is determined by the `filter`. If it passes the filter, it's pertinent. diff --git a/vendor/github.com/blang/semver/v4/LICENSE b/vendor/github.com/blang/semver/v4/LICENSE new file mode 100644 index 00000000000..5ba5c86fcb0 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Benedikt Lang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/github.com/blang/semver/v4/json.go b/vendor/github.com/blang/semver/v4/json.go new file mode 100644 index 00000000000..a74bf7c4494 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/json.go @@ -0,0 +1,23 @@ +package semver + +import ( + "encoding/json" +) + +// MarshalJSON implements the encoding/json.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements the encoding/json.Unmarshaler interface. +func (v *Version) UnmarshalJSON(data []byte) (err error) { + var versionString string + + if err = json.Unmarshal(data, &versionString); err != nil { + return + } + + *v, err = Parse(versionString) + + return +} diff --git a/vendor/github.com/blang/semver/v4/range.go b/vendor/github.com/blang/semver/v4/range.go new file mode 100644 index 00000000000..95f7139b977 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/range.go @@ -0,0 +1,416 @@ +package semver + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +type wildcardType int + +const ( + noneWildcard wildcardType = iota + majorWildcard wildcardType = 1 + minorWildcard wildcardType = 2 + patchWildcard wildcardType = 3 +) + +func wildcardTypefromInt(i int) wildcardType { + switch i { + case 1: + return majorWildcard + case 2: + return minorWildcard + case 3: + return patchWildcard + default: + return noneWildcard + } +} + +type comparator func(Version, Version) bool + +var ( + compEQ comparator = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 0 + } + compNE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) != 0 + } + compGT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 1 + } + compGE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) >= 0 + } + compLT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == -1 + } + compLE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) <= 0 + } +) + +type versionRange struct { + v Version + c comparator +} + +// rangeFunc creates a Range from the given versionRange. +func (vr *versionRange) rangeFunc() Range { + return Range(func(v Version) bool { + return vr.c(v, vr.v) + }) +} + +// Range represents a range of versions. +// A Range can be used to check if a Version satisfies it: +// +// range, err := semver.ParseRange(">1.0.0 <2.0.0") +// range(semver.MustParse("1.1.1") // returns true +type Range func(Version) bool + +// OR combines the existing Range with another Range using logical OR. +func (rf Range) OR(f Range) Range { + return Range(func(v Version) bool { + return rf(v) || f(v) + }) +} + +// AND combines the existing Range with another Range using logical AND. +func (rf Range) AND(f Range) Range { + return Range(func(v Version) bool { + return rf(v) && f(v) + }) +} + +// ParseRange parses a range and returns a Range. +// If the range could not be parsed an error is returned. +// +// Valid ranges are: +// - "<1.0.0" +// - "<=1.0.0" +// - ">1.0.0" +// - ">=1.0.0" +// - "1.0.0", "=1.0.0", "==1.0.0" +// - "!1.0.0", "!=1.0.0" +// +// A Range can consist of multiple ranges separated by space: +// Ranges can be linked by logical AND: +// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0" +// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2 +// +// Ranges can also be linked by logical OR: +// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x" +// +// AND has a higher precedence than OR. It's not possible to use brackets. +// +// Ranges can be combined by both AND and OR +// +// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` +func ParseRange(s string) (Range, error) { + parts := splitAndTrim(s) + orParts, err := splitORParts(parts) + if err != nil { + return nil, err + } + expandedParts, err := expandWildcardVersion(orParts) + if err != nil { + return nil, err + } + var orFn Range + for _, p := range expandedParts { + var andFn Range + for _, ap := range p { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + vr, err := buildVersionRange(opStr, vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err) + } + rf := vr.rangeFunc() + + // Set function + if andFn == nil { + andFn = rf + } else { // Combine with existing function + andFn = andFn.AND(rf) + } + } + if orFn == nil { + orFn = andFn + } else { + orFn = orFn.OR(andFn) + } + + } + return orFn, nil +} + +// splitORParts splits the already cleaned parts by '||'. +// Checks for invalid positions of the operator and returns an +// error if found. +func splitORParts(parts []string) ([][]string, error) { + var ORparts [][]string + last := 0 + for i, p := range parts { + if p == "||" { + if i == 0 { + return nil, fmt.Errorf("First element in range is '||'") + } + ORparts = append(ORparts, parts[last:i]) + last = i + 1 + } + } + if last == len(parts) { + return nil, fmt.Errorf("Last element in range is '||'") + } + ORparts = append(ORparts, parts[last:]) + return ORparts, nil +} + +// buildVersionRange takes a slice of 2: operator and version +// and builds a versionRange, otherwise an error. +func buildVersionRange(opStr, vStr string) (*versionRange, error) { + c := parseComparator(opStr) + if c == nil { + return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, "")) + } + v, err := Parse(vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err) + } + + return &versionRange{ + v: v, + c: c, + }, nil + +} + +// inArray checks if a byte is contained in an array of bytes +func inArray(s byte, list []byte) bool { + for _, el := range list { + if el == s { + return true + } + } + return false +} + +// splitAndTrim splits a range string by spaces and cleans whitespaces +func splitAndTrim(s string) (result []string) { + last := 0 + var lastChar byte + excludeFromSplit := []byte{'>', '<', '='} + for i := 0; i < len(s); i++ { + if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) { + if last < i-1 { + result = append(result, s[last:i]) + } + last = i + 1 + } else if s[i] != ' ' { + lastChar = s[i] + } + } + if last < len(s)-1 { + result = append(result, s[last:]) + } + + for i, v := range result { + result[i] = strings.Replace(v, " ", "", -1) + } + + // parts := strings.Split(s, " ") + // for _, x := range parts { + // if s := strings.TrimSpace(x); len(s) != 0 { + // result = append(result, s) + // } + // } + return +} + +// splitComparatorVersion splits the comparator from the version. +// Input must be free of leading or trailing spaces. +func splitComparatorVersion(s string) (string, string, error) { + i := strings.IndexFunc(s, unicode.IsDigit) + if i == -1 { + return "", "", fmt.Errorf("Could not get version from string: %q", s) + } + return strings.TrimSpace(s[0:i]), s[i:], nil +} + +// getWildcardType will return the type of wildcard that the +// passed version contains +func getWildcardType(vStr string) wildcardType { + parts := strings.Split(vStr, ".") + nparts := len(parts) + wildcard := parts[nparts-1] + + possibleWildcardType := wildcardTypefromInt(nparts) + if wildcard == "x" { + return possibleWildcardType + } + + return noneWildcard +} + +// createVersionFromWildcard will convert a wildcard version +// into a regular version, replacing 'x's with '0's, handling +// special cases like '1.x.x' and '1.x' +func createVersionFromWildcard(vStr string) string { + // handle 1.x.x + vStr2 := strings.Replace(vStr, ".x.x", ".x", 1) + vStr2 = strings.Replace(vStr2, ".x", ".0", 1) + parts := strings.Split(vStr2, ".") + + // handle 1.x + if len(parts) == 2 { + return vStr2 + ".0" + } + + return vStr2 +} + +// incrementMajorVersion will increment the major version +// of the passed version +func incrementMajorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[0]) + if err != nil { + return "", err + } + parts[0] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// incrementMajorVersion will increment the minor version +// of the passed version +func incrementMinorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + parts[1] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// expandWildcardVersion will expand wildcards inside versions +// following these rules: +// +// * when dealing with patch wildcards: +// >= 1.2.x will become >= 1.2.0 +// <= 1.2.x will become < 1.3.0 +// > 1.2.x will become >= 1.3.0 +// < 1.2.x will become < 1.2.0 +// != 1.2.x will become < 1.2.0 >= 1.3.0 +// +// * when dealing with minor wildcards: +// >= 1.x will become >= 1.0.0 +// <= 1.x will become < 2.0.0 +// > 1.x will become >= 2.0.0 +// < 1.0 will become < 1.0.0 +// != 1.x will become < 1.0.0 >= 2.0.0 +// +// * when dealing with wildcards without +// version operator: +// 1.2.x will become >= 1.2.0 < 1.3.0 +// 1.x will become >= 1.0.0 < 2.0.0 +func expandWildcardVersion(parts [][]string) ([][]string, error) { + var expandedParts [][]string + for _, p := range parts { + var newParts []string + for _, ap := range p { + if strings.Contains(ap, "x") { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + + versionWildcardType := getWildcardType(vStr) + flatVersion := createVersionFromWildcard(vStr) + + var resultOperator string + var shouldIncrementVersion bool + switch opStr { + case ">": + resultOperator = ">=" + shouldIncrementVersion = true + case ">=": + resultOperator = ">=" + case "<": + resultOperator = "<" + case "<=": + resultOperator = "<" + shouldIncrementVersion = true + case "", "=", "==": + newParts = append(newParts, ">="+flatVersion) + resultOperator = "<" + shouldIncrementVersion = true + case "!=", "!": + newParts = append(newParts, "<"+flatVersion) + resultOperator = ">=" + shouldIncrementVersion = true + } + + var resultVersion string + if shouldIncrementVersion { + switch versionWildcardType { + case patchWildcard: + resultVersion, _ = incrementMinorVersion(flatVersion) + case minorWildcard: + resultVersion, _ = incrementMajorVersion(flatVersion) + } + } else { + resultVersion = flatVersion + } + + ap = resultOperator + resultVersion + } + newParts = append(newParts, ap) + } + expandedParts = append(expandedParts, newParts) + } + + return expandedParts, nil +} + +func parseComparator(s string) comparator { + switch s { + case "==": + fallthrough + case "": + fallthrough + case "=": + return compEQ + case ">": + return compGT + case ">=": + return compGE + case "<": + return compLT + case "<=": + return compLE + case "!": + fallthrough + case "!=": + return compNE + } + + return nil +} + +// MustParseRange is like ParseRange but panics if the range cannot be parsed. +func MustParseRange(s string) Range { + r, err := ParseRange(s) + if err != nil { + panic(`semver: ParseRange(` + s + `): ` + err.Error()) + } + return r +} diff --git a/vendor/github.com/blang/semver/v4/semver.go b/vendor/github.com/blang/semver/v4/semver.go new file mode 100644 index 00000000000..307de610f92 --- /dev/null +++ b/vendor/github.com/blang/semver/v4/semver.go @@ -0,0 +1,476 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers +) + +// SpecVersion is the latest fully supported spec version of semver +var SpecVersion = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +// Version represents a semver compatible version +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []PRVersion + Build []string //No Precedence +} + +// Version to string +func (v Version) String() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + + if len(v.Pre) > 0 { + b = append(b, '-') + b = append(b, v.Pre[0].String()...) + + for _, pre := range v.Pre[1:] { + b = append(b, '.') + b = append(b, pre.String()...) + } + } + + if len(v.Build) > 0 { + b = append(b, '+') + b = append(b, v.Build[0]...) + + for _, build := range v.Build[1:] { + b = append(b, '.') + b = append(b, build...) + } + } + + return string(b) +} + +// FinalizeVersion discards prerelease and build number and only returns +// major, minor and patch number. +func (v Version) FinalizeVersion() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + return string(b) +} + +// Equals checks if v is equal to o. +func (v Version) Equals(o Version) bool { + return (v.Compare(o) == 0) +} + +// EQ checks if v is equal to o. +func (v Version) EQ(o Version) bool { + return (v.Compare(o) == 0) +} + +// NE checks if v is not equal to o. +func (v Version) NE(o Version) bool { + return (v.Compare(o) != 0) +} + +// GT checks if v is greater than o. +func (v Version) GT(o Version) bool { + return (v.Compare(o) == 1) +} + +// GTE checks if v is greater than or equal to o. +func (v Version) GTE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// GE checks if v is greater than or equal to o. +func (v Version) GE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// LT checks if v is less than o. +func (v Version) LT(o Version) bool { + return (v.Compare(o) == -1) +} + +// LTE checks if v is less than or equal to o. +func (v Version) LTE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// LE checks if v is less than or equal to o. +func (v Version) LE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// Compare compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } + return -1 + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } + return -1 + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } + return -1 + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + +} + +// IncrementPatch increments the patch version +func (v *Version) IncrementPatch() error { + v.Patch++ + return nil +} + +// IncrementMinor increments the minor version +func (v *Version) IncrementMinor() error { + v.Minor++ + v.Patch = 0 + return nil +} + +// IncrementMajor increments the major version +func (v *Version) IncrementMajor() error { + v.Major++ + v.Minor = 0 + v.Patch = 0 + return nil +} + +// Validate validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + + return nil +} + +// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error +func New(s string) (*Version, error) { + v, err := Parse(s) + vp := &v + return vp, err +} + +// Make is an alias for Parse, parses version string and returns a validated Version or error +func Make(s string) (Version, error) { + return Parse(s) +} + +// ParseTolerant allows for certain version specifications that do not strictly adhere to semver +// specs to be parsed by this library. It does so by normalizing versions before passing them to +// Parse(). It currently trims spaces, removes a "v" prefix, adds a 0 patch number to versions +// with only major and minor components specified, and removes leading 0s. +func ParseTolerant(s string) (Version, error) { + s = strings.TrimSpace(s) + s = strings.TrimPrefix(s, "v") + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + // Remove leading zeros. + for i, p := range parts { + if len(p) > 1 { + p = strings.TrimLeft(p, "0") + if len(p) == 0 || !strings.ContainsAny(p[0:1], "0123456789") { + p = "0" + p + } + parts[i] = p + } + } + // Fill up shortened versions. + if len(parts) < 3 { + if strings.ContainsAny(parts[len(parts)-1], "+-") { + return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") + } + for len(parts) < 3 { + parts = append(parts, "0") + } + } + s = strings.Join(parts, ".") + + return Parse(s) +} + +// Parse parses version string and returns a validated Version or error +func Parse(s string) (Version, error) { + if len(s) == 0 { + return Version{}, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return Version{}, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return Version{}, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return Version{}, err + } + + v := Version{} + v.Major = major + v.Minor = minor + + var build, prerelease []string + patchStr := parts[2] + + if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 { + build = strings.Split(patchStr[buildIndex+1:], ".") + patchStr = patchStr[:buildIndex] + } + + if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 { + prerelease = strings.Split(patchStr[preIndex+1:], ".") + patchStr = patchStr[:preIndex] + } + + if !containsOnly(patchStr, numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr) + } + if hasLeadingZeroes(patchStr) { + return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr) + } + patch, err := strconv.ParseUint(patchStr, 10, 64) + if err != nil { + return Version{}, err + } + + v.Patch = patch + + // Prerelease + for _, prstr := range prerelease { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return Version{}, err + } + v.Pre = append(v.Pre, parsedPR) + } + + // Build meta data + for _, str := range build { + if len(str) == 0 { + return Version{}, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + + return v, nil +} + +// MustParse is like Parse but panics if the version cannot be parsed. +func MustParse(s string) Version { + v, err := Parse(s) + if err != nil { + panic(`semver: Parse(` + s + `): ` + err.Error()) + } + return v +} + +// PRVersion represents a PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// NewPRVersion creates a new valid prerelease version +func NewPRVersion(s string) (PRVersion, error) { + if len(s) == 0 { + return PRVersion{}, errors.New("Prerelease is empty") + } + v := PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return PRVersion{}, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// IsNumeric checks if prerelease-version is numeric +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compare compares two PreRelease Versions v and o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// NewBuildVersion creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} + +// FinalizeVersion returns the major, minor and patch number only and discards +// prerelease and build number. +func FinalizeVersion(s string) (string, error) { + v, err := Parse(s) + if err != nil { + return "", err + } + v.Pre = nil + v.Build = nil + + finalVer := v.String() + return finalVer, nil +} diff --git a/vendor/github.com/blang/semver/v4/sort.go b/vendor/github.com/blang/semver/v4/sort.go new file mode 100644 index 00000000000..e18f880826a --- /dev/null +++ b/vendor/github.com/blang/semver/v4/sort.go @@ -0,0 +1,28 @@ +package semver + +import ( + "sort" +) + +// Versions represents multiple versions. +type Versions []Version + +// Len returns length of version collection +func (s Versions) Len() int { + return len(s) +} + +// Swap swaps two versions inside the collection by its indices +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Less checks if version at index i is less than version at index j +func (s Versions) Less(i, j int) bool { + return s[i].LT(s[j]) +} + +// Sort sorts a slice of versions +func Sort(versions []Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/blang/semver/v4/sql.go b/vendor/github.com/blang/semver/v4/sql.go new file mode 100644 index 00000000000..db958134f3b --- /dev/null +++ b/vendor/github.com/blang/semver/v4/sql.go @@ -0,0 +1,30 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var str string + switch src := src.(type) { + case string: + str = src + case []byte: + str = string(src) + default: + return fmt.Errorf("version.Scan: cannot convert %T to string", src) + } + + if t, err := Parse(str); err == nil { + *v = t + } + + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 4a5067abe15..4467481e774 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,3 +1,6 @@ +# github.com/blang/semver/v4 v4.0.0 +## explicit; go 1.14 +github.com/blang/semver/v4 # github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc ## explicit github.com/davecgh/go-spew/spew