#  ============LICENSE_START=======================================================
#  Copyright (C) 2021 Nordix Foundation
#  ================================================================================
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#
#  SPDX-License-Identifier: Apache-2.0
#  ============LICENSE_END=========================================================

openapi: 3.0.1
info:
  title: ONAP Open API v3 Configuration Persistence Service
  description: Configuration Persistence Service is a Model Driven Generic Database
  version: 1.0.0
  contact:
    name: ONAP
    url: 'https://onap.readthedocs.io'
    email: onap-discuss@lists.onap.org
  license:
    name: Apache 2.0
    url: 'http://www.apache.org/licenses/LICENSE-2.0'
  x-planned-retirement-date: '202212'
  x-component: Modeling
  x-logo:
    url: cps_logo.png
servers:
  - url: '//localhost:8088'
tags:
  - name: cps-admin
    description: cps Admin
  - name: cps-data
    description: cps Data
paths:
  /v1/dataspaces:
    post:
      description: Create a new dataspace
      tags:
        - cps-admin
      summary: Create a dataspace
      operationId: createDataspace
      parameters:
        - name: dataspace-name
          in: query
          description: dataspace-name
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Created
          content:
            text/plain:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}':
    delete:
      description: Delete the given dataspace - DRAFT
      tags:
        - cps-admin
      summary: Delete a dataspace
      operationId: deleteDataspace
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '204':
          description: No Content
          content: {}
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/anchors':
    get:
      description: 'Read all anchors, given a dataspace'
      tags:
        - cps-admin
      summary: Get anchors
      operationId: getAnchors
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    post:
      description: Create a new anchor in the given dataspace
      tags:
        - cps-admin
      summary: Create an anchor
      operationId: createAnchor
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: schema-set-name
          in: query
          description: schema-set-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: query
          description: anchor-name
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Created
          content:
            text/plain:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}':
    get:
      description: Read an anchor given an anchor name and a dataspace
      tags:
        - cps-admin
      summary: Get an anchor
      operationId: getAnchor
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    delete:
      description: Delete an anchor given an anchor name and a dataspace - DRAFT
      tags:
        - cps-admin
      summary: Delete an anchor
      operationId: deleteAnchor
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '204':
          description: No Content
          content: {}
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/schema-sets':
    post:
      description: Create a new schema set in the given dataspace
      tags:
        - cps-admin
      summary: Create a schema set
      operationId: createSchemaSet
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: schema-set-name
          in: query
          description: schema-set-name
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              required:
                - file
              properties:
                multipartFile:
                  type: string
                  description: multipartFile
                  format: binary
                  example: 'http://example.com/examples/example.yang'
      responses:
        '201':
          description: Created
          content:
            text/plain:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/schema-sets/{schema-set-name}':
    get:
      description: Read a schema set given a schema set name and a dataspace
      tags:
        - cps-admin
      summary: Get a schema set
      operationId: getSchemaSet
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: schema-set-name
          in: path
          description: schema-set-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    delete:
      description: Delete a schema set given a schema set name and a dataspace
      tags:
        - cps-admin
      summary: Delete a schema set
      operationId: deleteSchemaSet
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: schema-set-name
          in: path
          description: schema-set-name
          required: true
          schema:
            type: string
      responses:
        '204':
          description: No Content
          content: {}
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}/node':
    get:
      description: >-
        Get a node with an option to retrieve all the children for a given
        anchor and dataspace
      tags:
        - cps-data
      summary: Get a node
      operationId: getNodeByDataspaceAndAnchor
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
        - name: xpath
          in: query
          description: xpath
          required: false
          schema:
            type: string
            default: /
        - name: include-descendants
          in: query
          description: include-descendants
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
      x-codegen-request-body-name: xpath
  '/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}/nodes':
    post:
      description: Create a node for a given anchor and dataspace
      tags:
        - cps-data
      summary: Create a node
      operationId: createNode
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        '201':
          description: Created
          content:
            text/plain:
              schema:
                type: string
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    patch:
      description: >-
        Update a data node leaves for a given dataspace and anchor and a parent
        node xpath
      tags:
        - cps-data
      summary: Update node leaves
      operationId: updateNodeLeaves
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
        - name: xpath
          in: query
          description: xpath
          required: false
          schema:
            type: string
            default: /
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    put:
      description: >-
        Replace a node with descendants for a given dataspace, anchor and a
        parent node xpath
      tags:
        - cps-data
      summary: Replace a node with descendants
      operationId: replaceNode
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
        - name: xpath
          in: query
          description: xpath
          required: false
          schema:
            type: string
            default: /
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  '/v1/dataspaces/{dataspace-name}/nodes':
    get:
      description: >-
        Get all nodes for a given dataspace using an xpath or schema node
        identifier - DRAFT
      tags:
        - cps-data
      summary: Get nodes
      operationId: getNodesByDataspace
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
      x-codegen-request-body-name: requestBody
  '/v1/dataspaces/{dataspace-name}/anchors/{anchor-name}/nodes/query':
    get:
      description: Query data nodes for the given dataspace and anchor using CPS path
      tags:
        - cps-query
      summary: Query data nodes
      operationId: getNodesByDataspaceAndAnchorAndCpsPath
      parameters:
        - name: dataspace-name
          in: path
          description: dataspace-name
          required: true
          schema:
            type: string
        - name: anchor-name
          in: path
          description: anchor-name
          required: true
          schema:
            type: string
        - name: cps-path
          in: query
          description: cps-path
          required: false
          schema:
            type: string
            default: /
        - name: include-descendants
          in: query
          description: include-descendants
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '404':
          description: The specified resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
      x-codegen-request-body-name: xpath
components:
  schemas:
    ErrorMessage:
      type: object
      title: Error
      properties:
        status:
          type: string
          example: 400
        message:
          type: string
          example: Dataspace not found
        details:
          type: string
          example: Dataspace with name D1 does not exist.