From 7cec085b66fe866444c9d043cbaf958bc5029602 Mon Sep 17 00:00:00 2001 From: dyh Date: Mon, 20 Jan 2020 15:08:39 +0800 Subject: [PATCH] update document Issue-ID: MODELING-292 Change-Id: I3a6568d84fb6c04dd9bf0ee6bfe26f722ea463ed Signed-off-by: dyh --- docs/administration.rst | 15 + docs/architecture.rst | 12 + docs/consumedapis.rst | 48 + docs/humaninterfaces.rst | 9 + docs/images/architecture.png | Bin 0 -> 77365 bytes docs/index.rst | 14 +- docs/installation.rst | 69 + docs/introduction.rst | 8 +- docs/offeredapis.rst | 155 ++ docs/release-notes.rst | 6 +- docs/swagger/etsicatalog_API_v1.yaml | 2716 ++++++++++++++++++++++++++++++++++ 11 files changed, 3041 insertions(+), 11 deletions(-) create mode 100644 docs/administration.rst create mode 100644 docs/architecture.rst create mode 100644 docs/consumedapis.rst create mode 100644 docs/humaninterfaces.rst create mode 100644 docs/images/architecture.png create mode 100644 docs/installation.rst create mode 100644 docs/offeredapis.rst create mode 100644 docs/swagger/etsicatalog_API_v1.yaml diff --git a/docs/administration.rst b/docs/administration.rst new file mode 100644 index 0000000..2427834 --- /dev/null +++ b/docs/administration.rst @@ -0,0 +1,15 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============== +Administration +============== + +Administration Links +-------------------- + +Here are some links to our administration pages found in the ONAP Service websites + +- `Modeling Jira `_ +- `Modeling Jenkins `_ +- `Modeling Confluence Portal `_ diff --git a/docs/architecture.rst b/docs/architecture.rst new file mode 100644 index 0000000..cc9dd45 --- /dev/null +++ b/docs/architecture.rst @@ -0,0 +1,12 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============ +Architecture +============ +Etsicatalog is a web application based on python3 and Django framework. It is a standalone micro-service which provides: + +- Package Management Service +- Parser Service + +.. image:: images/architecture.png \ No newline at end of file diff --git a/docs/consumedapis.rst b/docs/consumedapis.rst new file mode 100644 index 0000000..2efd1d6 --- /dev/null +++ b/docs/consumedapis.rst @@ -0,0 +1,48 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============= +Consumed APIs +============= + +SDC +--- +Etsicatalog invokes SDC APIs to query/fetch package from SDC catalog. + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/sdc/v1/catalog/services/ + - GET + - Get service list + * - /api/sdc/v1/catalog/services/{{csarId}}/metadata + - GET + - Get a service metadata + * - /api/sdc/v1/catalog/resources + - GET + - Get resource list + * - /api/sdc/v1/catalog/resources/{{csarId}}/metadata + - GET + - Get a resource metadata + * - /api/sdc/v1/catalog/services/{{csarId}}/toscaModel + - GET + - Download a service package + +Micro Service Bus +----------------- +Etsicatalog invokes Micro Service Bus APIs to register service to MSB. + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/microservices/v1/services + - POST + - Register service to the Microservice Bus \ No newline at end of file diff --git a/docs/humaninterfaces.rst b/docs/humaninterfaces.rst new file mode 100644 index 0000000..2963870 --- /dev/null +++ b/docs/humaninterfaces.rst @@ -0,0 +1,9 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Human Interfaces +================ + +There is **No** Human Interface (pure Rest API project) + +Any "Rest Client" application may be used (Postman, ...) to interact with etsicatalog application. \ No newline at end of file diff --git a/docs/images/architecture.png b/docs/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcd9e433b89a43c8b559d5840a6ea199f7b6150 GIT binary patch literal 77365 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 36b2d3b..7346ede 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,15 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. -ETSI Catalog Project ------------------------------------------------- +Etsicatalog Project +------------------- .. toctree:: - :maxdepth: 1 + :maxdepth: 2 introduction - release-notes.rst + architecture + installation + offeredapis + consumedapis + administration + humaninterfaces + release-notes diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..6006353 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,69 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Installation +============ + +This document describes local build and installation for development purpose. + +Pre-requisites +-------------- + +* Python3 & pip +* MariaDB + +Build & Run +----------- + +**Clone repository**: +:: + + $ git clone https://gerrit.onap.org/r/modeling/etsicatalog + $ cd etsicatalog + +**Create database**:: + + $ cd /resources/dbscripts/mysql + +Run modeling-etsicatalog-createdb.sql to create database. + +Run commands followed to init database:: + + $ python manage.py makemigrations + $ python manage.py makemigrations database + $ python manage.py migrate + $ python manage.py migrate database + +Review and edit \catalog\pub\config\config.py + +MySQL default configuration is as follows:: + + DB_IP = "127.0.0.1" + DB_PORT = 3306 + DB_NAME = "etsicatalog" + DB_USER = "etsicatalog" + DB_PASSWD = "etsicatalog" + +**Start server**:: + + $ python manage.py runserver 8806 + + + +Test +---- + +**Run Healthcheck**:: + + GET /api/catalog/v1/health_check + +You should get:: + + { + "status": "active" + } + +**View API document**: + +http://127.0.0.1:8806/api/catalog/v1/swagger + diff --git a/docs/introduction.rst b/docs/introduction.rst index d7336d7..d83cc76 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -2,8 +2,8 @@ .. http://creativecommons.org/licenses/by/4.0 -etsicatalog Introduction -================================= +Etsicatalog Introduction +========================= -The ETSI Catalog project provides a runtime catalog service which can be consumed by other projects or components, such as UUI, VF-C, etc. -The catalog can be used to store packages distributed by the SDC, and also include a TOSCA parser service. +The Etsicatalog project provides a runtime catalog service which can be consumed by other projects or components, such as UUI, VF-C, etc. +The catalog can be used to store packages distributed by the SDC, and also includes a TOSCA parser service. diff --git a/docs/offeredapis.rst b/docs/offeredapis.rst new file mode 100644 index 0000000..953f85e --- /dev/null +++ b/docs/offeredapis.rst @@ -0,0 +1,155 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +============ +Offered APIs +============ +Etsicatalog provides the followed APIs: + +- **NS package management interface** + + Provides runtime NS package management interface + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/nsd/v1/ns_descriptors + - POST + - Create a new NS descriptor resource. + * - /api/nsd/v1/ns_descriptors + - GET + - Query information about multiple NS descriptor resources. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}} + - GET + - Read information about an individual NS descriptor resource. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}}/nsd_content + - PUT + - Upload the content of a NSD. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}}/nsd_content + - GET + - Fetch the content of a NSD. + * - /api/nsd/v1/ns_descriptors/{{nsdInfoId}} + - DELETE + - Delete an individual NS descriptor resource. + * - /api/nsd/v1/pnf_descriptors + - POST + - Create a new PNF descriptor resource. + * - /api/nsd/v1/pnf_descriptors + - GET + - Query information about multiple PNF descriptor resources. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}} + - GET + - Read an individual PNFD resource. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}}/pnfd_content + - PUT + - Upload the content of a PNFD. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}}/pnfd_content + - GET + - Fetch the content of a PNFD. + * - /api/nsd/v1/pnf_descriptors/{{pnfdInfoId}} + - DELETE + - Delete an individual PNF descriptor resource. + +- **VNF package management interface** + + Provides runtime VNF package management interface + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/vnfpkgm/v1/vnf_packages + - POST + - Create a new individual VNF package resource + * - /api/vnfpkgm/v1/vnf_packages + - GET + - Query VNF packages information + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}} + - GET + - Read information about an individual VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content + - PUT + - Upload a VNF package by providing the content of the VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content/upload_from_uri + - PUT + - Upload a VNF package by providing the address information of the VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/package_content + - GET + - Fetch an on-boarded VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/vnfd + - GET + - Read VNFD of an on-boarded VNF package + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}}/artifacts/{{artifactPath}} + - GET + - Fetch individual VNF package artifact + * - /api/vnfpkgm/v1/vnf_packages/{{vnfPkgId}} + - DELETE + - Delete an individual VNF package + * - /api/vnfpkgm/v1/subscriptions + - POST + - Subscribe to notifications related to on-boarding and/or changes of VNF packages + * - /api/vnfpkgm/v1/subscriptions + - GET + - Query multiple subscriptions + * - /api/vnfpkgm/v1/subscriptions/{{subscriptionId}} + - GET + - Read an individual subscription resource + * - /api/vnfpkgm/v1/subscriptions/{{subscriptionId}} + - DELETE + - Terminate a subscription + +- **Catalog interface** + + Provides APIs to query/fetch package from SDC catalog + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/catalog/v1/nspackages + - POST + - Fetch NS package from SDC catalog + * - /api/catalog/v1/vnfpackages + - POST + - Fetch NVF package from SDC catalog + * - /api/catalog/v1/service_packages + - POST + - Fetch Service package from SDC catalog + +- **Parser interface** + + Provide APIs to parser VNF/PNF/NS/Service package + +.. list-table:: + :widths: 50 10 40 + :header-rows: 1 + + * - URL + - Method + - Description + * - /api/parser/v1/parserpnfd + - POST + - Parse PNF package + * - /api/parser/v1/parservnfd + - POST + - Parse VNF package + * - /api/parser/v1/parsernsd + - POST + - Parse NS package + * - /api/parser/v1/parser + - POST + - Parse package + +You can download the following API yaml file and paste the content into the swagger tool: https://editor.swagger.io to view more detail of APIs. + +:download:`etsicatalog_API_v1.yaml ` diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 2d6254f..8187b8c 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -3,8 +3,8 @@ .. http://creativecommons.org/licenses/by/4.0 -etsicatalog Release Notes -========================= +Release Notes +============== etsicatalog provides package management service and parser service as Micro Service. @@ -34,7 +34,7 @@ None **Security Issues** -- ` El Alto Vulnerability Report `_ +- `El Alto Vulnerability Report `_ **Upgrade Notes** diff --git a/docs/swagger/etsicatalog_API_v1.yaml b/docs/swagger/etsicatalog_API_v1.yaml new file mode 100644 index 0000000..fde0af7 --- /dev/null +++ b/docs/swagger/etsicatalog_API_v1.yaml @@ -0,0 +1,2716 @@ +swagger: '2.0' +info: + title: Modeling etsicatalog API + description: "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\n\ + The `ReDoc` view can be found [here](/api/catalog/v1/redoc).\nThe swagger YAML\ + \ document can be found [here](/api/catalog/v1/swagger.yaml).\nThe swagger JSON\ + \ document can be found [here](/api/catalog/v1/swagger.json)." + version: v1 +host: 127.0.0.1:8806 +schemes: + - http +basePath: / +consumes: + - application/json +produces: + - application/json +securityDefinitions: + Basic: + type: basic +security: + - Basic: [] +paths: + /api/catalog/v1/nspackages: + get: + operationId: api_catalog_v1_nspackages_list + description: Query NS packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsPackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_nspackages_create + description: On distribute NS package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NsPackageDistributeRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/NsPackageDistributeResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/nspackages/{csarId}: + get: + operationId: api_catalog_v1_nspackages_read + description: Query one NS package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsPackage' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_nspackages_delete + description: Delete one NS package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsPackageDistributeResponse' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/catalog/v1/service_packages: + get: + operationId: api_catalog_v1_service_packages_list + description: Query Service packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/ServicePackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_service_packages_create + description: On distribute Service package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ServicePackageDistributeRequest' + responses: + '202': + description: '' + '400': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/service_packages/{csarId}: + get: + operationId: api_catalog_v1_service_packages_read + description: Query one Service package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ServicePackage' + '404': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_service_packages_delete + description: Delete one Service package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '204': + description: '' + '404': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/catalog/v1/vnfpackages: + get: + operationId: api_catalog_v1_vnfpackages_list + description: Query Nf packages + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NfPackage' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_vnfpackages_create + description: On distribute Nf package + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NfPackageDistributeRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Catalog interface + parameters: [] + /api/catalog/v1/vnfpackages/{csarId}: + get: + operationId: api_catalog_v1_vnfpackages_read + description: Query one Nf package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NfPackage' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + delete: + operationId: api_catalog_v1_vnfpackages_delete + description: Delete one Nf package + parameters: + - name: csarId + in: query + description: csarId + type: string + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponse' + '500': + description: error message + schema: + type: string + tags: + - Catalog interface + parameters: + - name: csarId + in: path + required: true + type: string + /api/nsd/v1/health_check: + get: + operationId: api_nsd_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/nsd/v1/ns_descriptors: + get: + operationId: api_nsd_v1_ns_descriptors_list + description: Query multiple NSDs + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsdInfo' + '500': + description: Internal error + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_ns_descriptors_create + description: Create a NSD + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreateNsdInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/NsdInfo' + '500': + description: Internal error + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/ns_descriptors/{nsdInfoId}: + get: + operationId: api_nsd_v1_ns_descriptors_read + description: Query a NSD + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsdInfo' + '404': + description: NSDs do not exist + '500': + description: Internal error + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_ns_descriptors_delete + description: Delete a NSD + parameters: [] + responses: + '204': + description: No content + '500': + description: Internal error + tags: + - NSD Management interface + parameters: + - name: nsdInfoId + in: path + required: true + type: string + /api/nsd/v1/ns_descriptors/{nsdInfoId}/nsd_content: + get: + operationId: api_nsd_v1_ns_descriptors_nsd_content_list + description: Download NSD content + parameters: [] + responses: + '204': + description: No content + '404': + description: NSD does not exist. + '500': + description: Internal error + tags: + - NSD Management interface + put: + operationId: api_nsd_v1_ns_descriptors_nsd_content_update + description: Upload NSD content + parameters: [] + responses: + '204': + description: PNFD file + '500': + description: Internal error + tags: + - NSD Management interface + parameters: + - name: nsdInfoId + in: path + required: true + type: string + /api/nsd/v1/pnf_descriptors: + get: + operationId: api_nsd_v1_pnf_descriptors_list + description: Query multiple PNFDs + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/PnfdInfo' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_pnf_descriptors_create + description: Create a PNFD + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreatePnfdInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/PnfdInfo' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/pnf_descriptors/{pnfdInfoId}: + get: + operationId: api_nsd_v1_pnf_descriptors_read + description: Query a PNFD + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PnfdInfo' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_pnf_descriptors_delete + description: Delete a PNFD + parameters: [] + responses: + '204': + description: No content + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: pnfdInfoId + in: path + required: true + type: string + /api/nsd/v1/pnf_descriptors/{pnfdInfoId}/pnfd_content: + get: + operationId: Fetch PNFD content + description: Fetch PNFD content + parameters: [] + responses: + '200': + description: PNFD file + schema: + type: string + format: binary + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + produces: + - application/octet-stream + - application/json + tags: + - NSD Management interface + put: + operationId: api_nsd_v1_pnf_descriptors_pnfd_content_update + description: Upload PNFD content + parameters: [] + responses: + '204': + description: No content + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: pnfdInfoId + in: path + required: true + type: string + /api/nsd/v1/subscriptions: + get: + operationId: api_nsd_v1_subscriptions_list + description: Query subscriptions for Nsd Management + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/NsdmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + post: + operationId: api_nsd_v1_subscriptions_create + description: Create Subscription for NSD Management + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/NsdmSubscriptionRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/NsdmSubscription' + '303': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: [] + /api/nsd/v1/subscriptions/{subscriptionId}: + get: + operationId: api_nsd_v1_subscriptions_read + description: Query subscriptions for Nsd Management + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NsdmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + delete: + operationId: api_nsd_v1_subscriptions_delete + description: Delete subscription for Nsd Management + parameters: [] + responses: + '204': + description: No_Content + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - NSD Management interface + parameters: + - name: subscriptionId + in: path + required: true + type: string + /api/vnfpkgm/v1/health_check: + get: + operationId: api_vnfpkgm_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/vnfpkgm/v1/subscriptions: + get: + operationId: api_vnfpkgm_v1_subscriptions_list + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + post: + operationId: api_vnfpkgm_v1_subscriptions_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/PkgmSubscriptionRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '400': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + parameters: [] + /api/vnfpkgm/v1/subscriptions/{subscriptionId}: + get: + operationId: api_vnfpkgm_v1_subscriptions_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/PkgmSubscription' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + delete: + operationId: api_vnfpkgm_v1_subscriptions_delete + description: '' + parameters: [] + responses: + '204': + description: '' + '404': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + '500': + description: '' + schema: + $ref: '#/definitions/SUBSCRIPTION_ProblemDetailsSerializer' + tags: + - VNF Package Management interface + parameters: + - name: subscriptionId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages: + get: + operationId: api_vnfpkgm_v1_vnf_packages_list + description: Query multiple VNF package resource + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/VnfPkgInfo' + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + post: + operationId: api_vnfpkgm_v1_vnf_packages_create + description: Create an individual VNF package resource + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreateVnfPkgInfoRequest' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/VnfPkgInfo' + '400': + description: Bad Request + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: [] + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}: + get: + operationId: api_vnfpkgm_v1_vnf_packages_read + description: Query an individual VNF package resource + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/VnfPkgInfo' + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + delete: + operationId: api_vnfpkgm_v1_vnf_packages_delete + description: Delete an individual VNF package resource + parameters: [] + responses: + '204': + description: No content + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}: + get: + operationId: api_vnfpkgm_v1_vnf_packages_artifacts_read + description: '' + parameters: [] + responses: + '200': + description: Return the artifact file + schema: + type: string + format: binary + '404': + description: Artifact not found + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + parameters: + - name: artifactPath + in: path + required: true + type: string + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content: + get: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_list + description: Fetch VNF package content + parameters: [] + responses: + '200': + description: VNF package file + schema: + type: string + format: binary + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + put: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_update + description: Upload VNF package content + parameters: [] + responses: + '202': + description: Successfully + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/package_content/upload_from_uri: + post: + operationId: api_vnfpkgm_v1_vnf_packages_package_content_upload_from_uri_create + description: Upload VNF package content from uri + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/UploadVnfPackageFromUriRequest' + responses: + '202': + description: Successfully + '400': + description: Bad Request + schema: + type: string + '500': + description: Internal error + schema: + type: string + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/vnfpkgm/v1/vnf_packages/{vnfPkgId}/vnfd: + get: + operationId: VNFD of an on-boarded VNF package + description: Read VNFD of an on-boarded VNF package + parameters: [] + responses: + '200': + description: VNFD of an on-boarded VNF package + schema: + type: string + format: binary + '404': + description: VNF package does not exist + schema: + type: string + '500': + description: Internal error + schema: + type: string + produces: + - application/octet-stream + - application/json + tags: + - VNF Package Management interface + parameters: + - name: vnfPkgId + in: path + required: true + type: string + /api/parser/v1/health_check: + get: + operationId: api_parser_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/parser/v1/parser: + post: + operationId: api_parser_v1_parser_create + description: Parse model(NS, Service, VNF, PNF) + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parsernsd: + post: + operationId: api_parser_v1_parsernsd_create + description: Parse NS model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parserpnfd: + post: + operationId: api_parser_v1_parserpnfd_create + description: Parse PNF model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/parser/v1/parservnfd: + post: + operationId: api_parser_v1_parservnfd_create + description: Parse NF model + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ParseModelRequest' + responses: + '202': + description: '' + schema: + $ref: '#/definitions/ParseModelResponse' + '500': + description: '' + schema: + $ref: '#/definitions/InternalErrorRequest' + tags: + - Parser interface + parameters: [] + /api/catalog/v1/callback_sample: + get: + operationId: api_catalog_v1_callback_sample_list + description: Callback Sample. + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + parameters: [] + /api/catalog/v1/health_check: + get: + operationId: api_catalog_v1_health_check_list + description: '' + parameters: [] + responses: + '200': + description: Active + tags: + - Health Check interface + parameters: [] + /api/catalog/v1/jobs/{job_id}: + get: + operationId: api_catalog_v1_jobs_read + description: Get job status + parameters: + - name: job_id + in: query + description: job id + type: string + - name: responseId + in: query + description: response id + type: string + responses: + '200': + description: '' + schema: + $ref: '#/definitions/GetJobResponse' + '500': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + tags: + - Catalog interface + post: + operationId: api_catalog_v1_jobs_create + description: Update job status + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/PostJobRequest' + - name: job_id + in: query + description: job id + type: string + responses: + '202': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + '500': + description: '' + schema: + $ref: '#/definitions/PostJobResponseResult' + tags: + - Catalog interface + parameters: + - name: job_id + in: path + required: true + type: string + /api/catalog/v1/mandb/{modelName}: + get: + operationId: api_catalog_v1_mandb_read + description: '' + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + delete: + operationId: api_catalog_v1_mandb_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - Sample interface + parameters: + - name: modelName + in: path + required: true + type: string + /samples/: + get: + operationId: samples_list + description: List all samples. + parameters: [] + responses: + '200': + description: '' + tags: + - Sample interface + parameters: [] +definitions: + NOTIFICATION_LINKSERIALIZER: + title: Vnfpackage + description: Link to the resource representing the VNF package to which the notified + change applies. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource. + type: string + minLength: 1 + PkgmLinks: + title: ' links' + description: Links to resources related to this resource. + type: object + properties: + vnfPackage: + $ref: '#/definitions/NOTIFICATION_LINKSERIALIZER' + subscription: + $ref: '#/definitions/NOTIFICATION_LINKSERIALIZER' + PkgChangeNotification: + required: + - id + - notificationType + - timeStamp + - subscriptionId + - vnfPkgId + - changeType + - vnfdId + - _links + type: object + properties: + id: + title: Id + description: Identifier of this notification. + type: string + minLength: 1 + notificationType: + title: Notificationtype + description: Discriminator for the different notification types. + type: string + enum: + - VnfPackageChangeNotification + timeStamp: + title: Timestamp + description: Date-time of the generation of the notification. + type: string + format: date-time + subscriptionId: + title: Subscriptionid + description: Identifier of the subscription that this notification relates + to. + type: string + minLength: 1 + vnfPkgId: + title: Vnfpkgid + description: Identifier of the VNF package. + type: string + format: uuid + changeType: + title: Changetype + description: The type of change of the VNF package. + type: string + enum: + - OP_STATE_CHANGE + - PKG_DELETE + operationalState: + title: Operationalstate + description: New operational state of the VNF package. + type: string + enum: + - ENABLED + - DISABLED + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + minLength: 1 + _links: + $ref: '#/definitions/PkgmLinks' + PkgOnboardingNotification: + required: + - id + - notificationType + - subscriptionId + - timeStamp + - vnfPkgId + - vnfdId + - _links + type: object + properties: + id: + title: Id + description: Identifier of this notification. + type: string + minLength: 1 + notificationType: + title: Notificationtype + description: Discriminator for the different notification types. + type: string + enum: + - VnfPackageOnboardingNotification + subscriptionId: + title: Subscriptionid + description: Identifier of the subscription that this notification relates + to. + type: string + minLength: 1 + timeStamp: + title: Timestamp + description: Date-time of the generation of the notification. + type: string + format: date-time + vnfPkgId: + title: Vnfpkgid + description: Identifier of the VNF package. + type: string + format: uuid + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + format: uuid + _links: + $ref: '#/definitions/PkgmLinks' + JobResponseHistoryList: + description: Response History List + type: object + properties: + status: + title: Status + description: Status + type: string + minLength: 1 + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: Status Description + type: string + minLength: 1 + errorCode: + title: Errorcode + description: Error Code + type: string + minLength: 1 + x-nullable: true + responseId: + title: Responseid + description: Response Id + type: string + minLength: 1 + JobResponseDescriptor: + title: Responsedescriptor + description: Job Response Descriptor + type: object + properties: + status: + title: Status + description: Status + type: string + minLength: 1 + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: Status Description + type: string + minLength: 1 + errorCode: + title: Errorcode + description: Error Code + type: string + minLength: 1 + x-nullable: true + responseId: + title: Responseid + description: Response Id + type: string + minLength: 1 + responseHistoryList: + description: Response History List + type: array + items: + $ref: '#/definitions/JobResponseHistoryList' + GetJobResponse: + type: object + properties: + jobId: + title: Jobid + description: Job Id + type: string + minLength: 1 + responseDescriptor: + $ref: '#/definitions/JobResponseDescriptor' + PostJobResponseResult: + required: + - result + type: object + properties: + result: + title: Result + description: Result + type: string + minLength: 1 + msg: + title: Msg + description: Message + type: string + minLength: 1 + PostJobRequest: + type: object + properties: + progress: + title: Progress + description: Job Progress + type: string + minLength: 1 + desc: + title: Desc + description: Description + type: string + minLength: 1 + errcode: + title: Errcode + description: Error Code + type: string + minLength: 1 + NsPackageInfo: + title: Packageinfo + description: NS Package Info + type: object + properties: + nsdId: + title: Nsdid + description: NSD ID + type: string + minLength: 1 + x-nullable: true + nsPackageId: + title: Nspackageid + description: NS Package ID + type: string + x-nullable: true + nsdProvider: + title: Nsdprovider + description: NSD Provider + type: string + x-nullable: true + nsdVersion: + title: Nsdversion + description: NSD Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR name + type: string + x-nullable: true + nsdModel: + title: Nsdmodel + description: NSD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download NSD Model + type: string + minLength: 1 + x-nullable: true + x-nullable: true + NsPackage: + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + x-nullable: true + packageInfo: + $ref: '#/definitions/NsPackageInfo' + InternalErrorRequest: + required: + - error + type: object + properties: + error: + title: Error + description: Error + type: string + minLength: 1 + errorMessage: + title: Errormessage + description: Error Message + type: string + minLength: 1 + NsPackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: csarId + type: string + minLength: 1 + NsPackageDistributeResponse: + required: + - status + - statusDescription + - errorCode + type: object + properties: + status: + title: Status + description: status + type: string + minLength: 1 + statusDescription: + title: Statusdescription + description: statusDescription + type: string + minLength: 1 + errorCode: + title: Errorcode + description: errorCode + type: string + minLength: 1 + ServicePackageInfo: + title: Packageinfo + description: Service Package Info + type: object + properties: + servicedId: + title: Servicedid + description: ServiceD ID + type: string + minLength: 1 + x-nullable: true + servicePackageId: + title: Servicepackageid + description: Service Package ID + type: string + x-nullable: true + servicedProvider: + title: Servicedprovider + description: ServiceD Provider + type: string + x-nullable: true + servicedVersion: + title: Servicedversion + description: ServiceD Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR name + type: string + x-nullable: true + servicedModel: + title: Servicedmodel + description: ServiceD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download ServiceD Model + type: string + minLength: 1 + x-nullable: true + x-nullable: true + ServicePackage: + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + x-nullable: true + packageInfo: + $ref: '#/definitions/ServicePackageInfo' + ServicePackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: csarId + type: string + minLength: 1 + NfPackageInfo: + title: Packageinfo + description: VNF Package Info + required: + - vnfPackageId + type: object + properties: + vnfdId: + title: Vnfdid + description: VNFD ID + type: string + x-nullable: true + vnfPackageId: + title: Vnfpackageid + description: VNF Package ID + type: string + minLength: 1 + vnfdProvider: + title: Vnfdprovider + description: VNFD Provider + type: string + x-nullable: true + vnfdVersion: + title: Vnfdversion + description: VNFD Version + type: string + x-nullable: true + vnfVersion: + title: Vnfversion + description: VNF Version + type: string + x-nullable: true + csarName: + title: Csarname + description: CSAR Name + type: string + x-nullable: true + vnfdModel: + title: Vnfdmodel + description: VNFD Model + type: string + x-nullable: true + downloadUrl: + title: Downloadurl + description: URL to download VNFD Model + type: string + x-nullable: true + NfImageInfo: + description: Image Info + required: + - index + - fileName + - imageId + - vimId + - vimUser + - tenant + - status + type: object + properties: + index: + title: Index + description: Index of VNF Image + type: string + minLength: 1 + fileName: + title: Filename + description: Image file name + type: string + minLength: 1 + imageId: + title: Imageid + description: Image ID + type: string + minLength: 1 + vimId: + title: Vimid + description: VIM ID + type: string + minLength: 1 + vimUser: + title: Vimuser + description: User of VIM + type: string + minLength: 1 + tenant: + title: Tenant + description: Tenant + type: string + minLength: 1 + status: + title: Status + description: Status + type: string + minLength: 1 + NfPackage: + required: + - csarId + - packageInfo + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + packageInfo: + $ref: '#/definitions/NfPackageInfo' + imageInfo: + description: Image Info + type: array + items: + $ref: '#/definitions/NfImageInfo' + x-nullable: true + NfPackageDistributeRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + vimIds: + description: A string for vimIds + type: array + items: + type: string + minLength: 1 + labVimId: + title: Labvimid + description: A list of VIM IDs. + type: string + PostJobResponse: + required: + - jobId + type: object + properties: + jobId: + title: Jobid + description: jobId + type: string + minLength: 1 + ProblemDetails: + title: Onboardingfailuredetails + description: Failure details of current onboarding procedure.It shall be present + when the nsdOnboardingState attribute is CREATED and the uploading or processing + fails in NFVO. + required: + - title + - detail + type: object + properties: + type: + title: Type + description: A URI reference according to IETF RFC 3986 [10] that identifies + the problem type. It is encouraged that the URI provides human-readable + documentation for the problem (e.g. using HTML) when dereferenced. When + this member is not present, its value is assumed to be "about:blank". + type: string + x-nullable: true + title: + title: Title + description: The HTTP status code for this occurrence of the problem. + type: integer + detail: + title: Detail + description: A human-readable explanation specific to this occurrence of the + problem. + type: string + minLength: 1 + instance: + title: Instance + description: A URI reference that identifies the specific occurrence of the + problem. It may yield further information if dereferenced. + type: string + x-nullable: true + additional_attributes: + title: Additional attributes + description: Any number of additional attributes, as defined in a specification + or by an implementation. + type: object + additionalProperties: + description: Additional attribute + type: string + x-nullable: true + UriLink: + title: Self + description: URI of this resource. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource + type: string + minLength: 1 + NSD_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - nsd_content + type: object + properties: + self: + $ref: '#/definitions/UriLink' + nsd_content: + $ref: '#/definitions/UriLink' + NsdInfo: + required: + - id + - nsdOnboardingState + - nsdOperationalState + - nsdUsageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the onboarded individual NS descriptor resource.This + identifier is allocated by the NFVO. + type: string + minLength: 1 + nsdId: + title: Nsdid + description: This identifier, which is allocated by the NSD designer,identifies + the NSD in a globally unique way.It is copied from the NSD content and shall + be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdName: + title: Nsdname + description: Name of the onboarded NSD.This information is copied from the + NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdVersion: + title: Nsdversion + description: Version of the on-boarded NSD.This information is copied from + the NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdDesigner: + title: Nsddesigner + description: Designer of the on-boarded NSD.This information is copied from + the NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + nsdInvariantId: + title: Nsdinvariantid + description: This identifier, which is allocated by the NSD designer,identifies + an NSD in a version independent manner.This information is copied from the + NSD content and shall be present after the NSD content is on-boarded. + type: string + x-nullable: true + vnfPkgIds: + description: Identifies the VNF package for the VNFD referenced by the on-boarded + NS descriptor resource. + type: array + items: + description: Identifier of the VNF package + type: string + x-nullable: true + pnfdInfoIds: + description: Identifies the PnfdInfo element for the PNFD referenced by the + on-boarded NS descriptor resource. + type: array + items: + description: Identifier of the PnfdInfo element + type: string + x-nullable: true + nestedNsdInfoIds: + description: Identifies the NsdInfo element for the nested NSD referenced + by the on-boarded NS descriptor resource. + type: array + items: + description: Identifier of the NsdInfo element + type: string + x-nullable: true + nsdOnboardingState: + title: Nsdonboardingstate + description: Onboarding state of the individual NS descriptor resource. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + onboardingFailureDetails: + $ref: '#/definitions/ProblemDetails' + nsdOperationalState: + title: Nsdoperationalstate + description: Operational state of the individual NS descriptor resource.This + attribute can be modified with the PATCH method. + type: string + enum: + - ENABLED + - DISABLED + nsdUsageState: + title: Nsdusagestate + description: Usage state of the individual NS descriptor resource. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the individual NS descriptor resource.This + attribute can be modified with the PATCH method. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/NSD_LinkSerializer' + CreateNsdInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User-defined data for the NS descriptor resource to be created.It + shall be present when the user defined data is set for the individual NS + descriptor resource to be created. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + PNFD_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - pnfd_content + type: object + properties: + self: + $ref: '#/definitions/UriLink' + pnfd_content: + $ref: '#/definitions/UriLink' + PnfdInfo: + required: + - id + - pnfdOnboardingState + - pnfdUsageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the onboarded individual PNF descriptor resource. This + identifier is allocated by the NFVO. + type: string + minLength: 1 + pnfdId: + title: Pnfdid + description: This identifier, which is allocated by the PNFD designer, identifies + the PNFD in a globally unique way. It is copied from the PNFD content + and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdName: + title: Pnfdname + description: Name of the onboarded PNFD. This information is copied + from the PNFD content and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdVersion: + title: Pnfdversion + description: Version of the on-boarded PNFD. This information is copied + from the PNFD content and shall be present after the PNFD content is on-boarded. + type: string + x-nullable: true + pnfdProvider: + title: Pnfdprovider + description: Provider of the on-boarded PNFD. This information is + copied from the PNFD content and shall be present after the PNFD content + is on-boarded. + type: string + x-nullable: true + pnfdInvariantId: + title: Pnfdinvariantid + description: Identifies a PNFD in a version independent manner. This + attribute is invariant across versions of PNFD. + type: string + x-nullable: true + pnfdOnboardingState: + title: Pnfdonboardingstate + description: Onboarding state of the individual PNF descriptor resource. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + onboardingFailureDetails: + $ref: '#/definitions/ProblemDetails' + pnfdUsageState: + title: Pnfdusagestate + description: Usage state of the individual PNF descriptor resource. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the individual PNF descriptor resource. This + attribute can be modified with the PATCH method. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/PNFD_LinkSerializer' + SUBSCRIPTION_ProblemDetailsSerializer: + required: + - status + - detail + type: object + properties: + type: + title: Type + description: Type + type: string + minLength: 1 + x-nullable: true + title: + title: Title + description: Title + type: string + minLength: 1 + x-nullable: true + status: + title: Status + description: Status + type: integer + detail: + title: Detail + description: Detail + type: string + minLength: 1 + instance: + title: Instance + description: Instance + type: string + minLength: 1 + x-nullable: true + additional_details: + description: Any number of additional attributes, as defined in a specification + or by an implementation. + type: array + items: + type: string + x-nullable: true + CreatePnfdInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User-defined data for the PNF descriptor resource to be created.It + shall be present when the user defined data is set for the individual PNF + descriptor resource to be created. + type: object + additionalProperties: + description: Key Value Pairs + type: string + x-nullable: true + NsdmNotificationsFilter: + title: Filter + description: Filter settings for this subscription, to define the of all notifications + this subscription relates to. + type: object + properties: + notificationTypes: + description: Match particular notification types + type: array + items: + type: string + enum: + - NsdOnBoardingNotification + - NsdOnboardingFailureNotification + - NsdChangeNotification + - NsdDeletionNotification + - PnfdOnBoardingNotification + - PnfdOnBoardingFailureNotification + - PnfdDeletionNotification + nsdInfoId: + description: Match NS packages with particular nsdInfoIds + type: array + items: + type: string + format: uuid + nsdId: + description: Match NS Packages with particular nsdIds + type: array + items: + type: string + format: uuid + nsdName: + description: Match NS Packages with particular nsdNames + type: array + items: + type: string + maxLength: 255 + minLength: 1 + nsdVersion: + description: match NS packages that belong to certain nsdversion + type: array + items: + type: string + maxLength: 255 + minLength: 1 + nsdInvariantId: + description: Match NS Packages with particular nsdInvariantIds + type: array + items: + type: string + format: uuid + vnfPkgIds: + description: Match NS Packages that has VNF PackageIds + type: array + items: + type: string + format: uuid + nestedNsdInfoIds: + description: Match NS Packages with particular nsdInvariantIds + type: array + items: + type: string + format: uuid + nsdOnboardingState: + description: Match NS Packages with particular NS Onboarding State + type: array + items: + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + nsdOperationalState: + description: Match NS Packages with particular NS Operational State + type: array + items: + type: string + enum: + - ENABLED + - DISABLED + nsdUsageState: + description: Match NS Packages with particular NS Usage State + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + pnfdInfoIds: + description: Match PF packages with particular pnfdInfoIds + type: array + items: + type: string + format: uuid + pnfdId: + description: Match PF packages with particular pnfdInfoIds + type: array + items: + type: string + format: uuid + pnfdName: + description: Match PF Packages with particular pnfdNames + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdVersion: + description: match PF packages that belong to certain pnfd version + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdProvider: + description: Match PF Packages with particular pnfdProvider + type: array + items: + type: string + maxLength: 255 + minLength: 1 + pnfdInvariantId: + description: Match PF Packages with particular pnfdInvariantIds + type: array + items: + type: string + format: uuid + pnfdOnboardingState: + description: 'Match PF Packages with particular PNF Onboarding State ' + type: array + items: + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + pnfdUsageState: + description: Match PF Packages with particular PNF usage State + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + NSDM_SUB_LinkSerializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + type: object + properties: + self: + $ref: '#/definitions/UriLink' + NsdmSubscription: + required: + - id + - callbackUri + - _links + type: object + properties: + id: + title: Id + description: Identifier of this subscription resource. + type: string + maxLength: 255 + minLength: 1 + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + maxLength: 255 + minLength: 1 + filter: + $ref: '#/definitions/NsdmNotificationsFilter' + _links: + $ref: '#/definitions/NSDM_SUB_LinkSerializer' + BasicAuth: + title: Paramsbasic + description: Parameters for authentication/authorization using BASIC. + type: object + properties: + userName: + title: Username + description: Username to be used in HTTP Basic authentication. + type: string + maxLength: 255 + minLength: 1 + password: + title: Password + description: Password to be used in HTTP Basic authentication. + type: string + maxLength: 255 + minLength: 1 + OAuthCredentials: + title: Paramsoauth2clientcredentials + description: Parameters for authentication/authorization using OAUTH2_CLIENT_CREDENTIALS. + type: object + properties: + clientId: + title: Clientid + description: Client identifier to be used in the access token request of the + OAuth 2.0 client credentials grant type. + type: string + maxLength: 255 + minLength: 1 + clientPassword: + title: Clientpassword + description: Client password to be used in the access token request of the + OAuth 2.0 client credentials grant type. + type: string + maxLength: 255 + minLength: 1 + tokenEndpoint: + title: Tokenendpoint + description: The token endpoint from which the access token can be obtained. + type: string + maxLength: 255 + minLength: 1 + SubscriptionAuthentication: + title: Authentication + description: Authentication parameters to configure the use of Authorization when + sending notifications corresponding to this subscription. + required: + - authType + type: object + properties: + authType: + description: Defines the types of Authentication / Authorization which the + API consumer is willing to accept when receiving a notification. + type: array + items: + type: string + enum: + - BASIC + - OAUTH2_CLIENT_CREDENTIALS + - TLS_CERT + paramsBasic: + $ref: '#/definitions/BasicAuth' + paramsOauth2ClientCredentials: + $ref: '#/definitions/OAuthCredentials' + NsdmSubscriptionRequest: + required: + - callbackUri + type: object + properties: + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + minLength: 1 + filter: + $ref: '#/definitions/NsdmNotificationsFilter' + authentication: + $ref: '#/definitions/SubscriptionAuthentication' + ParseModelRequest: + required: + - csarId + type: object + properties: + csarId: + title: Csarid + description: CSAR ID + type: string + minLength: 1 + packageType: + title: Packagetype + description: 'Package type: VNF, PNF, NS, Service' + type: string + minLength: 1 + inputs: + title: Inputs + description: Inputs + type: string + ParseModelResponse: + required: + - model + type: object + properties: + model: + title: Model + description: Model + type: string + VNF_SUBSCRIPTION_LINKSERIALIZER: + title: Self + description: URI of this resource. + required: + - href + type: object + properties: + href: + title: Href + description: URI of the referenced resource. + type: string + minLength: 1 + LinkSelf: + title: ' links' + description: Links to resources related to this resource. + required: + - self + type: object + properties: + self: + $ref: '#/definitions/VNF_SUBSCRIPTION_LINKSERIALIZER' + Version: + title: Versions + description: match VNF packages that contain VNF products with certain versions + required: + - vnfSoftwareVersion + type: object + properties: + vnfSoftwareVersion: + title: Vnfsoftwareversion + description: VNF software version to match. + type: string + maxLength: 255 + minLength: 1 + vnfdVersions: + description: Match VNF packages that contain VNF products with certain VNFD + versions + type: array + items: + type: string + minLength: 1 + vnfProducts: + title: Vnfproducts + description: match VNF packages that contain VNF products with certain product + names, from one particular provider + required: + - vnfProductName + type: object + properties: + vnfProductName: + title: Vnfproductname + description: Name of the VNF product to match. + type: string + maxLength: 255 + minLength: 1 + versions: + $ref: '#/definitions/Version' + vnfProductsProviders: + required: + - vnfProvider + type: object + properties: + vnfProvider: + title: Vnfprovider + description: Name of the VNFprovider to match. + type: string + maxLength: 255 + minLength: 1 + vnfProducts: + $ref: '#/definitions/vnfProducts' + PkgmNotificationsFilter: + title: Filter + description: Filter settings for this subscription, to define the subset of all + notifications this subscription relates to + type: object + properties: + notificationTypes: + description: Match particular notification types + type: array + items: + type: string + enum: + - VnfPackageOnboardingNotification + - VnfPackageChangeNotification + vnfProductsFromProviders: + description: Match VNF packages that contain VNF products from certain providers. + type: array + items: + $ref: '#/definitions/vnfProductsProviders' + vnfdId: + description: Match VNF packages with a VNFD identifierlisted in the attribute + type: array + items: + type: string + format: uuid + vnfPkgId: + description: Match VNF packages with a VNFD identifierlisted in the attribute + type: array + items: + type: string + format: uuid + operationalState: + description: Operational state of the VNF package. + type: array + items: + type: string + enum: + - ENABLED + - DISABLED + usageState: + description: Operational state of the VNF package. + type: array + items: + type: string + enum: + - IN_USE + - NOT_IN_USE + PkgmSubscription: + required: + - id + - callbackUri + - _links + type: object + properties: + id: + title: Id + description: Identifier of this subscription resource. + type: string + format: uuid + callbackUri: + title: Callbackuri + description: The URI of the endpoint to send the notification to. + type: string + format: uri + minLength: 1 + _links: + $ref: '#/definitions/LinkSelf' + filter: + $ref: '#/definitions/PkgmNotificationsFilter' + PkgmSubscriptionRequest: + required: + - callbackUri + type: object + properties: + filters: + $ref: '#/definitions/PkgmNotificationsFilter' + callbackUri: + title: Callbackuri + description: Callback URI to sendthe notification + type: string + format: uri + minLength: 1 + authentication: + $ref: '#/definitions/SubscriptionAuthentication' + Checksum: + title: Checksum + description: Checksum of the on-boarded VNF package. + required: + - algorithm + - hash + type: object + properties: + algorithm: + title: Algorithm + description: Name of the algorithm used to generate the checksum. + type: string + minLength: 1 + hash: + title: Hash + description: The hexadecimal value of the checksum. + type: string + minLength: 1 + VnfPackageSoftwareImageInfo: + description: Information about VNF package artifacts that are software images. + required: + - id + - name + - provider + - version + - checksum + - containerFormat + - diskFormat + - createdAt + - minDisk + - minRam + - size + - imagePath + type: object + properties: + id: + title: Id + description: Identifier of the software image. + type: string + minLength: 1 + name: + title: Name + description: Name of the software image. + type: string + minLength: 1 + provider: + title: Provider + description: Provider of the software image. + type: string + minLength: 1 + version: + title: Version + description: Version of the software image. + type: string + minLength: 1 + checksum: + $ref: '#/definitions/Checksum' + containerFormat: + title: Containerformat + description: 'terminationType: Indicates whether forceful or graceful termination + is requested.' + type: string + enum: + - AKI + - AMI + - ARI + - BARE + - DOCKER + - OVA + - OVF + diskFormat: + title: Diskformat + description: Disk format of a software image is the format of the underlying + disk image. + type: string + enum: + - AKI + - AMI + - ARI + - ISO + - QCOW2 + - RAW + - VDI + - VHD + - VHDX + - VMDK + createdAt: + title: Createdat + description: Time when this software image was created. + type: string + format: date-time + minDisk: + title: Mindisk + description: The minimal disk for this software image in bytes. + type: integer + minRam: + title: Minram + description: The minimal RAM for this software image in bytes. + type: integer + size: + title: Size + description: Size of this software image in bytes. + type: integer + userMetadata: + title: Usermetadata + description: User-defined data. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + imagePath: + title: Imagepath + description: Path in the VNF package. + type: string + minLength: 1 + VnfPackageArtifactInfo: + description: Information about VNF package artifacts contained in the VNF package + that are not software images. + required: + - artifactPath + - checksum + type: object + properties: + artifactPath: + title: Artifactpath + description: Path in the VNF package. + type: string + minLength: 1 + checksum: + $ref: '#/definitions/Checksum' + metadata: + title: Metadata + description: The metadata of the artifact that are available in the VNF package + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + VNF_PKGM_Link_Serializer: + title: ' links' + description: Links to resources related to this resource. + required: + - self + - packageContent + type: object + properties: + self: + $ref: '#/definitions/UriLink' + vnfd: + $ref: '#/definitions/UriLink' + packageContent: + $ref: '#/definitions/UriLink' + VnfPkgInfo: + required: + - id + - onboardingState + - operationalState + - usageState + - _links + type: object + properties: + id: + title: Id + description: Identifier of the on-boarded VNF package. + type: string + minLength: 1 + vnfdId: + title: Vnfdid + description: This identifier, which is managed by the VNF provider, identifies + the VNF package and the VNFD in a globally unique way. + type: string + x-nullable: true + vnfProvider: + title: Vnfprovider + description: Provider of the VNF package and the VNFD. + type: string + x-nullable: true + vnfProductName: + title: Vnfproductname + description: Name to identify the VNF product. + type: string + x-nullable: true + vnfSoftwareVersion: + title: Vnfsoftwareversion + description: Software version of the VNF. + type: string + x-nullable: true + vnfdVersion: + title: Vnfdversion + description: The version of the VNvFD. + type: string + x-nullable: true + checksum: + $ref: '#/definitions/Checksum' + softwareImages: + description: Information about VNF package artifacts that are software images. + type: array + items: + $ref: '#/definitions/VnfPackageSoftwareImageInfo' + x-nullable: true + additionalArtifacts: + description: Information about VNF package artifacts contained in the VNF + package that are not software images. + type: array + items: + $ref: '#/definitions/VnfPackageArtifactInfo' + x-nullable: true + onboardingState: + title: Onboardingstate + description: On-boarding state of the VNF package. + type: string + enum: + - CREATED + - UPLOADING + - PROCESSING + - ONBOARDED + operationalState: + title: Operationalstate + description: Operational state of the VNF package. + type: string + enum: + - ENABLED + - DISABLED + usageState: + title: Usagestate + description: Usage state of the VNF package. + type: string + enum: + - IN_USE + - NOT_IN_USE + userDefinedData: + title: Userdefineddata + description: User defined data for the VNF package. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + _links: + $ref: '#/definitions/VNF_PKGM_Link_Serializer' + CreateVnfPkgInfoRequest: + type: object + properties: + userDefinedData: + title: Userdefineddata + description: User defined data for the VNF package. + type: object + additionalProperties: + description: KeyValue Pairs + type: string + x-nullable: true + UploadVnfPackageFromUriRequest: + required: + - addressInformation + type: object + properties: + addressInformation: + title: Addressinformation + description: Address information of the VNF package content. + type: string + minLength: 1 + userName: + title: Username + description: User name to be used for authentication. + type: string + minLength: 1 + password: + title: Password + description: Password to be used for authentication. + type: string + minLength: 1 -- 2.16.6