groups:
  - name: "Container Images"
    description: "Image to be used for container"
  - name: "Container Entrypoint"
    description: "Configuration of the executable that will be run when the container is started"
  - name: "Container Environment Variables"
    description: "Set the environment that will be visible to the container"
  - name: "Networking"
    description: "Configure networking for container"
  - name: "Port Forwarding"
    description: "Configure ports to forward to workload"
  - name: "Storage"
    description: "Persist and share data that is separate from the lifecycle of the container"
  - name: "Health Check"
    description: "Define mechanism to periodically probe the container to ensure it's functioning as desired"
  - name: "Workload Details"
    description: "Configure how workload should be deployed"
  - name: "Scaling/Upgrade Policy"
    description: "Configure how pods are replaced when configuration is upgraded"
  - name: "Restart Policy"
    description: "Configure when pod should be restarted in case of failure"
  - name: "Resource Reservation"
    description: "Specify resources to be allocated to workload"
  - name: "Resource Limits"
    description: "Set CPU/memory limits for Kubernetes Pod"
  - name: "Portal Configuration"
    description: "Configure UI web portal"

questions:
  - variable: enableUIPortal
    label: "Enable WebUI Portal (only supported in TrueNAS SCALE Bluefin)"
    description: "Enable webui portal for easier access to workload ( Only valid for TrueNAS SCALE Bluefin )"
    group: "Portal Configuration"
    schema:
      type: boolean
      default: false
  - variable: portalDetails
    label: "WebUI Portal"
    description: "Configure WebUI Portal"
    group: "Portal Configuration"
    schema:
      show_if: [["enableUIPortal", "=", true]]
      type: dict
      attrs:
        - variable: portalName
          label: "Portal Name"
          description: "Specify a UI Portal name to use which would be displayed in the UI"
          schema:
            type: string
            default: "Web Portal"
        - variable: protocol
          label: "Protocol for Portal"
          description: "Specify protocol for portal"
          schema:
            type: string
            default: "http"
            enum:
              - value: "http"
                description: "HTTP Protocol"
              - value: "https"
                description: "HTTPS Protocol"
        - variable: useNodeIP
          label: "Use Node IP for Portal IP/Domain"
          schema:
            type: boolean
            default: true
        - variable: host
          description: "IP/Domain to use for accessing the portal"
          label: "Portal IP/Domain"
          schema:
            show_if: [["useNodeIP", "=", false]]
            type: string
            $ref:
              - "definitions/nodeIP"
        - variable: port
          label: "Port"
          description: "Specify port to be used for Portal access"
          schema:
            type: int
            max: 65535
            default: 15000

  # Workload type
  - variable: workloadType
    description: "Please specify type of workload to deploy"
    label: "Workload Type"
    group: "Workload Details"
    schema:
      type: string
      hidden: true
      default: "Deployment"
      required: true
      enum:
        - value: "Deployment"
          description: "Deploy a Deployment workload"
        - value: "Job"
          description: "Deploy job workload"
        - value: "CronJob"
          description: "Deploy cronjob workload"

  # Cronjob schedule
  - variable: cronSchedule
    label: "Cron Schedule"
    group: "Workload Details"
    schema:
      hidden: true
      type: cron
      show_if: [["workloadType", "=", "CronJob"]]
      default:
        minute: "5"

  # Image related
  - variable: image
    description: "Docker Image Details"
    label: "Docker Image"
    group: "Container Images"
    schema:
      type: dict
      required: true
      attrs:
        - variable: repository
          description: "Docker image repository"
          label: "Image repository"
          schema:
            type: string
            required: true
        - variable: tag
          description: "Tag to use for specified image"
          label: "Image Tag"
          schema:
            type: string
            default: "latest"
        - variable: pullPolicy
          description: "Docker Image Pull Policy"
          label: "Image Pull Policy"
          schema:
            type: string
            default: "IfNotPresent"
            enum:
              - value: "IfNotPresent"
                description: "Only pull image if not present on host"
              - value: "Always"
                description: "Always pull image even if present on host"
              - value: "Never"
                description: "Never pull image even if it's not present on host"

  # Update strategy
  - variable: updateStrategy
    description: "Upgrade Policy"
    label: "Update Strategy"
    group: "Scaling/Upgrade Policy"
    schema:
      type: string
      show_if: [["workloadType", "=", "Deployment"]]
      default: "Recreate"
      enum:
        - value: "RollingUpdate"
          description: "Create new pods and then kill old ones"
        - value: "Recreate"
          description: "Kill existing pods before creating new ones"

  # Restart Policy
  - variable: jobRestartPolicy
    description: "Restart Policy for Job"
    label: "Restart Policy"
    group: "Restart Policy"
    schema:
      hidden: true
      type: string
      default: "OnFailure"
      show_if: [["workloadType", "!=", "Deployment"]]
      enum:
        - value: "OnFailure"
          description: "Only restart job if it fails"
        - value: "Never"
          description: "Never restart job even if it fails"

  # Configurable CMD / Entrypoint / Environment Variables
  - variable: containerCommand
    description: "Commands to execute inside container overriding image CMD default"
    label: "Container CMD"
    group: "Container Entrypoint"
    schema:
      type: list
      items:
        - variable: command
          description: "Container Command"
          label: "Command"
          schema:
            type: string
  - variable: containerArgs
    description: "Specify arguments for container command"
    label: "Container Args"
    group: "Container Entrypoint"
    schema:
      type: list
      items:
        - variable: arg
          description: "Container Arg"
          label: "Arg"
          schema:
            type: string
  - variable: containerEnvironmentVariables
    description: "Container Environment Variables"
    label: "Container Environment Variables"
    group: "Container Environment Variables"
    schema:
      type: list
      items:
        - variable: environmentVariable
          description: "Container Environment Variable"
          label: "Container Environment Variable"
          schema:
            type: dict
            attrs:
              - variable: name
                description: "Environment Variable Name"
                label: "Environment Variable Name"
                schema:
                  type: string
                  required: true
              - variable: value
                description: "Environment Variable Value"
                label: "Environment Variable Value"
                schema:
                  type: string
                  required: true

  # Networking options
  - variable: externalInterfaces
    description: "Add External Interfaces"
    label: "Add external Interfaces"
    group: "Networking"
    schema:
      type: list
      items:
        - variable: interfaceConfiguration
          description: "Interface Configuration"
          label: "Interface Configuration"
          schema:
            type: dict
            $ref:
              - "normalize/interfaceConfiguration"
            attrs:
              - variable: hostInterface
                description: "Please specify host interface"
                label: "Host Interface"
                schema:
                  type: string
                  required: true
                  $ref:
                    - "definitions/interface"
              - variable: ipam
                description: "Define how IP Address will be managed"
                label: "IP Address Management"
                schema:
                  type: dict
                  required: true
                  attrs:
                    - variable: type
                      description: "Specify type for IPAM"
                      label: "IPAM Type"
                      schema:
                        type: string
                        required: true
                        enum:
                          - value: "dhcp"
                            description: "Use DHCP"
                          - value: "static"
                            description: "Use static IP"
                        show_subquestions_if: "static"
                        subquestions:
                          - variable: staticIPConfigurations
                            label: "Static IP Addresses"
                            schema:
                              type: list
                              items:
                                - variable: staticIP
                                  label: "Static IP"
                                  schema:
                                    type: ipaddr
                                    cidr: true
                          - variable: staticRoutes
                            label: "Static Routes"
                            schema:
                              type: list
                              items:
                                - variable: staticRouteConfiguration
                                  label: "Static Route Configuration"
                                  schema:
                                    type: dict
                                    attrs:
                                      - variable: destination
                                        label: "Destination"
                                        schema:
                                          type: ipaddr
                                          cidr: true
                                          required: true
                                      - variable: gateway
                                        label: "Gateway"
                                        schema:
                                          type: ipaddr
                                          cidr: false
                                          required: true

  - variable: dnsPolicy
    label: "DNS Policy"
    description: "Default behaviour is where Pod inherits the name resolution configuration from the node that the pods run on, if None is specified, It allows a Pod to ignore DNS settings from the Kubernetes environment."
    group: "Networking"
    schema:
      type: string
      default: "Default"
      enum:
        - value: "Default"
          description: "Use Default DNS Policy where Pod will inherit the name resolution configuration from the node."
        - value: "ClusterFirst"
          description: >
            "Kubernetes internal DNS will be prioritised and resolved first. If the domain does not resolve with internal
            kubernetes DNS, the DNS query will be forwarded to the upstream nameserver inherited from the node. This is
            useful if the workload needs to access other service(s)/workload(s) using kubernetes internal DNS."
        - value: "ClusterFirstWithHostNet"
          description: "For Pods running with hostNetwork and wanting to prioritise internal kubernetes DNS should make use of this policy."
        - value: "None"
          description: "Ignore DNS settings from the Kubernetes cluster"
  - variable: dnsConfig
    label: "DNS Configuration"
    group: "Networking"
    description: "Specify custom DNS configuration which will be applied to the pod"
    schema:
      type: dict
      attrs:
        - variable: nameservers
          label: "Nameservers"
          schema:
            default: []
            type: list
            items:
              - variable: nameserver
                label: "Nameserver"
                schema:
                  type: string
        - variable: searches
          label: "Searches"
          schema:
            default: []
            type: list
            items:
              - variable: search
                label: "Search Entry"
                schema:
                  type: string
        - variable: options
          label: "DNS Options"
          schema:
            type: list
            items:
              - variable: optionsEntry
                label: "Option Entry Configuration"
                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: hostNetwork
    label: "Provide access to node network namespace for the workload"
    group: "Networking"
    schema:
      type: boolean
      default: false
      show_if: [["externalInterfaces", "=", []]]

  - variable: hostPortsList
    label: "Specify host ports for the workload"
    description: "Only use host ports if scaling of a workload is not required"
    group: "Networking"
    schema:
      show_if: [["updateStrategy", "=", "Recreate"]]
      type: list
      hidden: true
      items:
        - variable: hostPortConfiguration
          label: "Host Port Configuration"
          schema:
            type: dict
            attrs:
              - variable: containerPort
                label: "Container Port"
                schema:
                  type: string
                  required: true
              - variable: hostPort
                label: "Host Port"
                schema:
                  type: string
                  required: true

  - variable: portForwardingList
    label: "Specify Node ports to forward to workload"
    group: "Port Forwarding"
    description: "Specify ports of node and workload to forward traffic from node port to workload port"
    schema:
      type: list
      show_if: [["hostNetwork", "=", false]]
      items:
        - variable: portForwarding
          label: "Port Forwarding Configuration"
          schema:
            type: dict
            attrs:
              - variable: containerPort
                label: "Container Port"
                schema:
                  type: int
                  required: true
              - variable: nodePort
                label: "Node Port"
                schema:
                  type: int
                  required: true
                  min: 9000
                  max: 65535
              - variable: protocol
                label: "Protocol"
                schema:
                  type: string
                  default: "TCP"
                  enum:
                    - value: "TCP"
                      description: "TCP Protocol"
                    - value: "UDP"
                      description: "UDP Protocol"

  # Storage Options
  # Host path based volumes
  - variable: hostPathVolumes
    label: "Host Path Volumes"
    group: "Storage"
    schema:
      type: list
      items:
        - variable: hostPathConfiguration
          label: "Host Path Configuration"
          schema:
            type: dict
            attrs:
              - variable: hostPath
                label: "Host Path"
                schema:
                  type: hostpath
                  required: true
              - variable: mountPath
                label: "Mount Path"
                description: "Path where host path will be mounted inside the pod"
                schema:
                  type: path
                  required: true
              - variable: readOnly
                label: "Read Only"
                schema:
                  type: boolean
                  default: false

  - variable: emptyDirVolumes
    label: "Memory Backed Volumes"
    description: "Mount memory based temporary volumes for fast access i.e consuming /dev/shm"
    group: "Storage"
    schema:
      type: list
      items:
        - variable: emptyDirVolume
          label: "Memory Backed Volume"
          schema:
            type: dict
            attrs:
              - variable: mountPath
                label: "Mount Path"
                description: "Path where temporary path will be mounted inside the pod"
                schema:
                  type: path
                  required: true

  # Volumes
  - variable: volumes
    label: "Volumes"
    group: "Storage"
    schema:
      type: list
      items:
        - variable: volume
          label: "Volume"
          schema:
            type: dict
            $ref:
              - "normalize/ixVolume"
            attrs:
              - variable: mountPath
                label: "Mount Path"
                description: "Path where the volume will be mounted inside the pod"
                schema:
                  type: path
                  required: true
              - variable: datasetName
                label: "Dataset Name"
                schema:
                  type: string
                  required: true

  # Pod Probes
  # Liveness Probe
  - variable: livenessProbe
    label: "Liveness Probe"
    description: "Configure Liveness Probe"
    group: "Health Check"
    schema:
      hidden: true
      type: dict
      default: null
      "null": true
      attrs:
        - variable: command
          label: "Liveness command"
          description: "Specify a command to determine liveness of pod"
          schema:
            type: list
            required: true
            items:
              - variable: commandArg
                label: "Command Arg"
                schema:
                  type: string
        - variable: initialDelaySeconds
          label: "Seconds Delay"
          description: "Seconds to delay the first liveness probe"
          schema:
            type: int
            default: 5
        - variable: periodSeconds
          label: "Period Seconds"
          description: "Specify number of seconds to run liveness probe"
          schema:
            type: int
            default: 10

  # Specify GPU configuration
  - variable: gpuConfiguration
    label: "GPU Configuration"
    group: "Resource Reservation"
    schema:
      type: dict
      $ref:
        - "definitions/gpuConfiguration"
      attrs: []

  - variable: tty
    label: "Enable TTY"
    description: "Determines whether containers in a pod runs with TTY enabled. By default pod has it disabled."
    group: "Workload Details"
    schema:
      type: boolean
      default: false

  - variable: stdin
    label: "Enable STDIN"
    description: "Determines whether containers in a pod runs with stdin enabled. By default pod has it disabled."
    group: "Workload Details"
    schema:
      type: boolean
      default: false

  - variable: securityContext
    label: "Security Context"
    group: "Workload Details"
    schema:
      type: dict
      attrs:
        - variable: privileged
          label: "Privileged Mode"
          description: "Determines if any container in a pod can enable privileged mode. By default a container is not allowed to access any devices on the host, but a 'privileged' container is given access to all devices on the host. This allows the container nearly all the same access as processes running on the host."
          schema:
            type: boolean
            default: false
        - variable: capabilities
          label: "Capabilities"
          description: "With Linux capabilities, you can grant certain privileges to a process without granting all the privileges of the root user."
          schema:
            type: list
            items:
              - variable: capability
                description: "Add Capability"
                label: "Add Capability"
                schema:
                  type: string
        - variable: enableRunAsUser
          label: "Configure Container User and Group ID"
          description: "Configure security context runAsUser and runAsGroup variables"
          schema:
            type: boolean
            default: false
            show_subquestions_if: true
            subquestions:
              - variable: runAsUser
                label: "Run Container As User"
                description: "Configure user id for container."
                schema:
                  type: int
                  default: 568
              - variable: runAsGroup
                label: "Run Container As Group"
                description: "Configure group id for container."
                schema:
                  type: int
                  default: 568


  - variable: enableResourceLimits
    label: "Enable Pod resource limits"
    group: "Resource Limits"
    schema:
      type: boolean
      default: false
  - variable: cpuLimit
    label: "CPU Limit"
    description: "CPU resource limit allow  plain integer values with suffix m(milli) e.g 1000m, 100."
    group: "Resource Limits"
    schema:
      type: string
      show_if: [["enableResourceLimits", "=", true]]
      valid_chars: "^\\d+(?:\\.\\d+(?!.*m$)|m?$)"
      default: "4000m"
  - variable: memLimit
    label: "Memory Limit"
    group: "Resource Limits"
    description: "Memory limits is specified by number of bytes. Followed by quantity suffix like E,P,T,G,M,k and Ei,Pi,Ti,Mi,Gi,Ki can also be used. e.g 129e6, 129M,  128974848000m, 123Mi"
    schema:
      type: string
      show_if: [["enableResourceLimits", "=", true]]
      valid_chars: "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$"
      default: "8Gi"
