{
  "$id": "https://json.schemastore.org/helmfile.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "repository": {
      "type": "object",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "certFile": {
          "type": "string"
        },
        "keyFile": {
          "type": "string"
        },
        "caFile": {
          "type": "string"
        },
        "username": {
          "type": "string"
        },
        "password": {
          "type": "string"
        },
        "oci": {
          "type": "boolean"
        },
        "passCredentials": {
          "type": "boolean"
        }
      }
    },
    "helmDefaults": {
      "type": "object",
      "description": "Default values to set for args along with dedicated keys that can be set by contributors, cli args take precedence over these.",
      "properties": {
        "kubeContext": {
          "type": "string",
          "description": "Dedicated default key for kube-context (--kube-context)."
        },
        "cleanupOnFail": {
          "type": "boolean",
          "description": "When true, cleans up any new resources created during a failed release.",
          "default": false
        },
        "args": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string"
              }
            ]
          }
        },
        "verify": {
          "type": "boolean",
          "description": "Verify the chart before upgrading (only works with packaged charts not directories).",
          "default": false
        },
        "wait": {
          "type": "boolean",
          "description": "Wait for k8s resources via --wait.",
          "default": false
        },
        "waitForJobs": {
          "type": "boolean",
          "description": "If true and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout",
          "default": false
        },
        "timeout": {
          "type": "number",
          "description": "Time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness)",
          "default": 300
        },
        "recreatePods": {
          "type": "boolean",
          "description": "Performs pods restart for the resource if applicable.",
          "default": false
        },
        "force": {
          "type": "boolean",
          "description": "Forces resource update through delete/recreate if needed.",
          "default": false
        },
        "historyMax": {
          "type": "number",
          "description": "Limit the maximum number of revisions saved per release. Use 0 for no limit.",
          "default": 10
        },
        "createNamespace": {
          "type": "boolean",
          "description": "When using helm 3.2+, automatically create release namespaces if they do not exist.",
          "default": true
        },
        "devel": {
          "type": "boolean",
          "description": "If used with charts museum allows to pull unstable charts for deployment, for example: if 1.2.3 and 1.2.4-dev versions exist and set to true, 1.2.4-dev will be pulled (default false)",
          "default": false
        },
        "reuseValues": {
          "type": "boolean",
          "description": "If set to true, reuses the last release's values and merges them with ones provided in helmfile.",
          "default": false
        },
        "skipDeps": {
          "description": "When set to `true`, skips running `helm dep up` and `helm dep build` on this release's chart.",
          "type": "boolean",
          "default": false
        },
        "cascade": {
          "type": "string",
          "description": "Cascade `--cascade` to helmv3 delete, available values: background, foreground, or orphan.",
          "default": "background",
          "enum": ["background", "foreground", "orphan"]
        },
        "postRenderer": {
          "type": "string",
          "description": "Propagate `--post-renderer` to helmv3 template and helm install.",
          "examples": ["path/to/postRenderer"]
        },
        "insecureSkipTLSVerify": {
          "type": "boolean",
          "description": "Is true if the TLS verification should be skipped when fetching remote chart.",
          "default": false
        }
      }
    },
    "release": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the release."
        },
        "namespace": {
          "type": "string",
          "description": "The namespace to install the release into."
        },
        "chart": {
          "description": "The chart name to be installed. The chart name can be either: 1) a chart reference: https://helm.sh/docs/topics/charts/#chart-references, 2) a path to a directory containing a chart, 3) a path to a packaged chart, or 4) a URL.",
          "type": "string"
        },
        "atomic": {
          "type": "boolean",
          "description": "Restores previous state in case of failed release.",
          "default": false
        },
        "cleanupOnFail": {
          "type": "boolean",
          "description": "When true, cleans up any new resources created during a failed release.",
          "default": false
        },
        "kubeContext": {
          "type": "string",
          "description": "--kube-context to be passed to helm commands.\nDefaults tp an empty string, which means the standard kubeconfig, either ~/kubeconfig or the file pointed by $KUBECONFIG environment variable)",
          "default": ""
        },
        "condition": {
          "type": "string",
          "description": "Wen set, helmfile will only attempt to install the release if the condition is true"
        },
        "createNamespace": {
          "type": "boolean",
          "description": "When using helm 3.2+, automatically create release namespaces if they do not exist.",
          "default": true
        },
        "devel": {
          "type": "boolean",
          "description": "If used with charts museum allows to pull unstable charts for deployment, for example: if 1.2.3 and 1.2.4-dev versions exist and set to true, 1.2.4-dev will be pulled.",
          "default": false
        },
        "disableValidation": {
          "description": "Disables validation of the rendered templates before releasing.",
          "type": "boolean",
          "default": false
        },
        "disableValidationOnInstall": {
          "type": "boolean",
          "description": "Passes --disable-validation to helm 3 diff plugin, this requires diff plugin >= 3.1.2",
          "default": false
        },
        "disableOpenAPIValidation": {
          "type": "boolean",
          "description": "Passes --disable-openapi-validation to helm 3 diff plugin, this requires diff plugin >= 3.1.2",
          "default": false
        },
        "historyMax": {
          "type": "number",
          "description": "Limit the maximum number of revisions saved per release. Use 0 for no limit.",
          "default": 10
        },
        "skipDeps": {
          "description": "When set to `true`, skips running `helm dep up` and `helm dep build` on this release's chart.",
          "type": "boolean",
          "default": false
        },
        "cascade": {
          "type": "string",
          "description": "Cascade `--cascade` to helmv3 delete, available values: background, foreground, or orphan",
          "default": "background",
          "enum": ["background", "foreground", "orphan"]
        },
        "postRenderer": {
          "type": "string",
          "description": "Propagate `--post-renderer` to helmv3 template and helm install.",
          "examples": ["path/to/postRenderer"]
        },
        "insecureSkipTLSVerify": {
          "type": "boolean",
          "description": "Is true if the TLS verification should be skipped when fetching remote chart",
          "default": false
        },
        "hooks": {
          "description": "Hooks allow to trigger actions at certain points in helm's lifecycle.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/hook"
          }
        },
        "installed": {
          "description": "Set `false` to uninstall this release on sync.",
          "default": true,
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "string"
            },
            {
              "type": "object"
            }
          ]
        },
        "labels": {
          "$ref": "#/definitions/map"
        },
        "missingFileHandler": {
          "type": "string",
          "$ref": "#/definitions/missingFileHandler"
        },
        "secrets": {
          "type": "array",
          "description": "Will attempt to decrypt it using helm-secrets plugin",
          "items": {
            "type": "string"
          }
        },
        "set": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "file": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "values": {
                    "type": "array",
                    "items": {
                      "anyOf": [
                        {
                          "type": "number"
                        }
                      ]
                    }
                  }
                }
              },
              {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "value": {
                    "type": "string"
                  }
                }
              }
            ]
          }
        },
        "timeout": {
          "type": "number",
          "description": "Time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness)",
          "default": 300
        },
        "recreatePods": {
          "type": "boolean",
          "description": "Performs pods restart for the resource if applicable",
          "default": false
        },
        "force": {
          "type": "boolean",
          "description": "Forces resource update through delete/recreate if needed.",
          "default": false
        },
        "values": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "$ref": "#/definitions/map"
              }
            ]
          }
        },
        "verify": {
          "type": "boolean"
        },
        "version": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "integer"
            }
          ]
        },
        "wait": {
          "type": "boolean",
          "description": "Wait for k8s resources via --wait.",
          "default": false
        },
        "waitForJobs": {
          "type": "boolean",
          "description": "If set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout.",
          "default": false
        }
      },
      "required": ["name", "chart"]
    },
    "helmfile": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "required": ["path"],
          "properties": {
            "path": {
              "type": "string"
            },
            "selectors": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  }
                ]
              }
            },
            "values": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "key1": {
                        "type": "string"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "missingFileHandler": {
      "type": "string",
      "enum": ["Error", "Warn", "Info", "Debug"]
    },
    "environment": {
      "type": "object",
      "properties": {
        "values": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "$ref": "#/definitions/map"
              }
            ]
          }
        },
        "secrets": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "missingFileHandler": {
          "$ref": "#/definitions/missingFileHandler"
        },
        "kubeContext": {
          "type": "string"
        }
      }
    },
    "hook": {
      "type": "object",
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "prepare",
              "preapply",
              "presync",
              "preuninstall",
              "postuninstall",
              "postsync",
              "cleanup"
            ]
          }
        },
        "showlogs": {
          "type": "boolean"
        },
        "command": {
          "type": "string"
        },
        "args": {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "string"
              }
            ]
          }
        }
      }
    },
    "map": {
      "type": "object",
      "patternProperties": {
        "[a-zA-Z\\d_-]+": {
          "anyOf": [
            {
              "type": "object"
            },
            {
              "type": "boolean"
            },
            {
              "type": "string"
            },
            {
              "type": "array"
            },
            {
              "type": "null"
            },
            {
              "type": "integer"
            }
          ]
        }
      }
    }
  },
  "properties": {
    "apiVersions": {
      "type": "array",
      "description": "Configure a fixed list of API versions to pass to 'helm template' via the --api-versions flag with the below:",
      "items": {
        "type": "string",
        "examples": ["example/v1"]
      }
    },
    "bases": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string"
          }
        ]
      }
    },
    "environments": {
      "type": "object",
      "description": "The list of environments managed by helmfile.",
      "default": {
        "default": {}
      },
      "examples": [
        {
          "default": {
            "values": []
          }
        }
      ],
      "patternProperties": {
        "[a-zA-Z\\d_-]+": {
          "$ref": "#/definitions/environment"
        }
      }
    },
    "commonLabels": {
      "type": "object",
      "description": "these labels will be applied to all releases in a Helmfile. Useful in templating if you have a helmfile per environment or customer and don't want to copy the same label to each release",
      "$ref": "#/definitions/map"
    },
    "helmBinary": {
      "type": "string",
      "description": "Path to alternative helm binary (--helm-binary)",
      "examples": ["path/to/helm3"]
    },
    "helmDefaults": {
      "$ref": "#/definitions/helmDefaults"
    },
    "helmfiles": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/helmfile"
      }
    },
    "hooks": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/hook"
      }
    },
    "missingFileHandler": {
      "$ref": "#/definitions/missingFileHandler"
    },
    "releases": {
      "type": "array",
      "description": "Helmfile runs various helm commands to converge the current state in the live cluster to the desired state defined here.",
      "items": {
        "$ref": "#/definitions/release"
      }
    },
    "repositories": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/repository"
      }
    }
  },
  "title": "Helmfile config schema"
}
