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: "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"

questions:
  # Workload type
  - variable: workloadType
    description: "Please specify type of workload to deploy"
    label: "Workload Type"
    group: "Workload Details"
    schema:
      type: string
      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:
      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: "RollingUpdate"
      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 workload"
    label: "Restart Policy"
    group: "Restart Policy"
    schema:
      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"
        - value: "None"
          description: "Ignore DNS settings from the Kuberentes 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: hostNetwork
    label: "Provide access to node network namespace for the workload"
    group: "Networking"
    schema:
      type: boolean
      default: false

  - 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
      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: "Networking"
    description: "Specify ports of node and workload to forward traffic from node port to workload port"
    schema:
      type: list
      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

  # 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:
      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: 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
