aboutsummaryrefslogtreecommitdiffstats
path: root/adapters/mso-vnfm-adapter
diff options
context:
space:
mode:
Diffstat (limited to 'adapters/mso-vnfm-adapter')
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml4
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/pom.xml20
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json3102
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java10
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Sol003PackageManagementControllerExceptionHandler.java74
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java180
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/AbstractServiceProviderConfiguration.java49
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java56
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderConfiguration.java56
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java160
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java82
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java20
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java105
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java19
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerRequestFailureException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgBadRequestException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgConflictException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgNotFoundException.java43
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementControllerTest.java429
-rw-r--r--adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java4
20 files changed, 4463 insertions, 79 deletions
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml
index 9d9e33a524..f828a12c8b 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-api/pom.xml
@@ -105,5 +105,9 @@
<artifactId>okio</artifactId>
<version>1.13.0</version>
</dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/pom.xml b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/pom.xml
index 784c39c906..8e2cfd2be4 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/pom.xml
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/pom.xml
@@ -110,6 +110,26 @@
</configOptions>
</configuration>
</execution>
+ <execution>
+ <id>etsicatalog-api</id>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <inputSpec>${basedir}/src/main/resources/ETSI-Catalog-API.json</inputSpec>
+ <language>java</language>
+ <library>okhttp-gson</library>
+ <output>${project.build.directory}/generated-sources/etsicatalog</output>
+ <apiPackage>org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.api</apiPackage>
+ <modelPackage>org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model</modelPackage>
+ <configOptions>
+ <sourceFolder>src/gen/java/main</sourceFolder>
+ <withXml>true</withXml>
+ <useRxJava2>true</useRxJava2>
+ <serializableModel>true</serializableModel>
+ </configOptions>
+ </configuration>
+ </execution>
</executions>
</plugin>
</plugins>
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json
new file mode 100644
index 0000000000..514029bab8
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-adapter-ext-clients/src/main/resources/ETSI-Catalog-API.json
@@ -0,0 +1,3102 @@
+{
+ "swagger": "2.0",
+ "info": {
+ "title": "Modeling etsicatalog API",
+ "description": "\n\nThe `swagger-ui` view can be found [here](/api/catalog/v1/swagger).\nThe `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:8000",
+ "schemes": ["http"],
+ "basePath": "/",
+ "consumes": ["application/json"],
+ "produces": ["application/json"],
+ "securityDefinitions": {
+ "Basic": {
+ "type": "basic"
+ }
+ },
+ "security": [{
+ "Basic": []
+ }],
+ "paths": {
+ "/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"
+ }]
+ },
+ "/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"
+ }
+ }
+ },
+ "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/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/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"
+ }
+ },
+ "500": {
+ "description": "Internal error"
+ }
+ },
+ "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"
+ }
+ }
+ },
+ "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"
+ }
+ }
+ },
+ "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"
+ }
+ }
+ },
+ "tags": ["VNF Package Management interface"]
+ },
+ "parameters": [{
+ "name": "vnfPkgId",
+ "in": "path",
+ "required": true,
+ "type": "string"
+ }]
+ },
+ "/samples/": {
+ "get": {
+ "operationId": "samples_list",
+ "description": "List all samples.",
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": ""
+ }
+ },
+ "tags": ["Sample interface"]
+ },
+ "parameters": []
+ }
+ },
+ "definitions": {
+ "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": {
+ "title": "Vnfproductsfromproviders",
+ "description": "Match VNF packages that contain VNF products from certain providers.",
+ "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": {
+ "$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
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
index 32c22356b3..84282e0c7f 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/MessageConverterConfiguration.java
@@ -23,10 +23,13 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.ArrayList;
import java.util.Collection;
+import org.onap.so.adapters.vnfmadapter.converters.Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter;
import org.onap.so.adapters.vnfmadapter.oauth.OAuth2AccessTokenAdapter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
@@ -38,6 +41,13 @@ import org.springframework.security.oauth2.common.OAuth2AccessToken;
public class MessageConverterConfiguration {
@Bean
+ public ConversionService conversionService() {
+ final DefaultConversionService service = new DefaultConversionService();
+ service.addConverter(new Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter());
+ return service;
+ }
+
+ @Bean
public HttpMessageConverters customConverters() {
final Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
final Gson gson = new GsonBuilder()
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Sol003PackageManagementControllerExceptionHandler.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Sol003PackageManagementControllerExceptionHandler.java
new file mode 100644
index 0000000000..2a97bb47e4
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/Sol003PackageManagementControllerExceptionHandler.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter;
+
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
+import org.onap.so.adapters.vnfmadapter.rest.Sol003PackageManagementController;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.EtsiCatalogManagerRequestFailureException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgBadRequestException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgConflictException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+/**
+ * Exception Handler for the Package Management Controller {@link Sol003PackageManagementController Sol003Controller}
+ *
+ * @author gareth.roper@est.tech
+ */
+@ControllerAdvice(assignableTypes = Sol003PackageManagementController.class)
+
+public class Sol003PackageManagementControllerExceptionHandler {
+
+ @ExceptionHandler(EtsiCatalogManagerRequestFailureException.class)
+ public ResponseEntity<ProblemDetails> handleEtsiCatalogManagerRequestFailureException(
+ final EtsiCatalogManagerRequestFailureException etsiCatalogManagerRequestFailureException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(etsiCatalogManagerRequestFailureException.getMessage());
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(problemDetails);
+ }
+
+ @ExceptionHandler(VnfPkgConflictException.class)
+ public ResponseEntity<ProblemDetails> handleVnfPkgConflictException(
+ final VnfPkgConflictException vnfPkgConflictException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(vnfPkgConflictException.getMessage());
+ return ResponseEntity.status(HttpStatus.CONFLICT).body(problemDetails);
+ }
+
+ @ExceptionHandler(VnfPkgNotFoundException.class)
+ public ResponseEntity<ProblemDetails> handleVnfPkgNotFoundException(
+ final VnfPkgNotFoundException vnfPkgNotFoundException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(vnfPkgNotFoundException.getMessage());
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(problemDetails);
+ }
+
+ @ExceptionHandler(VnfPkgBadRequestException.class)
+ public ResponseEntity<ProblemDetails> handleVnfPkgBadRequestException(
+ final VnfPkgBadRequestException vnfPkgBadRequestException) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(vnfPkgBadRequestException.getMessage());
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(problemDetails);
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java
new file mode 100644
index 0000000000..de18ecc43e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/converters/Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.java
@@ -0,0 +1,180 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.converters;
+
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.*;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Converter to convert from an Etsi Catalog Model {@link VnfPkgInfo} Object to a PackageManagement Model
+ * {@link InlineResponse2001} Object
+ *
+ * @author andrew.a.lamb@est.tech
+ */
+@Service
+public class Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter
+ implements Converter<VnfPkgInfo, InlineResponse2001> {
+ private static final Logger logger =
+ LoggerFactory.getLogger(Sol003EtsiVnfPkgInfoToPkgmInlineResponse2001Converter.class);
+
+ /**
+ * Convert a {@link VnfPkgInfo} Object to an {@link InlineResponse2001} Object
+ *
+ * @param vnfPkgInfo The VnfPkgInfo Object to Convert
+ * @return The Converted InlineResponse2001 Object
+ */
+ @Override
+ public InlineResponse2001 convert(final VnfPkgInfo vnfPkgInfo) {
+ if (vnfPkgInfo == null) {
+ logger.info("No VnfPkgInfo Object Provided for Conversion. (Null object received, returning Null)");
+ return null;
+ }
+ final InlineResponse2001 response = new InlineResponse2001();
+ response.setId(vnfPkgInfo.getId());
+ response.setVnfdId(vnfPkgInfo.getVnfdId());
+ response.setVnfProvider(vnfPkgInfo.getVnfProvider());
+ response.setVnfProductName(vnfPkgInfo.getVnfProductName());
+ response.setVnfSoftwareVersion(vnfPkgInfo.getVnfSoftwareVersion());
+ response.setVnfdVersion(vnfPkgInfo.getVnfdVersion());
+ response.setChecksum(convertChecksumToVnfPackagesChecksum(vnfPkgInfo.getChecksum()));
+ response.setSoftwareImages(
+ convertVnfPackageSoftwareImageInfoListToVnfPackagesSoftwareImagesList(vnfPkgInfo.getSoftwareImages()));
+ response.setAdditionalArtifacts(convertVnfPackageArtifactInfoListToVnfPackagesAdditionalArtifactsList(
+ vnfPkgInfo.getAdditionalArtifacts()));
+
+ if (vnfPkgInfo.getOnboardingState() != null) {
+ response.setOnboardingState(
+ InlineResponse2001.OnboardingStateEnum.fromValue(vnfPkgInfo.getOnboardingState().getValue()));
+ }
+
+ if (vnfPkgInfo.getOperationalState() != null) {
+ response.setOperationalState(
+ InlineResponse2001.OperationalStateEnum.fromValue(vnfPkgInfo.getOperationalState().getValue()));
+ }
+
+ response.setUserDefinedData((vnfPkgInfo.getUserDefinedData()));
+
+ if (vnfPkgInfo.getLinks() != null) {
+ response.setLinks(convertVNFPKGMLinkSerializerToVnfPackagesLinks(vnfPkgInfo.getLinks()));
+ }
+
+ return response;
+ }
+
+ private VnfPackagesChecksum convertChecksumToVnfPackagesChecksum(final Checksum checksum) {
+ final VnfPackagesChecksum vnfPackagesChecksum = new VnfPackagesChecksum();
+ if (checksum != null) {
+ vnfPackagesChecksum.setAlgorithm(checksum.getAlgorithm());
+ vnfPackagesChecksum.setHash(checksum.getHash());
+ }
+ return vnfPackagesChecksum;
+ }
+
+ private List<VnfPackagesSoftwareImages> convertVnfPackageSoftwareImageInfoListToVnfPackagesSoftwareImagesList(
+ final List<VnfPackageSoftwareImageInfo> vnfPackageSoftwareImageInfoList) {
+ final List<VnfPackagesSoftwareImages> vnfPackagesSoftwareImages = new ArrayList<>();
+ if (vnfPackageSoftwareImageInfoList != null) {
+ for (final VnfPackageSoftwareImageInfo vnfPackageSoftwareImageInfo : vnfPackageSoftwareImageInfoList) {
+ final VnfPackagesSoftwareImages softwareImage =
+ convertVnfPackageSoftwareImageInfoToVnfPackagesSoftwareImages(vnfPackageSoftwareImageInfo);
+ vnfPackagesSoftwareImages.add(softwareImage);
+ }
+ }
+ return vnfPackagesSoftwareImages;
+ }
+
+ private VnfPackagesSoftwareImages convertVnfPackageSoftwareImageInfoToVnfPackagesSoftwareImages(
+ final VnfPackageSoftwareImageInfo vnfPackageSoftwareImageInfo) {
+ final VnfPackagesSoftwareImages vnfPackagesSoftwareImages = new VnfPackagesSoftwareImages();
+ vnfPackagesSoftwareImages.setId(vnfPackageSoftwareImageInfo.getId());
+ vnfPackagesSoftwareImages.setName(vnfPackageSoftwareImageInfo.getName());
+ vnfPackagesSoftwareImages.setProvider(vnfPackageSoftwareImageInfo.getProvider());
+ vnfPackagesSoftwareImages.setVersion(vnfPackageSoftwareImageInfo.getVersion());
+ vnfPackagesSoftwareImages
+ .setChecksum(convertChecksumToVnfPackagesChecksum(vnfPackageSoftwareImageInfo.getChecksum()));
+ if (vnfPackageSoftwareImageInfo.getContainerFormat() != null) {
+ vnfPackagesSoftwareImages.setContainerFormat(VnfPackagesSoftwareImages.ContainerFormatEnum
+ .fromValue(vnfPackageSoftwareImageInfo.getContainerFormat().getValue()));
+ }
+
+ if (vnfPackageSoftwareImageInfo.getDiskFormat() != null) {
+ vnfPackagesSoftwareImages.setDiskFormat(VnfPackagesSoftwareImages.DiskFormatEnum
+ .fromValue(vnfPackageSoftwareImageInfo.getDiskFormat().getValue()));
+ }
+
+ vnfPackagesSoftwareImages.setCreatedAt(vnfPackageSoftwareImageInfo.getCreatedAt());
+ vnfPackagesSoftwareImages.setMinDisk(vnfPackageSoftwareImageInfo.getMinDisk());
+ vnfPackagesSoftwareImages.setMinRam(vnfPackageSoftwareImageInfo.getMinRam());
+ vnfPackagesSoftwareImages.setSize(vnfPackageSoftwareImageInfo.getSize());
+ vnfPackagesSoftwareImages.setUserMetadata(vnfPackageSoftwareImageInfo.getUserMetadata());
+ vnfPackagesSoftwareImages.setImagePath(vnfPackageSoftwareImageInfo.getImagePath());
+ return vnfPackagesSoftwareImages;
+ }
+
+ private List<VnfPackagesAdditionalArtifacts> convertVnfPackageArtifactInfoListToVnfPackagesAdditionalArtifactsList(
+ final List<VnfPackageArtifactInfo> vnfPackageArtifactInfoList) {
+ if (vnfPackageArtifactInfoList != null) {
+ final List<VnfPackagesAdditionalArtifacts> additionalArtifacts = new ArrayList<>();
+ for (final VnfPackageArtifactInfo artifactInfo : vnfPackageArtifactInfoList) {
+ final VnfPackagesAdditionalArtifacts artifact =
+ convertVnfPackageArtifactInfoToVnfPackagesAdditionalArtifacts(artifactInfo);
+ additionalArtifacts.add(artifact);
+ }
+ return additionalArtifacts;
+ }
+ return null;
+ }
+
+ private VnfPackagesAdditionalArtifacts convertVnfPackageArtifactInfoToVnfPackagesAdditionalArtifacts(
+ final VnfPackageArtifactInfo vnfPackageArtifactInfo) {
+ final VnfPackagesAdditionalArtifacts vnfPackagesAdditionalArtifacts = new VnfPackagesAdditionalArtifacts();
+ vnfPackagesAdditionalArtifacts.setArtifactPath(vnfPackageArtifactInfo.getArtifactPath());
+ vnfPackagesAdditionalArtifacts
+ .setChecksum(convertChecksumToVnfPackagesChecksum(vnfPackageArtifactInfo.getChecksum()));
+ vnfPackagesAdditionalArtifacts.setMetadata(vnfPackageArtifactInfo.getMetadata());
+ return vnfPackagesAdditionalArtifacts;
+ }
+
+ private VnfPackagesLinks convertVNFPKGMLinkSerializerToVnfPackagesLinks(
+ final VNFPKGMLinkSerializer vnfpkgmLinkSerializer) {
+ final VnfPackagesLinks vnfPackagesLinks = new VnfPackagesLinks();
+ vnfPackagesLinks.setSelf(convertUriLinkToVnfPackagesLinksSelf(vnfpkgmLinkSerializer.getSelf()));
+ vnfPackagesLinks.setVnfd(convertUriLinkToVnfPackagesLinksSelf(vnfpkgmLinkSerializer.getVnfd()));
+ vnfPackagesLinks
+ .setPackageContent(convertUriLinkToVnfPackagesLinksSelf(vnfpkgmLinkSerializer.getPackageContent()));
+ return vnfPackagesLinks;
+ }
+
+ private VnfPackagesLinksSelf convertUriLinkToVnfPackagesLinksSelf(final UriLink uriLink) {
+ final VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
+ if (uriLink != null) {
+ vnfPackagesLinksSelf.setHref(uriLink.getHref());
+ }
+ return vnfPackagesLinksSelf;
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/AbstractServiceProviderConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/AbstractServiceProviderConfiguration.java
new file mode 100644
index 0000000000..8f6d853997
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/AbstractServiceProviderConfiguration.java
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients;
+
+import com.google.gson.Gson;
+import java.util.Iterator;
+import org.onap.vnfmadapter.v1.JSON;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.GsonHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * A base class that can be extended by classes for configuring HttpRestServiceProvider classes. Provides common methods
+ * that will be useful to some such classes.
+ *
+ * @author gareth.roper@est.tech
+ */
+public abstract class AbstractServiceProviderConfiguration {
+
+ public void setGsonMessageConverter(final RestTemplate restTemplate) {
+ final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next() instanceof MappingJackson2HttpMessageConverter) {
+ iterator.remove();
+ }
+ }
+ final Gson gson = new JSON().getGson();
+ restTemplate.getMessageConverters().add(new GsonHttpMessageConverter(gson));
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
new file mode 100644
index 0000000000..a73958e544
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProvider.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
+
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
+import java.util.Optional;
+
+/**
+ * Provides methods for invoking REST calls to the ETSI Catalog Manager.
+ *
+ * @author gareth.roper@est.tech
+ */
+public interface EtsiCatalogServiceProvider {
+
+ /**
+ * GET Package Content, from VNF Package.
+ *
+ * @param vnfPkgId The ID of the VNF Package from which the "package_content" will be retrieved.
+ * @return The Package Content of a VNF Package ("vnfPkgId").
+ */
+ Optional<byte[]> getVnfPackageContent(final String vnfPkgId);
+
+ /**
+ * GET VNF packages information from ETSI Catalog. Will return zero or more VNF package representations.
+ *
+ * @return An Array of all VNF packages retrieved from the ETSI Catalog.
+ */
+ Optional<InlineResponse2001[]> getVnfPackages();
+
+ /**
+ * GET specific VNF package information from ETSI Catalog.
+ *
+ * @param vnfPkgId The ID of the VNF Package that you want to query.
+ * @return The VNF package retrieved from the ETSI Catalog
+ */
+ Optional<InlineResponse2001> getVnfPackage(final String vnfPkgId);
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderConfiguration.java
new file mode 100644
index 0000000000..6840dd388b
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderConfiguration.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
+
+import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
+import org.onap.so.adapters.vnfmadapter.extclients.AbstractServiceProviderConfiguration;
+import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
+import org.onap.so.configuration.rest.HttpHeadersProvider;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.onap.so.rest.service.HttpRestServiceProviderImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * Configures the HttpRestServiceProvider to make REST calls to the ETSI Catalog Manager
+ *
+ * @author gareth.roper@est.tech
+ */
+
+@Configuration
+public class EtsiCatalogServiceProviderConfiguration extends AbstractServiceProviderConfiguration {
+
+ @Bean(name = "etsiCatalogServiceProvider")
+ public HttpRestServiceProvider httpRestServiceProvider(
+ @Qualifier(CONFIGURABLE_REST_TEMPLATE) @Autowired final RestTemplate restTemplate) {
+ return getHttpRestServiceProvider(restTemplate, new BasicHttpHeadersProvider());
+ }
+
+ private HttpRestServiceProvider getHttpRestServiceProvider(final RestTemplate restTemplate,
+ final HttpHeadersProvider httpHeadersProvider) {
+ setGsonMessageConverter(restTemplate);
+ return new HttpRestServiceProviderImpl(restTemplate, httpHeadersProvider);
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
new file mode 100644
index 0000000000..96b01f04e4
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogServiceProviderImpl.java
@@ -0,0 +1,160 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
+
+import java.util.Optional;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfPkgInfo;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.EtsiCatalogManagerRequestFailureException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgBadRequestException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgConflictException;
+import org.onap.so.adapters.vnfmadapter.rest.exceptions.VnfPkgNotFoundException;
+import org.onap.so.rest.exceptions.HttpResouceNotFoundException;
+import org.onap.so.rest.exceptions.InvalidRestRequestException;
+import org.onap.so.rest.exceptions.RestProcessingException;
+import org.onap.so.rest.service.HttpRestServiceProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+/**
+ * Provides the implementations of the REST Requests to the ETSI Catalog Manager.
+ *
+ * @author gareth.roper@est.tech
+ */
+@Service
+public class EtsiCatalogServiceProviderImpl implements EtsiCatalogServiceProvider {
+ private static final Logger logger = LoggerFactory.getLogger(EtsiCatalogServiceProviderImpl.class);
+
+ @Qualifier("etsiCatalogServiceProvider")
+ private final HttpRestServiceProvider httpServiceProvider;
+ private final EtsiCatalogUrlProvider etsiCatalogUrlProvider;
+ private final ConversionService conversionService;
+
+ @Autowired
+ public EtsiCatalogServiceProviderImpl(final EtsiCatalogUrlProvider etsiCatalogUrlProvider,
+ final HttpRestServiceProvider httpServiceProvider, final ConversionService conversionService) {
+ this.etsiCatalogUrlProvider = etsiCatalogUrlProvider;
+ this.httpServiceProvider = httpServiceProvider;
+ this.conversionService = conversionService;
+ }
+
+ @Override
+ public Optional<byte[]> getVnfPackageContent(final String vnfPkgId)
+ throws EtsiCatalogManagerRequestFailureException {
+ try {
+ final ResponseEntity<byte[]> response = httpServiceProvider
+ .getHttpResponse(etsiCatalogUrlProvider.getVnfPackageContentUrl(vnfPkgId), byte[].class);
+ logger.info("getVnfPackageContent Request to ETSI Catalog Manager Status Code: {}",
+ response.getStatusCodeValue());
+ if (response.getStatusCode() == HttpStatus.OK) {
+ return Optional.ofNullable(response.getBody());
+ }
+ } catch (final HttpResouceNotFoundException httpResouceNotFoundException) {
+ logger.error("Caught HttpResouceNotFoundException", httpResouceNotFoundException);
+ throw new VnfPkgNotFoundException("No Vnf Package found with vnfPkgId: " + vnfPkgId);
+ } catch (final RestProcessingException restProcessingException) {
+ logger.error("Caught RestProcessingException with Status Code: {}", restProcessingException.getStatusCode(),
+ restProcessingException);
+ if (restProcessingException.getStatusCode() == HttpStatus.CONFLICT.value()) {
+ throw new VnfPkgConflictException("A conflict occurred with the state of the resource,\n"
+ + "due to the attribute: onboardingState not being set to ONBOARDED.");
+ }
+ }
+ throw new EtsiCatalogManagerRequestFailureException("Internal Server Error Occurred.");
+ }
+
+ @Override
+ public Optional<InlineResponse2001[]> getVnfPackages() {
+ try {
+ final ResponseEntity<VnfPkgInfo[]> response =
+ httpServiceProvider.getHttpResponse(etsiCatalogUrlProvider.getVnfPackagesUrl(), VnfPkgInfo[].class);
+ logger.info("getVnfPackages Request to ETSI Catalog Manager Status Code: {}",
+ response.getStatusCodeValue());
+ if (response.getStatusCode() == HttpStatus.OK) {
+ if (response.hasBody()) {
+ final VnfPkgInfo[] vnfPackages = response.getBody();
+ final InlineResponse2001[] responses = new InlineResponse2001[vnfPackages.length];
+ for (int index = 0; index < vnfPackages.length; index++) {
+ if (conversionService.canConvert(vnfPackages[index].getClass(), InlineResponse2001.class)) {
+ final InlineResponse2001 inlineResponse2001 =
+ conversionService.convert(vnfPackages[index], InlineResponse2001.class);
+ if (inlineResponse2001 != null) {
+ responses[index] = inlineResponse2001;
+ }
+ }
+ logger.error("Unable to find Converter for response class: {}", vnfPackages[index].getClass());
+ }
+ return Optional.ofNullable(responses);
+ }
+ logger.error("Received response without body ...");
+ }
+ logger.error("Unexpected status code received {}", response.getStatusCode());
+ return Optional.empty();
+ } catch (final InvalidRestRequestException invalidRestRequestException) {
+ logger.error("Caught InvalidRestRequestException", invalidRestRequestException);
+ throw new VnfPkgBadRequestException("Error: Bad Request Received");
+ } catch (final HttpResouceNotFoundException httpResouceNotFoundException) {
+ logger.error("Caught HttpResouceNotFoundException", httpResouceNotFoundException);
+ throw new VnfPkgNotFoundException("No Vnf Packages found");
+ } catch (final RestProcessingException restProcessingException) {
+ logger.error("Caught RestProcessingException with Status Code: {}", restProcessingException.getStatusCode(),
+ restProcessingException);
+ throw new EtsiCatalogManagerRequestFailureException("Internal Server Error Occurred.");
+ }
+ }
+
+ @Override
+ public Optional<InlineResponse2001> getVnfPackage(final String vnfPkgId) {
+ try {
+ final ResponseEntity<VnfPkgInfo> response = httpServiceProvider
+ .getHttpResponse(etsiCatalogUrlProvider.getVnfPackageUrl(vnfPkgId), VnfPkgInfo.class);
+ logger.info("getVnfPackage Request for vnfPkgId {} to ETSI Catalog Manager Status Code: {}", vnfPkgId,
+ response.getStatusCodeValue());
+ if (response.getStatusCode() == HttpStatus.OK) {
+ if (response.hasBody()) {
+ final VnfPkgInfo vnfPkgInfo = response.getBody();
+ if (conversionService.canConvert(vnfPkgInfo.getClass(), InlineResponse2001.class)) {
+ return Optional.ofNullable(conversionService.convert(vnfPkgInfo, InlineResponse2001.class));
+ }
+ logger.error("Unable to find Converter for response class: {}", vnfPkgInfo.getClass());
+ }
+ logger.error("Received response without body ....");
+ }
+ return Optional.empty();
+ } catch (final InvalidRestRequestException invalidRestRequestException) {
+ logger.error("Caught InvalidRestRequestException", invalidRestRequestException);
+ throw new VnfPkgBadRequestException("Error: Bad Request Received");
+ } catch (final HttpResouceNotFoundException httpResouceNotFoundException) {
+ logger.error("Caught HttpResouceNotFoundException", httpResouceNotFoundException);
+ throw new VnfPkgNotFoundException("No Vnf Package found with vnfPkgId: " + vnfPkgId);
+ } catch (final RestProcessingException restProcessingException) {
+ logger.error("Caught RestProcessingException with Status Code: {}", restProcessingException.getStatusCode(),
+ restProcessingException);
+ throw new EtsiCatalogManagerRequestFailureException("Internal Server Error Occurred.");
+ }
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java
new file mode 100644
index 0000000000..d233c3f0fd
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/etsicatalog/EtsiCatalogUrlProvider.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+
+package org.onap.so.adapters.vnfmadapter.extclients.etsicatalog;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+/**
+ * Provides the URLs for the REST Requests to the ETSI Catalog Manager.
+ *
+ * @author gareth.roper@est.tech
+ */
+@Service
+public class EtsiCatalogUrlProvider {
+
+ private static final Logger logger = getLogger(EtsiCatalogUrlProvider.class);
+
+ @Value("${msb.endpoint:#{\"http://msb_iag.onap:80\"}}")
+ private String msbEndpoint;
+ @Value("${msb.catalogServiceUrl:#{null}}")
+ private String catalogServiceUrl;
+ @Value("${msb.vnfpkgmServiceUrl:#{\"/api/vnfpkgm/v1\"}}")
+ private String vnfpkgmServiceUrl;
+
+ public EtsiCatalogUrlProvider() {}
+
+ /**
+ * Get the URL for retrieving the Package Content from the ETSI Catalog.".
+ *
+ * @param vnfPkgId The ID of the VNF Package
+ * @return the URL for the GET operation
+ */
+ public String getVnfPackageContentUrl(final String vnfPkgId) {
+ final String url = msbEndpoint + vnfpkgmServiceUrl + "/vnf_packages/" + vnfPkgId + "/package_content";
+ logger.info("getEtsiCatalogVnfPackageContentUrl: {}", url);
+ return url;
+ }
+
+ /**
+ * Get the URL for retrieving VNF packages information from ETSI Catalog.".
+ *
+ * @return the URL for the GET operation
+ */
+ public String getVnfPackagesUrl() {
+ final String url = msbEndpoint + vnfpkgmServiceUrl + "/vnf_packages";
+ logger.info("getEtsiCatalogVnfPackagesEndpoint: {}", url);
+ return url;
+ }
+
+ /**
+ * Get the URL for retrieving specific VNF package information from the ETSI Catalog.".
+ *
+ * @param vnfPkgId The ID of the VNF Package
+ * @return the URL for the GET operation
+ */
+ public String getVnfPackageUrl(final String vnfPkgId) {
+ final String url = msbEndpoint + vnfpkgmServiceUrl + "/vnf_packages/" + vnfPkgId;
+ logger.info("getEtsiCatalogVnfPackageEndpoint: {}", url);
+ return url;
+ }
+
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
index ae9316cfdf..073fc93107 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/extclients/vnfm/VnfmServiceProviderConfiguration.java
@@ -21,7 +21,6 @@
package org.onap.so.adapters.vnfmadapter.extclients.vnfm;
import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
-import com.google.gson.Gson;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
@@ -29,7 +28,6 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
-import java.util.Iterator;
import java.util.ListIterator;
import java.util.Map;
import java.util.UUID;
@@ -43,7 +41,7 @@ import org.apache.http.ssl.SSLContextBuilder;
import org.onap.aai.domain.yang.EsrSystemInfo;
import org.onap.aai.domain.yang.EsrVnfm;
import org.onap.logging.filter.spring.SpringClientPayloadFilter;
-import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.JSON;
+import org.onap.so.adapters.vnfmadapter.extclients.AbstractServiceProviderConfiguration;
import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
import org.onap.so.logging.jaxrs.filter.SOSpringClientFilter;
import org.onap.so.rest.service.HttpRestServiceProvider;
@@ -58,9 +56,6 @@ import org.springframework.core.io.Resource;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.json.GsonHttpMessageConverter;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
import org.springframework.web.client.RestTemplate;
@@ -69,7 +64,7 @@ import org.springframework.web.client.RestTemplate;
* Configures the HttpRestServiceProvider for REST call to a VNFM.
*/
@Configuration
-public class VnfmServiceProviderConfiguration {
+public class VnfmServiceProviderConfiguration extends AbstractServiceProviderConfiguration {
private static final Logger logger = LoggerFactory.getLogger(VnfmServiceProviderConfiguration.class);
private Map<String, HttpRestServiceProvider> mapOfVnfmIdToHttpRestServiceProvider = new ConcurrentHashMap<>();
@@ -135,17 +130,6 @@ public class VnfmServiceProviderConfiguration {
return new OAuth2RestTemplate(resourceDetails);
}
- private void setGsonMessageConverter(final RestTemplate restTemplate) {
- final Iterator<HttpMessageConverter<?>> iterator = restTemplate.getMessageConverters().iterator();
- while (iterator.hasNext()) {
- if (iterator.next() instanceof MappingJackson2HttpMessageConverter) {
- iterator.remove();
- }
- }
- final Gson gson = new JSON().getGson();
- restTemplate.getMessageConverters().add(new GsonHttpMessageConverter(gson));
- }
-
private void setTrustStore(final RestTemplate restTemplate) {
SSLContext sslContext;
try {
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
index 1da1159be0..76ec492bd4 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementController.java
@@ -23,10 +23,13 @@ package org.onap.so.adapters.vnfmadapter.rest;
import static org.onap.so.adapters.vnfmadapter.Constants.APPLICATION_ZIP;
import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
import static org.slf4j.LoggerFactory.getLogger;
-import java.util.List;
+import java.util.Optional;
import javax.ws.rs.core.MediaType;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.EtsiCatalogServiceProvider;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.ProblemDetails;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
@@ -45,74 +48,120 @@ import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping(value = PACKAGE_MANAGEMENT_BASE_URL, consumes = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class Sol003PackageManagementController {
- private static final String LOG_REQUEST_RECEIVED = "VNF Package Management Controller: {} {} {} {} {}";
+ private final EtsiCatalogServiceProvider etsiCatalogServiceProvider;
+ private static final String LOG_REQUEST_RECEIVED = "VNF PackageManagement Controller: {} {} {}";
private static final Logger logger = getLogger(Sol003PackageManagementController.class);
+ @Autowired
+ Sol003PackageManagementController(final EtsiCatalogServiceProvider etsiCatalogServiceProvider) {
+ this.etsiCatalogServiceProvider = etsiCatalogServiceProvider;
+ }
+
/**
- * GET VNF packages information. Direction: VNFM -> VNFM-Adapter. Will return zero or more VNF package
- * representations that match the attribute filter. These representations will be in a list. Section Number: 10.4.2
- *
- * @return A List of all VNF packages. Object: List<InlineResponse2001> Response Code: 200 OK
+ * GET VNF packages information. Will return zero or more VNF package representations that match the attribute
+ * filter. These representations will be in a list. Section Number: 10.4.2
+ *
+ * @return An Array of all VNF packages. Object: InlineResponse2001[] Response Code: 200 OK
*/
-
@GetMapping(value = "/vnf_packages", produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
- public ResponseEntity<List<InlineResponse2001>> getVnfPackages() {
+ public ResponseEntity getVnfPackages() {
logger.info(LOG_REQUEST_RECEIVED, "getVnfPackages.");
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+ final Optional<InlineResponse2001[]> response = etsiCatalogServiceProvider.getVnfPackages();
+ if (response.isPresent()) {
+ logger.info(LOG_REQUEST_RECEIVED, "getVnfPackages Response: ", HttpStatus.OK);
+ return new ResponseEntity(response.get(), HttpStatus.OK);
+ }
+ final String errorMessage = "An error occurred, a null response was received by the\n"
+ + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" \n"
+ + "endpoint.";
+ logger.error(errorMessage);
+ return new ResponseEntity(buildProblemDetails(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
- * GET VNF package information. Direction: VNFM -> VNFM-Adapter. Will return a specific VNF package representation
- * that match the attribute filter. Section Number: 10.4.3
+ * GET VNF package information. Will return a specific VNF package representation that match the attribute filter.
+ * Section Number: 10.4.3
*
* @param vnfPkgId The ID of the VNF Package that you want to query.
* @return A VNF package based on vnfPkgId. Object: VnfPkgInfo Response Code: 200 OK
*/
@GetMapping(value = "/vnf_packages/{vnfPkgId}", produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
- public ResponseEntity<InlineResponse2001> getVnfPackage(@PathVariable("vnfPkgId") final String vnfPkgId) {
+ public ResponseEntity getVnfPackage(@PathVariable("vnfPkgId") final String vnfPkgId) {
logger.info(LOG_REQUEST_RECEIVED, "getVnfPackage: ", vnfPkgId);
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+ final Optional<InlineResponse2001> response = etsiCatalogServiceProvider.getVnfPackage(vnfPkgId);
+ if (response.isPresent()) {
+ logger.info(LOG_REQUEST_RECEIVED, "getVnfPackage Response: ", HttpStatus.OK);
+ return new ResponseEntity(response.get(), HttpStatus.OK);
+ }
+ final String errorMessage = "An error occurred, a null response was received by the\n"
+ + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" by vnfPkgId: \""
+ + vnfPkgId + "\" \n" + "endpoint.";
+ logger.error(errorMessage);
+ return new ResponseEntity(buildProblemDetails(errorMessage), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
- * GET VNFD, from VNF package. Direction: VNFM -> VNFM-Adapter. Will return a copy of the file representing the VNFD
- * or a ZIP file that contains the file/multiple files representing the VNFD specified. Section Number: 10.4.4
- *
+ * GET VNFD, from VNF package. Will return a copy of the file representing the VNFD or a ZIP file that contains the
+ * file/multiple files representing the VNFD specified. Section Number: 10.4.4
+ *
* @param vnfPkgId The ID of the VNF Package that you want to retrieve the VNFD from.
* @return The VNFD of a VNF Package as a single file or within a ZIP file. Object: byte[] Response Code: 200 OK
*/
- @GetMapping(value = "/vnf_packages/{vnfPkgId}/vnfd", produces = {MediaType.TEXT_PLAIN, APPLICATION_ZIP})
+ @GetMapping(value = "/vnf_packages/{vnfPkgId}/vnfd",
+ produces = {MediaType.TEXT_PLAIN, APPLICATION_ZIP, MediaType.APPLICATION_JSON})
public ResponseEntity<byte[]> getVnfPackageVnfd(@PathVariable("vnfPkgId") final String vnfPkgId) {
logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageVnfd: ", vnfPkgId);
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
/**
- * GET Package Content, from VNF Package. Direction: VNFM -> VNFM-Adapter. Will return a copy of the VNF package
- * file that you specified. Section Number: 10.4.5
- *
+ * GET Package Content, from VNF Package. Will return a copy of the VNF package file that you specified. Section
+ * Number: 10.4.5
+ *
* @param vnfPkgId The ID of the VNF Package that you want to retrieve the "package_content" from.
* @return The Package Content of a VNF Package. Object: byte[] Response Code: 200 OK
*/
- @GetMapping(value = "/vnf_packages/{vnfPkgId}/package_content", produces = {APPLICATION_ZIP})
- public ResponseEntity<byte[]> getVnfPackageContent(@PathVariable("vnfPkgId") final String vnfPkgId) {
- logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageContent: ", vnfPkgId);
- return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+ @GetMapping(value = "/vnf_packages/{vnfPkgId}/package_content",
+ produces = {MediaType.APPLICATION_JSON, APPLICATION_ZIP, MediaType.APPLICATION_OCTET_STREAM})
+ public ResponseEntity getVnfPackageContent(@PathVariable("vnfPkgId") final String vnfPkgId) {
+ logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageContent Endpoint Invoked with VNF Package ID: ", vnfPkgId);
+ final Optional<byte[]> response = etsiCatalogServiceProvider.getVnfPackageContent(vnfPkgId);
+ if (response.isPresent()) {
+ logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageContent Response: ", HttpStatus.OK);
+ return new ResponseEntity(response.get(), HttpStatus.OK);
+ }
+ logger.error("Null response was received from the EtsiCatalogManager using the GET \"package_content\"");
+ return new ResponseEntity(buildProblemDetails("An error occurred, a null response was received by the\n"
+ + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"package_content\" \n"
+ + "endpoint."), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
- * GET Artifact, from VNF Package. Direction: VNFM -> VNFM-Adapter. Will return a the content of the artifact that
- * you specified. Section Number: 10.4.6
- *
+ * GET Artifact, from VNF Package Will return a the content of the artifact that you specified. Section Number:
+ * 10.4.6
+ *
* @param vnfPkgId The ID of the VNF Package that you want to retrieve an artifact from.
* @param artifactPath The path of the artifact that you want to retrieve.
* @return An Artifact from a VNF Package. Object: byte[] Response Code: 200 OK
*/
@GetMapping(value = "/vnf_packages/{vnfPkgId}/artifacts/{artifactPath}",
- produces = {MediaType.APPLICATION_OCTET_STREAM})
+ produces = {MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
public ResponseEntity<byte[]> getVnfPackageArtifact(@PathVariable("vnfPkgId") final String vnfPkgId,
@PathVariable("artifactPath") final String artifactPath) {
logger.info(LOG_REQUEST_RECEIVED, "getVnfPackageArtifact: vnfPkgId=", vnfPkgId, " artifactPath=", artifactPath);
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
+
+ /**
+ * Builds the ProblemDetails Object, using the provided error message.
+ *
+ * @param detail The error message retrieved from the exception thrown.
+ * @return ProblemDetails Object, containing error information.
+ */
+ private ProblemDetails buildProblemDetails(final String detail) {
+ final ProblemDetails problemDetails = new ProblemDetails();
+ problemDetails.setDetail(detail);
+ return problemDetails;
+ }
+
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java
index 6fac952aa8..16650d4a3d 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementController.java
@@ -53,9 +53,9 @@ public class Sol003SubscriptionManagementController {
private static final Logger logger = getLogger(Sol003SubscriptionManagementController.class);
/**
- * POST Subscribe request. Direction: VNFM -> VNFM Adapter. Will send request and respond with the subscription that
- * you subscribed to, if successful. Section Number: 10.4.7
- *
+ * POST Subscribe request. Will send request and respond with the subscription that you subscribed to, if
+ * successful. Section Number: 10.4.7
+ *
* @param pkgmSubscriptionRequest This includes the details of the subscription to be created.
* @return The subscription requested, if successful. Object: InlineRespone2002 Response Code: 201 Created Response
* Code: 303 Duplicate Subscription
@@ -68,9 +68,8 @@ public class Sol003SubscriptionManagementController {
}
/**
- * GET all subscriptions. Direction: VNFM -> VNFM Adapter. Will return a list of all subscriptions currently active.
- * Section Number: 10.4.7
- *
+ * GET all subscriptions. Will return a list of all subscriptions currently active. Section Number: 10.4.7
+ *
* @return All of the current active subscriptions. Object: List<InlineResponse2002> Response Code: 200 OK
*/
@GetMapping(value = "/subscriptions")
@@ -80,8 +79,8 @@ public class Sol003SubscriptionManagementController {
}
/**
- * GET a specific subscription, by subscriptionId. Direction: VNFM -> VNFM Adapter. Section Number: 10.4.8
- *
+ * GET a specific subscription, by subscriptionId. Section Number: 10.4.8
+ *
* @param subscriptionId The ID of the subscription that you wish to retrieve.
* @return A subscription based on subscriptionId. Object: InlineResponse2002 Response Code: 200 OK
*/
@@ -93,8 +92,8 @@ public class Sol003SubscriptionManagementController {
}
/**
- * DELETE a specific subscription, by subscriptionId. Direction: VNFM -> VNFM Adapter. Section Number: 10.4.7
- *
+ * DELETE a specific subscription, by subscriptionId. Section Number: 10.4.7
+ *
* @param subscriptionId The ID of the subscription that you wish to delete.
* @return Empty response if successful. Object: Void Response Code: 204 No Content
*/
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerRequestFailureException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerRequestFailureException.java
new file mode 100644
index 0000000000..dbdc354f4e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/EtsiCatalogManagerRequestFailureException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for an ETSI Catalog Manager Request Failure
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+public class EtsiCatalogManagerRequestFailureException extends RuntimeException {
+
+ private static final long serialVersionUID = 66862444537194516L;
+
+ public EtsiCatalogManagerRequestFailureException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgBadRequestException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgBadRequestException.java
new file mode 100644
index 0000000000..211131c2a4
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgBadRequestException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for a Vnfpkg Bad Request failure, due to state of resource.
+ *
+ * @author andrew.a.lamb@est.tech
+ */
+@ResponseStatus(code = HttpStatus.BAD_REQUEST)
+public class VnfPkgBadRequestException extends RuntimeException {
+
+ private static final long serialVersionUID = 3301317418914258411L;
+
+ public VnfPkgBadRequestException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgConflictException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgConflictException.java
new file mode 100644
index 0000000000..0cc9c5bd7e
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgConflictException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for a Vnfpkg Conflict failure, due to state of resource.
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.CONFLICT)
+public class VnfPkgConflictException extends RuntimeException {
+
+ private static final long serialVersionUID = 26862444537198441L;
+
+ public VnfPkgConflictException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgNotFoundException.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgNotFoundException.java
new file mode 100644
index 0000000000..0f9f214643
--- /dev/null
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/main/java/org/onap/so/adapters/vnfmadapter/rest/exceptions/VnfPkgNotFoundException.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest.exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Exception for a Vnfpkg Not Found Failure
+ *
+ * @author gareth.roper@est.tech
+ */
+@ResponseStatus(code = HttpStatus.NOT_FOUND)
+public class VnfPkgNotFoundException extends RuntimeException {
+
+ private static final long serialVersionUID = 26862444537198441L;
+
+ public VnfPkgNotFoundException(final String message) {
+ super(message);
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementControllerTest.java
index 801c468018..857bd7dc3e 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementControllerTest.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003PackageManagementControllerTest.java
@@ -1,74 +1,457 @@
-package org.onap.so.adapters.vnfmadapter.rest;
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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=========================================================
+ */
+package org.onap.so.adapters.vnfmadapter.rest;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
+import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
-import java.net.URISyntaxException;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
+import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
+import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Random;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
+import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.*;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2001;
+import org.onap.so.configuration.rest.BasicHttpHeadersProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.web.client.RestTemplate;
+import com.google.gson.Gson;
+/**
+ * @author gareth.roper@est.tech
+ */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class Sol003PackageManagementControllerTest {
- private static final String vnfPackageId = "myVnfPackageId";
- private static final String artifactPath = "myArtifactPath";
+ private static final Logger logger = LoggerFactory.getLogger(Sol003PackageManagementControllerTest.class);
+
+ @LocalServerPort
+ private int port;
@Autowired
@Qualifier(CONFIGURABLE_REST_TEMPLATE)
private RestTemplate testRestTemplate;
- private MockRestServiceServer mockRestServer;
@Autowired
private Sol003PackageManagementController controller;
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ private static final String VNF_PACKAGE_ID = "myVnfPackageId";
+ private static final String ARTIFACT_PATH = "myArtifactPath";
+ private static final String MSB_BASE_URL = "http://msb_iag.onap:80/api/vnfpkgm/v1/vnf_packages";
+ private static final String VNFPKGM_BASE_URL = PACKAGE_MANAGEMENT_BASE_URL + "/vnf_packages";
+ private static final String localhostUrl = "http://localhost:";
+ private static final String GET_VNF_PACKAGES_URL = "";
+ private static final String GET_VNF_PACKAGE_BY_ID_URL = "/" + VNF_PACKAGE_ID;
+ private static final String VNFD_ID = "vnfdId";
+ private static final String VNF_PROVIDER = "vnfProvider";
+ private static final String VNF_PRODUCT_NAME = "vnfProductName";
+ private static final String VNF_SOFTWARE_VERSION = "vnfSoftwareVersion";
+ private static final String VNFD_VERSION = "vnfdVersion";
+ private static final String ALGORITHM = "algorithm";
+ private static final String HASH = "hash";
+ private static final String URI_HREF = "uriHref";
+
+ private MockRestServiceServer mockRestServer;
+ private BasicHttpHeadersProvider basicHttpHeadersProvider;
+ private final Gson gson = new Gson();
+
+ public Sol003PackageManagementControllerTest() {}
+
@Before
- public void setUp() throws Exception {
- mockRestServer = MockRestServiceServer.bindTo(testRestTemplate).build();
+ public void setUp() {
+ final MockRestServiceServer.MockRestServiceServerBuilder builder =
+ MockRestServiceServer.bindTo(testRestTemplate);
+ builder.ignoreExpectOrder(true);
+ mockRestServer = builder.build();
+ basicHttpHeadersProvider = new BasicHttpHeadersProvider();
+ }
+
+ @Test
+ public void testGetPackageContent_ValidArray_Success() {
+ final byte[] responseArray = buildByteArrayWithRandomData(10);
+
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET))
+ .andRespond(withSuccess(responseArray, MediaType.APPLICATION_OCTET_STREAM));
+
+ final String testURL = "http://localhost:" + port + PACKAGE_MANAGEMENT_BASE_URL + "/vnf_packages/"
+ + VNF_PACKAGE_ID + "/package_content";
+ final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+ final ResponseEntity<byte[]> responseEntity =
+ restTemplate.withBasicAuth("test", "test").exchange(testURL, HttpMethod.GET, request, byte[].class);
+
+ assertEquals(byte[].class, responseEntity.getBody().getClass());
+ assertArrayEquals(responseEntity.getBody(), responseArray);
+ assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
}
@Test
- public void getVnfPackages() throws URISyntaxException, InterruptedException {
- final ResponseEntity<List<InlineResponse2001>> response = controller.getVnfPackages();
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
+ public void testOnGetPackageContent_Conflict_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.CONFLICT));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.CONFLICT, responseEntity.getStatusCode());
}
@Test
- public void getVnfPackage() throws URISyntaxException, InterruptedException {
- final ResponseEntity<InlineResponse2001> response = controller.getVnfPackage(vnfPackageId);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
+ public void testOnGetPackageContent_NotFound_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
}
@Test
- public void getVnfPackageVnfd() throws URISyntaxException, InterruptedException {
- final ResponseEntity<byte[]> response = controller.getVnfPackageVnfd(vnfPackageId);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
+ public void testOnGetPackageContent_UnauthorizedClient_Fail() {
+ final String testURL = "http://localhost:" + port + PACKAGE_MANAGEMENT_BASE_URL + "/vnf_packages/"
+ + VNF_PACKAGE_ID + "/package_content";
+ final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+ final ResponseEntity<ProblemDetails> responseEntity =
+ restTemplate.exchange(testURL, HttpMethod.GET, request, ProblemDetails.class);
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.UNAUTHORIZED, responseEntity.getStatusCode());
}
@Test
- public void getVnfPackageContents() throws URISyntaxException, InterruptedException {
- final ResponseEntity<byte[]> response = controller.getVnfPackageContent(vnfPackageId);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
+ public void testOnGetPackageContent_InternalServerError_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
}
@Test
- public void getVnfPackageArtifact() throws URISyntaxException, InterruptedException {
- final ResponseEntity<byte[]> response = controller.getVnfPackageArtifact(vnfPackageId, artifactPath);
- assertEquals(HttpStatus.NOT_IMPLEMENTED, response.getStatusCode());
+ public void testOnGetPackageContent_BadRequest_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.BAD_REQUEST));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
}
+ @Test
+ public void testOnGetPackageContent_UnauthorizedServer_InternalError_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withStatus(HttpStatus.UNAUTHORIZED));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertTrue(responseEntity.getBody() instanceof ProblemDetails);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+ }
+
+ @Test
+ public void testGetPackageContent_SuccessResponseFromServerWithNullPackage_Fail() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID + "/package_content"))
+ .andExpect(method(HttpMethod.GET)).andRespond(withSuccess());
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/package_content");
+
+ assertEquals(ProblemDetails.class, responseEntity.getBody().getClass());
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+ }
+
+ @Test
+ public void testVnfPackagesReceivedAsInlineResponse2001ListIfGetVnfPackagesSuccessful() {
+ final VnfPkgInfo[] responses = createVnfPkgArray();
+
+ mockRestServer.expect(requestTo(MSB_BASE_URL)).andExpect(method(HttpMethod.GET))
+ .andRespond(withSuccess(gson.toJson(responses), MediaType.APPLICATION_JSON));
+
+ final String testURL = localhostUrl + port + VNFPKGM_BASE_URL;
+ final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+
+ final ResponseEntity<InlineResponse2001[]> responseEntity = restTemplate.withBasicAuth("test", "test")
+ .exchange(testURL, HttpMethod.GET, request, InlineResponse2001[].class);
+
+ assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+ assertNotNull(responseEntity.getBody());
+ final InlineResponse2001[] inlineResponse2001array = responseEntity.getBody();
+ final InlineResponse2001 inlineResponse2001 = inlineResponse2001array[0];
+ assertEquals(VNF_PACKAGE_ID, inlineResponse2001.getId());
+ assertEquals(VNFD_ID, inlineResponse2001.getVnfdId());
+ assertEquals(VNFD_ID, inlineResponse2001.getSoftwareImages().get(0).getId());
+ assertEquals(VNF_PRODUCT_NAME, inlineResponse2001.getSoftwareImages().get(0).getName());
+ assertEquals(ALGORITHM, inlineResponse2001.getChecksum().getAlgorithm());
+ assertEquals(HASH, inlineResponse2001.getChecksum().getHash());
+ assertEquals(ARTIFACT_PATH, inlineResponse2001.getAdditionalArtifacts().get(0).getArtifactPath());
+ assertEquals(ALGORITHM, inlineResponse2001.getAdditionalArtifacts().get(0).getChecksum().getAlgorithm());
+ assertEquals(HASH, inlineResponse2001.getAdditionalArtifacts().get(0).getChecksum().getHash());
+ assertEquals(URI_HREF, inlineResponse2001.getLinks().getSelf().getHref());
+ }
+
+ @Test
+ public void test400BadRequestInfoReceivedAsProblemDetailsIfGetVnfPackagesIs400BadRequest() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.BAD_REQUEST));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGES_URL);
+ assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
+
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("Error: Bad Request Received", problemDetails.getDetail());
+ }
+
+ @Test
+ public void test404NotFoundInfoReceivedAsProblemDetailsIfGetVnfPackagesIs404NotFound() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGES_URL);
+ assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
+
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("No Vnf Packages found", problemDetails.getDetail());
+ }
+
+ @Test
+ public void test500InternalServerErrorProblemDetailsReceivedIfGetVnfPackagesReturns500InternalServerError() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGES_URL);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("Internal Server Error Occurred.", problemDetails.getDetail());
+ }
+
+ @Test
+ public void test500InternalServerErrorProblemDetailsReceivedIfGetVnfPackagesReturnsANullPackage() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL)).andExpect(method(HttpMethod.GET)).andRespond(withSuccess());
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGES_URL);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("An error occurred, a null response was received by the\n"
+ + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" \n"
+ + "endpoint.", problemDetails.getDetail());
+ }
+
+ @Test
+ public void testVnfPackageReceivedAsInlineResponse2001IfGetVnfPackageByIdSuccessful() {
+ final VnfPkgInfo response = createVnfPkgInfo(VNF_PACKAGE_ID);
+
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID)).andExpect(method(HttpMethod.GET))
+ .andRespond(withSuccess(gson.toJson(response), MediaType.APPLICATION_JSON));
+
+ final String testURL = localhostUrl + port + VNFPKGM_BASE_URL + "/" + VNF_PACKAGE_ID;
+ final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+ final ResponseEntity<InlineResponse2001> responseEntity = restTemplate.withBasicAuth("test", "test")
+ .exchange(testURL, HttpMethod.GET, request, InlineResponse2001.class);
+
+ assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+ assertNotNull(responseEntity.getBody());
+ final InlineResponse2001 inlineResponse2001 = responseEntity.getBody();
+ assertEquals(VNF_PACKAGE_ID, inlineResponse2001.getId());
+ assertEquals(VNFD_ID, inlineResponse2001.getVnfdId());
+ assertEquals(VNFD_ID, inlineResponse2001.getSoftwareImages().get(0).getId());
+ assertEquals(VNF_PRODUCT_NAME, inlineResponse2001.getSoftwareImages().get(0).getName());
+ assertEquals(ALGORITHM, inlineResponse2001.getChecksum().getAlgorithm());
+ assertEquals(HASH, inlineResponse2001.getChecksum().getHash());
+ assertEquals(ARTIFACT_PATH, inlineResponse2001.getAdditionalArtifacts().get(0).getArtifactPath());
+ assertEquals(ALGORITHM, inlineResponse2001.getAdditionalArtifacts().get(0).getChecksum().getAlgorithm());
+ assertEquals(HASH, inlineResponse2001.getAdditionalArtifacts().get(0).getChecksum().getHash());
+ assertEquals(URI_HREF, inlineResponse2001.getLinks().getSelf().getHref());
+ }
+
+ @Test
+ public void test400BadRequestInfoReceivedAsProblemDetailsIfGetVnfPackageByIdIs400BadRequest() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.BAD_REQUEST));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGE_BY_ID_URL);
+
+ assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode());
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("Error: Bad Request Received", problemDetails.getDetail());
+ }
+
+ @Test
+ public void test404NotFoundInfoReceivedAsProblemDetailsIfGetVnfPackageByIdIs404NotFound() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.NOT_FOUND));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGE_BY_ID_URL);
+
+ assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("No Vnf Package found with vnfPkgId: " + VNF_PACKAGE_ID, problemDetails.getDetail());
+ }
+
+ @Test
+ public void test500InternalServerErrorProblemDetailsReceivedIfGetVnfPackageByIdReturns500InternalServerError() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID)).andExpect(method(HttpMethod.GET))
+ .andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGE_BY_ID_URL);
+
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("Internal Server Error Occurred.", problemDetails.getDetail());
+ }
+
+ @Test
+ public void test500InternalServerErrorProblemDetailsReceivedIfGetVnfPackageByIdReturnsANullPackage() {
+ mockRestServer.expect(requestTo(MSB_BASE_URL + "/" + VNF_PACKAGE_ID)).andExpect(method(HttpMethod.GET))
+ .andRespond(withSuccess());
+
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(GET_VNF_PACKAGE_BY_ID_URL);
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
+
+ assertNotNull(responseEntity.getBody());
+ final ProblemDetails problemDetails = responseEntity.getBody();
+ assertEquals("An error occurred, a null response was received by the\n"
+ + " Sol003PackageManagementController from the EtsiCatalogManager using the GET \"vnf_packages\" by vnfPkgId: \""
+ + VNF_PACKAGE_ID + "\" \n" + "endpoint.", problemDetails.getDetail());
+ }
+
+ // The below 2 test methods are here to improve code coverage and provide a foundation for writing future tests
+ @Test
+ public void testGetVnfd_Not_Implemented() {
+ final ResponseEntity<ProblemDetails> responseEntity = sendHttpRequest(VNF_PACKAGE_ID + "/vnfd");
+ assertEquals(HttpStatus.NOT_IMPLEMENTED, responseEntity.getStatusCode());
+ }
+
+ @Test
+ public void testGetArtifact_Not_Implemented() {
+ final ResponseEntity<ProblemDetails> responseEntity =
+ sendHttpRequest(VNF_PACKAGE_ID + "/artifacts/" + ARTIFACT_PATH);
+ assertEquals(HttpStatus.NOT_IMPLEMENTED, responseEntity.getStatusCode());
+ }
+
+ // Simply returns a byte array filled with random data, for use in the tests.
+ private byte[] buildByteArrayWithRandomData(final int sizeInKb) {
+ final Random rnd = new Random();
+ final byte[] b = new byte[sizeInKb * 1024]; // converting kb to byte
+ rnd.nextBytes(b);
+ return b;
+ }
+
+ private ResponseEntity<ProblemDetails> sendHttpRequest(final String url) {
+ final String testURL = localhostUrl + port + VNFPKGM_BASE_URL + "/" + url;
+ final HttpEntity<?> request = new HttpEntity<>(basicHttpHeadersProvider.getHttpHeaders());
+ return restTemplate.withBasicAuth("test", "test").exchange(testURL, HttpMethod.GET, request,
+ ProblemDetails.class);
+ }
+
+ private VnfPkgInfo[] createVnfPkgArray() {
+ final VnfPkgInfo[] vnfPkgInfoArray = new VnfPkgInfo[1];
+ final VnfPkgInfo vnfPkgInfo = createVnfPkgInfo(VNF_PACKAGE_ID);
+ vnfPkgInfoArray[0] = vnfPkgInfo;
+ return vnfPkgInfoArray;
+ }
+
+ private VnfPkgInfo createVnfPkgInfo(final String vnfPackageId) {
+ final VnfPkgInfo vnfPkgInfo = new VnfPkgInfo();
+ vnfPkgInfo.setId(vnfPackageId);
+ vnfPkgInfo.setVnfdId(VNFD_ID);
+ vnfPkgInfo.setVnfProvider(VNF_PROVIDER);
+ vnfPkgInfo.setVnfProductName(VNF_PRODUCT_NAME);
+ vnfPkgInfo.setVnfSoftwareVersion(VNF_SOFTWARE_VERSION);
+ vnfPkgInfo.setVnfdVersion(VNFD_VERSION);
+ vnfPkgInfo.setChecksum(createVnfPkgChecksum());
+ vnfPkgInfo.setSoftwareImages(createSoftwareImages());
+ vnfPkgInfo.setAdditionalArtifacts(createAdditionalArtifacts());
+ vnfPkgInfo.setLinks(createVNFPKGMLinkSerializerLinks());
+ return vnfPkgInfo;
+ }
+
+ private Checksum createVnfPkgChecksum() {
+ final Checksum checksum = new Checksum();
+ checksum.setAlgorithm(ALGORITHM);
+ checksum.setHash(HASH);
+ return checksum;
+ }
+
+ private List<VnfPackageSoftwareImageInfo> createSoftwareImages() {
+ final List<VnfPackageSoftwareImageInfo> softwareImages = new ArrayList<>();
+ final VnfPackageSoftwareImageInfo vnfPackageSoftwareImageInfo = new VnfPackageSoftwareImageInfo();
+ vnfPackageSoftwareImageInfo.setId(VNFD_ID);
+ vnfPackageSoftwareImageInfo.setName(VNF_PRODUCT_NAME);
+ vnfPackageSoftwareImageInfo.setProvider("");
+ vnfPackageSoftwareImageInfo.setVersion("");
+ vnfPackageSoftwareImageInfo.setChecksum(createVnfPkgChecksum());
+ vnfPackageSoftwareImageInfo
+ .setContainerFormat(VnfPackageSoftwareImageInfo.ContainerFormatEnum.fromValue("AKI"));
+ softwareImages.add(vnfPackageSoftwareImageInfo);
+ return softwareImages;
+ }
+
+ private List<VnfPackageArtifactInfo> createAdditionalArtifacts() {
+ final List<VnfPackageArtifactInfo> vnfPackageArtifactInfos = new ArrayList<>();
+ final VnfPackageArtifactInfo vnfPackageArtifactInfo =
+ new VnfPackageArtifactInfo().artifactPath(ARTIFACT_PATH).checksum(createVnfPkgChecksum());
+ vnfPackageArtifactInfos.add(vnfPackageArtifactInfo);
+ return vnfPackageArtifactInfos;
+ }
+
+ private VNFPKGMLinkSerializer createVNFPKGMLinkSerializerLinks() {
+ final UriLink uriLink = new UriLink().href(URI_HREF);
+ final VNFPKGMLinkSerializer vnfpkgmLinkSerializer = new VNFPKGMLinkSerializer().self(uriLink);
+ return vnfpkgmLinkSerializer;
+ }
}
diff --git a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java
index 999dd02f0f..8fc27c5943 100644
--- a/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java
+++ b/adapters/mso-vnfm-adapter/mso-vnfm-etsi-adapter/src/test/java/org/onap/so/adapters/vnfmadapter/rest/Sol003SubscriptionManagementControllerTest.java
@@ -20,6 +20,10 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.web.client.RestTemplate;
+/**
+ * @author gareth.roper@est.tech
+ */
+
@RunWith(SpringRunner.class)
@SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")