From cdd53e89eb3308359ffcdaa873915b8db7361f49 Mon Sep 17 00:00:00 2001 From: sonicaj Date: Mon, 22 Jan 2024 11:20:57 +0000 Subject: [PATCH] Publish new changes in catalog --- charts/home-assistant/2.0.0/.helmignore | 2 + charts/home-assistant/2.0.0/Chart.lock | 6 + charts/home-assistant/2.0.0/Chart.yaml | 24 + charts/home-assistant/2.0.0/README.md | 3 + charts/home-assistant/2.0.0/app-readme.md | 1 + .../2.0.0/charts/common-1.2.9.tgz | Bin 0 -> 63212 bytes .../home-assistant/2.0.0/ci/basic-values.yaml | 15 + charts/home-assistant/2.0.0/ix_values.yaml | 70 ++ charts/home-assistant/2.0.0/metadata.yaml | 17 + .../home-assistant/2.0.0/migrations/migrate | 94 +++ charts/home-assistant/2.0.0/questions.yaml | 633 ++++++++++++++++++ .../2.0.0/templates/_configuration.tpl | 85 +++ .../2.0.0/templates/_home-assistant.tpl | 63 ++ .../2.0.0/templates/_migration.tpl | 48 ++ .../2.0.0/templates/_persistance.tpl | 56 ++ .../2.0.0/templates/_portal.tpl | 12 + .../2.0.0/templates/_postgres.tpl | 12 + .../2.0.0/templates/_service.tpl | 17 + .../2.0.0/templates/common.yaml | 19 + .../home-assistant/2.0.0/to_keep_versions.md | 4 + 20 files changed, 1181 insertions(+) create mode 100644 charts/home-assistant/2.0.0/.helmignore create mode 100644 charts/home-assistant/2.0.0/Chart.lock create mode 100644 charts/home-assistant/2.0.0/Chart.yaml create mode 100644 charts/home-assistant/2.0.0/README.md create mode 100644 charts/home-assistant/2.0.0/app-readme.md create mode 100644 charts/home-assistant/2.0.0/charts/common-1.2.9.tgz create mode 100644 charts/home-assistant/2.0.0/ci/basic-values.yaml create mode 100644 charts/home-assistant/2.0.0/ix_values.yaml create mode 100644 charts/home-assistant/2.0.0/metadata.yaml create mode 100755 charts/home-assistant/2.0.0/migrations/migrate create mode 100644 charts/home-assistant/2.0.0/questions.yaml create mode 100644 charts/home-assistant/2.0.0/templates/_configuration.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_home-assistant.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_migration.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_persistance.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_portal.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_postgres.tpl create mode 100644 charts/home-assistant/2.0.0/templates/_service.tpl create mode 100644 charts/home-assistant/2.0.0/templates/common.yaml create mode 100644 charts/home-assistant/2.0.0/to_keep_versions.md diff --git a/charts/home-assistant/2.0.0/.helmignore b/charts/home-assistant/2.0.0/.helmignore new file mode 100644 index 0000000000..c1347c2c27 --- /dev/null +++ b/charts/home-assistant/2.0.0/.helmignore @@ -0,0 +1,2 @@ +# Patterns to ignore when building packages. +*.png diff --git a/charts/home-assistant/2.0.0/Chart.lock b/charts/home-assistant/2.0.0/Chart.lock new file mode 100644 index 0000000000..54416569a7 --- /dev/null +++ b/charts/home-assistant/2.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.2.9 +digest: sha256:af1a9a1f87e3e48453c9f25f909f5ebcd7fa6e25162b7b425448ba752bcdbc5c +generated: "2024-01-19T14:50:50.732430258+02:00" diff --git a/charts/home-assistant/2.0.0/Chart.yaml b/charts/home-assistant/2.0.0/Chart.yaml new file mode 100644 index 0000000000..e0aece608b --- /dev/null +++ b/charts/home-assistant/2.0.0/Chart.yaml @@ -0,0 +1,24 @@ +name: home-assistant +description: Home Assistant App for TrueNAS SCALE +annotations: + title: Home Assistant +type: application +version: 2.0.0 +apiVersion: v2 +appVersion: 2024.1.3 +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.2.9 +home: https://github.com/home-assistant/home-assistant +icon: https://media.sys.truenas.net/apps/home-assistant/icons/icon.png +sources: + - https://github.com/home-assistant/home-assistant + - https://github.com/truenas/charts/tree/master/charts/home-assistant +keywords: + - home-automation diff --git a/charts/home-assistant/2.0.0/README.md b/charts/home-assistant/2.0.0/README.md new file mode 100644 index 0000000000..bcdded4f0a --- /dev/null +++ b/charts/home-assistant/2.0.0/README.md @@ -0,0 +1,3 @@ +# Introduction + +home assistant App for TrueNAS SCALE \ No newline at end of file diff --git a/charts/home-assistant/2.0.0/app-readme.md b/charts/home-assistant/2.0.0/app-readme.md new file mode 100644 index 0000000000..15cfb6b108 --- /dev/null +++ b/charts/home-assistant/2.0.0/app-readme.md @@ -0,0 +1 @@ +home-assistant App for TrueNAS SCALE diff --git a/charts/home-assistant/2.0.0/charts/common-1.2.9.tgz b/charts/home-assistant/2.0.0/charts/common-1.2.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4b09cad6999202a7da8bc56ac013432f0c69b4e3 GIT binary patch literal 63212 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 + Database Details + + - Database: `{{ .Values.haDbName }}` + - Username: `{{ .Values.haDbUser }}` + - Password: `{{ .Values.haDbPass }}` + - Host: `{{ .Values.haDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + + + {{- $_ := unset .Values "haDbUser" }} + {{- $_ := unset .Values "haDbName" }} + {{- $_ := unset .Values "haDbPass" }} + {{- $_ := unset .Values "haDbHost" }} diff --git a/charts/home-assistant/2.0.0/metadata.yaml b/charts/home-assistant/2.0.0/metadata.yaml new file mode 100644 index 0000000000..61486a5797 --- /dev/null +++ b/charts/home-assistant/2.0.0/metadata.yaml @@ -0,0 +1,17 @@ +runAsContext: + - userName: root + groupName: root + gid: 0 + uid: 0 + description: Home-Assistant runs as root user. + - userName: postgres + groupName: postgres + gid: 999 + uid: 999 + description: Postgres runs as a non-root user. +capabilities: + - name: NET_BIND_SERVICE + description: Home Assistant is able to bind to privileged ports. + - name: NET_RAW + description: Home Assistant is able to use raw sockets. +hostMounts: [] diff --git a/charts/home-assistant/2.0.0/migrations/migrate b/charts/home-assistant/2.0.0/migrations/migrate new file mode 100755 index 0000000000..b38d51c4e5 --- /dev/null +++ b/charts/home-assistant/2.0.0/migrations/migrate @@ -0,0 +1,94 @@ +#!/usr/bin/python3 +import json +import os +import sys + +def migrate_volume(volume): + return { + 'type': 'hostPath', + 'hostPathConfig': { + 'hostPath': volume['hostPath'] + }, + } if volume.get('hostPathEnabled', False) else { + 'type': 'ixVolume', + 'ixVolumeConfig': { + 'datasetName': volume['datasetName'], + }, + } + +def migrate_common_lib(values): + delete_keys = [ + 'web_port', 'hostNetwork', 'cpuLimit', 'memLimit', 'enableResourceLimits', + 'dnsConfig', 'environmentVariables', 'appVolumeMounts', 'postgresAppVolumeMounts', + 'extraAppVolumeMounts', 'ownerUID', 'ownerGID', 'timezone' + ] + + values.update({ + # Migrate Network + 'haNetwork': { + 'webPort': values['web_port'], + 'hostNetwork': values['hostNetwork'], + }, + # Migrate Resources + 'resources': { + 'limits': { + 'cpu': values.get('cpuLimit', '4000m'), + 'memory': values.get('memLimit', '8Gi'), + } + }, + 'haID': { + 'user': values.get('ownerUID'), + 'group': values.get('ownerGID'), + }, + # Migrate DNS + 'podOptions': { + 'dnsConfig': { + 'options': [ + {'name': opt['name'], 'value': opt['value']} + for opt in values.get('dnsConfig', {}).get('options', []) + ] + } + }, + # Migrate Config + 'TZ': values.get('timezone'), + 'haConfig': { + 'additionalEnvs': values.get('environmentVariables', []), + }, + # Migrate Storage + 'haStorage': { + 'config': migrate_volume(values['appVolumeMounts']['config']), + 'media': migrate_volume(values['appVolumeMounts']['media']), + 'pgData': migrate_volume(values['postgresAppVolumeMounts']['postgres-data']), + 'pgBackup': migrate_volume(values['postgresAppVolumeMounts']['postgres-backup']), + 'additionalStorages': [ + { + 'type': 'hostPath', + 'hostPathConfig': {'hostPath': e['hostPath']}, + 'mountPath': e['mountPath'], + } + for e in values.get('extraAppVolumeMounts', []) + ], + }, + }) + + for k in delete_keys: + values.pop(k, None) + + return values + +def migrate(values): + # If this missing, we have already migrated + if not 'appVolumeMounts' in values.keys(): + return values + + + return migrate_common_lib(values) + + +if __name__ == '__main__': + if len(sys.argv) != 2: + exit(1) + + if os.path.exists(sys.argv[1]): + with open(sys.argv[1], 'r') as f: + print(json.dumps(migrate(json.loads(f.read())))) diff --git a/charts/home-assistant/2.0.0/questions.yaml b/charts/home-assistant/2.0.0/questions.yaml new file mode 100644 index 0000000000..dc122cdb0e --- /dev/null +++ b/charts/home-assistant/2.0.0/questions.yaml @@ -0,0 +1,633 @@ +groups: + - name: Home Assistant Configuration + description: Configure Home Assistant + - name: User and Group Configuration + description: Configure User and Group for Home Assistant + - name: Advanced Pod Configuration + description: Configure Advanced Pod Options for Home Assistant + - name: Network Configuration + description: Configure Network for Home Assistant + - name: Storage Configuration + description: Configure Storage for Home Assistant + - name: Resources Configuration + description: Configure Resources for Home Assistant + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: TZ + group: Home Assistant Configuration + label: Timezone + schema: + type: string + default: Etc/UTC + required: true + $ref: + - definitions/timezone + + - variable: podOptions + label: "" + group: Advanced Pod Configuration + schema: + type: dict + attrs: + - variable: dnsConfig + label: Advanced DNS Configuration + schema: + type: dict + attrs: + - variable: options + label: DNS Options + schema: + type: list + items: + - variable: optionsEntry + label: DNS Option Entry + schema: + type: dict + attrs: + - variable: name + label: Option Name + schema: + type: string + required: true + - variable: value + label: Option Value + schema: + type: string + required: true + + - variable: haNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Home Assistant Web UI. + schema: + type: int + default: 20810 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + schema: + type: boolean + default: true + + - variable: haID + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Home Assistant files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Home Assistant files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + + + - variable: haStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Home Assistant Configuration Storage + description: The path to store Home Assistant Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "config" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: media + label: Home Assistant Media Storage + description: The path to store Home Assistant Media. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "media" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: pgData + label: Home Assistant Postgres Data Storage + description: The path to store Home Assistant Postgres Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + # Nothing to show for the user + hidden: true + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "pgData" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + - variable: pgBackup + label: Home Assistant Postgres Backup Storage + description: The path to store Home Assistant Postgres Backup. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + # Nothing to show for the user + hidden: true + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "pgBackup" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Home Assistant. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system.
+ SMB Share: Is a SMB share that is mounted to a persistent volume claim. + schema: + type: string + required: true + default: "ixVolume" + immutable: true + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - value: "smb-pv-pvc" + description: SMB Share (Mounts a persistent volume claim to a SMB share) + - variable: readOnly + label: Read Only + description: Mount the volume as read only. + schema: + type: boolean + default: false + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + default: "storage_entry" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: smbConfig + label: SMB Share Configuration + description: The configuration for the SMB Share. + schema: + type: dict + show_if: [["type", "=", "smb-pv-pvc"]] + attrs: + - variable: server + label: Server + description: The server for the SMB share. + schema: + type: string + required: true + - variable: share + label: Share + description: The share name for the SMB share. + schema: + type: string + required: true + - variable: domain + label: Domain (Optional) + description: The domain for the SMB share. + schema: + type: string + - variable: username + label: Username + description: The username for the SMB share. + schema: + type: string + required: true + - variable: password + label: Password + description: The password for the SMB share. + schema: + type: string + required: true + private: true + - variable: size + label: Size (in Gi) + description: The size of the volume quota. + schema: + type: int + required: true + min: 1 + default: 1 + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for WG-Easy. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for WG-Easy. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/charts/home-assistant/2.0.0/templates/_configuration.tpl b/charts/home-assistant/2.0.0/templates/_configuration.tpl new file mode 100644 index 0000000000..1c7e97d784 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_configuration.tpl @@ -0,0 +1,85 @@ +{{- define "home-assistant.configuration" -}} + + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "home-assistant" -}} + {{- $dbName := "home-assistant" -}} + {{- $dbPass := (randAlphaNum 32) -}} + + {{/* Fetch secrets from pre-migration secret */}} + {{- with (lookup "v1" "Secret" .Release.Namespace "db-details") -}} + {{- $dbUser = ((index .data "db-user") | b64dec) -}} + {{- $dbPass = ((index .data "db-password") | b64dec) -}} + {{/* Previous installs had a typo */}} + {{- $dbName = "homeassistance" -}} + {{- end -}} + + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbUser = ((index .data "POSTGRES_USER") | b64dec) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- $dbName = ((index .data "POSTGRES_DB") | b64dec) -}} + {{- end -}} + + {{/* Temporary set dynamic db details on values, + so we can print them on the notes */}} + {{- $_ := set .Values "haDbPass" $dbPass -}} + {{- $_ := set .Values "haDbHost" $dbHost -}} + {{- $_ := set .Values "haDbName" $dbName -}} + {{- $_ := set .Values "haDbUser" $dbUser -}} + + {{- $dbURL := (printf "postgres://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) -}} + {{- $haDBURL := (printf "postgresql://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) }} +secret: + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} + {{- if eq (include "home-assistant.is-migration" $) "true" }} + postgres-backup-creds: + enabled: true + annotations: + helm.sh/hook: "pre-upgrade" + helm.sh/hook-delete-policy: "hook-succeeded" + helm.sh/hook-weight: "1" + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }}-ha + POSTGRES_URL: {{ printf "postgres://%s:%s@%s-ha:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName }} + {{- end }} + ha-config: + enabled: true + data: + configuration.default: | + # Configure a default setup of Home Assistant (frontend, api, etc) + default_config: + # Text to speech + tts: + - platform: google_translate + recorder.default: | + recorder: + purge_keep_days: 30 + commit_interval: 3 + db_url: {{ $haDBURL }} + script.sh: | + #!/bin/sh + config="/config/configuration.yaml" + default="/default/init" + if [ ! -f "$config" ]; then + echo "File [$config] does NOT exist. Creating..." + cp "$default/configuration.default" "$config" + fi + if ! grep -q "recorder:" "$config"; then + echo "Section [recorder] does NOT exist in [$config]. Appending..." + cat "$default/recorder.default" >> "$config" + fi + echo "Ensure DB URL is up to date" + yq -i '.recorder.db_url = "{{ $haDBURL }}"' "$config" + echo "Done" +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_home-assistant.tpl b/charts/home-assistant/2.0.0/templates/_home-assistant.tpl new file mode 100644 index 0000000000..3b5b583ed6 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_home-assistant.tpl @@ -0,0 +1,63 @@ +{{- define "home-assistant.workload" -}} +workload: + home-assistant: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.haNetwork.hostNetwork }} + securityContext: + fsGroup: {{ .Values.haID.group }} + containers: + home-assistant: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - NET_BIND_SERVICE + - NET_RAW + fixedEnv: + PUID: {{ .Values.haID.user }} + {{ with .Values.haConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + path: /manifest.json + port: 8123 + readiness: + enabled: true + type: http + path: /manifest.json + port: 8123 + startup: + enabled: true + type: http + path: /manifest.json + port: 8123 + initContainers: + 01-init-config: + enabled: true + type: init + imageSelector: yqImage + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + command: /default/init/script.sh + {{- include "ix.v1.common.app.postgresWait" (dict "name" "postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_migration.tpl b/charts/home-assistant/2.0.0/templates/_migration.tpl new file mode 100644 index 0000000000..2fe0d8f0f4 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_migration.tpl @@ -0,0 +1,48 @@ +{{- define "home-assistant.get-versions" -}} + {{- $oldChartVersion := "" -}} + {{- $newChartVersion := "" -}} + + {{/* Safely access the context, so it wont block CI */}} + {{- if hasKey .Values.global "ixChartContext" -}} + {{- if .Values.global.ixChartContext.upgradeMetadata -}} + + {{- $oldChartVersion = .Values.global.ixChartContext.upgradeMetadata.oldChartVersion -}} + {{- $newChartVersion = .Values.global.ixChartContext.upgradeMetadata.newChartVersion -}} + {{- if and (not $oldChartVersion) (not $newChartVersion) -}} + {{- fail "Upgrade Metadata is missing. Cannot proceed" -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- toYaml (dict "old" $oldChartVersion "new" $newChartVersion) -}} +{{- end -}} + +{{- define "home-assistant.migration" -}} + {{- $versions := (fromYaml (include "home-assistant.get-versions" $)) -}} + {{- if and $versions.old $versions.new -}} + {{- $oldV := semver $versions.old -}} + {{- $newV := semver $versions.new -}} + + {{/* If new is v2.x.x */}} + {{- if eq ($newV.Major | int) 2 -}} + {{/* And old is v1.x.x, but lower than .130 */}} + {{- if and (eq $oldV.Major 1) (lt ($oldV.Patch | int) 130) -}} + {{/* Block the upgrade */}} + {{- fail "Migration to 2.x.x is only allowed from 1.0.130 or higher" -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- define "home-assistant.is-migration" -}} + {{- $isMigration := "" -}} + {{- $versions := (fromYaml (include "home-assistant.get-versions" $)) -}} + {{- if $versions.old -}} + {{- $oldV := semver $versions.old -}} + {{- if and (eq $oldV.Major 1) (eq ($oldV.Patch | int) 130) -}} + {{- $isMigration = "true" -}} + {{- end -}} + {{- end -}} + + {{- $isMigration -}} +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_persistance.tpl b/charts/home-assistant/2.0.0/templates/_persistance.tpl new file mode 100644 index 0000000000..2ad49df7d7 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_persistance.tpl @@ -0,0 +1,56 @@ +{{- define "home-assistant.persistence" -}} +persistence: + config: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.haStorage.config) | nindent 4 }} + targetSelector: + home-assistant: + home-assistant: + mountPath: /config + 01-init-config: + mountPath: /config + media: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.haStorage.media) | nindent 4 }} + targetSelector: + home-assistant: + home-assistant: + mountPath: /media + default-config: + enabled: true + type: secret + objectName: ha-config + defaultMode: "0744" + items: + - key: configuration.default + path: configuration.default + - key: recorder.default + path: recorder.default + - key: script.sh + path: script.sh + targetSelector: + home-assistant: + 01-init-config: + mountPath: /default/init + tmp: + enabled: true + type: emptyDir + targetSelector: + home-assistant: + home-assistant: + mountPath: /tmp + {{- range $idx, $storage := .Values.haStorage.additionalStorages }} + {{ printf "ha-%v:" (int $idx) }} + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" $storage) | nindent 4 }} + targetSelector: + home-assistant: + home-assistant: + mountPath: {{ $storage.mountPath }} + {{- end }} + + {{- include "ix.v1.common.app.postgresPersistence" + (dict "pgData" .Values.haStorage.pgData + "pgBackup" .Values.haStorage.pgBackup + ) | nindent 2 }} +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_portal.tpl b/charts/home-assistant/2.0.0/templates/_portal.tpl new file mode 100644 index 0000000000..0a5eef5182 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "home-assistant.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + port: {{ .Values.haNetwork.webPort | quote }} + path: "/" + protocol: "http" + host: $node_ip +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_postgres.tpl b/charts/home-assistant/2.0.0/templates/_postgres.tpl new file mode 100644 index 0000000000..f72ff4ebec --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_postgres.tpl @@ -0,0 +1,12 @@ +{{- define "postgres.workload" -}} + {{- $backupSecretName := "postgres-creds" -}} + {{- if eq (include "home-assistant.is-migration" $) "true" }} + {{- $backupSecretName = "postgres-backup-creds" -}} + {{- end }} +workload: +{{- include "ix.v1.common.app.postgres" (dict "secretName" "postgres-creds" + "backupSecretName" $backupSecretName + "resources" .Values.resources + "imageSelector" "haPostgresImage" + "ixChartContext" .Values.ixChartContext) | nindent 2 }} +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/_service.tpl b/charts/home-assistant/2.0.0/templates/_service.tpl new file mode 100644 index 0000000000..4506dcddb0 --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/_service.tpl @@ -0,0 +1,17 @@ +{{- define "home-assistant.service" -}} +service: + home-assistant: + enabled: true + primary: true + type: NodePort + targetSelector: home-assistant + ports: + webui: + enabled: true + primary: true + port: {{ .Values.haNetwork.webPort }} + nodePort: {{ .Values.haNetwork.webPort }} + targetPort: 8123 + targetSelector: home-assistant + {{- include "ix.v1.common.app.postgresService" $ | nindent 2 }} +{{- end -}} diff --git a/charts/home-assistant/2.0.0/templates/common.yaml b/charts/home-assistant/2.0.0/templates/common.yaml new file mode 100644 index 0000000000..506148fb9f --- /dev/null +++ b/charts/home-assistant/2.0.0/templates/common.yaml @@ -0,0 +1,19 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{- include "home-assistant.migration" $ -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "home-assistant.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "home-assistant.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "home-assistant.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "home-assistant.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} + +{{- if eq (include "home-assistant.is-migration" $) "true" }} + {{- $_ := set .Values.workload.postgres.podSpec.initContainers.permissions "type" "init" -}} +{{- end }} + +{{/* Create the configmap for portal manually*/}} +{{- include "home-assistant.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/charts/home-assistant/2.0.0/to_keep_versions.md b/charts/home-assistant/2.0.0/to_keep_versions.md new file mode 100644 index 0000000000..7572c06f63 --- /dev/null +++ b/charts/home-assistant/2.0.0/to_keep_versions.md @@ -0,0 +1,4 @@ +# 1.0.130 + +This version is kept because it contains a fix that is needed for migration to v2.x.x +It should be safe to remove few months after v2.x.x is released.