From df964fd77bcd130dabb919e9b909998132d1cb12 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:26:17 +0200 Subject: [PATCH] Adds Handbrake (#2024) * initial commit * add chartfiles * 2 more tempaltes * add initial templates/values * basic values * add extra test values * add readme * fix storage * add metadata * add kill cap * rofs false * chown * emptydirs * hmm * more caps * more caps * update meta * 2 more * fix dataset names --- library/ix-dev/community/handbrake/Chart.lock | 6 + library/ix-dev/community/handbrake/Chart.yaml | 27 + library/ix-dev/community/handbrake/README.md | 3 + .../ix-dev/community/handbrake/app-readme.md | 3 + .../handbrake/charts/common-1.2.7.tgz | Bin 0 -> 63154 bytes .../community/handbrake/ci/basic-values.yaml | 13 + .../community/handbrake/ci/https-values.yaml | 16 + library/ix-dev/community/handbrake/item.yaml | 8 + .../ix-dev/community/handbrake/metadata.yaml | 22 + .../ix-dev/community/handbrake/questions.yaml | 648 ++++++++++++++++++ .../community/handbrake/templates/NOTES.txt | 1 + .../handbrake/templates/_handbrake.tpl | 60 ++ .../handbrake/templates/_persistence.tpl | 54 ++ .../community/handbrake/templates/_portal.tpl | 12 + .../handbrake/templates/_service.tpl | 20 + .../community/handbrake/templates/common.yaml | 11 + .../community/handbrake/upgrade_info.json | 1 + .../community/handbrake/upgrade_strategy | 41 ++ .../ix-dev/community/handbrake/values.yaml | 43 ++ 19 files changed, 989 insertions(+) create mode 100644 library/ix-dev/community/handbrake/Chart.lock create mode 100644 library/ix-dev/community/handbrake/Chart.yaml create mode 100644 library/ix-dev/community/handbrake/README.md create mode 100644 library/ix-dev/community/handbrake/app-readme.md create mode 100644 library/ix-dev/community/handbrake/charts/common-1.2.7.tgz create mode 100644 library/ix-dev/community/handbrake/ci/basic-values.yaml create mode 100644 library/ix-dev/community/handbrake/ci/https-values.yaml create mode 100644 library/ix-dev/community/handbrake/item.yaml create mode 100644 library/ix-dev/community/handbrake/metadata.yaml create mode 100644 library/ix-dev/community/handbrake/questions.yaml create mode 100644 library/ix-dev/community/handbrake/templates/NOTES.txt create mode 100644 library/ix-dev/community/handbrake/templates/_handbrake.tpl create mode 100644 library/ix-dev/community/handbrake/templates/_persistence.tpl create mode 100644 library/ix-dev/community/handbrake/templates/_portal.tpl create mode 100644 library/ix-dev/community/handbrake/templates/_service.tpl create mode 100644 library/ix-dev/community/handbrake/templates/common.yaml create mode 100644 library/ix-dev/community/handbrake/upgrade_info.json create mode 100755 library/ix-dev/community/handbrake/upgrade_strategy create mode 100644 library/ix-dev/community/handbrake/values.yaml diff --git a/library/ix-dev/community/handbrake/Chart.lock b/library/ix-dev/community/handbrake/Chart.lock new file mode 100644 index 0000000000..2f4ab325ca --- /dev/null +++ b/library/ix-dev/community/handbrake/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.2.7 +digest: sha256:d69abe6772f86bc5c22cd95bf4505685ca88a1f5f99d78e2cf58cb66bb945e07 +generated: "2024-01-10T19:15:04.204944142+02:00" diff --git a/library/ix-dev/community/handbrake/Chart.yaml b/library/ix-dev/community/handbrake/Chart.yaml new file mode 100644 index 0000000000..1953ea34f8 --- /dev/null +++ b/library/ix-dev/community/handbrake/Chart.yaml @@ -0,0 +1,27 @@ +name: handbrake +description: HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. +annotations: + title: HandBrake +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 23.12.2 +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.7 +home: https://github.com/jlesage/docker-handbrake +icon: https://media.sys.truenas.net/apps/handbrake/icons/icon.png +sources: + - https://github.com/jlesage/docker-handbrake + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/handbrake + - https://hub.docker.com/r/jlesage/handbrake +keywords: + - media + - video + - transcoder diff --git a/library/ix-dev/community/handbrake/README.md b/library/ix-dev/community/handbrake/README.md new file mode 100644 index 0000000000..d212e8d1af --- /dev/null +++ b/library/ix-dev/community/handbrake/README.md @@ -0,0 +1,3 @@ +# Handbrake + +[Handbrake](https://github.com/jlesage/docker-handbrake) is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. diff --git a/library/ix-dev/community/handbrake/app-readme.md b/library/ix-dev/community/handbrake/app-readme.md new file mode 100644 index 0000000000..d212e8d1af --- /dev/null +++ b/library/ix-dev/community/handbrake/app-readme.md @@ -0,0 +1,3 @@ +# Handbrake + +[Handbrake](https://github.com/jlesage/docker-handbrake) is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. diff --git a/library/ix-dev/community/handbrake/charts/common-1.2.7.tgz b/library/ix-dev/community/handbrake/charts/common-1.2.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..33d3fddee90eda34ada0a29cb22331dcabbe2e60 GIT binary patch literal 63154 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/handbrake/ci/basic-values.yaml b/library/ix-dev/community/handbrake/ci/basic-values.yaml new file mode 100644 index 0000000000..c858541cd7 --- /dev/null +++ b/library/ix-dev/community/handbrake/ci/basic-values.yaml @@ -0,0 +1,13 @@ +handbrakeID: + user: 1000 + group: 1000 + +handbrakeStorage: + config: + type: pvc + storage: + type: pvc + output: + type: pvc + watch: + type: pvc diff --git a/library/ix-dev/community/handbrake/ci/https-values.yaml b/library/ix-dev/community/handbrake/ci/https-values.yaml new file mode 100644 index 0000000000..c3255651f1 --- /dev/null +++ b/library/ix-dev/community/handbrake/ci/https-values.yaml @@ -0,0 +1,16 @@ +handbrakeID: + user: 1000 + group: 1000 + +handbrakeConfig: + secureConnection: true + +handbrakeStorage: + config: + type: pvc + storage: + type: pvc + output: + type: pvc + watch: + type: pvc diff --git a/library/ix-dev/community/handbrake/item.yaml b/library/ix-dev/community/handbrake/item.yaml new file mode 100644 index 0000000000..c24f1e5e89 --- /dev/null +++ b/library/ix-dev/community/handbrake/item.yaml @@ -0,0 +1,8 @@ +icon_url: https://media.sys.truenas.net/apps/handbrake/icons/icon.png +categories: + - media +screenshots: [] +tags: + - media + - video + - transcoder diff --git a/library/ix-dev/community/handbrake/metadata.yaml b/library/ix-dev/community/handbrake/metadata.yaml new file mode 100644 index 0000000000..e902d5e889 --- /dev/null +++ b/library/ix-dev/community/handbrake/metadata.yaml @@ -0,0 +1,22 @@ +runAsContext: + - userName: root + groupName: root + gid: 0 + uid: 0 + description: Handbrake runs as root user. +capabilities: + - name: CHOWN + description: Handbrake is able to change file ownership. + - name: DAC_OVERRIDE + description: Handbrake is able to bypass file read, write, and execute permission checks. + - name: FOWNER + description: Handbrake is able to bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. + - name: SETUID + description: Handbrake is able to set the setuid attribute on a file. + - name: SETGID + description: Handbrake is able to set the setgid attribute on a file. + - name: NET_BIND_SERVICE + description: Handbrake is able to bind a socket to internet domain privileged ports (port numbers less than 1024). + - name: KILL + description: Handbrake is able to kill processes. +hostMounts: [] diff --git a/library/ix-dev/community/handbrake/questions.yaml b/library/ix-dev/community/handbrake/questions.yaml new file mode 100644 index 0000000000..767c11c9e6 --- /dev/null +++ b/library/ix-dev/community/handbrake/questions.yaml @@ -0,0 +1,648 @@ +groups: + - name: Handbrake Configuration + description: Configure Handbrake + - name: User and Group Configuration + description: Configure User and Group for Handbrake + - name: Network Configuration + description: Configure Network for Handbrake + - name: Storage Configuration + description: Configure Storage for Handbrake + - name: Resources Configuration + description: Configure Resources for Handbrake + +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: Handbrake Configuration + label: Timezone + schema: + type: string + default: Etc/UTC + required: true + $ref: + - definitions/timezone + + - variable: handbrakeConfig + label: "" + group: Handbrake Configuration + schema: + type: dict + attrs: + - variable: darkMode + label: Dark Mode + description: Enable dark mode for Handbrake. + schema: + type: boolean + default: false + - variable: vncPassword + label: VNC Password + description: The password for the VNC UI. + schema: + type: string + default: "" + private: true + - variable: secureConnection + label: Secure Connection + description: Enable secure connection for Handbrake. + schema: + type: boolean + default: false + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Handbrake. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: handbrakeID + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Handbrake files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Handbrake files will be owned by. + schema: + type: int + min: 568 + default: 568 + required: true + + - variable: handbrakeNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Handbrake Web UI. + schema: + type: int + default: 31010 + min: 9000 + max: 65535 + required: true + - variable: vncPort + label: VNC Port + description: The port for the Handbrake VNC UI. + schema: + type: int + default: 31011 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: handbrakeStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Handbrake Config Storage + description: The path to store Handbrake 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: storage + label: Handbrake Download Storage + description: The path to store Handbrake Storage. + 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: readOnly + label: Read Only + description: Mount the volume as read only. + schema: + type: boolean + default: false + - 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: "storage" + - 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: output + label: Handbrake Output Storage + description: The path to store Handbrake Output. + 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: "output" + - 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: watch + label: Handbrake Watch Storage + description: The path to store Handbrake Watch. + 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: "watch" + - 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: additionalStorages + label: Additional Storage + description: Additional storage for Handbrake. + 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 Handbrake. + 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 Handbrake. + 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/library/ix-dev/community/handbrake/templates/NOTES.txt b/library/ix-dev/community/handbrake/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/handbrake/templates/_handbrake.tpl b/library/ix-dev/community/handbrake/templates/_handbrake.tpl new file mode 100644 index 0000000000..4e9561deeb --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/_handbrake.tpl @@ -0,0 +1,60 @@ +{{- define "handbrake.workload" -}} +workload: + handbrake: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.handbrakeNetwork.hostNetwork }} + securityContext: + fsGroup: {{ .Values.handbrakeID.group }} + containers: + handbrake: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + - NET_BIND_SERVICE + - KILL + env: + AUTOMATED_CONVERSION_OUTPUT_DIR: /output + HANDBRAKE_GUI: "1" + WEB_LISTENING_PORT: {{ .Values.handbrakeNetwork.webPort }} + VNC_LISTENING_PORT: {{ .Values.handbrakeNetwork.vncPort }} + VNC_PASSWORD: {{ .Values.handbrakeConfig.vncPassword }} + DARK_MODE: {{ ternary "1" "0" .Values.handbrakeConfig.darkMode }} + SECURE_CONNECTION: {{ ternary "1" "0" .Values.handbrakeConfig.secureConnection }} + fixedEnv: + PUID: {{ .Values.handbrakeID.user }} + {{ with .Values.handbrakeConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: tcp + port: {{ .Values.handbrakeNetwork.vncPort }} + readiness: + enabled: true + type: tcp + port: {{ .Values.handbrakeNetwork.vncPort }} + startup: + enabled: true + type: tcp + port: {{ .Values.handbrakeNetwork.vncPort }} +{{- end -}} diff --git a/library/ix-dev/community/handbrake/templates/_persistence.tpl b/library/ix-dev/community/handbrake/templates/_persistence.tpl new file mode 100644 index 0000000000..9e005a9da8 --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/_persistence.tpl @@ -0,0 +1,54 @@ +{{- define "handbrake.persistence" -}} +persistence: + config: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.handbrakeStorage.config) | nindent 4 }} + targetSelector: + handbrake: + handbrake: + mountPath: /config + storage: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.handbrakeStorage.storage) | nindent 4 }} + targetSelector: + handbrake: + handbrake: + mountPath: /storage + output: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.handbrakeStorage.output) | nindent 4 }} + targetSelector: + handbrake: + handbrake: + mountPath: /output + watch: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.handbrakeStorage.watch) | nindent 4 }} + targetSelector: + handbrake: + handbrake: + mountPath: /watch + varrun: + enabled: true + type: emptyDir + targetSelector: + handbrake: + handbrake: + mountPath: /var/run + tmp: + enabled: true + type: emptyDir + targetSelector: + handbrake: + handbrake: + mountPath: /tmp + {{- range $idx, $storage := .Values.handbrakeStorage.additionalStorages }} + {{ printf "handbrake-%v:" (int $idx) }} + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" $storage) | nindent 4 }} + targetSelector: + handbrake: + handbrake: + mountPath: {{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/handbrake/templates/_portal.tpl b/library/ix-dev/community/handbrake/templates/_portal.tpl new file mode 100644 index 0000000000..1839c4a7e9 --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "handbrake.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.handbrakeNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/handbrake/templates/_service.tpl b/library/ix-dev/community/handbrake/templates/_service.tpl new file mode 100644 index 0000000000..8378c86b9e --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/_service.tpl @@ -0,0 +1,20 @@ +{{- define "handbrake.service" -}} +service: + handbrake: + enabled: true + primary: true + type: NodePort + targetSelector: handbrake + ports: + webui: + enabled: true + primary: true + port: {{ .Values.handbrakeNetwork.webPort }} + nodePort: {{ .Values.handbrakeNetwork.webPort }} + targetSelector: handbrake + vnc: + enabled: true + port: {{ .Values.handbrakeNetwork.vncPort }} + nodePort: {{ .Values.handbrakeNetwork.vncPort }} + targetSelector: handbrake +{{- end -}} diff --git a/library/ix-dev/community/handbrake/templates/common.yaml b/library/ix-dev/community/handbrake/templates/common.yaml new file mode 100644 index 0000000000..d0cd5f4f29 --- /dev/null +++ b/library/ix-dev/community/handbrake/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "handbrake.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "handbrake.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "handbrake.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "handbrake.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/handbrake/upgrade_info.json b/library/ix-dev/community/handbrake/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/handbrake/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/handbrake/upgrade_strategy b/library/ix-dev/community/handbrake/upgrade_strategy new file mode 100755 index 0000000000..924794842c --- /dev/null +++ b/library/ix-dev/community/handbrake/upgrade_strategy @@ -0,0 +1,41 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'v\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + temp_tags = {t.strip('v'): t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + + # Strip leading zeros + tags = {} + for tag in temp_tags: + tag = tag.split('.') + for i in range(len(tag)): + # Remove leading zeros + tag[i] = tag[i].lstrip('0') + tags[tag] = '.'.join(tag) + + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/handbrake/values.yaml b/library/ix-dev/community/handbrake/values.yaml new file mode 100644 index 0000000000..5b80827dd7 --- /dev/null +++ b/library/ix-dev/community/handbrake/values.yaml @@ -0,0 +1,43 @@ +image: + repository: jlesage/handbrake + pullPolicy: IfNotPresent + tag: v23.12.2 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +handbrakeConfig: + darkMode: false + vncPassword: "" + secureConnection: false + additionalEnvs: [] + +handbrakeID: + user: 568 + group: 568 + +handbrakeNetwork: + webPort: 31010 + vncPort: 31011 + hostNetwork: false + +handbrakeStorage: + config: + type: ixVolume + ixVolumeConfig: + datasetName: config + storage: + type: ixVolume + ixVolumeConfig: + datasetName: storage + output: + type: ixVolume + ixVolumeConfig: + datasetName: output + watch: + type: ixVolume + ixVolumeConfig: + datasetName: watch + additionalStorages: []