{
  "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/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/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "properties": {
        "deletePolicy": {
          "description": "DeletePolicy defines the policy used to identify nodes to delete when downscaling. Defaults to \"Random\".  Valid values are \"Random, \"Newest\", \"Oldest\"",
          "enum": [
            "Random",
            "Newest",
            "Oldest"
          ],
          "type": "string"
        },
        "minReadySeconds": {
          "description": "MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready)",
          "format": "int32",
          "type": "integer"
        },
        "replicas": {
          "description": "Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1.",
          "format": "int32",
          "type": "integer"
        },
        "selector": {
          "description": "Selector is a label query over machines that should match the replica count. Label keys and values that must match in order to be controlled by this MachineSet. It must match the machine template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors",
          "type": "object"
        },
        "template": {
          "description": "Template is the object that describes the machine that will be created if insufficient replicas are detected.",
          "properties": {
            "metadata": {
              "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata",
              "type": "object"
            },
            "spec": {
              "description": "Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status",
              "properties": {
                "configSource": {
                  "description": "ConfigSource is used to populate in the associated Node for dynamic kubelet config. This field already exists in Node, so any updates to it in the Machine spec will be automatically copied to the linked NodeRef from the status. The rest of dynamic kubelet config support should then work as-is.",
                  "type": "object"
                },
                "metadata": {
                  "description": "ObjectMeta will autopopulate the Node created. Use this to indicate what labels, annotations, name prefix, etc., should be used when creating the Node.",
                  "type": "object"
                },
                "providerID": {
                  "description": "ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider.",
                  "type": "string"
                },
                "providerSpec": {
                  "description": "ProviderSpec details Provider-specific configuration to use during node creation.",
                  "properties": {
                    "value": {
                      "description": "Value is an inlined, serialized representation of the resource configuration. It is recommended that providers maintain their own versioned API types that should be serialized/deserialized from this field, akin to component config.",
                      "type": "object"
                    },
                    "valueFrom": {
                      "description": "Source for the provider configuration. Cannot be used if value is not empty.",
                      "properties": {
                        "machineClass": {
                          "description": "The machine class from which the provider config should be sourced.",
                          "properties": {
                            "provider": {
                              "description": "Provider is the name of the cloud-provider which MachineClass is intended for.",
                              "type": "string"
                            }
                          },
                          "type": "object",
                          "additionalProperties": false
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "taints": {
                  "description": "The list of the taints to be applied to the corresponding Node in additive manner. This list will not overwrite any other taints added to the Node on an ongoing basis by other entities. These taints should be actively reconciled e.g. if you ask the machine controller to apply a taint and then manually remove the taint the machine controller will put it back) but not have the machine controller remove any taints",
                  "items": {
                    "type": "object"
                  },
                  "type": "array"
                },
                "versions": {
                  "description": "Versions of key software to use. This field is optional at cluster creation time, and omitting the field indicates that the cluster installation tool should select defaults for the user. These defaults may differ based on the cluster installer, but the tool should populate the values it uses when persisting Machine objects. A Machine spec missing this field at runtime is invalid.",
                  "properties": {
                    "controlPlane": {
                      "description": "ControlPlane is the semantic version of the Kubernetes control plane to run. This should only be populated when the machine is a control plane.",
                      "type": "string"
                    },
                    "kubelet": {
                      "description": "Kubelet is the semantic version of kubelet to run",
                      "type": "string"
                    }
                  },
                  "required": [
                    "kubelet"
                  ],
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "required": [
                "providerSpec"
              ],
              "type": "object",
              "additionalProperties": false
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "required": [
        "selector"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "properties": {
        "availableReplicas": {
          "description": "The number of available replicas (ready for at least minReadySeconds) for this MachineSet.",
          "format": "int32",
          "type": "integer"
        },
        "errorMessage": {
          "type": "string"
        },
        "errorReason": {
          "description": "In the event that there is a terminal problem reconciling the replicas, both ErrorReason and ErrorMessage will be set. ErrorReason will be populated with a succinct value suitable for machine interpretation, while ErrorMessage will contain a more verbose string suitable for logging and human consumption.  These fields should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachineTemplate's spec or the configuration of the machine controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the machine controller, or the responsible machine controller itself being critically misconfigured.  Any transient errors that occur during the reconciliation of Machines can be added as events to the MachineSet object and/or logged in the controller's output.",
          "type": "string"
        },
        "fullyLabeledReplicas": {
          "description": "The number of replicas that have labels matching the labels of the machine template of the MachineSet.",
          "format": "int32",
          "type": "integer"
        },
        "observedGeneration": {
          "description": "ObservedGeneration reflects the generation of the most recently observed MachineSet.",
          "format": "int64",
          "type": "integer"
        },
        "readyReplicas": {
          "description": "The number of ready replicas for this MachineSet. A machine is considered ready when the node has been created and is \"Ready\".",
          "format": "int32",
          "type": "integer"
        },
        "replicas": {
          "description": "Replicas is the most recently observed number of replicas.",
          "format": "int32",
          "type": "integer"
        }
      },
      "required": [
        "replicas"
      ],
      "type": "object",
      "additionalProperties": false
    }
  }
}
