openapi: "3.0.0"

info:
  title: "Replication / Recovery"
  description: >-
    This API allows replication and recovery of ZKAPAuthorizer internal state.
    Replication is in a single direction from this single Tahoe-LAFS node to
    the Tahoe-LAFS grid.
  version: "1.0.0"

paths:
  /storage-plugins/privatestorageio-zkapauthz-v1/recover:
    post:
      description: >-
        Restore from a previously configured replica.

        This is only valid when ZKAPAuthorizer has no local state yet.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/ReplicaConfiguration"

      responses:
        "500": # INTERNAL SERVER ERROR
          description: >-
            Recovery from the replica has failed for some reason.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

        "409": # CONFLICT
          description: >-
            Recovery is not possible at this time because local state already
            exists in the database.  Recover into a new, empty ZKAPAuthorizer
            installation only.

        "404": # NOT FOUND
          description: >-
            Recovery from the replica has failed because the recovery data
            cannot be retrieved using the given capability.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

        "200": # OK
          description: >-
            Recovery from the replica has succeeded.
          content:
            application/json:
              schema:
                type: "object"
                properties: {}

  /storage-plugins/privatestorageio-zkapauthz-v1/replicate:
    get:
      description: >-
        Get this node's replica configuration.
      responses:
        404: # NOT FOUND
          description: >-
            This node is not configuration for replication.

        200: # OK
          description: >-
            Information about replica configuration is available and included
            in the response.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReplicaConfiguration"

    post:
      description: >-
        Configure an on-grid replica.

        Once a replica has been configured this node will keep that replica
        up-to-date with local state changes.
      responses:
        201: # CREATED
          description: >-
            The replication system is now configured.

            A replica has not necessarily been created yet but ZKAPAuthorizer
            will begin creating one now.  The response includes the recovery
            capability for that replica.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReplicaConfiguration"

        409: # CONFLICT
          description: >-
            The replication system was already configured.

            The response includes the recovery capability for the replica that
            is being maintained.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReplicaConfiguration"

components:
  schemas:
    Error:
      type: "object"
      properties:
        details:
          type: "string"
          description: >-
            A free-form text field which may give further details about
            the failure.

    ReplicaConfiguration:
      type: "object"
      properties:
        recovery-capability:
          type: "string"
          description: >-
            The Tahoe-LAFS read-only capability for the recovery data.

            This is the capability which can be submitted in order to initiate
            a recovery from the replica.



  responses:
    ErrorResponse:
      description: >-
        Something broken.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Error"