# ============LICENSE_START=======================================================
#  Copyright (C) 2020-2022 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=========================================================

swagger: "2.0"
info:
  title: PM Subscription Handler Service
  version: "2.0.0"
  description: PM subscription handler enables control of performance management jobs on network functions in ONAP
consumes:
  - "application/json"
produces:
  - "application/json"
basePath: "/"
schemes:
  - https
  - http
# Paths supported by the server application
paths:
  /healthcheck:
    get:
      operationId: mod.api.controller.status
      tags:
        - "HealthCheck"
      description: >-
        This is the health check endpoint. If this returns a 200, the server is alive.
      responses:
        200:
          description: Successful response
          schema:
            type: object
            properties:
              status:
                type: string
                description: Overall health of PMSH
                enum: [healthy, unhealthy]
        503:
          description: The PMSH service is unavailable

  /subscription:
    post:
      tags:
        - "Subscription"
      description: >-
        Create a PM Subscription
      operationId: mod.api.controller.post_subscription
      parameters:
        - in: "body"
          name: "body"
          required: true
          schema:
            $ref: "#/definitions/subscription"
      responses:
        201:
          description: Successfully created PM Subscription
        409:
          description: Duplicate data
        400:
          description: Invalid input

    get:
      description: Get all the subscriptions from PMSH.
      operationId: mod.api.controller.get_subscriptions
      tags:
        - "Subscription"
      responses:
        200:
          description: OK; Array of subscriptions are returned else empty if not found
          schema:
            type: array
            items:
              $ref: "#/definitions/subscription"
        500:
          description: Exception occurred while querying database

  /subscription/{subscription_name}:
    get:
      description: Get the Subscription from PMSH specified by Name
      operationId: mod.api.controller.get_subscription_by_name
      tags:
        - "Subscription"
      parameters:
        - name: subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
      responses:
        200:
          description: OK; Requested Subscription was returned
          schema:
            $ref : "#/definitions/subscription"
        404:
          description: Subscription with specified name not found
        500:
          description: Exception occurred while querying database

    delete:
      description: Deletes the Subscription from PMSH specified by Name
      operationId: mod.api.controller.delete_subscription_by_name
      tags:
        - "Subscription"
      parameters:
        - name: subscription_name
          in: path
          required: true
          description: The name of the subscription to delete
          type: string
      responses:
        204:
          description: Successfully deleted the subscription and returns NO Content
        404:
          description: Subscription with the specified name not found
        409:
          description: Subscription could not be deleted as it contains measurement groups
            with state UNLOCKED OR state change to LOCKED was under process
        500:
          description: Exception occurred on the server

  /subscription/{subscription_name}/nfFilter:
    put:
      description: Update nfFilter for
      tags:
        - "Subscription"
      parameters:
        - name: subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
        - name: "body"
          in: "body"
          required: true
          schema:
            $ref: "#/definitions/nfFilter"
      responses:
        201:
          description: Successfully updated filter
        409:
          description: Duplicate data
        400:
          description: Invalid input


  /subscription/{subscription_name}/measurementGroups/{measurement_group_name}:
    get:
      description: Get the  measurement group and associated network functions
        from PMSH by using sub name and meas group name
      operationId: mod.api.controller.get_meas_group_with_nfs
      tags:
        - "measurement group"
      parameters:
        - name : subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
        - name: measurement_group_name
          in: path
          required: true
          description: Name of the measurement group name
          type: string
      responses:
        200:
          description: OK; Received requested measurement group with associated NF's
          schema:
            $ref : "#/definitions/measGroupWithNFs"
        404:
          description: Measurement group with specified name not found
        500:
          description: Exception occurred while querying database

    post:
      description: Create a measurement group
      tags:
        - "measurement group"
      parameters:
        - name : subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
        - name: measurement_group_name
          in: path
          required: true
          description: Name of the measurement group name
          type: string
        - name : "body"
          in: "body"
          required: true
          schema:
            $ref: "#/definitions/measurementGroup"
      responses:
        201:
          description: Successfully created measurement group
        409:
          description: Duplicate data
        400:
          description: Invalid input

    delete:
      description: Delete a measurement group
      tags:
        - "measurement group"
      parameters:
        - name : subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
        - name: measurement_group_name
          in: path
          required: true
          description: Name of the measurement group name
          type: string
      responses:
        204:
          description: Successfully deleted the measurement group and returns NO Content
        404:
          description: Measurement group with the specified name not found
        409:
          description: Measurement  not deleted because state UNLOCKED OR state change to LOCKED was under process
        500:
          description: Exception occurred on the server

  /subscription/{subscription_name}/measurementGroups/{measurement_group_name}/{administrativeState}:
    put:
      description: Update administrative state for a measurement group
      tags:
        - "measurement group"
      parameters:
        - name: subscription_name
          in: path
          required: true
          description: Name of the subscription
          type: string
        - name: measurement_group_name
          in: path
          required: true
          description: Name of the measurement group name
          type: string
        - name: administrativeState
          in: path
          required: true
          description: New administrative state of measurement group
          type: string
      responses:
        201:
          description: Successfully updated administrative state
        409:
          description: Duplicate data
        400:
          description: Invalid input

