{
  "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": {
    "/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"
          },
          "400": {
            "description": "Invalid input"
          },
          "409": {
            "description": "Duplicate data"
          }
        }
      },
      "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"
          },
          "400": {
            "description": "Invalid input"
          },
          "409": {
            "description": "Duplicate data"
          }
        }
      }
    },
    "/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"
          },
          "400": {
            "description": "Invalid input"
          },
          "409": {
            "description": "Duplicate data"
          }
        }
      },
      "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"
          },
          "400": {
            "description": "Invalid input"
          },
          "409": {
            "description": "Duplicate data"
          }
        }
      }
    }
  },
  "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"
              }
            }
          }
        }
      }
    }
  }
}
