diff --git a/charts/jellyfin/Chart.yaml b/charts/jellyfin/Chart.yaml index 7ade3cc..0443162 100644 --- a/charts/jellyfin/Chart.yaml +++ b/charts/jellyfin/Chart.yaml @@ -17,6 +17,8 @@ annotations: description: Deprecate initContainers parameter in favor of extraInitContainers for consistency (will be removed after 2030) - kind: fixed description: Fix extraInitContainers not working (was using wrong parameter name in template) + - kind: added + description: Add support for Gateway API HTTPRoute resource - kind: added description: Add envFrom support to load environment variables from ConfigMap or Secret - kind: added diff --git a/charts/jellyfin/README.md b/charts/jellyfin/README.md index febdd62..d5d788d 100644 --- a/charts/jellyfin/README.md +++ b/charts/jellyfin/README.md @@ -1,5 +1,6 @@ # jellyfin +![Version: 2.6.0](https://img.shields.io/badge/Version-2.6.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 10.11.2](https://img.shields.io/badge/AppVersion-10.11.2-informational?style=flat-square) ![Version: 2.5.1](https://img.shields.io/badge/Version-2.5.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 10.11.2](https://img.shields.io/badge/AppVersion-10.11.2-informational?style=flat-square) A Helm chart for Jellyfin Media Server @@ -60,6 +61,10 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml | extraContainers | list | `[]` | additional sidecar containers to run inside the pod. | | extraInitContainers | list | `[]` | additional init containers to run inside the pod. | | fullnameOverride | string | `""` | Override the default full name of the chart. | +| httpRoute | object | `{"annotations":{},"enabled":false,"hostnames":[],"parentRefs":[],"rules":[{"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]}` | HTTPRoute configuration for Gateway API. See: https://gateway-api.sigs.k8s.io/ | +| httpRoute.hostnames | list | `[]` | Hostnames to match for this HTTPRoute | +| httpRoute.parentRefs | list | `[]` | Gateway references to attach this HTTPRoute to | +| httpRoute.rules | list | `[{"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | Rules for routing traffic | | image.pullPolicy | string | `"IfNotPresent"` | Image pull policy (Always, IfNotPresent, or Never). | | image.repository | string | `"docker.io/jellyfin/jellyfin"` | Container image repository for Jellyfin. | | image.tag | string | `""` | Jellyfin container image tag. Leave empty to automatically use the Chart's app version. | @@ -141,6 +146,33 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml ---------------------------------------------- Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) +## Gateway API HTTPRoute + +This chart supports the Kubernetes Gateway API HTTPRoute resource as a modern alternative to Ingress. + +To use HTTPRoute, you need to have Gateway API CRDs installed in your cluster and a Gateway resource configured. + +Example configuration: + +```yaml +httpRoute: + enabled: true + annotations: {} + parentRefs: + - name: my-gateway + namespace: gateway-system + sectionName: https + hostnames: + - jellyfin.example.com + rules: + - matches: + - path: + type: PathPrefix + value: / +``` + +For more information about Gateway API, see: + ## Hardware acceleration Out of the box the pod does not have the necessary permissions to enable hardware acceleration (HWA) in Jellyfin. diff --git a/charts/jellyfin/README.md.gotmpl b/charts/jellyfin/README.md.gotmpl index 90546e6..be3cf9e 100644 --- a/charts/jellyfin/README.md.gotmpl +++ b/charts/jellyfin/README.md.gotmpl @@ -59,6 +59,33 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml {{ template "helm-docs.versionFooter" . }} +## Gateway API HTTPRoute + +This chart supports the Kubernetes Gateway API HTTPRoute resource as a modern alternative to Ingress. + +To use HTTPRoute, you need to have Gateway API CRDs installed in your cluster and a Gateway resource configured. + +Example configuration: + +```yaml +httpRoute: + enabled: true + annotations: {} + parentRefs: + - name: my-gateway + namespace: gateway-system + sectionName: https + hostnames: + - jellyfin.example.com + rules: + - matches: + - path: + type: PathPrefix + value: / +``` + +For more information about Gateway API, see: + ## Hardware acceleration Out of the box the pod does not have the necessary permissions to enable hardware acceleration (HWA) in Jellyfin. diff --git a/charts/jellyfin/templates/NOTES.txt b/charts/jellyfin/templates/NOTES.txt index 9072838..126f16b 100644 --- a/charts/jellyfin/templates/NOTES.txt +++ b/charts/jellyfin/templates/NOTES.txt @@ -101,6 +101,37 @@ For more information and documentation: $ helm status {{ .Release.Name }} $ helm get all {{ .Release.Name }} +{{- if .Values.httpRoute.enabled }} + +HTTPRoute (Gateway API) is ENABLED: +{{- if .Values.httpRoute.parentRefs }} + Gateway References: + {{- range .Values.httpRoute.parentRefs }} + - {{ .name }}{{ if .namespace }} (namespace: {{ .namespace }}){{ end }}{{ if .sectionName }} [{{ .sectionName }}]{{ end }} + {{- end }} +{{- else }} + ⚠ WARNING: No parentRefs defined - HTTPRoute will not attach to any Gateway! +{{- end }} +{{- if .Values.httpRoute.hostnames }} + Hostnames: + {{- range .Values.httpRoute.hostnames }} + - {{ . }} + {{- end }} +{{- end }} + Rules: {{ len .Values.httpRoute.rules }} route(s) configured + Backend: {{ include "jellyfin.fullname" . }}:{{ .Values.service.port }} + +Access Jellyfin via Gateway API at: +{{- if .Values.httpRoute.hostnames }} +{{- range .Values.httpRoute.hostnames }} + https://{{ . }}{{ (index $.Values.httpRoute.rules 0).matches 0 .path.value }} +{{- end }} +{{- else }} + (Configure httpRoute.hostnames for external access) +{{- end }} + +Note: Ensure your Gateway API CRDs are installed and Gateway is configured. +{{- else if .Values.ingress.enabled }} {{- if .Values.ingress.enabled }} Jellyfin is available via Ingress at: diff --git a/charts/jellyfin/templates/httproute.yaml b/charts/jellyfin/templates/httproute.yaml new file mode 100644 index 0000000..c701451 --- /dev/null +++ b/charts/jellyfin/templates/httproute.yaml @@ -0,0 +1,33 @@ +{{- if .Values.httpRoute.enabled }} +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: {{ include "jellyfin.fullname" . }} + labels: + {{- include "jellyfin.labels" . | nindent 4 }} + {{- with .Values.httpRoute.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- with .Values.httpRoute.parentRefs }} + parentRefs: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.httpRoute.hostnames }} + hostnames: + {{- toYaml . | nindent 4 }} + {{- end }} + rules: + {{- range .Values.httpRoute.rules }} + - matches: + {{- range .matches }} + - path: + type: {{ .path.type }} + value: {{ .path.value }} + {{- end }} + backendRefs: + - name: {{ include "jellyfin.fullname" $ }} + port: {{ $.Values.service.port }} + {{- end }} +{{- end }} diff --git a/charts/jellyfin/tests/httproute_test.yaml b/charts/jellyfin/tests/httproute_test.yaml new file mode 100644 index 0000000..7ee0ab4 --- /dev/null +++ b/charts/jellyfin/tests/httproute_test.yaml @@ -0,0 +1,193 @@ +suite: test httproute +templates: + - httproute.yaml +tests: + - it: should not create HTTPRoute by default + asserts: + - hasDocuments: + count: 0 + + - it: should create HTTPRoute when enabled + set: + httpRoute.enabled: true + httpRoute.parentRefs: + - name: my-gateway + namespace: gateway-system + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - hasDocuments: + count: 1 + - isKind: + of: HTTPRoute + - isAPIVersion: + of: gateway.networking.k8s.io/v1 + - equal: + path: metadata.name + value: RELEASE-NAME-jellyfin + + - it: should add annotations when specified + set: + httpRoute.enabled: true + httpRoute.annotations: + my-annotation: my-value + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - equal: + path: metadata.annotations.my-annotation + value: my-value + + - it: should set parentRefs correctly + set: + httpRoute.enabled: true + httpRoute.parentRefs: + - name: my-gateway + namespace: gateway-system + sectionName: https + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - equal: + path: spec.parentRefs[0].name + value: my-gateway + - equal: + path: spec.parentRefs[0].namespace + value: gateway-system + - equal: + path: spec.parentRefs[0].sectionName + value: https + + - it: should set hostnames when specified + set: + httpRoute.enabled: true + httpRoute.hostnames: + - jellyfin.example.com + - media.example.com + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - equal: + path: spec.hostnames[0] + value: jellyfin.example.com + - equal: + path: spec.hostnames[1] + value: media.example.com + + - it: should create rules with path matches + set: + httpRoute.enabled: true + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: /jellyfin + asserts: + - equal: + path: spec.rules[0].matches[0].path.type + value: PathPrefix + - equal: + path: spec.rules[0].matches[0].path.value + value: /jellyfin + + - it: should set backendRefs to jellyfin service + set: + httpRoute.enabled: true + service.port: 8096 + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - equal: + path: spec.rules[0].backendRefs[0].name + value: RELEASE-NAME-jellyfin + - equal: + path: spec.rules[0].backendRefs[0].port + value: 8096 + + - it: should support multiple rules + set: + httpRoute.enabled: true + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + - matches: + - path: + type: Exact + value: /api + asserts: + - lengthEqual: + path: spec.rules + count: 2 + - equal: + path: spec.rules[0].matches[0].path.value + value: / + - equal: + path: spec.rules[1].matches[0].path.value + value: /api + + - it: should support multiple matches in single rule + set: + httpRoute.enabled: true + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: /api + - path: + type: PathPrefix + value: /web + asserts: + - lengthEqual: + path: spec.rules[0].matches + count: 2 + - equal: + path: spec.rules[0].matches[0].path.value + value: /api + - equal: + path: spec.rules[0].matches[1].path.value + value: /web + + - it: should use custom service port + set: + httpRoute.enabled: true + service.port: 9000 + httpRoute.parentRefs: + - name: my-gateway + httpRoute.rules: + - matches: + - path: + type: PathPrefix + value: / + asserts: + - equal: + path: spec.rules[0].backendRefs[0].port + value: 9000 diff --git a/charts/jellyfin/values.yaml b/charts/jellyfin/values.yaml index efaa14f..fe9826f 100644 --- a/charts/jellyfin/values.yaml +++ b/charts/jellyfin/values.yaml @@ -139,6 +139,25 @@ ingress: # hosts: # - chart-example.local +# -- HTTPRoute configuration for Gateway API. See: https://gateway-api.sigs.k8s.io/ +httpRoute: + enabled: false + annotations: {} + # -- Gateway references to attach this HTTPRoute to + parentRefs: [] + # - name: my-gateway + # namespace: gateway-system + # sectionName: https + # -- Hostnames to match for this HTTPRoute + hostnames: [] + # - jellyfin.example.com + # -- Rules for routing traffic + rules: + - matches: + - path: + type: PathPrefix + value: / + # -- Resource requests and limits for the Jellyfin container. resources: {} # limits: