# ===========================================================================
# Local Persistent Volumes — backed by /volume/LAB01/{folder}
# These use the 'local' volume type, which requires node affinity.
# ===========================================================================

# --- StorageClass for local volumes (no dynamic provisioning) ---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain

---
# ===========================================================================
# PV + PVC: Jellyfin Configuration
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-config-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: config
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /volume/LAB01/jellyfin-config
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/os
              operator: In
              values:
                - linux

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-config-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      storage-role: config

---
# ===========================================================================
# PV + PVC: Jellyfin Cache (metadata images, etc.)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-cache-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: cache
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /volume/LAB01/jellyfin-cache
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/os
              operator: In
              values:
                - linux

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-cache-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      storage-role: cache

---
# ===========================================================================
# PV + PVC: Jellyfin Transcode Scratch Space
# Transcoding temporary files are written here. Size depends on concurrent
# streams — 50Gi is a reasonable starting point for a home lab.
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-transcode-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: transcode
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /volume/LAB01/jellyfin-transcode
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/os
              operator: In
              values:
                - linux

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-transcode-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 50Gi
  selector:
    matchLabels:
      storage-role: transcode

---
# ===========================================================================
# NFS Persistent Volumes — Media Libraries
# IMPORTANT: Replace the placeholder values below with your actual NFS server
# IP and export paths.
# ===========================================================================

# --- StorageClass for NFS (manual provisioning) ---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Retain

---
# ===========================================================================
# PV + PVC: Music Library (NFS, read-only)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-music-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: music
spec:
  capacity:
    # Capacity is advisory for NFS; set to a value that reflects your share size
    storage: 500Gi
  volumeMode: Filesystem
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THESE VALUES =====
    server: "NFS_SERVER_IP"
    path: "MUSIC_NFS_PATH"
    readOnly: true
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr
    - rsize=1048576
    - wsize=1048576

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-music-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadOnlyMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 500Gi
  selector:
    matchLabels:
      storage-role: music

---
# ===========================================================================
# PV + PVC: Video Library (NFS, read-only)
# ===========================================================================
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jellyfin-video-pv
  labels:
    app.kubernetes.io/name: jellyfin
    storage-role: video
spec:
  capacity:
    storage: 2Ti
  volumeMode: Filesystem
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    # ===== EDIT THESE VALUES =====
    server: "NFS_SERVER_IP"
    path: "VIDEO_NFS_PATH"
    readOnly: true
  mountOptions:
    - nfsvers=4.1
    - hard
    - intr
    - rsize=1048576
    - wsize=1048576

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jellyfin-video-pvc
  namespace: jellyfin
  labels:
    app.kubernetes.io/name: jellyfin
spec:
  accessModes:
    - ReadOnlyMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 2Ti
  selector:
    matchLabels:
      storage-role: video
