No ingress gate change: this chart already honours ingress.enabled, and its ingress block keeps the upstream-style host/tls lists that the README documents as an exception. The schema models that shape as it is instead of pushing the repo's domain/clusterIssuer pair onto it, and the list entries stay open because they go verbatim into the Ingress spec. The domain checkpoint ran over values.yaml and templates and came back empty: ingress.domain does not exist in this chart at all. 1. values.schema.json (#68): additionalProperties: false on every chart-owned object level. Pod-spec passthrough (volumes, volumeMounts, nodeSelector, tolerations, affinity, ingress hosts/tls) stays open. 2. Null-safety for hardening, probes and resources (#99). This chart's hardening is a documented deviation and the fallbacks reproduce it exactly: the pod context is deliberately EMPTY, because the official image must start as root (s6-overlay does its setup as uid 0 and the image has no non-root user), and capabilities.add keeps NET_RAW, without which device discovery (DHCP watcher, ping/arp integrations) logs "Operation not permitted". core.storage stays deliberately not null-safe: an erased block yields an invalid PVC, which is the loud class #99 excludes. The #82 limitation around the 1Password-backed config Secret is untouched: Helm never sees the content, so it cannot be hashed, and the values.yaml note about the manual rollout restart stays as it is. Rendering with normal values is byte-identical to 5.0.0.
225 lines
7.6 KiB
JSON
225 lines
7.6 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
|
"title": "homeassistant values",
|
|
"description": "Strict values schema (issue #68). additionalProperties is false on every chart-owned object level, so a key that the chart does not read is rejected at render time instead of being silently ignored. The only objects that stay open are the ones passed verbatim into the Kubernetes pod spec (probes, security contexts, volumes, scheduling, global) - the chart does not interpret their contents, so it cannot judge which keys are meaningful. The hardening, probe and resources blocks additionally accept null, because an erased block falls back to the chart defaults (issue #99). Note that this chart keeps replicas, resources, probes and securityContext at the TOP level, and that its ingress block deliberately follows the upstream host/tls style (documented exception in the README).",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"global": {
|
|
"description": "Helm's conventional cross-chart values. Unused by this chart, kept open so an umbrella install cannot break on it.",
|
|
"type": "object"
|
|
},
|
|
"scaleDown": {
|
|
"type": "boolean"
|
|
},
|
|
"replicas": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"service": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"type": {
|
|
"type": ["string", "null"]
|
|
},
|
|
"port": {
|
|
"type": ["integer", "null"],
|
|
"minimum": 1,
|
|
"maximum": 65535
|
|
}
|
|
}
|
|
},
|
|
"ingress": {
|
|
"description": "Documented exception (README): this chart keeps the upstream-style flexible ingress values - host and tls lists instead of the repo's required domain/clusterIssuer pair. The list entries go verbatim into the Ingress spec, so they stay open.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean"
|
|
},
|
|
"className": {
|
|
"description": "Set to \"\" to omit ingressClassName from the rendered Ingress.",
|
|
"type": ["string", "null"]
|
|
},
|
|
"annotations": {
|
|
"type": "object"
|
|
},
|
|
"hosts": {
|
|
"type": ["array", "null"]
|
|
},
|
|
"tls": {
|
|
"type": ["array", "null"]
|
|
}
|
|
}
|
|
},
|
|
"securityContext": {
|
|
"$ref": "#/definitions/securityContext"
|
|
},
|
|
"resources": {
|
|
"$ref": "#/definitions/resources"
|
|
},
|
|
"livenessProbe": {
|
|
"$ref": "#/definitions/probe"
|
|
},
|
|
"readinessProbe": {
|
|
"$ref": "#/definitions/probe"
|
|
},
|
|
"startupProbe": {
|
|
"$ref": "#/definitions/probe"
|
|
},
|
|
"env": {
|
|
"$ref": "#/definitions/env"
|
|
},
|
|
"volumes": {
|
|
"description": "Additional volumes, rendered verbatim into the pod spec.",
|
|
"type": ["array", "null"]
|
|
},
|
|
"volumeMounts": {
|
|
"description": "Additional volumeMounts, rendered verbatim into the container.",
|
|
"type": ["array", "null"]
|
|
},
|
|
"nodeSelector": {
|
|
"description": "Rendered verbatim into the pod spec.",
|
|
"type": ["object", "null"]
|
|
},
|
|
"tolerations": {
|
|
"description": "Rendered verbatim into the pod spec.",
|
|
"type": ["array", "null"]
|
|
},
|
|
"affinity": {
|
|
"description": "Rendered verbatim into the pod spec.",
|
|
"type": ["object", "null"]
|
|
},
|
|
"core": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"timezone": {
|
|
"type": ["string", "null"]
|
|
},
|
|
"storage": {
|
|
"description": "The config PVC. Not null-safe on purpose: an erased block yields an invalid PVC rather than a silently degraded workload.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"size": {
|
|
"type": ["string", "null"]
|
|
},
|
|
"storageClass": {
|
|
"type": ["string", "null"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"secrets": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"configSecretRef": {
|
|
"description": "op:// item path holding config, http-config and recorder-config. Changing the PATH restarts the pod via the checksum/secret-ref annotation; changing the item CONTENT does not - see the note in values.yaml (#82).",
|
|
"type": ["string", "null"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"definitions": {
|
|
"resources": {
|
|
"description": "May be null / empty: the chart then falls back to its default requests and computed limits (issue #99) instead of rendering a container without resource accounting.",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"limitFactor": {
|
|
"type": "number",
|
|
"exclusiveMinimum": 0
|
|
},
|
|
"requests": {
|
|
"$ref": "#/definitions/resourceList"
|
|
},
|
|
"limits": {
|
|
"$ref": "#/definitions/resourceList"
|
|
}
|
|
}
|
|
},
|
|
"resourceList": {
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"cpu": {
|
|
"type": ["string", "number", "null"]
|
|
},
|
|
"memory": {
|
|
"type": ["string", "number", "null"]
|
|
},
|
|
"ephemeral-storage": {
|
|
"type": ["string", "number", "null"]
|
|
},
|
|
"ephemeralStorage": {
|
|
"type": ["string", "number", "null"]
|
|
}
|
|
}
|
|
},
|
|
"env": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"value": {
|
|
"type": "string"
|
|
},
|
|
"valueFrom": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"secretKeyRef": {
|
|
"$ref": "#/definitions/keyRef"
|
|
},
|
|
"configMapKeyRef": {
|
|
"$ref": "#/definitions/keyRef"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"keyRef": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["name", "key"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"key": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"securityContext": {
|
|
"description": "May be null / empty at any level: the chart then falls back to its hardening defaults (issue #99). Note that this chart's hardening is a documented deviation - the pod context is deliberately empty because the image must start as root (s6-overlay), and capabilities.add keeps NET_RAW for device discovery.",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"pod": {
|
|
"description": "Merged onto the chart's pod defaults (empty by design) and rendered as the pod's securityContext; kept open because the chart does not interpret the individual fields.",
|
|
"type": ["object", "null"]
|
|
},
|
|
"container": {
|
|
"description": "Merged onto the chart's container defaults and rendered as the container's securityContext; kept open because the chart does not interpret the individual fields.",
|
|
"type": ["object", "null"]
|
|
}
|
|
}
|
|
},
|
|
"probe": {
|
|
"description": "Merged onto the chart's probe defaults and rendered as a container probe; kept open because the chart does not interpret the individual fields. May be null / empty, which means the defaults apply (issue #99) rather than the probe disappearing.",
|
|
"type": ["object", "null"]
|
|
}
|
|
}
|
|
}
|