{
  "description": "ClusterClass is a template which can be used to create managed topologies.",
  "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": "ClusterClassSpec describes the desired state of the ClusterClass.",
      "properties": {
        "controlPlane": {
          "description": "ControlPlane is a reference to a local struct that holds the details for provisioning the Control Plane for the Cluster.",
          "properties": {
            "machineHealthCheck": {
              "description": "MachineHealthCheck defines a MachineHealthCheck for this ControlPlaneClass. This field is supported if and only if the ControlPlane provider template referenced above is Machine based and supports setting replicas.",
              "properties": {
                "maxUnhealthy": {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "type": "string"
                    }
                  ],
                  "description": "Any further remediation is only allowed if at most \"MaxUnhealthy\" machines selected by \"selector\" are not healthy.",
                  "x-kubernetes-int-or-string": true
                },
                "nodeStartupTimeout": {
                  "description": "Machines older than this duration without a node will be considered to have failed and will be remediated. If you wish to disable this feature, set the value explicitly to 0.",
                  "type": "string"
                },
                "remediationTemplate": {
                  "description": "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API.",
                  "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"
                    }
                  },
                  "type": "object",
                  "x-kubernetes-map-type": "atomic",
                  "additionalProperties": false
                },
                "unhealthyConditions": {
                  "description": "UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy.",
                  "items": {
                    "description": "UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration.  When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy.",
                    "properties": {
                      "status": {
                        "minLength": 1,
                        "type": "string"
                      },
                      "timeout": {
                        "type": "string"
                      },
                      "type": {
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "status",
                      "timeout",
                      "type"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "type": "array"
                },
                "unhealthyRange": {
                  "description": "Any further remediation is only allowed if the number of machines selected by \"selector\" as not healthy is within the range of \"UnhealthyRange\". Takes precedence over MaxUnhealthy. Eg. \"[3-5]\" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines",
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "machineInfrastructure": {
              "description": "MachineInfrastructure defines the metadata and infrastructure information for control plane machines. \n This field is supported if and only if the control plane provider template referenced above is Machine based and supports setting replicas.",
              "properties": {
                "ref": {
                  "description": "Ref is a required reference to a custom resource offered by a provider.",
                  "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"
                    }
                  },
                  "type": "object",
                  "x-kubernetes-map-type": "atomic",
                  "additionalProperties": false
                }
              },
              "required": [
                "ref"
              ],
              "type": "object",
              "additionalProperties": false
            },
            "metadata": {
              "description": "Metadata is the metadata applied to the machines of the ControlPlane. At runtime this metadata is merged with the corresponding metadata from the topology. \n This field is supported if and only if the control plane provider template referenced is Machine based.",
              "properties": {
                "annotations": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations",
                  "type": "object"
                },
                "labels": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels",
                  "type": "object"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "ref": {
              "description": "Ref is a required reference to a custom resource offered by a provider.",
              "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"
                }
              },
              "type": "object",
              "x-kubernetes-map-type": "atomic",
              "additionalProperties": false
            }
          },
          "required": [
            "ref"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "infrastructure": {
          "description": "Infrastructure is a reference to a provider-specific template that holds the details for provisioning infrastructure specific cluster for the underlying provider. The underlying provider is responsible for the implementation of the template to an infrastructure cluster.",
          "properties": {
            "ref": {
              "description": "Ref is a required reference to a custom resource offered by a provider.",
              "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"
                }
              },
              "type": "object",
              "x-kubernetes-map-type": "atomic",
              "additionalProperties": false
            }
          },
          "required": [
            "ref"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "patches": {
          "description": "Patches defines the patches which are applied to customize referenced templates of a ClusterClass. Note: Patches will be applied in the order of the array.",
          "items": {
            "description": "ClusterClassPatch defines a patch which is applied to customize the referenced templates.",
            "properties": {
              "definitions": {
                "description": "Definitions define inline patches. Note: Patches will be applied in the order of the array. Note: Exactly one of Definitions or External must be set.",
                "items": {
                  "description": "PatchDefinition defines a patch which is applied to customize the referenced templates.",
                  "properties": {
                    "jsonPatches": {
                      "description": "JSONPatches defines the patches which should be applied on the templates matching the selector. Note: Patches will be applied in the order of the array.",
                      "items": {
                        "description": "JSONPatch defines a JSON patch.",
                        "properties": {
                          "op": {
                            "description": "Op defines the operation of the patch. Note: Only `add`, `replace` and `remove` are supported.",
                            "type": "string"
                          },
                          "path": {
                            "description": "Path defines the path of the patch. Note: Only the spec of a template can be patched, thus the path has to start with /spec/. Note: For now the only allowed array modifications are `append` and `prepend`, i.e.: * for op: `add`: only index 0 (prepend) and - (append) are allowed * for op: `replace` or `remove`: no indexes are allowed",
                            "type": "string"
                          },
                          "value": {
                            "description": "Value defines the value of the patch. Note: Either Value or ValueFrom is required for add and replace operations. Only one of them is allowed to be set at the same time. Note: We have to use apiextensionsv1.JSON instead of our JSON type, because controller-tools has a hard-coded schema for apiextensionsv1.JSON which cannot be produced by another type (unset type field). Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111",
                            "x-kubernetes-preserve-unknown-fields": true
                          },
                          "valueFrom": {
                            "description": "ValueFrom defines the value of the patch. Note: Either Value or ValueFrom is required for add and replace operations. Only one of them is allowed to be set at the same time.",
                            "properties": {
                              "template": {
                                "description": "Template is the Go template to be used to calculate the value. A template can reference variables defined in .spec.variables and builtin variables. Note: The template must evaluate to a valid YAML or JSON value.",
                                "type": "string"
                              },
                              "variable": {
                                "description": "Variable is the variable to be used as value. Variable can be one of the variables defined in .spec.variables or a builtin variable.",
                                "type": "string"
                              }
                            },
                            "type": "object",
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "op",
                          "path"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "type": "array"
                    },
                    "selector": {
                      "description": "Selector defines on which templates the patch should be applied.",
                      "properties": {
                        "apiVersion": {
                          "description": "APIVersion filters templates by apiVersion.",
                          "type": "string"
                        },
                        "kind": {
                          "description": "Kind filters templates by kind.",
                          "type": "string"
                        },
                        "matchResources": {
                          "description": "MatchResources selects templates based on where they are referenced.",
                          "properties": {
                            "controlPlane": {
                              "description": "ControlPlane selects templates referenced in .spec.ControlPlane. Note: this will match the controlPlane and also the controlPlane machineInfrastructure (depending on the kind and apiVersion).",
                              "type": "boolean"
                            },
                            "infrastructureCluster": {
                              "description": "InfrastructureCluster selects templates referenced in .spec.infrastructure.",
                              "type": "boolean"
                            },
                            "machineDeploymentClass": {
                              "description": "MachineDeploymentClass selects templates referenced in specific MachineDeploymentClasses in .spec.workers.machineDeployments.",
                              "properties": {
                                "names": {
                                  "description": "Names selects templates by class names.",
                                  "items": {
                                    "type": "string"
                                  },
                                  "type": "array"
                                }
                              },
                              "type": "object",
                              "additionalProperties": false
                            }
                          },
                          "type": "object",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "apiVersion",
                        "kind",
                        "matchResources"
                      ],
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "jsonPatches",
                    "selector"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "type": "array"
              },
              "description": {
                "description": "Description is a human-readable description of this patch.",
                "type": "string"
              },
              "enabledIf": {
                "description": "EnabledIf is a Go template to be used to calculate if a patch should be enabled. It can reference variables defined in .spec.variables and builtin variables. The patch will be enabled if the template evaluates to `true`, otherwise it will be disabled. If EnabledIf is not set, the patch will be enabled per default.",
                "type": "string"
              },
              "external": {
                "description": "External defines an external patch. Note: Exactly one of Definitions or External must be set.",
                "properties": {
                  "generateExtension": {
                    "description": "GenerateExtension references an extension which is called to generate patches.",
                    "type": "string"
                  },
                  "validateExtension": {
                    "description": "ValidateExtension references an extension which is called to validate the topology.",
                    "type": "string"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "name": {
                "description": "Name of the patch.",
                "type": "string"
              }
            },
            "required": [
              "name"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "variables": {
          "description": "Variables defines the variables which can be configured in the Cluster topology and are then used in patches.",
          "items": {
            "description": "ClusterClassVariable defines a variable which can be configured in the Cluster topology and used in patches.",
            "properties": {
              "name": {
                "description": "Name of the variable.",
                "type": "string"
              },
              "required": {
                "description": "Required specifies if the variable is required. Note: this applies to the variable as a whole and thus the top-level object defined in the schema. If nested fields are required, this will be specified inside the schema.",
                "type": "boolean"
              },
              "schema": {
                "description": "Schema defines the schema of the variable.",
                "properties": {
                  "openAPIV3Schema": {
                    "description": "OpenAPIV3Schema defines the schema of a variable via OpenAPI v3 schema. The schema is a subset of the schema used in Kubernetes CRDs.",
                    "properties": {
                      "additionalProperties": {
                        "description": "AdditionalProperties specifies the schema of values in a map (keys are always strings). NOTE: Can only be set if type is object. NOTE: AdditionalProperties is mutually exclusive with Properties. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.",
                        "x-kubernetes-preserve-unknown-fields": true
                      },
                      "default": {
                        "description": "Default is the default value of the variable. NOTE: Can be set for all types.",
                        "x-kubernetes-preserve-unknown-fields": true
                      },
                      "description": {
                        "description": "Description is a human-readable description of this variable.",
                        "type": "string"
                      },
                      "enum": {
                        "description": "Enum is the list of valid values of the variable. NOTE: Can be set for all types.",
                        "items": {
                          "x-kubernetes-preserve-unknown-fields": true
                        },
                        "type": "array"
                      },
                      "example": {
                        "description": "Example is an example for this variable.",
                        "x-kubernetes-preserve-unknown-fields": true
                      },
                      "exclusiveMaximum": {
                        "description": "ExclusiveMaximum specifies if the Maximum is exclusive. NOTE: Can only be set if type is integer or number.",
                        "type": "boolean"
                      },
                      "exclusiveMinimum": {
                        "description": "ExclusiveMinimum specifies if the Minimum is exclusive. NOTE: Can only be set if type is integer or number.",
                        "type": "boolean"
                      },
                      "format": {
                        "description": "Format is an OpenAPI v3 format string. Unknown formats are ignored. For a list of supported formats please see: (of the k8s.io/apiextensions-apiserver version we're currently using) https://github.com/kubernetes/apiextensions-apiserver/blob/master/pkg/apiserver/validation/formats.go NOTE: Can only be set if type is string.",
                        "type": "string"
                      },
                      "items": {
                        "description": "Items specifies fields of an array. NOTE: Can only be set if type is array. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.",
                        "x-kubernetes-preserve-unknown-fields": true
                      },
                      "maxItems": {
                        "description": "MaxItems is the max length of an array variable. NOTE: Can only be set if type is array.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "maxLength": {
                        "description": "MaxLength is the max length of a string variable. NOTE: Can only be set if type is string.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "maximum": {
                        "description": "Maximum is the maximum of an integer or number variable. If ExclusiveMaximum is false, the variable is valid if it is lower than, or equal to, the value of Maximum. If ExclusiveMaximum is true, the variable is valid if it is strictly lower than the value of Maximum. NOTE: Can only be set if type is integer or number.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "minItems": {
                        "description": "MinItems is the min length of an array variable. NOTE: Can only be set if type is array.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "minLength": {
                        "description": "MinLength is the min length of a string variable. NOTE: Can only be set if type is string.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "minimum": {
                        "description": "Minimum is the minimum of an integer or number variable. If ExclusiveMinimum is false, the variable is valid if it is greater than, or equal to, the value of Minimum. If ExclusiveMinimum is true, the variable is valid if it is strictly greater than the value of Minimum. NOTE: Can only be set if type is integer or number.",
                        "format": "int64",
                        "type": "integer"
                      },
                      "pattern": {
                        "description": "Pattern is the regex which a string variable must match. NOTE: Can only be set if type is string.",
                        "type": "string"
                      },
                      "properties": {
                        "description": "Properties specifies fields of an object. NOTE: Can only be set if type is object. NOTE: Properties is mutually exclusive with AdditionalProperties. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.",
                        "x-kubernetes-preserve-unknown-fields": true
                      },
                      "required": {
                        "description": "Required specifies which fields of an object are required. NOTE: Can only be set if type is object.",
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "type": {
                        "description": "Type is the type of the variable. Valid values are: object, array, string, integer, number or boolean.",
                        "type": "string"
                      },
                      "uniqueItems": {
                        "description": "UniqueItems specifies if items in an array must be unique. NOTE: Can only be set if type is array.",
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "type"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "openAPIV3Schema"
                ],
                "type": "object",
                "additionalProperties": false
              }
            },
            "required": [
              "name",
              "required",
              "schema"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "workers": {
          "description": "Workers describes the worker nodes for the cluster. It is a collection of node types which can be used to create the worker nodes of the cluster.",
          "properties": {
            "machineDeployments": {
              "description": "MachineDeployments is a list of machine deployment classes that can be used to create a set of worker nodes.",
              "items": {
                "description": "MachineDeploymentClass serves as a template to define a set of worker nodes of the cluster provisioned using the `ClusterClass`.",
                "properties": {
                  "class": {
                    "description": "Class denotes a type of worker node present in the cluster, this name MUST be unique within a ClusterClass and can be referenced in the Cluster to create a managed MachineDeployment.",
                    "type": "string"
                  },
                  "machineHealthCheck": {
                    "description": "MachineHealthCheck defines a MachineHealthCheck for this MachineDeploymentClass.",
                    "properties": {
                      "maxUnhealthy": {
                        "anyOf": [
                          {
                            "type": "integer"
                          },
                          {
                            "type": "string"
                          }
                        ],
                        "description": "Any further remediation is only allowed if at most \"MaxUnhealthy\" machines selected by \"selector\" are not healthy.",
                        "x-kubernetes-int-or-string": true
                      },
                      "nodeStartupTimeout": {
                        "description": "Machines older than this duration without a node will be considered to have failed and will be remediated. If you wish to disable this feature, set the value explicitly to 0.",
                        "type": "string"
                      },
                      "remediationTemplate": {
                        "description": "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API.",
                        "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"
                          }
                        },
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "unhealthyConditions": {
                        "description": "UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy.",
                        "items": {
                          "description": "UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration.  When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy.",
                          "properties": {
                            "status": {
                              "minLength": 1,
                              "type": "string"
                            },
                            "timeout": {
                              "type": "string"
                            },
                            "type": {
                              "minLength": 1,
                              "type": "string"
                            }
                          },
                          "required": [
                            "status",
                            "timeout",
                            "type"
                          ],
                          "type": "object",
                          "additionalProperties": false
                        },
                        "type": "array"
                      },
                      "unhealthyRange": {
                        "description": "Any further remediation is only allowed if the number of machines selected by \"selector\" as not healthy is within the range of \"UnhealthyRange\". Takes precedence over MaxUnhealthy. Eg. \"[3-5]\" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines",
                        "type": "string"
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  },
                  "template": {
                    "description": "Template is a local struct containing a collection of templates for creation of MachineDeployment objects representing a set of worker nodes.",
                    "properties": {
                      "bootstrap": {
                        "description": "Bootstrap contains the bootstrap template reference to be used for the creation of worker Machines.",
                        "properties": {
                          "ref": {
                            "description": "Ref is a required reference to a custom resource offered by a provider.",
                            "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"
                              }
                            },
                            "type": "object",
                            "x-kubernetes-map-type": "atomic",
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "ref"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "infrastructure": {
                        "description": "Infrastructure contains the infrastructure template reference to be used for the creation of worker Machines.",
                        "properties": {
                          "ref": {
                            "description": "Ref is a required reference to a custom resource offered by a provider.",
                            "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"
                              }
                            },
                            "type": "object",
                            "x-kubernetes-map-type": "atomic",
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "ref"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "metadata": {
                        "description": "Metadata is the metadata applied to the machines of the MachineDeployment. At runtime this metadata is merged with the corresponding metadata from the topology.",
                        "properties": {
                          "annotations": {
                            "additionalProperties": {
                              "type": "string"
                            },
                            "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations",
                            "type": "object"
                          },
                          "labels": {
                            "additionalProperties": {
                              "type": "string"
                            },
                            "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels",
                            "type": "object"
                          }
                        },
                        "type": "object",
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "bootstrap",
                      "infrastructure"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "class",
                  "template"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
