apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name must match the spec fields below, and be in the form: <plural>.<group>
  name: machineconfigpools.machineconfiguration.openshift.io
  labels:
    "openshift.io/operator-managed": ""
  annotations:
    include.release.openshift.io/ibm-cloud-managed: "true"
    include.release.openshift.io/self-managed-high-availability: "true"
    include.release.openshift.io/single-node-developer: "true"
spec:
  # group name to use for REST API: /apis/<group>/<version>
  group: machineconfiguration.openshift.io
  # either Namespaced or Cluster
  scope: Cluster
  names:
    # plural name to be used in the URL: /apis/<group>/<version>/<plural>
    plural: machineconfigpools
    # singular name to be used as an alias on the CLI and for display
    singular: machineconfigpool
    # kind is normally the PascalCased singular type. Your resource manifests use this.
    kind: MachineConfigPool
    # shortNames allow shorter string to match your resource on the CLI
    shortNames:
    - mcp
  # list of versions supported by this CustomResourceDefinition
  versions:
  - name: v1
    # Each version can be enabled/disabled by Served flag.
    served: true
    # One and only one version must be marked as the storage version.
    storage: true
    subresources:
      status: {}
    additionalPrinterColumns:
    - jsonPath: .status.configuration.name
      name: Config
      type: string
    - jsonPath: .status.conditions[?(@.type=="Updated")].status
      description: When all the machines in the pool are updated to the correct machine
        config.
      name: Updated
      type: string
    - jsonPath: .status.conditions[?(@.type=="Updating")].status
      description: When at least one of machine is not either not updated or is in the
        process of updating to the desired machine config.
      name: Updating
      type: string
    - jsonPath: .status.conditions[?(@.type=="Degraded")].status
      description: When progress is blocked on updating one or more nodes, or the pool
        configuration is failing.
      name: Degraded
      type: string
    - jsonPath: .status.machineCount
      description: Total number of machines in the machine config pool
      name: MachineCount
      type: number
    - jsonPath: .status.readyMachineCount
      description: Total number of ready machines targeted by the pool
      name: ReadyMachineCount
      type: number
    - jsonPath: .status.updatedMachineCount
      description: Total number of machines targeted by the pool that have the CurrentMachineConfig
        as their config
      name: UpdatedMachineCount
      type: number
    - jsonPath: .status.degradedMachineCount
      description: Total number of machines marked degraded (or unreconcilable)
      name: DegradedMachineCount
      type: number
    - jsonPath: .metadata.creationTimestamp
      name: Age
      type: date
    schema:
      openAPIV3Schema:
        description: MachineConfigPool describes a pool of MachineConfigs.
        type: object
        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: MachineConfigPoolSpec is the spec for MachineConfigPool resource.
            type: object
            properties:
              configuration:
                description: The targeted MachineConfig object for the machine config
                  pool.
                type: object
                properties:
                  apiVersion:
                    description: API version of the referent.
                    type: string
                  fieldPath:
                    description: 'If referring to a piece of an object instead of an
                      entire object, this string should contain a valid JSON/Go field
                      access statement, such as desiredState.manifest.containers[2].
                      For example, if the object reference is to a container within
                      a pod, this would take on a value like: "spec.containers{name}"
                      (where "name" refers to the name of the container that triggered
                      the event) or if no container name is specified "spec.containers[2]"
                      (container with index 2 in this pod). This syntax is chosen only
                      to have some well-defined way of referencing a part of an object.
                      TODO: this design is not final and this field is subject to change
                      in the future.'
                    type: string
                  kind:
                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                    type: string
                  name:
                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                    type: string
                  namespace:
                    description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                    type: string
                  resourceVersion:
                    description: 'Specific resourceVersion to which this reference is
                      made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                    type: string
                  source:
                    description: source is the list of MachineConfig objects that were
                      used to generate the single MachineConfig object specified in
                      `content`.
                    type: array
                    items:
                      description: ObjectReference contains enough information to let
                        you inspect or modify the referred object.
                      type: object
                      properties:
                        apiVersion:
                          description: API version of the referent.
                          type: string
                        fieldPath:
                          description: 'If referring to a piece of an object instead
                            of an entire object, this string should contain a valid
                            JSON/Go field access statement, such as desiredState.manifest.containers[2].
                            For example, if the object reference is to a container within
                            a pod, this would take on a value like: "spec.containers{name}"
                            (where "name" refers to the name of the container that triggered
                            the event) or if no container name is specified "spec.containers[2]"
                            (container with index 2 in this pod). This syntax is chosen
                            only to have some well-defined way of referencing a part
                            of an object. TODO: this design is not final and this field
                            is subject to change in the future.'
                          type: string
                        kind:
                          description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                          type: string
                        name:
                          description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                          type: string
                        namespace:
                          description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                          type: string
                        resourceVersion:
                          description: 'Specific resourceVersion to which this reference
                            is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                          type: string
                        uid:
                          description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
                          type: string
                  uid:
                    description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
                    type: string
              machineConfigSelector:
                description: machineConfigSelector specifies a label selector for MachineConfigs.
                  Refer https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
                  on how label and selectors work.
                type: object
                properties:
                  matchExpressions:
                    description: matchExpressions is a list of label selector requirements.
                      The requirements are ANDed.
                    type: array
                    items:
                      description: A label selector requirement is a selector that contains
                        values, a key, and an operator that relates the key and values.
                      type: object
                      required:
                      - key
                      - operator
                      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.
                          type: array
                          items:
                            type: string
                  matchLabels:
                    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
                    additionalProperties:
                      type: string
              maxUnavailable:
                description: maxUnavailable defines either an integer number or percentage
                  of nodes in the corresponding pool that can go Unavailable during
                  an update. This includes nodes Unavailable for any reason, including
                  user initiated cordons, failing nodes, etc. The default value is 1.
                  A value larger than 1 will mean multiple nodes going unavailable during
                  the update, which may affect your workload stress on the remaining nodes.
                  You cannot set this value to 0 to stop updates (it will default back to 1);
                  to stop updates, use the 'paused' property instead. Drain will respect
                  Pod Disruption Budgets (PDBs) such as etcd quorum guards, even if
                  maxUnavailable is greater than one.
                anyOf:
                - type: integer
                - type: string
                x-kubernetes-int-or-string: true
              nodeSelector:
                description: nodeSelector specifies a label selector for Machines
                type: object
                properties:
                  matchExpressions:
                    description: matchExpressions is a list of label selector requirements.
                      The requirements are ANDed.
                    type: array
                    items:
                      description: A label selector requirement is a selector that contains
                        values, a key, and an operator that relates the key and values.
                      type: object
                      required:
                      - key
                      - operator
                      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.
                          type: array
                          items:
                            type: string
                  matchLabels:
                    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
                    additionalProperties:
                      type: string
              paused:
                description: paused specifies whether or not changes to this machine
                  config pool should be stopped. This includes generating new desiredMachineConfig
                  and update of machines.
                type: boolean
          status:
            description: MachineConfigPoolStatus is the status for MachineConfigPool
              resource.
            type: object
            properties:
              conditions:
                description: conditions represents the latest available observations
                  of current state.
                type: array
                items:
                  description: MachineConfigPoolCondition contains condition information
                    for an MachineConfigPool.
                  type: object
                  properties:
                    lastTransitionTime:
                      description: lastTransitionTime is the timestamp corresponding
                        to the last status change of this condition.
                      type: string
                      format: date-time
                      nullable: true
                    message:
                      description: message is a human readable description of the details
                        of the last transition, complementing reason.
                      type: string
                    reason:
                      description: reason is a brief machine readable explanation for
                        the condition's last transition.
                      type: string
                    status:
                      description: status of the condition, one of ('True', 'False',
                        'Unknown').
                      type: string
                    type:
                      description: type of the condition, currently ('Done', 'Updating',
                        'Failed').
                      type: string
              configuration:
                description: configuration represents the current MachineConfig object
                  for the machine config pool.
                type: object
                properties:
                  apiVersion:
                    description: API version of the referent.
                    type: string
                  fieldPath:
                    description: 'If referring to a piece of an object instead of an
                      entire object, this string should contain a valid JSON/Go field
                      access statement, such as desiredState.manifest.containers[2].
                      For example, if the object reference is to a container within
                      a pod, this would take on a value like: "spec.containers{name}"
                      (where "name" refers to the name of the container that triggered
                      the event) or if no container name is specified "spec.containers[2]"
                      (container with index 2 in this pod). This syntax is chosen only
                      to have some well-defined way of referencing a part of an object.
                      TODO: this design is not final and this field is subject to change
                      in the future.'
                    type: string
                  kind:
                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                    type: string
                  name:
                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                    type: string
                  namespace:
                    description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                    type: string
                  resourceVersion:
                    description: 'Specific resourceVersion to which this reference is
                      made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                    type: string
                  source:
                    description: source is the list of MachineConfig objects that were
                      used to generate the single MachineConfig object specified in
                      `content`.
                    type: array
                    items:
                      description: ObjectReference contains enough information to let
                        you inspect or modify the referred object.
                      type: object
                      properties:
                        apiVersion:
                          description: API version of the referent.
                          type: string
                        fieldPath:
                          description: 'If referring to a piece of an object instead
                            of an entire object, this string should contain a valid
                            JSON/Go field access statement, such as desiredState.manifest.containers[2].
                            For example, if the object reference is to a container within
                            a pod, this would take on a value like: "spec.containers{name}"
                            (where "name" refers to the name of the container that triggered
                            the event) or if no container name is specified "spec.containers[2]"
                            (container with index 2 in this pod). This syntax is chosen
                            only to have some well-defined way of referencing a part
                            of an object. TODO: this design is not final and this field
                            is subject to change in the future.'
                          type: string
                        kind:
                          description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                          type: string
                        name:
                          description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                          type: string
                        namespace:
                          description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
                          type: string
                        resourceVersion:
                          description: 'Specific resourceVersion to which this reference
                            is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                          type: string
                        uid:
                          description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
                          type: string
                  uid:
                    description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
                    type: string
              degradedMachineCount:
                description: degradedMachineCount represents the total number of machines
                  marked degraded (or unreconcilable). A node is marked degraded if
                  applying a configuration failed..
                type: integer
                format: int32
              machineCount:
                description: machineCount represents the total number of machines in
                  the machine config pool.
                type: integer
                format: int32
              observedGeneration:
                description: observedGeneration represents the generation observed by
                  the controller.
                type: integer
                format: int64
              readyMachineCount:
                description: readyMachineCount represents the total number of ready
                  machines targeted by the pool.
                type: integer
                format: int32
              unavailableMachineCount:
                description: unavailableMachineCount represents the total number of
                  unavailable (non-ready) machines targeted by the pool. A node is marked
                  unavailable if it is in updating state or NodeReady condition is false.
                type: integer
                format: int32
              updatedMachineCount:
                description: updatedMachineCount represents the total number of machines
                  targeted by the pool that have the CurrentMachineConfig as their config.
                type: integer
                format: int32
