{
  "description": "Plan represents a set of Jobs to apply an upgrade (or other operation) to set of Nodes.",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore 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.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "PlanSpec represents the user-configurable details of a Plan.",
      "properties": {
        "channel": {
          "description": "A URL that returns HTTP 302 with the last path element of the value returned in the Location header assumed to be an image tag (after munging \"+\" to \"-\").",
          "type": "string"
        },
        "concurrency": {
          "description": "The maximum number of concurrent nodes to apply this update on.",
          "format": "int64",
          "type": "integer"
        },
        "cordon": {
          "description": "If Cordon is true, the node is cordoned before the upgrade container is run.\nIf drain is specified, the value for cordon is ignored, and the node is cordoned.\nIf neither drain nor cordon are specified and the node is marked as schedulable=false it will not be marked as schedulable=true when the Job completes.",
          "type": "boolean"
        },
        "drain": {
          "description": "Configuration for draining nodes prior to upgrade. If left unspecified, no drain will be performed.",
          "properties": {
            "deleteEmptydirData": {
              "type": "boolean"
            },
            "deleteLocalData": {
              "type": "boolean"
            },
            "disableEviction": {
              "type": "boolean"
            },
            "force": {
              "type": "boolean"
            },
            "gracePeriod": {
              "format": "int32",
              "type": "integer"
            },
            "ignoreDaemonSets": {
              "type": "boolean"
            },
            "podSelector": {
              "description": "A label selector is a label query over a set of resources. The result of matchLabels and\nmatchExpressions are ANDed. An empty label selector matches all objects. A null\nlabel selector matches no objects.",
              "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\nrelates 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.\nValid 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,\nthe values array must be non-empty. If the operator is Exists or DoesNotExist,\nthe values array must be empty. This array is replaced during a strategic\nmerge patch.",
                        "items": {
                          "type": "string"
                        },
                        "type": "array",
                        "x-kubernetes-list-type": "atomic"
                      }
                    },
                    "required": [
                      "key",
                      "operator"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "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\nmap is equivalent to an element of matchExpressions, whose key field is \"key\", the\noperator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
                  "type": "object"
                }
              },
              "type": "object",
              "x-kubernetes-map-type": "atomic",
              "additionalProperties": false
            },
            "skipWaitForDeleteTimeout": {
              "type": "integer"
            },
            "timeout": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ],
              "description": "If a string, this is passed through directly to the `kubectl drain` command.\nIf an int, this represents the duration as a count of nanoseconds, and will be converted to a duration string when passed to the `kubectl drain` command.",
              "x-kubernetes-int-or-string": true
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "exclusive": {
          "description": "Jobs for exclusive plans cannot be run alongside any other exclusive plan.",
          "type": "boolean"
        },
        "imagePullSecrets": {
          "description": "Image Pull Secrets, used to pull images for the Job.",
          "items": {
            "description": "LocalObjectReference contains enough information to let you locate the\nreferenced object inside the same namespace.",
            "properties": {
              "name": {
                "default": "",
                "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                "type": "string"
              }
            },
            "type": "object",
            "x-kubernetes-map-type": "atomic",
            "additionalProperties": false
          },
          "type": "array"
        },
        "jobActiveDeadlineSecs": {
          "description": "Sets ActiveDeadlineSeconds on Jobs generated to apply this Plan.\nIf the Job does not complete within this time, the Plan will stop processing until it is updated to trigger a redeploy.\nIf set to 0, Jobs have no deadline. If not set, the controller default value is used.",
          "format": "int64",
          "type": "integer"
        },
        "nodeSelector": {
          "description": "Select which nodes this plan can be applied to.",
          "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\nrelates 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.\nValid 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,\nthe values array must be non-empty. If the operator is Exists or DoesNotExist,\nthe values array must be empty. This array is replaced during a strategic\nmerge patch.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array",
                    "x-kubernetes-list-type": "atomic"
                  }
                },
                "required": [
                  "key",
                  "operator"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "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\nmap is equivalent to an element of matchExpressions, whose key field is \"key\", the\noperator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
              "type": "object"
            }
          },
          "type": "object",
          "x-kubernetes-map-type": "atomic",
          "additionalProperties": false
        },
        "postCompleteDelay": {
          "description": "Time after a Job for one Node is complete before a new Job will be created for the next Node.",
          "type": "string"
        },
        "prepare": {
          "description": "The prepare init container, if specified, is run before cordon/drain which is run before the upgrade container.",
          "properties": {
            "args": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "command": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "envFrom": {
              "items": {
                "description": "EnvFromSource represents the source of a set of ConfigMaps or Secrets",
                "properties": {
                  "configMapRef": {
                    "description": "The ConfigMap to select from",
                    "properties": {
                      "name": {
                        "default": "",
                        "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                        "type": "string"
                      },
                      "optional": {
                        "description": "Specify whether the ConfigMap must be defined",
                        "type": "boolean"
                      }
                    },
                    "type": "object",
                    "x-kubernetes-map-type": "atomic",
                    "additionalProperties": false
                  },
                  "prefix": {
                    "description": "Optional text to prepend to the name of each environment variable.\nMay consist of any printable ASCII characters except '='.",
                    "type": "string"
                  },
                  "secretRef": {
                    "description": "The Secret to select from",
                    "properties": {
                      "name": {
                        "default": "",
                        "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                        "type": "string"
                      },
                      "optional": {
                        "description": "Specify whether the Secret must be defined",
                        "type": "boolean"
                      }
                    },
                    "type": "object",
                    "x-kubernetes-map-type": "atomic",
                    "additionalProperties": false
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "envs": {
              "items": {
                "description": "EnvVar represents an environment variable present in a Container.",
                "properties": {
                  "name": {
                    "description": "Name of the environment variable.\nMay consist of any printable ASCII characters except '='.",
                    "type": "string"
                  },
                  "value": {
                    "description": "Variable references $(VAR_NAME) are expanded\nusing the previously defined environment variables in the container and\nany service environment variables. If a variable cannot be resolved,\nthe reference in the input string will be unchanged. Double $$ are reduced\nto a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n\"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\nEscaped references will never be expanded, regardless of whether the variable\nexists or not.\nDefaults to \"\".",
                    "type": "string"
                  },
                  "valueFrom": {
                    "description": "Source for the environment variable's value. Cannot be used if value is not empty.",
                    "properties": {
                      "configMapKeyRef": {
                        "description": "Selects a key of a ConfigMap.",
                        "properties": {
                          "key": {
                            "description": "The key to select.",
                            "type": "string"
                          },
                          "name": {
                            "default": "",
                            "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                            "type": "string"
                          },
                          "optional": {
                            "description": "Specify whether the ConfigMap or its key must be defined",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "fieldRef": {
                        "description": "Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\nspec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.",
                        "properties": {
                          "apiVersion": {
                            "description": "Version of the schema the FieldPath is written in terms of, defaults to \"v1\".",
                            "type": "string"
                          },
                          "fieldPath": {
                            "description": "Path of the field to select in the specified API version.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "fieldPath"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "fileKeyRef": {
                        "description": "FileKeyRef selects a key of the env file.\nRequires the EnvFiles feature gate to be enabled.",
                        "properties": {
                          "key": {
                            "description": "The key within the env file. An invalid key will prevent the pod from starting.\nThe keys defined within a source may consist of any printable ASCII characters except '='.\nDuring Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.",
                            "type": "string"
                          },
                          "optional": {
                            "default": false,
                            "description": "Specify whether the file or its key must be defined. If the file or key\ndoes not exist, then the env var is not published.\nIf optional is set to true and the specified key does not exist,\nthe environment variable will not be set in the Pod's containers.\n\nIf optional is set to false and the specified key does not exist,\nan error will be returned during Pod creation.",
                            "type": "boolean"
                          },
                          "path": {
                            "description": "The path within the volume from which to select the file.\nMust be relative and may not contain the '..' path or start with '..'.",
                            "type": "string"
                          },
                          "volumeName": {
                            "description": "The name of the volume mount containing the env file.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "key",
                          "path",
                          "volumeName"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "resourceFieldRef": {
                        "description": "Selects a resource of the container: only resources limits and requests\n(limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.",
                        "properties": {
                          "containerName": {
                            "description": "Container name: required for volumes, optional for env vars",
                            "type": "string"
                          },
                          "divisor": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "description": "Specifies the output format of the exposed resources, defaults to \"1\"",
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "resource": {
                            "description": "Required: resource to select",
                            "type": "string"
                          }
                        },
                        "required": [
                          "resource"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "secretKeyRef": {
                        "description": "Selects a key of a secret in the pod's namespace",
                        "properties": {
                          "key": {
                            "description": "The key of the secret to select from.  Must be a valid secret key.",
                            "type": "string"
                          },
                          "name": {
                            "default": "",
                            "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                            "type": "string"
                          },
                          "optional": {
                            "description": "Specify whether the Secret or its key must be defined",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "name"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "image": {
              "description": "Image name. If the tag is omitted, the value from .status.latestVersion will be used.",
              "type": "string"
            },
            "securityContext": {
              "description": "SecurityContext holds security configuration that will be applied to a container.\nSome fields are present in both SecurityContext and PodSecurityContext.  When both\nare set, the values in SecurityContext take precedence.",
              "properties": {
                "allowPrivilegeEscalation": {
                  "description": "AllowPrivilegeEscalation controls whether a process can gain more\nprivileges than its parent process. This bool directly controls if\nthe no_new_privs flag will be set on the container process.\nAllowPrivilegeEscalation is true always when the container is:\n1) run as Privileged\n2) has CAP_SYS_ADMIN\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "appArmorProfile": {
                  "description": "appArmorProfile is the AppArmor options to use by this container. If set, this profile\noverrides the pod's appArmorProfile.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile loaded on the node that should be used.\nThe profile must be preconfigured on the node to work.\nMust match the loaded name of the profile.\nMust be set if and only if type is \"Localhost\".",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of AppArmor profile will be applied.\nValid options are:\n  Localhost - a profile pre-loaded on the node.\n  RuntimeDefault - the container runtime's default profile.\n  Unconfined - no AppArmor enforcement.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "capabilities": {
                  "description": "The capabilities to add/drop when running containers.\nDefaults to the default set of capabilities granted by the container runtime.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "add": {
                      "description": "Added capabilities",
                      "items": {
                        "description": "Capability represent POSIX capabilities type",
                        "type": "string"
                      },
                      "type": "array",
                      "x-kubernetes-list-type": "atomic"
                    },
                    "drop": {
                      "description": "Removed capabilities",
                      "items": {
                        "description": "Capability represent POSIX capabilities type",
                        "type": "string"
                      },
                      "type": "array",
                      "x-kubernetes-list-type": "atomic"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "privileged": {
                  "description": "Run container in privileged mode.\nProcesses in privileged containers are essentially equivalent to root on the host.\nDefaults to false.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "procMount": {
                  "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "string"
                },
                "readOnlyRootFilesystem": {
                  "description": "Whether this container has a read-only root filesystem.\nDefault is false.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "runAsGroup": {
                  "description": "The GID to run the entrypoint of the container process.\nUses runtime default if unset.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "runAsNonRoot": {
                  "description": "Indicates that the container must run as a non-root user.\nIf true, the Kubelet will validate the image at runtime to ensure that it\ndoes not run as UID 0 (root) and fail to start the container if it does.\nIf unset or false, no such validation will be performed.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                  "type": "boolean"
                },
                "runAsUser": {
                  "description": "The UID to run the entrypoint of the container process.\nDefaults to user specified in image metadata if unspecified.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "seLinuxOptions": {
                  "description": "The SELinux context to be applied to the container.\nIf unspecified, the container runtime will allocate a random SELinux context for each\ncontainer.  May also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "level": {
                      "description": "Level is SELinux level label that applies to the container.",
                      "type": "string"
                    },
                    "role": {
                      "description": "Role is a SELinux role label that applies to the container.",
                      "type": "string"
                    },
                    "type": {
                      "description": "Type is a SELinux type label that applies to the container.",
                      "type": "string"
                    },
                    "user": {
                      "description": "User is a SELinux user label that applies to the container.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "seccompProfile": {
                  "description": "The seccomp options to use by this container. If seccomp options are\nprovided at both the pod & container level, the container options\noverride the pod options.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile defined in a file on the node should be used.\nThe profile must be preconfigured on the node to work.\nMust be a descending path, relative to the kubelet's configured seccomp profile location.\nMust be set if type is \"Localhost\". Must NOT be set for any other type.",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of seccomp profile will be applied.\nValid options are:\n\nLocalhost - a profile defined in a file on the node should be used.\nRuntimeDefault - the container runtime default profile should be used.\nUnconfined - no profile should be applied.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "windowsOptions": {
                  "description": "The Windows specific settings applied to all containers.\nIf unspecified, the options from the PodSecurityContext will be used.\nIf set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is linux.",
                  "properties": {
                    "gmsaCredentialSpec": {
                      "description": "GMSACredentialSpec is where the GMSA admission webhook\n(https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\nGMSA credential spec named by the GMSACredentialSpecName field.",
                      "type": "string"
                    },
                    "gmsaCredentialSpecName": {
                      "description": "GMSACredentialSpecName is the name of the GMSA credential spec to use.",
                      "type": "string"
                    },
                    "hostProcess": {
                      "description": "HostProcess determines if a container should be run as a 'Host Process' container.\nAll of a Pod's containers must have the same effective HostProcess value\n(it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\nIn addition, if HostProcess is true then HostNetwork must also be set to true.",
                      "type": "boolean"
                    },
                    "runAsUserName": {
                      "description": "The UserName in Windows to run the entrypoint of the container process.\nDefaults to the user specified in image metadata if unspecified.\nMay also be set in PodSecurityContext. If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "volumes": {
              "items": {
                "description": "HostPath volume to mount into the pod",
                "properties": {
                  "destination": {
                    "description": "Path to mount the Volume at within the Pod.",
                    "type": "string"
                  },
                  "name": {
                    "description": "Name of the Volume as it will appear within the Pod spec.",
                    "type": "string"
                  },
                  "source": {
                    "description": "Path on the host to mount.",
                    "type": "string"
                  }
                },
                "required": [
                  "destination",
                  "name",
                  "source"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "required": [
            "image"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "priorityClassName": {
          "description": "Priority Class Name of Job, if specified.",
          "type": "string"
        },
        "secrets": {
          "description": "Secrets to be mounted into the Job Pod.",
          "items": {
            "description": "SecretSpec describes a Secret to be mounted for prepare/upgrade containers.",
            "properties": {
              "defaultMode": {
                "description": "Mode to mount the Secret volume with.",
                "format": "int32",
                "type": "integer"
              },
              "ignoreUpdates": {
                "description": "If set to true, the Secret contents will not be hashed, and changes to the Secret will not trigger new application of the Plan.",
                "type": "boolean"
              },
              "name": {
                "description": "Secret name",
                "type": "string"
              },
              "path": {
                "description": "Path to mount the Secret volume within the Pod.",
                "type": "string"
              }
            },
            "required": [
              "name",
              "path"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "serviceAccountName": {
          "description": "The service account for the pod to use. As with normal pods, if not specified the default service account from the namespace will be assigned.",
          "type": "string"
        },
        "tolerations": {
          "description": "Specify which node taints should be tolerated by pods applying the upgrade.\nAnything specified here is appended to the default of:\n- `{key: node.kubernetes.io/unschedulable, effect: NoSchedule, operator: Exists}`",
          "items": {
            "description": "The pod this Toleration is attached to tolerates any taint that matches\nthe triple <key,value,effect> using the matching operator <operator>.",
            "properties": {
              "effect": {
                "description": "Effect indicates the taint effect to match. Empty means match all taint effects.\nWhen 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.\nIf 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.\nValid operators are Exists and Equal. Defaults to Equal.\nExists is equivalent to wildcard for value, so that a pod can\ntolerate all taints of a particular category.",
                "type": "string"
              },
              "tolerationSeconds": {
                "description": "TolerationSeconds represents the period of time the toleration (which must be\nof effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\nit is not set, which means tolerate the taint forever (do not evict). Zero and\nnegative 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.\nIf the operator is Exists, the value should be empty, otherwise just a regular string.",
                "type": "string"
              }
            },
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "upgrade": {
          "description": "The upgrade container; must be specified.",
          "properties": {
            "args": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "command": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "envFrom": {
              "items": {
                "description": "EnvFromSource represents the source of a set of ConfigMaps or Secrets",
                "properties": {
                  "configMapRef": {
                    "description": "The ConfigMap to select from",
                    "properties": {
                      "name": {
                        "default": "",
                        "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                        "type": "string"
                      },
                      "optional": {
                        "description": "Specify whether the ConfigMap must be defined",
                        "type": "boolean"
                      }
                    },
                    "type": "object",
                    "x-kubernetes-map-type": "atomic",
                    "additionalProperties": false
                  },
                  "prefix": {
                    "description": "Optional text to prepend to the name of each environment variable.\nMay consist of any printable ASCII characters except '='.",
                    "type": "string"
                  },
                  "secretRef": {
                    "description": "The Secret to select from",
                    "properties": {
                      "name": {
                        "default": "",
                        "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                        "type": "string"
                      },
                      "optional": {
                        "description": "Specify whether the Secret must be defined",
                        "type": "boolean"
                      }
                    },
                    "type": "object",
                    "x-kubernetes-map-type": "atomic",
                    "additionalProperties": false
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "envs": {
              "items": {
                "description": "EnvVar represents an environment variable present in a Container.",
                "properties": {
                  "name": {
                    "description": "Name of the environment variable.\nMay consist of any printable ASCII characters except '='.",
                    "type": "string"
                  },
                  "value": {
                    "description": "Variable references $(VAR_NAME) are expanded\nusing the previously defined environment variables in the container and\nany service environment variables. If a variable cannot be resolved,\nthe reference in the input string will be unchanged. Double $$ are reduced\nto a single $, which allows for escaping the $(VAR_NAME) syntax: i.e.\n\"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\".\nEscaped references will never be expanded, regardless of whether the variable\nexists or not.\nDefaults to \"\".",
                    "type": "string"
                  },
                  "valueFrom": {
                    "description": "Source for the environment variable's value. Cannot be used if value is not empty.",
                    "properties": {
                      "configMapKeyRef": {
                        "description": "Selects a key of a ConfigMap.",
                        "properties": {
                          "key": {
                            "description": "The key to select.",
                            "type": "string"
                          },
                          "name": {
                            "default": "",
                            "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                            "type": "string"
                          },
                          "optional": {
                            "description": "Specify whether the ConfigMap or its key must be defined",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "fieldRef": {
                        "description": "Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['<KEY>']`, `metadata.annotations['<KEY>']`,\nspec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.",
                        "properties": {
                          "apiVersion": {
                            "description": "Version of the schema the FieldPath is written in terms of, defaults to \"v1\".",
                            "type": "string"
                          },
                          "fieldPath": {
                            "description": "Path of the field to select in the specified API version.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "fieldPath"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "fileKeyRef": {
                        "description": "FileKeyRef selects a key of the env file.\nRequires the EnvFiles feature gate to be enabled.",
                        "properties": {
                          "key": {
                            "description": "The key within the env file. An invalid key will prevent the pod from starting.\nThe keys defined within a source may consist of any printable ASCII characters except '='.\nDuring Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.",
                            "type": "string"
                          },
                          "optional": {
                            "default": false,
                            "description": "Specify whether the file or its key must be defined. If the file or key\ndoes not exist, then the env var is not published.\nIf optional is set to true and the specified key does not exist,\nthe environment variable will not be set in the Pod's containers.\n\nIf optional is set to false and the specified key does not exist,\nan error will be returned during Pod creation.",
                            "type": "boolean"
                          },
                          "path": {
                            "description": "The path within the volume from which to select the file.\nMust be relative and may not contain the '..' path or start with '..'.",
                            "type": "string"
                          },
                          "volumeName": {
                            "description": "The name of the volume mount containing the env file.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "key",
                          "path",
                          "volumeName"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "resourceFieldRef": {
                        "description": "Selects a resource of the container: only resources limits and requests\n(limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.",
                        "properties": {
                          "containerName": {
                            "description": "Container name: required for volumes, optional for env vars",
                            "type": "string"
                          },
                          "divisor": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "description": "Specifies the output format of the exposed resources, defaults to \"1\"",
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "resource": {
                            "description": "Required: resource to select",
                            "type": "string"
                          }
                        },
                        "required": [
                          "resource"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      },
                      "secretKeyRef": {
                        "description": "Selects a key of a secret in the pod's namespace",
                        "properties": {
                          "key": {
                            "description": "The key of the secret to select from.  Must be a valid secret key.",
                            "type": "string"
                          },
                          "name": {
                            "default": "",
                            "description": "Name of the referent.\nThis field is effectively required, but due to backwards compatibility is\nallowed to be empty. Instances of this type with an empty value here are\nalmost certainly wrong.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
                            "type": "string"
                          },
                          "optional": {
                            "description": "Specify whether the Secret or its key must be defined",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object",
                        "x-kubernetes-map-type": "atomic",
                        "additionalProperties": false
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "name"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "image": {
              "description": "Image name. If the tag is omitted, the value from .status.latestVersion will be used.",
              "type": "string"
            },
            "securityContext": {
              "description": "SecurityContext holds security configuration that will be applied to a container.\nSome fields are present in both SecurityContext and PodSecurityContext.  When both\nare set, the values in SecurityContext take precedence.",
              "properties": {
                "allowPrivilegeEscalation": {
                  "description": "AllowPrivilegeEscalation controls whether a process can gain more\nprivileges than its parent process. This bool directly controls if\nthe no_new_privs flag will be set on the container process.\nAllowPrivilegeEscalation is true always when the container is:\n1) run as Privileged\n2) has CAP_SYS_ADMIN\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "appArmorProfile": {
                  "description": "appArmorProfile is the AppArmor options to use by this container. If set, this profile\noverrides the pod's appArmorProfile.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile loaded on the node that should be used.\nThe profile must be preconfigured on the node to work.\nMust match the loaded name of the profile.\nMust be set if and only if type is \"Localhost\".",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of AppArmor profile will be applied.\nValid options are:\n  Localhost - a profile pre-loaded on the node.\n  RuntimeDefault - the container runtime's default profile.\n  Unconfined - no AppArmor enforcement.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "capabilities": {
                  "description": "The capabilities to add/drop when running containers.\nDefaults to the default set of capabilities granted by the container runtime.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "add": {
                      "description": "Added capabilities",
                      "items": {
                        "description": "Capability represent POSIX capabilities type",
                        "type": "string"
                      },
                      "type": "array",
                      "x-kubernetes-list-type": "atomic"
                    },
                    "drop": {
                      "description": "Removed capabilities",
                      "items": {
                        "description": "Capability represent POSIX capabilities type",
                        "type": "string"
                      },
                      "type": "array",
                      "x-kubernetes-list-type": "atomic"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "privileged": {
                  "description": "Run container in privileged mode.\nProcesses in privileged containers are essentially equivalent to root on the host.\nDefaults to false.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "procMount": {
                  "description": "procMount denotes the type of proc mount to use for the containers.\nThe default value is Default which uses the container runtime defaults for\nreadonly paths and masked paths.\nThis requires the ProcMountType feature flag to be enabled.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "string"
                },
                "readOnlyRootFilesystem": {
                  "description": "Whether this container has a read-only root filesystem.\nDefault is false.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "boolean"
                },
                "runAsGroup": {
                  "description": "The GID to run the entrypoint of the container process.\nUses runtime default if unset.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "runAsNonRoot": {
                  "description": "Indicates that the container must run as a non-root user.\nIf true, the Kubelet will validate the image at runtime to ensure that it\ndoes not run as UID 0 (root) and fail to start the container if it does.\nIf unset or false, no such validation will be performed.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                  "type": "boolean"
                },
                "runAsUser": {
                  "description": "The UID to run the entrypoint of the container process.\nDefaults to user specified in image metadata if unspecified.\nMay also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "seLinuxOptions": {
                  "description": "The SELinux context to be applied to the container.\nIf unspecified, the container runtime will allocate a random SELinux context for each\ncontainer.  May also be set in PodSecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "level": {
                      "description": "Level is SELinux level label that applies to the container.",
                      "type": "string"
                    },
                    "role": {
                      "description": "Role is a SELinux role label that applies to the container.",
                      "type": "string"
                    },
                    "type": {
                      "description": "Type is a SELinux type label that applies to the container.",
                      "type": "string"
                    },
                    "user": {
                      "description": "User is a SELinux user label that applies to the container.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "seccompProfile": {
                  "description": "The seccomp options to use by this container. If seccomp options are\nprovided at both the pod & container level, the container options\noverride the pod options.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile defined in a file on the node should be used.\nThe profile must be preconfigured on the node to work.\nMust be a descending path, relative to the kubelet's configured seccomp profile location.\nMust be set if type is \"Localhost\". Must NOT be set for any other type.",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of seccomp profile will be applied.\nValid options are:\n\nLocalhost - a profile defined in a file on the node should be used.\nRuntimeDefault - the container runtime default profile should be used.\nUnconfined - no profile should be applied.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "windowsOptions": {
                  "description": "The Windows specific settings applied to all containers.\nIf unspecified, the options from the PodSecurityContext will be used.\nIf set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is linux.",
                  "properties": {
                    "gmsaCredentialSpec": {
                      "description": "GMSACredentialSpec is where the GMSA admission webhook\n(https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\nGMSA credential spec named by the GMSACredentialSpecName field.",
                      "type": "string"
                    },
                    "gmsaCredentialSpecName": {
                      "description": "GMSACredentialSpecName is the name of the GMSA credential spec to use.",
                      "type": "string"
                    },
                    "hostProcess": {
                      "description": "HostProcess determines if a container should be run as a 'Host Process' container.\nAll of a Pod's containers must have the same effective HostProcess value\n(it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\nIn addition, if HostProcess is true then HostNetwork must also be set to true.",
                      "type": "boolean"
                    },
                    "runAsUserName": {
                      "description": "The UserName in Windows to run the entrypoint of the container process.\nDefaults to the user specified in image metadata if unspecified.\nMay also be set in PodSecurityContext. If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "volumes": {
              "items": {
                "description": "HostPath volume to mount into the pod",
                "properties": {
                  "destination": {
                    "description": "Path to mount the Volume at within the Pod.",
                    "type": "string"
                  },
                  "name": {
                    "description": "Name of the Volume as it will appear within the Pod spec.",
                    "type": "string"
                  },
                  "source": {
                    "description": "Path on the host to mount.",
                    "type": "string"
                  }
                },
                "required": [
                  "destination",
                  "name",
                  "source"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            }
          },
          "required": [
            "image"
          ],
          "type": "object",
          "additionalProperties": false
        },
        "version": {
          "description": "Providing a value for version will prevent polling/resolution of the channel if specified.",
          "type": "string"
        },
        "window": {
          "description": "A time window in which to execute Jobs for this Plan.\nJobs will not be generated outside this time window, but may continue executing into the window once started.",
          "properties": {
            "days": {
              "description": "Days that this time window is valid for",
              "items": {
                "enum": [
                  "0",
                  "su",
                  "sun",
                  "sunday",
                  "1",
                  "mo",
                  "mon",
                  "monday",
                  "2",
                  "tu",
                  "tue",
                  "tuesday",
                  "3",
                  "we",
                  "wed",
                  "wednesday",
                  "4",
                  "th",
                  "thu",
                  "thursday",
                  "5",
                  "fr",
                  "fri",
                  "friday",
                  "6",
                  "sa",
                  "sat",
                  "saturday"
                ],
                "type": "string"
              },
              "minItems": 1,
              "type": "array"
            },
            "endTime": {
              "description": "End of the time window.",
              "type": "string"
            },
            "startTime": {
              "description": "Start of the time window.",
              "type": "string"
            },
            "timeZone": {
              "description": "Time zone for the time window; if not specified UTC will be used.",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "required": [
        "upgrade"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "PlanStatus represents the resulting state from processing Plan events.",
      "properties": {
        "applying": {
          "description": "List of Node names that the Plan is currently being applied on.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "conditions": {
          "description": "`LatestResolved` indicates that the latest version as per the spec has been determined.\n`Validated` indicates that the plan spec has been validated.\n`Complete` indicates that the latest version of the plan has completed on all selected nodes. If any Jobs for the Plan fail to complete, this condition will remain false, and the reason and message will reflect the source of the error.",
          "items": {
            "properties": {
              "lastTransitionTime": {
                "description": "Last time the condition transitioned from one status to another.",
                "type": "string"
              },
              "lastUpdateTime": {
                "description": "The last time this condition was updated.",
                "type": "string"
              },
              "message": {
                "description": "Human-readable message indicating details about last transition",
                "type": "string"
              },
              "reason": {
                "description": "The reason 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 cluster condition.",
                "type": "string"
              }
            },
            "required": [
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array",
          "x-kubernetes-list-map-keys": [
            "type"
          ],
          "x-kubernetes-list-type": "map"
        },
        "latestHash": {
          "description": "The hash of the most recently applied plan .spec.",
          "type": "string"
        },
        "latestVersion": {
          "description": "The latest version, as resolved from .spec.version, or the channel server.",
          "type": "string"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
