# --------------------------------------------------------------
# Configuration file for the Kubeflow Notebooks UI.
#
# About the `readOnly` configs:
#  - when `readOnly` is set to "true", the respective option
#    will be disabled for users and only set by the admin
#  - when 'readOnly' is missing, it defaults to 'false'
# --------------------------------------------------------------

spawnerFormDefaults:
  ################################################################
  # Container Images
  ################################################################
  # if users can input custom images, or only select from dropdowns
  allowCustomImage: true

  # if the registry of the container image is hidden from display
  hideRegistry: true

  # if the tag of the container image is hidden from display
  hideTag: false

  # configs for the ImagePullPolicy
  imagePullPolicy:
    readOnly: false

    # the default ImagePullPolicy
    # (possible values: "Always", "IfNotPresent", "Never")
    value: IfNotPresent

  ################################################################
  # Jupyter-like Container Images
  #
  # NOTES:
  #  - the `image` section is used for "Jupyter-like" apps whose
  #    HTTP path is configured by the "NB_PREFIX" environment variable
  ################################################################
  image:
    # the default container image
    value: ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-scipy:v1.10.0

    # the list of available container images in the dropdown
    options:
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-scipy:v1.10.0
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-pytorch-full:v1.10.0
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-pytorch-cuda-full:v1.10.0
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-pytorch-gaudi-full:v1.10.0
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-tensorflow-full:v1.10.0
    - ghcr.io/kubeflow/kubeflow/notebook-servers/jupyter-tensorflow-cuda-full:v1.10.0

  ################################################################
  # VSCode-like Container Images (Group 1)
  #
  # NOTES:
  #  - the `imageGroupOne` section is used for "VSCode-like" apps that
  #    expose themselves under the HTTP root path "/" and support path
  #    rewriting without breaking
  #  - the annotation `notebooks.kubeflow.org/http-rewrite-uri: "/"` is
  #    set on Notebooks spawned by this group, to make Istio rewrite
  #    the path of HTTP requests to the HTTP root
  ################################################################
  imageGroupOne:
    # the default container image
    value: ghcr.io/kubeflow/kubeflow/notebook-servers/codeserver-python:v1.10.0

    # the list of available container images in the dropdown
    options:
    - ghcr.io/kubeflow/kubeflow/notebook-servers/codeserver-python:v1.10.0

  ################################################################
  # RStudio-like Container Images (Group 2)
  #
  # NOTES:
  #  - the `imageGroupTwo` section is used for "RStudio-like" apps whose
  #    HTTP path is configured by the "X-RStudio-Root-Path" header
  #  - the annotation `notebooks.kubeflow.org/http-rewrite-uri: "/"` is
  #    set on Notebooks spawned by this group, to make Istio rewrite
  #    the path of HTTP requests to the HTTP root
  #  - the annotation `notebooks.kubeflow.org/http-headers-request-set` is
  #    set on Notebooks spawned by this group, such that Istio injects the
  #    "X-RStudio-Root-Path" header to all request
  ################################################################
  imageGroupTwo:
    # the default container image
    value: ghcr.io/kubeflow/kubeflow/notebook-servers/rstudio-tidyverse:v1.10.0

    # the list of available container images in the dropdown
    options:
    - ghcr.io/kubeflow/kubeflow/notebook-servers/rstudio-tidyverse:v1.10.0

  ################################################################
  # CPU Resources
  ################################################################
  cpu:
    readOnly: false

    # the default cpu request for the container
    value: "0.5"

    # a factor by which to multiply the CPU request calculate the cpu limit
    # (to disable cpu limits, set as "none")
    limitFactor: "1.2"

  ################################################################
  # Memory Resources
  ################################################################
  memory:
    readOnly: false

    # the default memory request for the container
    value: "1.0Gi"

    # a factor by which to multiply the memory request calculate the memory limit
    # (to disable memory limits, set as "none")
    limitFactor: "1.2"

  ################################################################
  # GPU/Device-Plugin Resources
  ################################################################
  gpus:
    readOnly: false

    # configs for gpu/device-plugin limits of the container
    # https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/#using-device-plugins
    value:
      # the `limitKey` of the default vendor
      # (to have no default, set as "")
      vendor: ""

      # the list of available vendors in the dropdown
      #  `limitsKey` - what will be set as the actual limit
      #  `uiName` - what will be displayed in the dropdown UI
      vendors:
      - limitsKey: "nvidia.com/gpu"
        uiName: "NVIDIA"
      - limitsKey: "amd.com/gpu"
        uiName: "AMD"
      - limitsKey: "habana.ai/gaudi"
        uiName: "Intel Gaudi"

      # the default value of the limit
      # (possible values: "none", "1", "2", "4", "8")
      num: "none"

  ################################################################
  # Workspace Volumes
  ################################################################
  workspaceVolume:
    readOnly: false

    # the default workspace volume to be created and mounted
    # (to have no default, set `value: null`)
    value:
      mount: /home/jovyan

      # pvc configs for creating new workspace volumes
      # https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.24/#persistentvolumeclaim-v1-core
      newPvc:
        metadata:
          # "{notebook-name}" is replaced with the Notebook name
          name: "{notebook-name}-workspace"
        spec:
          #storageClassName: my-storage-class
          resources:
            requests:
              storage: 5Gi
          accessModes:
          - ReadWriteOnce

  ################################################################
  # Data Volumes
  ################################################################
  dataVolumes:
    readOnly: false

    # a list of additional data volumes to be created and/or mounted
    value: []
    #value:
    #  - mount: /home/jovyan/datavol-1
    #    newPvc:
    #      metadata:
    #        name: "{notebook-name}-datavol-1"
    #      spec:
    #        resources:
    #          requests:
    #            storage: 5Gi
    #        accessModes:
    #          - ReadWriteOnce
    #
    #  - mount: /home/jovyan/datavol-1
    #    existingSource:
    #      persistentVolumeClaim:
    #        claimName: "test-pvc"

  ################################################################
  # Affinity
  ################################################################
  affinityConfig:
    readOnly: false

    # the `configKey` of the default affinity config
    # (to have no default, set as "")
    # (if `readOnly`, the default `value` will be the only accessible option)
    value: ""

    # the list of available affinity configs in the dropdown
    options: []
    #options:
    #  - configKey: "dedicated_node_per_notebook"
    #    displayName: "Dedicated Node Per Notebook"
    #    affinity:
    #      # Require a Node with label `lifecycle=kubeflow-notebook`
    #      nodeAffinity:
    #        requiredDuringSchedulingIgnoredDuringExecution:
    #          nodeSelectorTerms:
    #            - matchExpressions:
    #                - key: "lifecycle"
    #                  operator: "In"
    #                  values:
    #                    - "kubeflow-notebook"
    #
    #      # Require a Node WITHOUT an existing Pod having `notebook-name` label
    #      podAntiAffinity:
    #        requiredDuringSchedulingIgnoredDuringExecution:
    #          - labelSelector:
    #              matchExpressions:
    #                - key: "notebook-name"
    #                  operator: "Exists"
    #            topologyKey: "kubernetes.io/hostname"
    #            # WARNING: `namespaceSelector` is Beta in 1.22 and Stable in 1.24,
    #            #          setting to {} is required for affinity to work across Namespaces
    #            namespaceSelector: {}

  ################################################################
  # Tolerations
  ################################################################
  tolerationGroup:
    readOnly: false

    # the `groupKey` of the default toleration group
    # (to have no default, set as "")
    # (if `readOnly`, the default `value` will be the only accessible option)
    value: ""

    # the list of available toleration groups in the dropdown
    options: []
    #options:
    #  - groupKey: "group_1"
    #    displayName: "4 CPU 8Gb Mem at ~$X.XXX USD per day"
    #    tolerations:
    #      - key: "dedicated"
    #        operator: "Equal"
    #        value: "kubeflow-c5.xlarge"
    #        effect: "NoSchedule"
    #
    #  - groupKey: "group_2"
    #    displayName: "8 CPU 16Gb Mem at ~$X.XXX USD per day"
    #    tolerations:
    #      - key: "dedicated"
    #        operator: "Equal"
    #        value: "kubeflow-c5.2xlarge"
    #        effect: "NoSchedule"
    #
    #  - groupKey: "group_3"
    #    displayName: "16 CPU 32Gb Mem at ~$X.XXX USD per day"
    #    tolerations:
    #      - key: "dedicated"
    #        operator: "Equal"
    #        value: "kubeflow-c5.4xlarge"
    #        effect: "NoSchedule"
    #
    #  - groupKey: "group_4"
    #    displayName: "32 CPU 256Gb Mem at ~$X.XXX USD per day"
    #    tolerations:
    #      - key: "dedicated"
    #        operator: "Equal"
    #        value: "kubeflow-r5.8xlarge"
    #        effect: "NoSchedule"

  ################################################################
  # Shared Memory
  ################################################################
  shm:
    readOnly: false

    # the default state of the "Enable Shared Memory" toggle
    value: true

  ################################################################
  # PodDefaults
  ################################################################
  configurations:
    readOnly: false

    # the list of PodDefault names that are selected by default
    # (take care to ensure these PodDefaults exist in Profile Namespaces)
    value: []
    #value:
    #  - my-pod-default

  ################################################################
  # Environment
  #
  # NOTE:
  #  - these configs are only used by the ROK "flavor" of the UI
  ################################################################
  environment:
    readOnly: false
    value: {}