definitions:
  subscription:
    type: object
    properties:
      subscription:
        type: object
        properties:
          subscriptionName:
            type: string
          operationalPolicyName:
            type: string
          controlLoopName:
            type: string
          nfFilter:
            $ref: "#/definitions/nfFilter"
          measurementGroups:
            type: array
            minItems: 1
            items:
              $ref: "#/definitions/measurementGroup"
        required:
          - subscriptionName
          - operationalPolicyName
          - nfFilter
          - measurementGroups
    required:
      - subscription

  nfFilter:
    type: object
    description: "At least one valid filter value within nfFilter is required"
    additionalProperties: false
    properties:
      nfNames:
        type: array
        items:
          type: string
      modelInvariantIDs:
        type: array
        items:
          type: string
      modelVersionIDs:
        type: array
        items:
          type: string
      modelNames:
        type: array
        items:
          type: string
    required:
      - nfNames
      - modelInvariantIDs
      - modelVersionIDs
      - modelNames

  measurementGroup:
    type: object
    properties:
      measurementGroup:
        type: object
        properties:
          measurementGroupName:
            type: string
          fileBasedGP:
            type: integer
          fileLocation:
            type: string
          administrativeState:
            type: string
            enum: [LOCKED, UNLOCKED]
          measurementTypes:
            type: array
            minItems: 1
            items:
              $ref: "#/definitions/measurementType"
          managedObjectDNsBasic:
            type: array
            minItems: 1
            items:
              $ref: "#/definitions/managedObjectDNs"
        allOf:
          - required:
              - measurementGroupName
              - fileBasedGP
              - fileLocation
              - administrativeState
              - measurementTypes
              - managedObjectDNsBasic
    required:
      - measurementGroup

  measurementType:
    type: object
    properties:
      measurementType:
        type: string
    required:
      - measurementType

  managedObjectDNs:
    type: object
    properties:
      DN:
        type: string
    required:
      - DN

  measGroupWithNFs:
    type: object
    properties:
      subscriptionName:
        type: string
      measurementGroupName:
        type: string
      administrativeState:
        type: string
        enum: [ LOCKED, UNLOCKED ]
      fileBasedGP:
        type: integer
      fileLocation:
        type: string
      measurementTypes:
        type: array
        minItems: 1
        items:
          $ref: "#/definitions/measurementType"
      managedObjectDNsBasic:
        type: array
        minItems: 1
        items:
          $ref: "#/definitions/managedObjectDNs"
      network_functions:
        type: array
        items:
          type: object
          properties:
            nfName:
              type: string
              description: Name of the Network Function
            ipv4Address:
              type: string
              description: Address of the IPV4
            ipv6Address:
              type: string
              description: Address of the IPV6
            nfMgStatus:
              type: string
              description: status of network function for one meas group
            modelInvariantId:
              type: string
              description: ID of the model invariant
            modelVersionId:
              type: string
              description: ID of the model version
            modelName:
              type: string
              description: Name of the model
            sdncModelName:
              type: string
              description: Name of the sdnc model
            sdncModelVersion:
              type: string
              description: Version of the sdnc model
