# When you made a change to this YAML, please validate with https://editor.swagger.io
openapi: 3.0.3
info:
  version: 1.1.1
  title: RootlessKit API
servers:
  - url: 'http://rootlesskit/v1'
    description: Local UNIX socket server. The host part of the URL is ignored.
paths:
# /info: API >= 1.1.0
  /info:
    get:
      responses:
        '200':
          description: Info. Available since API 1.1.0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Info'
  /ports:
    get:
      responses:
        '200':
          description: An array of PortStatus
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PortStatuses'
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PortSpec'
      responses:
        '201':
          description: PortStatus with ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PortStatus'
  '/ports/{id}':
    delete:
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Null response
components:
  schemas:
    Proto:
      type: string
      description: "protocol for listening. Corresponds to Go's net.Listen. The strings with \"4\" and \"6\" suffixes were introduced in API 1.1.0."
      enum:
        - tcp
        - tcp4
        - tcp6
        - udp
        - udp4
        - udp6
        - sctp
        - sctp4
        - sctp6
    PortSpec:
      required:
        - proto
      properties:
        proto:
          $ref: '#/components/schemas/Proto'
        parentIP:
          type: string
        parentPort:
          type: integer
          format: int32
          minimum: 1
          maximum: 65535
        childIP:
          type: string
# future version may support requests with parentPort<=0 for automatic port assignment
        childPort:
          type: integer
          format: int32
          minimum: 1
          maximum: 65535
    PortStatus:
      required:
        - id
      properties:
        id:
          type: integer
          format: int64
        spec:
          $ref: '#/components/schemas/PortSpec'
    PortStatuses:
      type: array
      items:
        $ref: '#/components/schemas/PortStatus'
# Info: API >= 1.1.0
    Info:
      required:
        - apiVersion
        - version
        - stateDir
        - childPID
      properties:
        apiVersion:
          type: string
          description: "API version, without \"v\" prefix"
          example: "1.1.0"
        version:
          type: string
          description: "Implementation version, without \"v\" prefix"
          example: "0.42.0-beta.1+dev"
        stateDir:
          type: string
          description: "state dir"
          example: "/run/user/1000/rootlesskit"
        childPID:
          type: integer
          description: "child PID"
          example: 10042
        networkDriver:
          $ref: '#/components/schemas/NetworkDriverInfo'
        portDriver:
          $ref: '#/components/schemas/PortDriverInfo'
    NetworkDriverInfo:
      required:
        - driver
      properties:
        driver:
          type: string
          description: "network driver. Empty when --net=host."
          example: "slirp4netns"
# TODO: return TAP info
        dns:
          type: array
          description: "DNS addresses"
          items:
            type: string
          example: ["10.0.2.3"]
        childIP:
          type: string
          description: "Child IP (v4)"
          example: "10.0.2.100"
        dynamicChildIP:
          type: boolean
          description: "Child IP may change"
    PortDriverInfo:
      required:
        - driver
        - supportedProtos
      properties:
        driver:
          type: string
          description: "port driver"
          example: "builtin"
        protos:
          type: array
          description: "The supported protocol strings for listening ports"
          example: ["tcp","udp"]
          items:
            $ref: '#/components/schemas/Proto'
        disallowLoopbackChildIP:
          type: boolean
          description: "If this field is set to true, loopback IP such as 127.0.0.1 cannot be specified as a child IP"
