summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore127
-rw-r--r--.gitreview4
-rw-r--r--LICENSE.txt7
-rw-r--r--README.md7
-rw-r--r--docs/architecture/NBI_R1_Developer_Guide.rst64
-rw-r--r--docs/index.rst11
-rw-r--r--docs/offeredapis/images/ONAP External ID Beijing.jpgbin0 -> 103409 bytes
-rw-r--r--docs/offeredapis/images/ONAP_External_ID_Beijing.jpgbin0 -> 103409 bytes
-rw-r--r--docs/offeredapis/images/html.pngbin0 -> 4086 bytes
-rw-r--r--docs/offeredapis/images/pdf.pngbin0 -> 1946 bytes
-rw-r--r--docs/offeredapis/images/postman.pngbin0 -> 28777 bytes
-rw-r--r--docs/offeredapis/images/swagger.pngbin0 -> 3590 bytes
-rw-r--r--docs/offeredapis/images/swaggerUI.pngbin0 -> 3590 bytes
-rw-r--r--docs/offeredapis/images/uml.jpgbin0 -> 7044 bytes
-rw-r--r--docs/offeredapis/index.rst198
-rw-r--r--docs/offeredapis/postman/ONAPBeijingServiceOrderDoc.postman_collection.json61
-rw-r--r--docs/offeredapis/serviceCatalog/apiServiceCatalog.plantuml110
-rw-r--r--docs/offeredapis/serviceCatalog/asciiDoc.adoc487
-rw-r--r--docs/offeredapis/serviceCatalog/documentation.html1473
-rw-r--r--docs/offeredapis/serviceCatalog/markDown.md294
-rw-r--r--docs/offeredapis/serviceInventory/apiServiceInventory.plantuml97
-rw-r--r--docs/offeredapis/serviceInventory/asciiDoc.adoc461
-rw-r--r--docs/offeredapis/serviceInventory/documentation.html1423
-rw-r--r--docs/offeredapis/serviceInventory/markDown.md287
-rw-r--r--docs/offeredapis/serviceOrder/apiServiceOrder.plantuml168
-rw-r--r--docs/offeredapis/serviceOrder/asciiDoc.adoc752
-rw-r--r--docs/offeredapis/serviceOrder/documentation.html2030
-rw-r--r--docs/offeredapis/serviceOrder/markDown.md463
-rw-r--r--docs/offeredapis/swaggers/serviceCatalog_1_0_0.json652
-rw-r--r--docs/offeredapis/swaggers/serviceCatalog_1_0_0.yaml488
-rw-r--r--docs/offeredapis/swaggers/serviceInventory_1_0_0.json620
-rw-r--r--docs/offeredapis/swaggers/serviceInventory_1_0_0.yaml423
-rw-r--r--docs/offeredapis/swaggers/serviceOrder_1_0_0.json1071
-rw-r--r--docs/offeredapis/swaggers/serviceOrder_1_0_0.yaml768
-rw-r--r--pom.xml241
-rw-r--r--restclient/.vscode/settings.json12
-rw-r--r--restclient/json/serviceOrder_create_in_completed.json43
-rw-r--r--restclient/json/serviceOrder_create_in_rejected.json29
-rw-r--r--restclient/onap.http60
-rw-r--r--restclient/serviceOrder.http29
-rw-r--r--src/main/java/org/onap/nbi/Application.java13
-rw-r--r--src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java33
-rw-r--r--src/main/java/org/onap/nbi/apis/RestConfiguration.java18
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java144
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java46
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java51
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java249
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/jolt/FindServiceSpecJsonTransformer.java35
-rw-r--r--src/main/java/org/onap/nbi/apis/servicecatalog/jolt/GetServiceSpecJsonTransformer.java36
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java82
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java33
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java20
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java45
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java149
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java35
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java36
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/MultiClient.java196
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/MultiCriteriaRequestBuilder.java106
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/ServiceCatalogUrl.java21
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/ServiceInventoryUrl.java21
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/ServiceOrderResource.java158
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/SoClient.java138
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/ActionType.java60
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/AppointmentRef.java150
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ErrorRepresentation.java256
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/Note.java154
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRef.java126
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRelationship.java130
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/OrderRelationship.java177
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/Place.java217
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/RelatedParty.java199
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/RelationshipType.java56
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/Service.java357
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceCharacteristic.java148
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrder.java589
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrderItem.java300
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRef.java126
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRelationship.java132
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/ServiceSpecificationRef.java265
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/StateType.java72
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/TargetServiceSchema.java124
-rwxr-xr-xsrc/main/java/org/onap/nbi/apis/serviceorder/model/Value.java143
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CloudConfiguration.java35
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CreateServiceInstanceResponse.java14
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/GetRequestStatusResponse.java45
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/ModelInfo.java82
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/Request.java42
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestDetails.java62
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestInfo.java50
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestParameters.java60
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestReference.java29
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestState.java34
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestStatus.java53
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/SubscriberInfo.java30
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/UserParams.java29
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ExecutionTask.java96
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfo.java67
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfoJson.java43
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderItemInfo.java27
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/repositories/ExecutionTaskRepository.java25
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderInfoRepository.java9
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderRepository.java11
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ServiceOrderValidator.java26
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ValidServiceOrder.java18
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/utils/JsonEntityConverter.java18
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/workflow/CheckOrderConsistenceManager.java145
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAICustomerManager.java29
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAIServiceTypeManager.java58
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskManager.java94
-rw-r--r--src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java349
-rw-r--r--src/main/java/org/onap/nbi/apis/status/StatusResource.java55
-rw-r--r--src/main/java/org/onap/nbi/apis/status/StatusService.java9
-rw-r--r--src/main/java/org/onap/nbi/apis/status/StatusServiceImpl.java28
-rw-r--r--src/main/java/org/onap/nbi/apis/status/model/ApplicationStatus.java55
-rw-r--r--src/main/java/org/onap/nbi/apis/status/model/StatusType.java30
-rw-r--r--src/main/java/org/onap/nbi/commons/BeanUtils.java39
-rw-r--r--src/main/java/org/onap/nbi/commons/JacksonFilter.java169
-rw-r--r--src/main/java/org/onap/nbi/commons/JsonRepresentation.java35
-rw-r--r--src/main/java/org/onap/nbi/commons/Query.java26
-rw-r--r--src/main/java/org/onap/nbi/commons/QueryParserUtils.java65
-rw-r--r--src/main/java/org/onap/nbi/commons/ReservedKeys.java18
-rw-r--r--src/main/java/org/onap/nbi/commons/Resource.java8
-rw-r--r--src/main/java/org/onap/nbi/commons/ResourceManagement.java149
-rw-r--r--src/main/java/org/onap/nbi/exceptions/ApiError.java61
-rw-r--r--src/main/java/org/onap/nbi/exceptions/ApiException.java33
-rw-r--r--src/main/java/org/onap/nbi/exceptions/ApiExceptionHandler.java48
-rw-r--r--src/main/java/org/onap/nbi/exceptions/BackendErrorHandler.java23
-rw-r--r--src/main/java/org/onap/nbi/exceptions/BackendFunctionalException.java22
-rw-r--r--src/main/java/org/onap/nbi/exceptions/TechnicalException.java26
-rw-r--r--src/main/java/org/onap/nbi/exceptions/ValidationException.java29
-rw-r--r--src/main/resources/application-localhost.properties50
-rw-r--r--src/main/resources/application.properties7
-rw-r--r--src/main/resources/jolt/findServiceCatalog.json28
-rw-r--r--src/main/resources/jolt/findServiceInventory.json24
-rw-r--r--src/main/resources/jolt/getServiceCatalog.json77
-rw-r--r--src/main/resources/jolt/getServiceInventory.json44
-rw-r--r--src/test/java/org/onap/nbi/apis/ApiTest.java591
-rw-r--r--src/test/java/org/onap/nbi/apis/ServiceOrderRepositoryTest.java45
-rw-r--r--src/test/java/org/onap/nbi/apis/StatusResourceTest.java42
-rw-r--r--src/test/java/org/onap/nbi/apis/assertions/ServiceCatalogAssertions.java135
-rw-r--r--src/test/java/org/onap/nbi/apis/assertions/ServiceInventoryAssertions.java85
-rw-r--r--src/test/java/org/onap/nbi/apis/assertions/ServiceOrderAssertions.java206
-rw-r--r--src/test/resources/application.properties32
-rw-r--r--src/test/resources/mappings/aai_get_6490_service-subscriptions.json24
-rw-r--r--src/test/resources/mappings/aai_get_customer_6490.json18
-rw-r--r--src/test/resources/mappings/aai_get_customer_generic.json18
-rw-r--r--src/test/resources/mappings/aai_get_generic_service-subscriptions.json20
-rw-r--r--src/test/resources/mappings/aai_get_service-subscription.json55
-rw-r--r--src/test/resources/mappings/aai_get_service-subscription_vnf.json58
-rw-r--r--src/test/resources/mappings/aai_get_service-subscriptionsVFW.json43
-rw-r--r--src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json43
-rw-r--r--src/test/resources/mappings/aai_get_tenants.json167
-rw-r--r--src/test/resources/mappings/aai_put_customer.json12
-rw-r--r--src/test/resources/mappings/aai_put_customer_service.json12
-rw-r--r--src/test/resources/mappings/sdc_find.json244
-rw-r--r--src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json213
-rw-r--r--src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json10
-rw-r--r--src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json213
-rw-r--r--src/test/resources/mappings/so_delete_service_instance.json18
-rw-r--r--src/test/resources/mappings/so_get_.json20
-rw-r--r--src/test/resources/mappings/so_post_create_service_instance.json18
161 files changed, 23486 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a05f4a2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,127 @@
+#### OS related ####
+### Linux related ###
+*~
+
+# KDE directory preferences
+.directory
+
+### OSX related ###
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+### Windows related ###
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+#### IDE related ####
+### Eclipse related ###
+*.pydevproject
+.metadata
+.gradle
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.factorypath
+.loadpath
+.classpath
+.project
+.springBeans
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+# TeXlipse plugin
+.texlipse
+
+### Idea related ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
+
+## Directory-based project format
+.idea/
+
+## File-based project format
+*.ipr
+*.iws
+*.iml
+
+## Additional for IntelliJ
+out/
+
+# generated by JIRA plugin
+atlassian-ide-plugin.xml
+
+### Netbeans related ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+### Notepad++ backups ###
+*.bak
+
+### Shell ###
+*.sh
+
+#### Tools & Languages related ####
+### Java related ###
+*.class
+
+# Package Files #
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Maven related ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+
+### Git related ###
+*.orig
+/.apt_generated/
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..4ddee5c
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,4 @@
+[gerrit]
+host=gerrit.onap.org
+port=29418
+project=externalapi/nbi.git
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..e8cdcf3
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,7 @@
+Copyright (c) 2017 Orange. All rights reserved.
+===================================================================
+
+ 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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6e46f00
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+nbi
+===============
+NBI stands for NorthBound Interface. It brings to ONAP a set of API - at service level - that can be used by external systems as BSS for example. These API are based on TMForum API
+
+## License
+The Microservice Bus is released under version 2.0 of the [Apache License][].
+[Apache License]: http://www.apache.org/licenses/LICENSE-2.0
diff --git a/docs/architecture/NBI_R1_Developer_Guide.rst b/docs/architecture/NBI_R1_Developer_Guide.rst
new file mode 100644
index 0000000..1d17665
--- /dev/null
+++ b/docs/architecture/NBI_R1_Developer_Guide.rst
@@ -0,0 +1,64 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2018 ORANGE
+
+
+============
+NBI - Developer Guide
+============
+***************
+Introduction
+***************
+
+NBI is a Java 8 web application built over Spring Framework. Using Spring Boot 1.5.10 dependencies, it runs as a standalone application with an embedded Tomcat server.
+
+***************
+Dependencies
+***************
+This project use various framework which are managed with Maven dependency management tool (see *pom.xml* file at root level) :
+
+- Swagger annotations
+- `Spring Framework <https://github.com/spring-projects/spring-boot>`_
+- `JOLT <https://github.com/bazaarvoice/jolt>`_ to perform JsonToJson transformation
+- `FasterXML/Jackson <https://github.com/FasterXML/jackson>`_ to perform JSON parsing
+- `Wiremock <https://github.com/tomakehurst/wiremock>`_ to perform testing over HTTP mocked response
+
+
+***************
+Configuration
+***************
+A configuration file, *src/main/resources/application-localhost.properties* list all the component interface that can be configured depending on the environment were the app is deployed.
+By default, the application runs with an embedded both MongoDB and MariaDB local instance.
+This file also list configurations of all the REST interface maid from NBI to other ONAP component such as SDC, AA&I and SO.
+
+***************
+Source tree
+***************
+This application provides ServiceOrder, ServiceCatalag and ServiceInventory as main functional resources and HealthCheck. Each resource is implemented independently in a package corresponding to its name.
+
+*commons , configuration, and exceptions* are shared technical classes that provided for all the application.
+
+
+***************************************
+Running and testing the application
+***************************************
+
+**Locally**
+
+Ensure that you have a MongoDB and MariaDB instance running and properly configured in *application.properties* file.
+Run *Application.java* class in your favorite IDE
+
+Or through a terminal, ensure that your maven installation is works and run *mvn spring-boot:run* command to start the appication.
+
+
+**Docker**
+
+in progress ...
+
+
+**Testing**
+When the app is running, you can access the API at http://yourhostname:8080/nbi/api/v1/ and fill the url with the name of the resources you asking for (/serviceSpecification, /service, /serviceOrder or /status)
+You can run a test by using `VisualStudio RestClient plugin <https://github.com/Huachao/vscode-restclient>`_
+See the *restclient* package at root level to find *.vscode/settings.json* configuration file and */json/* package with samples requests that can be run.
+You can also trigger these endpoints with any RESTful client or automation framework.
+
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..e39fb0d
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,11 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2018 Orange
+
+ONAP ExternalAPI / NBI
+========================================
+
+.. toctree::
+ :maxdepth: 1
+
+ offeredapis/NBI_R1_interface.rst
diff --git a/docs/offeredapis/images/ONAP External ID Beijing.jpg b/docs/offeredapis/images/ONAP External ID Beijing.jpg
new file mode 100644
index 0000000..8fbd4ab
--- /dev/null
+++ b/docs/offeredapis/images/ONAP External ID Beijing.jpg
Binary files differ
diff --git a/docs/offeredapis/images/ONAP_External_ID_Beijing.jpg b/docs/offeredapis/images/ONAP_External_ID_Beijing.jpg
new file mode 100644
index 0000000..8fbd4ab
--- /dev/null
+++ b/docs/offeredapis/images/ONAP_External_ID_Beijing.jpg
Binary files differ
diff --git a/docs/offeredapis/images/html.png b/docs/offeredapis/images/html.png
new file mode 100644
index 0000000..f1bda88
--- /dev/null
+++ b/docs/offeredapis/images/html.png
Binary files differ
diff --git a/docs/offeredapis/images/pdf.png b/docs/offeredapis/images/pdf.png
new file mode 100644
index 0000000..fed52f9
--- /dev/null
+++ b/docs/offeredapis/images/pdf.png
Binary files differ
diff --git a/docs/offeredapis/images/postman.png b/docs/offeredapis/images/postman.png
new file mode 100644
index 0000000..cab386c
--- /dev/null
+++ b/docs/offeredapis/images/postman.png
Binary files differ
diff --git a/docs/offeredapis/images/swagger.png b/docs/offeredapis/images/swagger.png
new file mode 100644
index 0000000..f5a9e0c
--- /dev/null
+++ b/docs/offeredapis/images/swagger.png
Binary files differ
diff --git a/docs/offeredapis/images/swaggerUI.png b/docs/offeredapis/images/swaggerUI.png
new file mode 100644
index 0000000..f5a9e0c
--- /dev/null
+++ b/docs/offeredapis/images/swaggerUI.png
Binary files differ
diff --git a/docs/offeredapis/images/uml.jpg b/docs/offeredapis/images/uml.jpg
new file mode 100644
index 0000000..d288c6c
--- /dev/null
+++ b/docs/offeredapis/images/uml.jpg
Binary files differ
diff --git a/docs/offeredapis/index.rst b/docs/offeredapis/index.rst
new file mode 100644
index 0000000..18b966e
--- /dev/null
+++ b/docs/offeredapis/index.rst
@@ -0,0 +1,198 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2018 ORANGE
+
+
+============
+nbi - northbound interface - External API for ONAP
+============
+***************
+Introduction
+***************
+
+NBI stands for NorthBound Interface. It brings to ONAP a set of API that can be used by external systems as BSS for example.
+These API are based on **TMF API**.
+
+
+***************
+Global NBI architecture for Beijing release
+***************
+
+Following illustration provides a global view about nbi architecture,integration with other ONAP components and API resource/operation provided.
+
+.. image:: images/ONAP_External_ID_Beijing.jpg
+ :width: 800px
+
+***************
+API Version
+***************
+
+APIs are described with a state version with “v” following the API Name, e.g.: nbi/api/v1/productOrder.
+The schema associated with a REST API must have its version number aligned with that of the REST API.
+
+The version number has major, minor and revision numbers. E.g. v1.0.0
+The version number (without the revision number) is held in the URI.
+
+The major version number is incremented for an incompatible change.
+The minor version number is incremented for a compatible change.
+For minor modifications of the API, version numbering must not be updated, provided the following backward compatibility rules are respected:
+
+- New elements in a data type must be optional (minOccurs=0)
+- Changes in the cardinality of an attribute in a data type must be from mandatory to optional or from lower to greater
+- New attributes defined in an element must be optional (absence of use=”required”).
+- If new enumerated values are included, the former ones and its meaning must be kept.
+- If new operations are added, the existing operations must be kept
+- New parameters added to existing operations must be optional and existing parameters
+must be kept
+
+For major modifications of the API, not backward compatible and forcing client implementations to be changed, the version number must be updated.
+
+***************
+API Table
+***************
+
+.. |pdf-icon| image:: images/pdf.png
+ :width: 40px
+
+.. |swagger-icon| image:: images/swagger.png
+ :width: 40px
+
+
+.. |swaggerUI-icon| image:: images/swaggerUI.png
+ :width: 40px
+
+.. |html-icon| image:: images/html.png
+ :width: 40px
+
+.. |plantuml-icon| image:: images/uml.jpg
+ :width: 40px
+
+.. |postman-icon| image:: images/postman.png
+ :width: 40px
+
+.. csv-table::
+ :header: "API", "|swagger-icon|", "|html-icon|", "|plantuml-icon|", "|swagger-icon|", "|postman-icon|", "|pdf-icon|"
+ :widths: 10,5,5,5,5,5,5
+
+ " ", "json file", "html doc", "plantUML doc", "Swagger Editor", "Postman Collection", "pdf doc"
+ "serviceCatalog", ":download:`link <swaggers/serviceCatalog_1_0_0.json>`", ":download:`link <serviceCatalog/documentation.html>`", ":download:`link <serviceCatalog/apiServiceCatalog.plantuml>`", "`link <http://editor2.swagger.io/#/?import=http://onap.readthedocs.io/en/latest/_downloads/serviceCatalog_1_0_0.json>`_", "coming", "coming"
+ "serviceInventory", ":download:`link <swaggers/serviceInventory_1_0_0.json>`", ":download:`link <serviceInventory/documentation.html>`", ":download:`link <serviceInventory/apiServiceInventory.plantuml>`", "`link <http://editor2.swagger.io/#/?import=http://onap.readthedocs.io/en/latest/_downloads/serviceInventory_1_0_0.json>`_", "coming", "coming"
+ "serviceOrder", ":download:`link <swaggers/serviceInventory_1_0_0.json>`", ":download:`link <serviceOrder/documentation.html>`", ":download:`link <serviceOrder/apiServiceOrder.plantuml>`", "`link <http://editor2.swagger.io/#/?import=http://onap.readthedocs.io/en/latest/_downloads/serviceInventory_1_0_0.json>`_", ":download:`link <postman/ONAPBeijingServiceOrderDoc.postman_collection.json>`", "coming"
+
+
+***************
+API Description
+***************
+
+**serviceCatalog:**
+
+From TMF633 serviceCatalog
+
+API at a glance:
+Only high level information are provided - swagger is documented.
+
+Only serviceSpecification resource is provided.
+Information are retrieved in SDC (and in Tosca file) - Only GET operation is provided - this API DID NOT UPDATE SDC
+
+Only characteristics at service level will be retrieved in ONAP Tosca file. For example if an ONAP service is composed of VNF and the VF module, the serviceSpecification resource will only feature characteristic describe in the ONAP service tosca model and not attributes in the tosca files for VNF or VF module.
+
+Only ‘basic’ service characteristics will be managed in this release. By ‘basic’ we mean string, boolean, integer parameter type and we do not manage ‘map’ or ‘list parameter type
+
+
+GET serviceSpecification(list)
+
+(example: GET /nbi/api/v1/serviceSpecification/?category=NetworkService&distributionStatus =DISTRIBUTED)
+
+It is possible to retrieve a list of serviceSpecification (get by list).
+
+Only attributes category and distributionStatus are available for serviceSpecification filtering. It is possible to select retrieved attributes using fields attribute.
+
+if no serviceSpecification matches, an empty list is send back.
+
+GET tservice Specification (id)
+
+(example: GET /nbi/api/v1/serviceSpecification/{uuid})
+
+It is use to retrieve one serviceSpecification - all available information are retieved (see swagger for description)
+
+
+**serviceInventory:**
+
+From TMF638 serviceInventory
+
+API at a glance:
+Only high level information are provided - swagger is documented.
+
+This API retrieves service(s) in the AAI inventory. Only following attributes will be retrieve in service inventory: id, name and type (no state or startDate available )
+
+GET Service Inventory (list):
+
+(example: GET /nbi/api/v1/service/?relatedParty.id=Pontus
+)
+
+GET (by list) allows to request with following criteria (all optional) :
+
+* id (id of the service instance) - id of the service instance (inventory)
+* serviceSpecification.id - id of the service specification (catalog)
+* serviceSpecification.name - name of the service specification (catalog)
+* relatedParty.id - id of the (aai) customer - if not filled we use ‘generic’ customer
+
+if no service matches, an empty list is send back.
+
+1. If a request is send without any parameter, we’ll retrieve the list of service-instance for the ‘generic’ customer
+2. If only customer parameter is filled (relatedParty.id + role= relatedParty’ONAPcustomer’) we’ll retrieve the list of service-instance for this customer
+3. If serviceSpecification.id or name is filled we’ll retrieve the list of Service instance (from this service specification) – We’ll use the customer id if provided (with Role=’ONAPcustomer) or generic if no customer id provided
+
+
+GET Service Inventory (id):
+
+(example: GET /nbi/api/v1/service/{uuid} but customerId & serviceSpecification.id must passed in requested parameters)
+
+
+Because of AAI capability, additionally to the service id, customer id and [serviceSpecification.id or serviceSpecification.name] must be supplied. If the customer id is not supplied, External API will use ‘generic’ customer
+
+**serviceOrder:**
+
+
+From TMF641 serviceOrder
+
+API at a glance:
+Only high level information are provided - swagger is documented.
+
+It is possible to use POST operation to create new serviceOrder in nbi and triggers service provisioning. GET operation is also available to retrieve one service order by providing id or a list of service order. For this release, only a subset of criteria is available:
+
+• externalId
+• state
+• description
+• orderDate.gt (orderDate must be greater – after -than)
+• orderDate.lt (orderDate must be lower-before - than)
+• fields – attribute used to filter retrieved attributes (if needed) and also for sorted SO
+• offset and limit are used for pagination purpose
+
+
+
+ServiceOrder will manage only ‘add’ and ‘delete’ operation (no change).
+
+prerequisites & assumptions :
+
+• Cloud & tenant information MUST BE defined in the external API property file
+• Management of ONAP customer for add service action:
+With the current version of APIs used from SO and AAI we need to manage a ‘customer’. This customer concept is confusing with Customer BSS concept. We took the following rules to manage the ‘customer’ information:
+
+• It could be provided through a serviceOrder in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided in the serviceOrder header (we will not consider in this release the party at item level); External API component will check if this customer exists and create it in AAI if not.
+• If no relatedParty are provided the service will be affected to ‘generic’ customer (dummy customer) – we assume this ‘generic’ customer always exists.
+
+• Additionally nbi will create in AAI the service-type if it did not exists for the customer
+
+• Integration is done at service-level: nbi will trigger only SO request at serviceInstance level --> ONAP prerequisite: SO must be able to find a BPMN to process service fulfillment (integrate vnf, vnf activation in SDNC, VF module
+
+• State management: States are only managed by ServiceOrder component and could not be updated from north side via API. Accordingly to service order item fulfillment progress, order item state are updated. Order state is automatically updated based on item state.
+
+
+***************
+Developer Guide
+***************
+
+Technical information about NBI (dependancies, configuration, running & testing) could be found here: `DevDoc <../architecture/NBI_R1_Developer_Guide.rst>`_
+
+
diff --git a/docs/offeredapis/postman/ONAPBeijingServiceOrderDoc.postman_collection.json b/docs/offeredapis/postman/ONAPBeijingServiceOrderDoc.postman_collection.json
new file mode 100644
index 0000000..92a16eb
--- /dev/null
+++ b/docs/offeredapis/postman/ONAPBeijingServiceOrderDoc.postman_collection.json
@@ -0,0 +1,61 @@
+{
+ "variables": [],
+ "info": {
+ "name": "ONAP Beijing ServiceOrder Doc",
+ "_postman_id": "d88ad75d-6fae-13ea-d63c-cac1f445a1bf",
+ "description": "",
+ "schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "ServiceOrder1",
+ "request": {
+ "url": "{nbiHostName}:{nbiPort}/nbi/api/v1/serviceOrder",
+ "method": "POST",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": ""
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n \"externalId\": \"NBI-SO001\",\n \"priority\": \"1\",\n \"description\": \"Firevall service ordering on customer specified\",\n \"category\": \"Consumer\",\n \"requestedStartDate\": \"2018-02-28T13:33:37.299Z\",\n \"requestedCompletionDate\": \"2018-02-28T13:33:37.299Z\",\n \"relatedParty\": [\n {\n \"id\": \"6490\",\n \"role\": \"ONAPcustomer\",\n \"name\": \"Jean Pontus\",\n \"@referredType\": \"individual\"\n }\n ],\n \"orderItem\": [\n {\n \"id\": \"1\",\n \"action\": \"add\",\n \"service\": {\n \"id\": \"vFW0001\",\n \"serviceState\": \"active\",\n \"serviceSpecification\": {\n \"id\": \"3dd3923d-1681-4f5b-99bb-f695ab147004\"\n }\n }\n }\n ]\n}"
+ },
+ "description": ""
+ },
+ "response": []
+ },
+ {
+ "name": "ServiceOrder2",
+ "request": {
+ "url": "http://127.0.0.1:8090/serviceOrder",
+ "method": "POST",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": ""
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n \"externalId\": \"NBI-SO002\",\n \"priority\": \"1\",\n \"description\": \"Firevall service ordering on customer not specified - added to generic customer\",\n \"category\": \"Consumer\",\n \"requestedStartDate\": \"2018-02-28T13:33:37.299Z\",\n \"requestedCompletionDate\": \"2018-02-28T13:33:37.299Z\",\n \"orderItem\": [\n {\n \"id\": \"1\",\n \"action\": \"add\",\n \"service\": {\n \"id\": \"vFW0002\",\n \"serviceState\": \"active\",\n \"serviceSpecification\": {\n \"id\": \"3dd3923d-1681-4f5b-99bb-f695ab147004\"\n }\n }\n }\n ]\n}"
+ },
+ "description": ""
+ },
+ "response": []
+ }
+ ]
+} \ No newline at end of file
diff --git a/docs/offeredapis/serviceCatalog/apiServiceCatalog.plantuml b/docs/offeredapis/serviceCatalog/apiServiceCatalog.plantuml
new file mode 100644
index 0000000..8483238
--- /dev/null
+++ b/docs/offeredapis/serviceCatalog/apiServiceCatalog.plantuml
@@ -0,0 +1,110 @@
+@startuml
+
+enum LifecycleStatusValues {
+ NOT_CERTIFIED_CHECKOUT
+ NOT_CERTIFIED_CHECKIN
+ READY_FOR_CERTIFICATION
+ CERTIFICATION_IN_PROGRESS
+ CERTIFIED
+}
+enum DistributionStatus {
+ DISTRIBUTION_NOT_APPROVED
+ DISTRIBUTION_APPROVED
+ DISTRIBUTED
+ DISTRIBUTION_REJECTED
+}
+
+class ErrorRepresentation {
+ code:int
+ reason:string
+ message:string
+ status:string
+ referenceErrror:string
+ @type:string
+ @schemaLocation:string
+}
+
+class TimePeriod {
+ startDateTime:dateTime
+ endDateTime:dateTime
+}
+
+class RelatedPartyRef {
+ id:string
+ role:string
+ name:string
+}
+
+class ServiceSpecification {
+ id:string
+ href:string
+ name:string
+ description:string
+ @type:string
+ @schemaLocation:string
+ @baseType:string
+ invariantUUID:string
+ toscaModelURL:string
+ toscaResourceName:string
+ category:string
+ subcategory:string
+ version:string
+}
+ ServiceSpecification --> "0-1" DistributionStatus : distributionStatus
+ ServiceSpecification --> "0-1" LifecycleStatusValues : lifecycleStatus
+ ServiceSpecification --> "0-1" TargetServiceSchemaRef : targetServiceSchema
+ ServiceSpecification --> "0-*" Attachment : attachment
+ ServiceSpecification --> "0-*" RelatedPartyRef : relatedParty
+ ServiceSpecification --> "0-*" ResourceSpecificationRef : resourceSpecification
+ ServiceSpecification --> "0-*" ServiceSpecCharacteristic : serviceSpecCharacteristic
+
+class ServiceSpecCharacteristic {
+ name:string
+ description:string
+ valueType:string
+ @type:string
+ @schemaLocation:string
+ required:boolean
+ status:string
+}
+ ServiceSpecCharacteristic --> "0-*" ServiceSpecCharacteristicValue : serviceSpecCharacteristicValue
+
+class Attachment {
+ id:string
+ name:string
+ description:string
+ @type:string
+ artifactLabel:string
+ artifactGroupType:string
+ artifactTimeout:string
+ artifactChecksum:string
+ artifactVersion:string
+ generatedFromUUID:string
+ url:string
+ mimeType:string
+}
+
+class ServiceSpecCharacteristicValue {
+ valueType:string
+ isDefault:boolean
+ value:string
+}
+
+class ResourceSpecificationRef {
+ id:string
+ version:string
+ name:string
+ @type:string
+ resourceInstanceName:string
+ resourceInvariantUUID:string
+ resourceType:string
+ modelCustomizationName:string
+ modelCustomizationId:string
+}
+
+class TargetServiceSchemaRef {
+ @type:string
+ @schemaLocation:string
+}
+
+@enduml \ No newline at end of file
diff --git a/docs/offeredapis/serviceCatalog/asciiDoc.adoc b/docs/offeredapis/serviceCatalog/asciiDoc.adoc
new file mode 100644
index 0000000..327f239
--- /dev/null
+++ b/docs/offeredapis/serviceCatalog/asciiDoc.adoc
@@ -0,0 +1,487 @@
+= API ServiceCatalog
+
+
+[[_overview]]
+== Overview
+
+=== Api URL
+
+https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/N3ma89X1x0/swagger.json[Swagger UI]
+
+
+https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/N3ma89X1x0/plantuml&noCache=797767.0[plant UML UI]
+
+serviceCatalog API designed for ONAP Beijing Release.
+This API is build from TMF open API17.5.
+Only operation GET (by id &amp; byList) for resource serviceSpecification is available
+
+
+=== Version information
+[%hardbreaks]
+__Version__ : 1.0.0_inProgress
+
+
+=== URI scheme
+[%hardbreaks]
+__Host__ : serverRoot
+__BasePath__ : /nbi/api/v1
+__Schemes__ : HTTPS
+
+
+=== Tags
+
+* ServiceSpecification
+
+
+=== Consumes
+
+* `application/json;charset=utf-8`
+
+
+=== Produces
+
+* `application/json;charset=utf-8`
+
+
+[[_paths]]
+== Resources
+
+[[_servicespecification_resource]]
+=== ServiceSpecification
+
+[[_servicespecificationfind]]
+==== List service specifications
+....
+GET /serviceSpecification
+....
+
+
+===== Description
+This operation returns service specifications from a catalog.
+Only a predefined set of attribute is proposed : Based on SDC limitations, only attributes category and distributionStatus are available for serviceSpecification filtering
+Fields attribute could be used to filter attributes retrieved
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^9,.^4"]
+|===
+|Type|Name|Description|Schema
+|**Query**|**category** +
+__optional__|Service Category (filter)|string
+|**Query**|**distributionStatus** +
+__optional__|Service distribution status (filter)|string
+|**Query**|**fields** +
+__optional__|Field selection - used to filtering the attributes to be retreived|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success|< <<_servicespecification,ServiceSpecification>> > array
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_servicespecificationget]]
+==== Retrieve a service specification
+....
+GET /serviceSpecification/{id}
+....
+
+
+===== Description
+This operation returns a service specification by its id from a catalog. Attribute selection is enabled using the fields attribute.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^9,.^4"]
+|===
+|Type|Name|Description|Schema
+|**Path**|**id** +
+__required__||string
+|**Query**|**fields** +
+__optional__|Attribute selection|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success|<<_servicespecification,ServiceSpecification>>
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_definitions]]
+== Definitions
+
+[[_attachment]]
+=== Attachment
+An attachment is a file uses to describe the service.
+In nbi we use attachment to retrieve ONAP artifacts.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@type** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with 'ONAPartifact'. We used this features to add following attributes:
+artifactLabel
+artifactGroupType
+artifactTimeout
+artifactChecksum
+artifactVersion
+generatedFromUUID +
+**Default** : `"ONAPartifact"`|string
+|**artifactChecksum** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - artifactChecksum|string
+|**artifactGroupType** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - artifactGroupType|string
+|**artifactLabel** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - artifactLabel|string
+|**artifactTimeout** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - artifactTimeout|string
+|**artifactVersion** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - artifactVersion|string
+|**description** +
+__optional__|Description of the attachment - filled with artifactDescription|string
+|**generatedFromUUID** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - generatedFromUUID|string
+|**id** +
+__optional__|Unique identifier of the attachment - filled with artifactUUID.|string
+|**mimeType** +
+__optional__|Filled with artifactType|string
+|**name** +
+__optional__|Name of the attachment - filled with artifactName|string
+|**url** +
+__optional__|Uniform Resource Locator, is a web page address - filled with artifactURL|string
+|===
+
+
+[[_distributionstatus]]
+=== DistributionStatus
+Service distribution status from ONAP.
+
+__Type__ : enum (DISTRIBUTION_NOT_APPROVED, DISTRIBUTION_APPROVED, DISTRIBUTED, DISTRIBUTION_REJECTED)
+
+
+[[_errorrepresentation]]
+=== ErrorRepresentation
+This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|it provides a link to the schema describing a REST resource.|string
+|**@type** +
+__optional__|The class type of a REST resource.|string
+|**code** +
+__required__|Application related code (as defined in the API or from a common list)|integer (int32)
+|**message** +
+__optional__|Text that provide more details and corrective actions related to the error. This can be shown to a client user|string
+|**reason** +
+__required__|Text that explains the reason for error. This can be shown to a client user.|string
+|**referenceErrror** +
+__optional__|url pointing to documentation describing the error|string
+|**status** +
+__optional__|http error code extension like 400-2|string
+|===
+
+
+[[_lifecyclestatusvalues]]
+=== LifecycleStatusValues
+Service lifecycle value from ONAP SDC
+
+__Type__ : enum (NOT_CERTIFIED_CHECKOUT, NOT_CERTIFIED_CHECKIN, READY_FOR_CERTIFICATION, CERTIFICATION_IN_PROGRESS, CERTIFIED)
+
+
+[[_relatedpartyref]]
+=== RelatedPartyRef
+Party linked to the service catalog.
+in nbi we retrieve information about last updater of the service in SDC
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**id** +
+__optional__|Unique identifier of the related party. Filled with lastUpdaterUserId|string
+|**name** +
+__optional__|Name of the related party - Filled with lastUpdatedFullName|string
+|**role** +
+__optional__|Role payed by the related party
+Only role 'lastUpdater' is retrieved in Beijing release|string
+|===
+
+
+[[_resourcespecificationref]]
+=== ResourceSpecificationRef
+A list of resourceSpec identified to deliver the service.
+for nbi we retrieve resource information available in service description (through SDC api) bu as well information retrieved in the TOSCA file.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@type** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with: 'ONAPresource'. We used this features to add following attributes:
+resourceInstanceName
+resourceInvariantUUID
+resourceType
+modelCustomizationName
+modelCustomizationId +
+**Default** : `"ONAPresource"`|string
+|**id** +
+__optional__|Unique identifier of the resource specification - filled with resourceUUID|string
+|**modelCustomizationId** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute customizationUUID in topology_template/node_template for the resource|string
+|**modelCustomizationName** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute name in topology_template/node_template for the resource|string
+|**name** +
+__optional__|Name of the resource specification - filled with resourceName|string
+|**resourceInstanceName** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - resourceInstanceName|string
+|**resourceInvariantUUID** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - resourceInvariantUUID|string
+|**resourceType** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - resoucreType|string
+|**version** +
+__optional__|Version for this resource specification - filled with resourceVersion|string
+|===
+
+
+[[_servicespeccharacteristic]]
+=== ServiceSpecCharacteristic
+A characteristic quality or distinctive feature of a ServiceSpecification.
+ServiceSpecCharacteristic are retrieved in the serviceTosca file in the topology_template section in the inputs section.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|An url pointing to type description - we do not use it in nbi Beijing release|string
+|**@type** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with: 'ONAPserviceCharacteristic'. We do not used this features in nbi Beijing release.|string
+|**description** +
+__optional__|A narrative that explains in detail what the characteristic is - Filled with parameter_description|string
+|**name** +
+__optional__|Name of the characteristic - Filled with parameter_name|string
+|**required** +
+__optional__|A parameter to define if the characteristic is mandatory - Filled from parameter_required – if not fielded by default ‘true’ +
+**Default** : `true`|boolean
+|**serviceSpecCharacteristicValue** +
+__optional__||< <<_servicespeccharacteristicvalue,ServiceSpecCharacteristicValue>> > array
+|**status** +
+__optional__|Status of the characteristic - filled with status_value|string
+|**valueType** +
+__optional__|A kind of value that the characteristic can take on, such as numeric, text and so forth - Filled with parameter_type|string
+|===
+
+
+[[_servicespeccharacteristicvalue]]
+=== ServiceSpecCharacteristicValue
+A number or text that can be assigned to a service specification characteristic.
+ServiceSpecCharacteristicValue are retrieved in the service Tosca file
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**isDefault** +
+__optional__|Information calculated from parameter default in the Tosca file|boolean
+|**value** +
+__optional__|A discrete value that the characteristic can take on|string
+|**valueType** +
+__optional__|A kind of value that the characteristic can take on, such as numeric, text, and so forth
+Retrieved in the Tosca in the topology_template section in the inputs section - parameter_type.
+We do not manage parameter_type= list or map for Beijing release|string
+|===
+
+
+[[_servicespecification]]
+=== ServiceSpecification
+ServiceSpecification is a class that offers characteristics to describe a type of service. Functionally, it acts as a template by which Services may be instantiated. By sharing the same specification, these services would therefore share the same set of characteristics.
+the service information are retrieved in SDC
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__|Not used for Beijing release|string
+|**@schemaLocation** +
+__optional__|Not used for Beijing release|string
+|**@type** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attributes:
+invariantUUID
+toscaModelURL
+toscaResourceName
+category (1)
+subcategory (1)
+distributionStatus +
+**Default** : `"ONAPservice"`|string
+|**attachment** +
+__optional__||< <<_attachment,Attachment>> > array
+|**category** +
+__optional__|Additional attribute - extended through @type - category
+Please note that this attribute is managed in TMF - in future release we'll introduce category resource|string
+|**description** +
+__optional__|A narrative that explains in detail what the service specification is - Filled with SDC Service description|string
+|**distributionStatus** +
+__optional__||<<_distributionstatus,DistributionStatus>>
+|**href** +
+__optional__|Reference of the service specification- not mapped in Beijing|string
+|**id** +
+__optional__|Unique identifier of the service specification. Filled with SDC Service uuid|string
+|**invariantUUID** +
+__required__|Additional attribute (not in the TMF API) - extended through @type - invariantUUID|string
+|**lifecycleStatus** +
+__optional__||<<_lifecyclestatusvalues,LifecycleStatusValues>>
+|**name** +
+__optional__|Name of the service specification- Filled with SDC Service name|string
+|**relatedParty** +
+__optional__||< <<_relatedpartyref,RelatedPartyRef>> > array
+|**resourceSpecification** +
+__optional__||< <<_resourcespecificationref,ResourceSpecificationRef>> > array
+|**serviceSpecCharacteristic** +
+__optional__||< <<_servicespeccharacteristic,ServiceSpecCharacteristic>> > array
+|**subcategory** +
+__optional__|Additional attribute - extended through @type - category
+Please note that this attribute is managed in TMF - in future release we'll introduce category resourc|string
+|**targetServiceSchema** +
+__optional__||<<_targetserviceschemaref,TargetServiceSchemaRef>>
+|**toscaModelURL** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - toscaModelURL|string
+|**toscaResourceName** +
+__optional__|Additional attribute (not in the TMF API) - extended through @type - toscaResourceName|string
+|**version** +
+__optional__|Service specification version - Filled with SDC Service version|string
+|===
+
+
+[[_targetserviceschemaref]]
+=== TargetServiceSchemaRef
+
+[options="header", cols=".^3,.^4"]
+|===
+|Name|Schema
+|**@schemaLocation** +
+__required__|string
+|**@type** +
+__required__|string
+|===
+
+
+[[_timeperiod]]
+=== TimePeriod
+A time period
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**endDateTime** +
+__optional__|End date and time of the period|string (date-time)
+|**startDateTime** +
+__optional__|Start date and time of the period|string (date-time)
+|===
+
diff --git a/docs/offeredapis/serviceCatalog/documentation.html b/docs/offeredapis/serviceCatalog/documentation.html
new file mode 100644
index 0000000..b1ea44a
--- /dev/null
+++ b/docs/offeredapis/serviceCatalog/documentation.html
@@ -0,0 +1,1473 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 1.5.6.1">
+<title>API ServiceCatalog</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
+/* Remove comment around @import statement below when using as a custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
+audio,canvas,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+[hidden],template{display:none}
+script{display:none!important}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:transparent}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
+input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.spread{width:100%}
+p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:none}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite:before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7;font-weight:bold}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
+.clearfix:after,.float-group:after{clear:both}
+*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+*:not(pre)>code.nobreak{word-wrap:normal}
+*:not(pre)>code.nowrap{white-space:nowrap}
+pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
+b.button:before{content:"[";padding:0 3px 0 2px}
+b.button:after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
+#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
+#content{margin-top:1.25em}
+#content:before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
+#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span:before{content:"\00a0\2013\00a0"}
+#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark:before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber:after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
+@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+.sect1{padding-bottom:.625em}
+@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
+.sect1+.sect1{border-top:1px solid #efefed}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
+.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:initial}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
+.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
+.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
+.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
+@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
+@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
+.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
+.listingblock:hover code[data-lang]:before{display:block}
+.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
+.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
+table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
+table.pyhltable td.code{padding-left:.75em;padding-right:0}
+pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
+pre.pygments .lineno{display:inline-block;margin-right:.25em}
+table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
+.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
+.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
+.quoteblock .quoteblock blockquote:before{display:none}
+.verseblock{margin:0 1em 1.25em 1em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
+.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
+.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
+table.tableblock{max-width:100%;border-collapse:separate}
+table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px 0}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot{border-width:1px 0}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+td>div.verse{white-space:pre}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
+ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
+ul.inline>li>*{display:block}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist>table tr>td:first-of-type{padding:.4em .75em 0 .75em;line-height:1;vertical-align:top}
+.colist>table tr>td:first-of-type img{max-width:initial}
+.colist>table tr>td:last-of-type{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
+.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background-color:#00fafa}
+.black{color:#000}
+.black-background{background-color:#000}
+.blue{color:#0000bf}
+.blue-background{background-color:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background-color:#fa00fa}
+.gray{color:#606060}
+.gray-background{background-color:#7d7d7d}
+.green{color:#006000}
+.green-background{background-color:#007d00}
+.lime{color:#00bf00}
+.lime-background{background-color:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background-color:#7d0000}
+.navy{color:#000060}
+.navy-background{background-color:#00007d}
+.olive{color:#606000}
+.olive-background{background-color:#7d7d00}
+.purple{color:#600060}
+.purple-background{background-color:#7d007d}
+.red{color:#bf0000}
+.red-background{background-color:#fa0000}
+.silver{color:#909090}
+.silver-background{background-color:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background-color:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background-color:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background-color:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]:after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@media print{@page{margin:1.25cm .75cm}
+*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]:after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
+.sect1{padding-bottom:0!important}
+.sect1+.sect1{border:0!important}
+#header>h1:first-child{margin-top:1.25rem}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span:before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]:before{display:block}
+#footer{background:none!important;padding:0 .9375em}
+#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+</style>
+</head>
+<body class="article toc2 toc-left">
+<div id="header">
+<h1>API ServiceCatalog</h1>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#_overview">Overview</a>
+<ul class="sectlevel2">
+<li><a href="#_api_url">Api URL</a></li>
+<li><a href="#_version_information">Version information</a></li>
+<li><a href="#_uri_scheme">URI scheme</a></li>
+<li><a href="#_tags">Tags</a></li>
+<li><a href="#_consumes">Consumes</a></li>
+<li><a href="#_produces">Produces</a></li>
+</ul>
+</li>
+<li><a href="#_paths">Resources</a>
+<ul class="sectlevel2">
+<li><a href="#_servicespecification_resource">ServiceSpecification</a></li>
+</ul>
+</li>
+<li><a href="#_definitions">Definitions</a>
+<ul class="sectlevel2">
+<li><a href="#_attachment">Attachment</a></li>
+<li><a href="#_distributionstatus">DistributionStatus</a></li>
+<li><a href="#_errorrepresentation">ErrorRepresentation</a></li>
+<li><a href="#_lifecyclestatusvalues">LifecycleStatusValues</a></li>
+<li><a href="#_relatedpartyref">RelatedPartyRef</a></li>
+<li><a href="#_resourcespecificationref">ResourceSpecificationRef</a></li>
+<li><a href="#_servicespeccharacteristic">ServiceSpecCharacteristic</a></li>
+<li><a href="#_servicespeccharacteristicvalue">ServiceSpecCharacteristicValue</a></li>
+<li><a href="#_servicespecification">ServiceSpecification</a></li>
+<li><a href="#_targetserviceschemaref">TargetServiceSchemaRef</a></li>
+<li><a href="#_timeperiod">TimePeriod</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_overview">Overview</h2>
+<div class="sectionbody">
+<div class="sect2">
+<div class="paragraph">
+<p>serviceCatalog API designed for ONAP Beijing Release.
+This API is build from TMF open API17.5.
+Only operation GET (by id &amp; byList) for resource serviceSpecification is available</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_version_information">Version information</h3>
+<div class="paragraph">
+<p><em>Version</em> : 1.0.0_inProgress</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_uri_scheme">URI scheme</h3>
+<div class="paragraph">
+<p><em>Host</em> : serverRoot<br>
+<em>BasePath</em> : /nbi/api/v1<br>
+<em>Schemes</em> : HTTPS</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_tags">Tags</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>ServiceSpecification</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_consumes">Consumes</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_produces">Produces</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_paths">Resources</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_servicespecification_resource">ServiceSpecification</h3>
+<div class="sect3">
+<h4 id="_servicespecificationfind">List service specifications</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /serviceSpecification</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description">Description</h5>
+<div class="paragraph">
+<p>This operation returns service specifications from a catalog.
+Only a predefined set of attribute is proposed : Based on SDC limitations, only attributes category and distributionStatus are available for serviceSpecification filtering
+Fields attribute could be used to filter attributes retrieved</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 16.6666%;">
+<col style="width: 50%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>category</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Category (filter)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>distributionStatus</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service distribution status (filter)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>fields</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Field selection - used to filtering the attributes to be retreived</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicespecification">ServiceSpecification</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_servicespecificationget">Retrieve a service specification</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /serviceSpecification/{id}</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description_2">Description</h5>
+<div class="paragraph">
+<p>This operation returns a service specification by its id from a catalog. Attribute selection is enabled using the fields attribute.</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters_2">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 16.6666%;">
+<col style="width: 50%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Path</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>fields</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Attribute selection</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses_2">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_servicespecification">ServiceSpecification</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_definitions">Definitions</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_attachment">Attachment</h3>
+<div class="paragraph">
+<p>An attachment is a file uses to describe the service.
+In nbi we use attachment to retrieve ONAP artifacts.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with 'ONAPartifact'. We used this features to add following attributes:
+artifactLabel
+artifactGroupType
+artifactTimeout
+artifactChecksum
+artifactVersion
+generatedFromUUID<br>
+<strong>Default</strong> : <code>"ONAPartifact"</code></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>artifactChecksum</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - artifactChecksum</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>artifactGroupType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - artifactGroupType</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>artifactLabel</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - artifactLabel</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>artifactTimeout</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - artifactTimeout</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>artifactVersion</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - artifactVersion</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Description of the attachment - filled with artifactDescription</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>generatedFromUUID</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - generatedFromUUID</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the attachment - filled with artifactUUID.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>mimeType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Filled with artifactType</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the attachment - filled with artifactName</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>url</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Uniform Resource Locator, is a web page address - filled with artifactURL</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_distributionstatus">DistributionStatus</h3>
+<div class="paragraph">
+<p>Service distribution status from ONAP.</p>
+</div>
+<div class="paragraph">
+<p><em>Type</em> : enum (DISTRIBUTION_NOT_APPROVED, DISTRIBUTION_APPROVED, DISTRIBUTED, DISTRIBUTION_REJECTED)</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_errorrepresentation">ErrorRepresentation</h3>
+<div class="paragraph">
+<p>This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">it provides a link to the schema describing a REST resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The class type of a REST resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>code</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Application related code (as defined in the API or from a common list)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">integer (int32)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>message</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that provide more details and corrective actions related to the error. This can be shown to a client user</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>reason</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that explains the reason for error. This can be shown to a client user.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>referenceErrror</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">url pointing to documentation describing the error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>status</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">http error code extension like 400-2</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_lifecyclestatusvalues">LifecycleStatusValues</h3>
+<div class="paragraph">
+<p>Service lifecycle value from ONAP SDC</p>
+</div>
+<div class="paragraph">
+<p><em>Type</em> : enum (NOT_CERTIFIED_CHECKOUT, NOT_CERTIFIED_CHECKIN, READY_FOR_CERTIFICATION, CERTIFICATION_IN_PROGRESS, CERTIFIED)</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_relatedpartyref">RelatedPartyRef</h3>
+<div class="paragraph">
+<p>Party linked to the service catalog.
+in nbi we retrieve information about last updater of the service in SDC</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the related party. Filled with lastUpdaterUserId</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the related party - Filled with lastUpdatedFullName</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>role</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Role payed by the related party
+Only role 'lastUpdater' is retrieved in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_resourcespecificationref">ResourceSpecificationRef</h3>
+<div class="paragraph">
+<p>A list of resourceSpec identified to deliver the service.
+for nbi we retrieve resource information available in service description (through SDC api) bu as well information retrieved in the TOSCA file.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with: 'ONAPresource'. We used this features to add following attributes:
+resourceInstanceName
+resourceInvariantUUID
+resourceType
+modelCustomizationName
+modelCustomizationId<br>
+<strong>Default</strong> : <code>"ONAPresource"</code></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the resource specification - filled with resourceUUID</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelCustomizationId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute customizationUUID in topology_template/node_template for the resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelCustomizationName</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute name in topology_template/node_template for the resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the resource specification - filled with resourceName</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>resourceInstanceName</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - resourceInstanceName</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>resourceInvariantUUID</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - resourceInvariantUUID</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>resourceType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - resoucreType</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>version</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Version for this resource specification - filled with resourceVersion</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicespeccharacteristic">ServiceSpecCharacteristic</h3>
+<div class="paragraph">
+<p>A characteristic quality or distinctive feature of a ServiceSpecification.
+ServiceSpecCharacteristic are retrieved in the serviceTosca file in the topology_template section in the inputs section.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">An url pointing to type description - we do not use it in nbi Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with: 'ONAPserviceCharacteristic'. We do not used this features in nbi Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A narrative that explains in detail what the characteristic is - Filled with parameter_description</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the characteristic - Filled with parameter_name</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>required</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A parameter to define if the characteristic is mandatory - Filled from parameter_required – if not fielded by default ‘true’<br>
+<strong>Default</strong> : <code>true</code></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecCharacteristicValue</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicespeccharacteristicvalue">ServiceSpecCharacteristicValue</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>status</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Status of the characteristic - filled with status_value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>valueType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A kind of value that the characteristic can take on, such as numeric, text and so forth - Filled with parameter_type</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicespeccharacteristicvalue">ServiceSpecCharacteristicValue</h3>
+<div class="paragraph">
+<p>A number or text that can be assigned to a service specification characteristic.
+ServiceSpecCharacteristicValue are retrieved in the service Tosca file</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>isDefault</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Information calculated from parameter default in the Tosca file</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>value</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A discrete value that the characteristic can take on</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>valueType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A kind of value that the characteristic can take on, such as numeric, text, and so forth
+Retrieved in the Tosca in the topology_template section in the inputs section - parameter_type.
+We do not manage parameter_type= list or map for Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicespecification">ServiceSpecification</h3>
+<div class="paragraph">
+<p>ServiceSpecification is a class that offers characteristics to describe a type of service. Functionally, it acts as a template by which Services may be instantiated. By sharing the same specification, these services would therefore share the same set of characteristics.
+the service information are retrieved in SDC</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not used for Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not used for Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attributes:
+invariantUUID
+toscaModelURL
+toscaResourceName
+category (1)
+subcategory (1)
+distributionStatus<br>
+<strong>Default</strong> : <code>"ONAPservice"</code></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>attachment</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_attachment">Attachment</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>category</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute - extended through @type - category
+Please note that this attribute is managed in TMF - in future release we&#8217;ll introduce category resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A narrative that explains in detail what the service specification is - Filled with SDC Service description</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>distributionStatus</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_distributionstatus">DistributionStatus</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the service specification- not mapped in Beijing</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service specification. Filled with SDC Service uuid</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>invariantUUID</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - invariantUUID</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>lifecycleStatus</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_lifecyclestatusvalues">LifecycleStatusValues</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the service specification- Filled with SDC Service name</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_relatedpartyref">RelatedPartyRef</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>resourceSpecification</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_resourcespecificationref">ResourceSpecificationRef</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecCharacteristic</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicespeccharacteristic">ServiceSpecCharacteristic</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>subcategory</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute - extended through @type - category
+Please note that this attribute is managed in TMF - in future release we&#8217;ll introduce category resourc</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>targetServiceSchema</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_targetserviceschemaref">TargetServiceSchemaRef</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>toscaModelURL</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - toscaModelURL</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>toscaResourceName</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @type - toscaResourceName</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>version</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service specification version - Filled with SDC Service version</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_targetserviceschemaref">TargetServiceSchemaRef</h3>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 42.8571%;">
+<col style="width: 57.1429%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_timeperiod">TimePeriod</h3>
+<div class="paragraph">
+<p>A time period</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>endDateTime</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">End date and time of the period</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>startDateTime</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Start date and time of the period</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2018-03-21 17:15:23 UTC
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/offeredapis/serviceCatalog/markDown.md b/docs/offeredapis/serviceCatalog/markDown.md
new file mode 100644
index 0000000..4d066c3
--- /dev/null
+++ b/docs/offeredapis/serviceCatalog/markDown.md
@@ -0,0 +1,294 @@
+# API ServiceCatalog
+
+
+<a name="overview"></a>
+## Overview
+
+### Api URL
+
+[Swagger UI](https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/N3ma89X1x0/swagger.json)
+
+
+[plant UML UI](https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/N3ma89X1x0/plantuml&noCache=797767.0)
+
+serviceCatalog API designed for ONAP Beijing Release.
+This API is build from TMF open API17.5.
+Only operation GET (by id & byList) for resource serviceSpecification is available
+
+
+### Version information
+*Version* : 1.0.0_inProgress
+
+
+### URI scheme
+*Host* : serverRoot
+*BasePath* : /nbi/api/v1
+*Schemes* : HTTPS
+
+
+### Tags
+
+* ServiceSpecification
+
+
+### Consumes
+
+* `application/json;charset=utf-8`
+
+
+### Produces
+
+* `application/json;charset=utf-8`
+
+
+<a name="paths"></a>
+## Resources
+
+<a name="servicespecification_resource"></a>
+### ServiceSpecification
+
+<a name="servicespecificationfind"></a>
+#### List service specifications
+```
+GET /serviceSpecification
+```
+
+
+##### Description
+This operation returns service specifications from a catalog.
+Only a predefined set of attribute is proposed : Based on SDC limitations, only attributes category and distributionStatus are available for serviceSpecification filtering
+Fields attribute could be used to filter attributes retrieved
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Query**|**category** <br>*optional*|Service Category (filter)|string|
+|**Query**|**distributionStatus** <br>*optional*|Service distribution status (filter)|string|
+|**Query**|**fields** <br>*optional*|Field selection - used to filtering the attributes to be retreived|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success|< [ServiceSpecification](#servicespecification) > array|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="servicespecificationget"></a>
+#### Retrieve a service specification
+```
+GET /serviceSpecification/{id}
+```
+
+
+##### Description
+This operation returns a service specification by its id from a catalog. Attribute selection is enabled using the fields attribute.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id** <br>*required*||string|
+|**Query**|**fields** <br>*optional*|Attribute selection|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success|[ServiceSpecification](#servicespecification)|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="definitions"></a>
+## Definitions
+
+<a name="attachment"></a>
+### Attachment
+An attachment is a file uses to describe the service.
+In nbi we use attachment to retrieve ONAP artifacts.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@type** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with 'ONAPartifact'. We used this features to add following attributes: <br>artifactLabel<br>artifactGroupType<br>artifactTimeout<br>artifactChecksum<br>artifactVersion<br>generatedFromUUID <br>**Default** : `"ONAPartifact"`|string|
+|**artifactChecksum** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - artifactChecksum|string|
+|**artifactGroupType** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - artifactGroupType|string|
+|**artifactLabel** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - artifactLabel|string|
+|**artifactTimeout** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - artifactTimeout|string|
+|**artifactVersion** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - artifactVersion|string|
+|**description** <br>*optional*|Description of the attachment - filled with artifactDescription|string|
+|**generatedFromUUID** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - generatedFromUUID|string|
+|**id** <br>*optional*|Unique identifier of the attachment - filled with artifactUUID.|string|
+|**mimeType** <br>*optional*|Filled with artifactType|string|
+|**name** <br>*optional*|Name of the attachment - filled with artifactName|string|
+|**url** <br>*optional*|Uniform Resource Locator, is a web page address - filled with artifactURL|string|
+
+
+<a name="distributionstatus"></a>
+### DistributionStatus
+Service distribution status from ONAP.
+
+*Type* : enum (DISTRIBUTION_NOT_APPROVED, DISTRIBUTION_APPROVED, DISTRIBUTED, DISTRIBUTION_REJECTED)
+
+
+<a name="errorrepresentation"></a>
+### ErrorRepresentation
+This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|it provides a link to the schema describing a REST resource.|string|
+|**@type** <br>*optional*|The class type of a REST resource.|string|
+|**code** <br>*required*|Application related code (as defined in the API or from a common list)|integer (int32)|
+|**message** <br>*optional*|Text that provide more details and corrective actions related to the error. This can be shown to a client user|string|
+|**reason** <br>*required*|Text that explains the reason for error. This can be shown to a client user.|string|
+|**referenceErrror** <br>*optional*|url pointing to documentation describing the error|string|
+|**status** <br>*optional*|http error code extension like 400-2|string|
+
+
+<a name="lifecyclestatusvalues"></a>
+### LifecycleStatusValues
+Service lifecycle value from ONAP SDC
+
+*Type* : enum (NOT_CERTIFIED_CHECKOUT, NOT_CERTIFIED_CHECKIN, READY_FOR_CERTIFICATION, CERTIFICATION_IN_PROGRESS, CERTIFIED)
+
+
+<a name="relatedpartyref"></a>
+### RelatedPartyRef
+Party linked to the service catalog.
+in nbi we retrieve information about last updater of the service in SDC
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**id** <br>*optional*|Unique identifier of the related party. Filled with lastUpdaterUserId|string|
+|**name** <br>*optional*|Name of the related party - Filled with lastUpdatedFullName|string|
+|**role** <br>*optional*|Role payed by the related party<br>Only role 'lastUpdater' is retrieved in Beijing release|string|
+
+
+<a name="resourcespecificationref"></a>
+### ResourceSpecificationRef
+A list of resourceSpec identified to deliver the service.
+for nbi we retrieve resource information available in service description (through SDC api) bu as well information retrieved in the TOSCA file.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@type** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with: 'ONAPresource'. We used this features to add following attributes:<br>resourceInstanceName<br>resourceInvariantUUID<br>resourceType<br>modelCustomizationName<br>modelCustomizationId <br>**Default** : `"ONAPresource"`|string|
+|**id** <br>*optional*|Unique identifier of the resource specification - filled with resourceUUID|string|
+|**modelCustomizationId** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute customizationUUID in topology_template/node_template for the resource|string|
+|**modelCustomizationName** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute name in topology_template/node_template for the resource|string|
+|**name** <br>*optional*|Name of the resource specification - filled with resourceName|string|
+|**resourceInstanceName** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - resourceInstanceName|string|
+|**resourceInvariantUUID** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - resourceInvariantUUID|string|
+|**resourceType** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - resoucreType|string|
+|**version** <br>*optional*|Version for this resource specification - filled with resourceVersion|string|
+
+
+<a name="servicespeccharacteristic"></a>
+### ServiceSpecCharacteristic
+A characteristic quality or distinctive feature of a ServiceSpecification.
+ServiceSpecCharacteristic are retrieved in the serviceTosca file in the topology_template section in the inputs section.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|An url pointing to type description - we do not use it in nbi Beijing release|string|
+|**@type** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with: 'ONAPserviceCharacteristic'. We do not used this features in nbi Beijing release.|string|
+|**description** <br>*optional*|A narrative that explains in detail what the characteristic is - Filled with parameter_description|string|
+|**name** <br>*optional*|Name of the characteristic - Filled with parameter_name|string|
+|**required** <br>*optional*|A parameter to define if the characteristic is mandatory - Filled from parameter_required – if not fielded by default ‘true’ <br>**Default** : `true`|boolean|
+|**serviceSpecCharacteristicValue** <br>*optional*||< [ServiceSpecCharacteristicValue](#servicespeccharacteristicvalue) > array|
+|**status** <br>*optional*|Status of the characteristic - filled with status_value|string|
+|**valueType** <br>*optional*|A kind of value that the characteristic can take on, such as numeric, text and so forth - Filled with parameter_type|string|
+
+
+<a name="servicespeccharacteristicvalue"></a>
+### ServiceSpecCharacteristicValue
+A number or text that can be assigned to a service specification characteristic.
+ServiceSpecCharacteristicValue are retrieved in the service Tosca file
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**isDefault** <br>*optional*|Information calculated from parameter default in the Tosca file|boolean|
+|**value** <br>*optional*|A discrete value that the characteristic can take on|string|
+|**valueType** <br>*optional*|A kind of value that the characteristic can take on, such as numeric, text, and so forth<br>Retrieved in the Tosca in the topology_template section in the inputs section - parameter_type. <br>We do not manage parameter_type= list or map for Beijing release|string|
+
+
+<a name="servicespecification"></a>
+### ServiceSpecification
+ServiceSpecification is a class that offers characteristics to describe a type of service. Functionally, it acts as a template by which Services may be instantiated. By sharing the same specification, these services would therefore share the same set of characteristics.
+the service information are retrieved in SDC
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*|Not used for Beijing release|string|
+|**@schemaLocation** <br>*optional*|Not used for Beijing release|string|
+|**@type** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attributes:<br>invariantUUID<br>toscaModelURL<br>toscaResourceName<br>category (1)<br>subcategory (1)<br>distributionStatus <br>**Default** : `"ONAPservice"`|string|
+|**attachment** <br>*optional*||< [Attachment](#attachment) > array|
+|**category** <br>*optional*|Additional attribute - extended through @type - category<br>Please note that this attribute is managed in TMF - in future release we'll introduce category resource|string|
+|**description** <br>*optional*|A narrative that explains in detail what the service specification is - Filled with SDC Service description|string|
+|**distributionStatus** <br>*optional*||[DistributionStatus](#distributionstatus)|
+|**href** <br>*optional*|Reference of the service specification- not mapped in Beijing|string|
+|**id** <br>*optional*|Unique identifier of the service specification. Filled with SDC Service uuid|string|
+|**invariantUUID** <br>*required*|Additional attribute (not in the TMF API) - extended through @type - invariantUUID|string|
+|**lifecycleStatus** <br>*optional*||[LifecycleStatusValues](#lifecyclestatusvalues)|
+|**name** <br>*optional*|Name of the service specification- Filled with SDC Service name|string|
+|**relatedParty** <br>*optional*||< [RelatedPartyRef](#relatedpartyref) > array|
+|**resourceSpecification** <br>*optional*||< [ResourceSpecificationRef](#resourcespecificationref) > array|
+|**serviceSpecCharacteristic** <br>*optional*||< [ServiceSpecCharacteristic](#servicespeccharacteristic) > array|
+|**subcategory** <br>*optional*|Additional attribute - extended through @type - category<br>Please note that this attribute is managed in TMF - in future release we'll introduce category resourc|string|
+|**targetServiceSchema** <br>*optional*||[TargetServiceSchemaRef](#targetserviceschemaref)|
+|**toscaModelURL** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - toscaModelURL|string|
+|**toscaResourceName** <br>*optional*|Additional attribute (not in the TMF API) - extended through @type - toscaResourceName|string|
+|**version** <br>*optional*|Service specification version - Filled with SDC Service version|string|
+
+
+<a name="targetserviceschemaref"></a>
+### TargetServiceSchemaRef
+
+|Name|Schema|
+|---|---|
+|**@schemaLocation** <br>*required*|string|
+|**@type** <br>*required*|string|
+
+
+<a name="timeperiod"></a>
+### TimePeriod
+A time period
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**endDateTime** <br>*optional*|End date and time of the period|string (date-time)|
+|**startDateTime** <br>*optional*|Start date and time of the period|string (date-time)|
+
diff --git a/docs/offeredapis/serviceInventory/apiServiceInventory.plantuml b/docs/offeredapis/serviceInventory/apiServiceInventory.plantuml
new file mode 100644
index 0000000..447f3fe
--- /dev/null
+++ b/docs/offeredapis/serviceInventory/apiServiceInventory.plantuml
@@ -0,0 +1,97 @@
+@startuml
+
+enum stateValues {
+ feasibilityChecked
+ designed
+ reserved
+ inactive
+ active
+ terminated
+}
+
+class ErrorRepresentation {
+ code:int
+ reason:string
+ message:string
+ status:string
+ referenceError:string
+ @type:string
+ @schemaLocation:string
+}
+
+class Service {
+ id:string
+ href:string
+ name:string
+ type:string
+ hasStarted:boolean
+ @type:string
+ @baseType:string
+ @schemaLocation:string
+}
+ Service --> "0-1" stateValues : state
+ Service --> "0-1" ServiceSpecificationRef : serviceSpecification
+ Service --> "0-*" ServiceCharacteristic : characteristic
+ Service --> "0-*" SupportingResource : supportingResource
+ Service --> "0-*" RelatedPartyRef : relatedParty
+
+class ServiceSpecificationRef {
+ id:string
+ href:string
+ name:string
+ version:string
+ @referredType:string
+ @schemaLocation:string
+ invariantUUID:string
+}
+
+class ServiceCharacteristic {
+ name:string
+ valueType:string
+}
+ ServiceCharacteristic --> "0-1" Value : value
+
+class SupportingResource {
+ id:string
+ href:string
+ role:string
+ name:string
+ @referredType:string
+ @schemaLocation:string
+ status:string
+ modelInvariantId:string
+ modelVersionId:string
+ modelCustomisationId:string
+}
+
+class RelatedPartyRef {
+ id:string
+ href:string
+ role:string
+ @referredType:string
+}
+
+class Value {
+ @type:string
+ @schemaLocation:string
+ serviceCharacteristicValue:string
+}
+
+class ListRelatedPartyRef {
+ id:string
+ role:string
+}
+
+class ListServiceSpecificationRef {
+ id:string
+ name:string
+}
+
+class ListService {
+ id:string
+ name:string
+}
+ ListService --> "0-1" ListServiceSpecificationRef : serviceSpecification
+ ListService --> "0-1" ListRelatedPartyRef : relatedParty
+
+@enduml \ No newline at end of file
diff --git a/docs/offeredapis/serviceInventory/asciiDoc.adoc b/docs/offeredapis/serviceInventory/asciiDoc.adoc
new file mode 100644
index 0000000..c6f51c4
--- /dev/null
+++ b/docs/offeredapis/serviceInventory/asciiDoc.adoc
@@ -0,0 +1,461 @@
+= API ServiceInventory
+
+
+[[_overview]]
+== Overview
+
+=== Api URL
+
+https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/5an735gnX0/swagger.json[Swagger UI]
+
+
+https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/5an735gnX0/plantuml&noCache=304710.0[plant UML UI]
+
+serviceInventory API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0)
+only operation GET (by id &amp; byList) for resource serviceSpecification is available
+
+
+=== Version information
+[%hardbreaks]
+__Version__ : 1.0.0_inProgress
+
+
+=== URI scheme
+[%hardbreaks]
+__Host__ : serverRoot
+__BasePath__ : /nbi/api/v1
+__Schemes__ : HTTPS
+
+
+=== Tags
+
+* Service
+
+
+=== Consumes
+
+* `application/json;charset=utf-8`
+
+
+=== Produces
+
+* `application/json;charset=utf-8`
+
+
+[[_paths]]
+== Resources
+
+[[_service_resource]]
+=== Service
+
+[[_servicefind]]
+==== List services
+....
+GET /service
+....
+
+
+===== Description
+This operation list service entities.
+Attribute selection is restricted.
+fields attribute may be used to filter retrieved attribute(s) for each service
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^4"]
+|===
+|Type|Name|Schema
+|**Query**|**fields** +
+__optional__|string
+|**Query**|**id** +
+__optional__|string
+|**Query**|**relatedParty.id** +
+__optional__|string
+|**Query**|**serviceSpecification.id** +
+__optional__|string
+|**Query**|**serviceSpecification.name** +
+__optional__|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success|< <<_listservice,ListService>> > array
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_serviceget]]
+==== Retrieve a service
+....
+GET /service/{id}
+....
+
+
+===== Description
+This operation retrieves a service entity.
+Attribute selection is enabled for all first level attributes.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^4"]
+|===
+|Type|Name|Schema
+|**Path**|**id** +
+__required__|string
+|**Query**|**relatedParty.id** +
+__optional__|string
+|**Query**|**serviceSpecification.id** +
+__optional__|string
+|**Query**|**serviceSpecification.name** +
+__optional__|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success|<<_service,Service>>
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_definitions]]
+== Definitions
+
+[[_errorrepresentation]]
+=== ErrorRepresentation
+This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|it provides a link to the schema describing a REST resource.|string
+|**@type** +
+__optional__|The class type of a REST resource.|string
+|**code** +
+__required__|Application related code (as defined in the API or from a common list)|integer (int32)
+|**message** +
+__optional__|Text that provide more details and corrective actions related to the error. This can be shown to a client user.|string
+|**reason** +
+__required__|Text that explains the reason for error. This can be shown to a client user.|string
+|**referenceError** +
+__optional__|url pointing to documentation describing the error|string
+|**status** +
+__optional__|http error code extension like 400-2|string
+|===
+
+
+[[_listrelatedpartyref]]
+=== ListRelatedPartyRef
+This class is used to structure list of service(s) retrieved
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**id** +
+__optional__|Unique identifier of a related party|string
+|**role** +
+__optional__|Role played by the related party - only role “ONAPcustomer” is managed in Beijing release.|string
+|===
+
+
+[[_listservice]]
+=== ListService
+This class is used to structure list of service(s) retrieved
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**id** +
+__optional__|Unique identifier of the service|string
+|**name** +
+__optional__|Name of the service|string
+|**relatedParty** +
+__optional__||<<_listrelatedpartyref,ListRelatedPartyRef>>
+|**serviceSpecification** +
+__optional__||<<_listservicespecificationref,ListServiceSpecificationRef>>
+|===
+
+
+[[_listservicespecificationref]]
+=== ListServiceSpecificationRef
+This class is used to structure list of service(s) retrieved
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**id** +
+__optional__|Unique identifier of the service specification|string
+|**name** +
+__optional__|Name of the required service specification|string
+|===
+
+
+[[_relatedpartyref]]
+=== RelatedPartyRef
+RelatedParty reference. A related party defines party or party role linked to a specific entity.
+Only ONAP Customer is managed in Beijing release.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@referredType** +
+__optional__|Not managed in the Beijing release.|string
+|**href** +
+__optional__|Reference of a related party.
+Not filled in Beijing release.|string
+|**id** +
+__optional__|Unique identifier of a related party|string
+|**role** +
+__optional__|Role played by the related party.
+Filled with 'ONAPcustomer'|string
+|===
+
+
+[[_service]]
+=== Service
+Instantiated service (service_instance) in AAI
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__|Not managed in Beijing release|string
+|**@schemaLocation** +
+__optional__|Not managed in Beijing release|string
+|**@type** +
+__optional__|This attribute allows to dynamically extends TMF class. Not used in Beijing release.|string
+|**characteristic** +
+__optional__||< <<_servicecharacteristic,ServiceCharacteristic>> > array
+|**hasStarted** +
+__optional__|This is a Boolean attribute that, if TRUE, signifies that this Service has already been started. If the value of this attribute is FALSE, then this signifies that this Service has NOT been Started
+Not managed in Beijing release|boolean
+|**href** +
+__optional__|Reference of the service
+Not managed in Beijing release|string
+|**id** +
+__optional__|Unique identifier of the service - Valued with service-instance-id|string
+|**name** +
+__optional__|Name of the service - Valued with service-instance-name|string
+|**relatedParty** +
+__optional__||< <<_relatedpartyref,RelatedPartyRef>> > array
+|**serviceSpecification** +
+__optional__||<<_servicespecificationref,ServiceSpecificationRef>>
+|**state** +
+__optional__||<<_statevalues,stateValues>>
+|**supportingResource** +
+__optional__||< <<_supportingresource,SupportingResource>> > array
+|**type** +
+__optional__|Service type - valued with 'service-instance'|string
+|===
+
+
+[[_servicecharacteristic]]
+=== ServiceCharacteristic
+A list of name value pairs that define the service characteristics
+Not managed in Beijing release.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**name** +
+__required__|Name of the characteristic
+Not managed in Beijing release.|string
+|**value** +
+__optional__||<<_value,Value>>
+|**valueType** +
+__optional__|Type of value for this characteristic.
+Not managed in Beijing release.|string
+|===
+
+
+[[_servicespecificationref]]
+=== ServiceSpecificationRef
+Service specification reference: ServiceSpecification of this service (catalog information)
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@referredType** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attribute: invariantUUID|string
+|**@schemaLocation** +
+__optional__|Not managed in Beijing release|string
+|**href** +
+__optional__|Reference of the service specification.
+not managed in Beijing release.|string
+|**id** +
+__optional__|Unique identifier of the service specification. valued to model-version-id|string
+|**invariantUUID** +
+__optional__|Additional attribute (not in the TMF API) - extended through @referredType - model-invariant-id|string
+|**name** +
+__optional__|Name of the required service specification|string
+|**version** +
+__optional__|Service specification version.
+Not managed in Beijing release|string
+|===
+
+
+[[_supportingresource]]
+=== SupportingResource
+Supporting resource - A supportingResource will be retrieved for each relationship of the relationship-list where related-link describe a vnf
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@referredType** +
+__optional__|This attribute allows to dynamically extends TMF class. Valued with 'ONAP resource'. We used this features to add following attributes:
+ status
+ modelInvariantId
+ modelVersionId
+ modelCustomisationId|string
+|**@schemaLocation** +
+__optional__|Not managed in Beijing release.|string
+|**href** +
+__optional__|Reference of the supporting resource|string
+|**id** +
+__optional__|Unique identifier of the supporting resource - Valued to vnf-id|string
+|**modelCustomisationId** +
+__optional__|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-customisation-id|string
+|**modelInvariantId** +
+__optional__|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-invariant-id|string
+|**modelVersionId** +
+__optional__|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-verson-id|string
+|**name** +
+__optional__|Name of the supporting resource - Valued with vnf_-name|string
+|**role** +
+__optional__|Not managed in Beijing release.|string
+|**status** +
+__optional__|Additional attribute (not in the TMF API) - extended through @referredType - valued with prov-status|string
+|===
+
+
+[[_value]]
+=== Value
+Structure used to describe characteristic value.
+Not managed in Beijing release.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|Not managed in Beijing release.|string
+|**@type** +
+__optional__|Not managed in Beijing release.|string
+|**serviceCharacteristicValue** +
+__optional__|Not managed in Beijing release.|string
+|===
+
+
+[[_statevalues]]
+=== stateValues
+__Type__ : enum (feasibilityChecked, designed, reserved, inactive, active, terminated)
+
diff --git a/docs/offeredapis/serviceInventory/documentation.html b/docs/offeredapis/serviceInventory/documentation.html
new file mode 100644
index 0000000..905fa1b
--- /dev/null
+++ b/docs/offeredapis/serviceInventory/documentation.html
@@ -0,0 +1,1423 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 1.5.6.1">
+<title>API ServiceInventory</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
+/* Remove comment around @import statement below when using as a custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
+audio,canvas,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+[hidden],template{display:none}
+script{display:none!important}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:transparent}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
+input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.spread{width:100%}
+p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:none}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite:before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7;font-weight:bold}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
+.clearfix:after,.float-group:after{clear:both}
+*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+*:not(pre)>code.nobreak{word-wrap:normal}
+*:not(pre)>code.nowrap{white-space:nowrap}
+pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
+b.button:before{content:"[";padding:0 3px 0 2px}
+b.button:after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
+#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
+#content{margin-top:1.25em}
+#content:before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
+#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span:before{content:"\00a0\2013\00a0"}
+#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark:before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber:after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
+@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+.sect1{padding-bottom:.625em}
+@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
+.sect1+.sect1{border-top:1px solid #efefed}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
+.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:initial}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
+.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
+.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
+.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
+@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
+@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
+.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
+.listingblock:hover code[data-lang]:before{display:block}
+.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
+.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
+table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
+table.pyhltable td.code{padding-left:.75em;padding-right:0}
+pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
+pre.pygments .lineno{display:inline-block;margin-right:.25em}
+table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
+.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
+.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
+.quoteblock .quoteblock blockquote:before{display:none}
+.verseblock{margin:0 1em 1.25em 1em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
+.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
+.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
+table.tableblock{max-width:100%;border-collapse:separate}
+table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px 0}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot{border-width:1px 0}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+td>div.verse{white-space:pre}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
+ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
+ul.inline>li>*{display:block}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist>table tr>td:first-of-type{padding:.4em .75em 0 .75em;line-height:1;vertical-align:top}
+.colist>table tr>td:first-of-type img{max-width:initial}
+.colist>table tr>td:last-of-type{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
+.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background-color:#00fafa}
+.black{color:#000}
+.black-background{background-color:#000}
+.blue{color:#0000bf}
+.blue-background{background-color:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background-color:#fa00fa}
+.gray{color:#606060}
+.gray-background{background-color:#7d7d7d}
+.green{color:#006000}
+.green-background{background-color:#007d00}
+.lime{color:#00bf00}
+.lime-background{background-color:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background-color:#7d0000}
+.navy{color:#000060}
+.navy-background{background-color:#00007d}
+.olive{color:#606000}
+.olive-background{background-color:#7d7d00}
+.purple{color:#600060}
+.purple-background{background-color:#7d007d}
+.red{color:#bf0000}
+.red-background{background-color:#fa0000}
+.silver{color:#909090}
+.silver-background{background-color:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background-color:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background-color:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background-color:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]:after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@media print{@page{margin:1.25cm .75cm}
+*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]:after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
+.sect1{padding-bottom:0!important}
+.sect1+.sect1{border:0!important}
+#header>h1:first-child{margin-top:1.25rem}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span:before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]:before{display:block}
+#footer{background:none!important;padding:0 .9375em}
+#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+</style>
+</head>
+<body class="article toc2 toc-left">
+<div id="header">
+<h1>API ServiceInventory</h1>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#_overview">Overview</a>
+<ul class="sectlevel2">
+<li><a href="#_api_url">Api URL</a></li>
+<li><a href="#_version_information">Version information</a></li>
+<li><a href="#_uri_scheme">URI scheme</a></li>
+<li><a href="#_tags">Tags</a></li>
+<li><a href="#_consumes">Consumes</a></li>
+<li><a href="#_produces">Produces</a></li>
+</ul>
+</li>
+<li><a href="#_paths">Resources</a>
+<ul class="sectlevel2">
+<li><a href="#_service_resource">Service</a></li>
+</ul>
+</li>
+<li><a href="#_definitions">Definitions</a>
+<ul class="sectlevel2">
+<li><a href="#_errorrepresentation">ErrorRepresentation</a></li>
+<li><a href="#_listrelatedpartyref">ListRelatedPartyRef</a></li>
+<li><a href="#_listservice">ListService</a></li>
+<li><a href="#_listservicespecificationref">ListServiceSpecificationRef</a></li>
+<li><a href="#_relatedpartyref">RelatedPartyRef</a></li>
+<li><a href="#_service">Service</a></li>
+<li><a href="#_servicecharacteristic">ServiceCharacteristic</a></li>
+<li><a href="#_servicespecificationref">ServiceSpecificationRef</a></li>
+<li><a href="#_supportingresource">SupportingResource</a></li>
+<li><a href="#_value">Value</a></li>
+<li><a href="#_statevalues">stateValues</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_overview">Overview</h2>
+<div class="sectionbody">
+<div class="sect2">
+<div class="paragraph">
+<p>serviceInventory API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0)
+only operation GET (by id &amp; byList) for resource serviceSpecification is available</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_version_information">Version information</h3>
+<div class="paragraph">
+<p><em>Version</em> : 1.0.0_inProgress</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_uri_scheme">URI scheme</h3>
+<div class="paragraph">
+<p><em>Host</em> : serverRoot<br>
+<em>BasePath</em> : /nbi/api/v1<br>
+<em>Schemes</em> : HTTPS</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_tags">Tags</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Service</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_consumes">Consumes</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_produces">Produces</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_paths">Resources</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_service_resource">Service</h3>
+<div class="sect3">
+<h4 id="_servicefind">List services</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /service</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description">Description</h5>
+<div class="paragraph">
+<p>This operation list service entities.
+Attribute selection is restricted.
+fields attribute may be used to filter retrieved attribute(s) for each service</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 22.2222%;">
+<col style="width: 33.3333%;">
+<col style="width: 44.4445%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>fields</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty.id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification.id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification.name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_listservice">ListService</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_serviceget">Retrieve a service</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /service/{id}</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description_2">Description</h5>
+<div class="paragraph">
+<p>This operation retrieves a service entity.
+Attribute selection is enabled for all first level attributes.</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters_2">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 22.2222%;">
+<col style="width: 33.3333%;">
+<col style="width: 44.4445%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Path</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty.id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification.id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification.name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses_2">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_service">Service</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_definitions">Definitions</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_errorrepresentation">ErrorRepresentation</h3>
+<div class="paragraph">
+<p>This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">it provides a link to the schema describing a REST resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The class type of a REST resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>code</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Application related code (as defined in the API or from a common list)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">integer (int32)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>message</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that provide more details and corrective actions related to the error. This can be shown to a client user.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>reason</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that explains the reason for error. This can be shown to a client user.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>referenceError</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">url pointing to documentation describing the error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>status</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">http error code extension like 400-2</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_listrelatedpartyref">ListRelatedPartyRef</h3>
+<div class="paragraph">
+<p>This class is used to structure list of service(s) retrieved</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of a related party</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>role</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Role played by the related party - only role “ONAPcustomer” is managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_listservice">ListService</h3>
+<div class="paragraph">
+<p>This class is used to structure list of service(s) retrieved</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the service</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_listrelatedpartyref">ListRelatedPartyRef</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_listservicespecificationref">ListServiceSpecificationRef</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_listservicespecificationref">ListServiceSpecificationRef</h3>
+<div class="paragraph">
+<p>This class is used to structure list of service(s) retrieved</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service specification</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the required service specification</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_relatedpartyref">RelatedPartyRef</h3>
+<div class="paragraph">
+<p>RelatedParty reference. A related party defines party or party role linked to a specific entity.
+Only ONAP Customer is managed in Beijing release.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@referredType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in the Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of a related party.
+Not filled in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of a related party</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>role</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Role played by the related party.
+Filled with 'ONAPcustomer'</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_service">Service</h3>
+<div class="paragraph">
+<p>Instantiated service (service_instance) in AAI</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Not used in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>characteristic</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicecharacteristic">ServiceCharacteristic</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>hasStarted</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This is a Boolean attribute that, if TRUE, signifies that this Service has already been started. If the value of this attribute is FALSE, then this signifies that this Service has NOT been Started
+Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the service
+Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service - Valued with service-instance-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the service - Valued with service-instance-name</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_relatedpartyref">RelatedPartyRef</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_servicespecificationref">ServiceSpecificationRef</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>state</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_statevalues">stateValues</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>supportingResource</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_supportingresource">SupportingResource</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service type - valued with 'service-instance'</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicecharacteristic">ServiceCharacteristic</h3>
+<div class="paragraph">
+<p>A list of name value pairs that define the service characteristics
+Not managed in Beijing release.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the characteristic
+Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>value</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_value">Value</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>valueType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Type of value for this characteristic.
+Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicespecificationref">ServiceSpecificationRef</h3>
+<div class="paragraph">
+<p>Service specification reference: ServiceSpecification of this service (catalog information)</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@referredType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attribute: invariantUUID</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the service specification.
+not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service specification. valued to model-version-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>invariantUUID</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @referredType - model-invariant-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the required service specification</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>version</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service specification version.
+Not managed in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_supportingresource">SupportingResource</h3>
+<div class="paragraph">
+<p>Supporting resource - A supportingResource will be retrieved for each relationship of the relationship-list where related-link describe a vnf</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@referredType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This attribute allows to dynamically extends TMF class. Valued with 'ONAP resource'. We used this features to add following attributes:
+ status
+ modelInvariantId
+ modelVersionId
+ modelCustomisationId</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the supporting resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the supporting resource - Valued to vnf-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelCustomisationId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @referredType - valued with model-customisation-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelInvariantId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @referredType - valued with model-invariant-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelVersionId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @referredType - valued with model-verson-id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the supporting resource - Valued with vnf_-name</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>role</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>status</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Additional attribute (not in the TMF API) - extended through @referredType - valued with prov-status</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_value">Value</h3>
+<div class="paragraph">
+<p>Structure used to describe characteristic value.
+Not managed in Beijing release.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceCharacteristicValue</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_statevalues">stateValues</h3>
+<div class="paragraph">
+<p><em>Type</em> : enum (feasibilityChecked, designed, reserved, inactive, active, terminated)</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2018-03-22 09:31:41 UTC
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/offeredapis/serviceInventory/markDown.md b/docs/offeredapis/serviceInventory/markDown.md
new file mode 100644
index 0000000..3b02751
--- /dev/null
+++ b/docs/offeredapis/serviceInventory/markDown.md
@@ -0,0 +1,287 @@
+# API ServiceInventory
+
+
+<a name="overview"></a>
+## Overview
+
+### Api URL
+
+[Swagger UI](https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/5an735gnX0/swagger.json)
+
+
+[plant UML UI](https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/5an735gnX0/plantuml&noCache=304710.0)
+
+serviceInventory API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0)
+only operation GET (by id & byList) for resource serviceSpecification is available
+
+
+### Version information
+*Version* : 1.0.0_inProgress
+
+
+### URI scheme
+*Host* : serverRoot
+*BasePath* : /nbi/api/v1
+*Schemes* : HTTPS
+
+
+### Tags
+
+* Service
+
+
+### Consumes
+
+* `application/json;charset=utf-8`
+
+
+### Produces
+
+* `application/json;charset=utf-8`
+
+
+<a name="paths"></a>
+## Resources
+
+<a name="service_resource"></a>
+### Service
+
+<a name="servicefind"></a>
+#### List services
+```
+GET /service
+```
+
+
+##### Description
+This operation list service entities.
+Attribute selection is restricted.
+fields attribute may be used to filter retrieved attribute(s) for each service
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Schema|
+|---|---|---|
+|**Query**|**fields** <br>*optional*|string|
+|**Query**|**id** <br>*optional*|string|
+|**Query**|**relatedParty.id** <br>*optional*|string|
+|**Query**|**serviceSpecification.id** <br>*optional*|string|
+|**Query**|**serviceSpecification.name** <br>*optional*|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success|< [ListService](#listservice) > array|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="serviceget"></a>
+#### Retrieve a service
+```
+GET /service/{id}
+```
+
+
+##### Description
+This operation retrieves a service entity.
+Attribute selection is enabled for all first level attributes.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Schema|
+|---|---|---|
+|**Path**|**id** <br>*required*|string|
+|**Query**|**relatedParty.id** <br>*optional*|string|
+|**Query**|**serviceSpecification.id** <br>*optional*|string|
+|**Query**|**serviceSpecification.name** <br>*optional*|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success|[Service](#service)|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="definitions"></a>
+## Definitions
+
+<a name="errorrepresentation"></a>
+### ErrorRepresentation
+This class is used to describe error.
+for nbi Beijing release we do not manage additional error for serviceCatalog
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|it provides a link to the schema describing a REST resource.|string|
+|**@type** <br>*optional*|The class type of a REST resource.|string|
+|**code** <br>*required*|Application related code (as defined in the API or from a common list)|integer (int32)|
+|**message** <br>*optional*|Text that provide more details and corrective actions related to the error. This can be shown to a client user.|string|
+|**reason** <br>*required*|Text that explains the reason for error. This can be shown to a client user.|string|
+|**referenceError** <br>*optional*|url pointing to documentation describing the error|string|
+|**status** <br>*optional*|http error code extension like 400-2|string|
+
+
+<a name="listrelatedpartyref"></a>
+### ListRelatedPartyRef
+This class is used to structure list of service(s) retrieved
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**id** <br>*optional*|Unique identifier of a related party|string|
+|**role** <br>*optional*|Role played by the related party - only role “ONAPcustomer” is managed in Beijing release.|string|
+
+
+<a name="listservice"></a>
+### ListService
+This class is used to structure list of service(s) retrieved
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**id** <br>*optional*|Unique identifier of the service|string|
+|**name** <br>*optional*|Name of the service|string|
+|**relatedParty** <br>*optional*||[ListRelatedPartyRef](#listrelatedpartyref)|
+|**serviceSpecification** <br>*optional*||[ListServiceSpecificationRef](#listservicespecificationref)|
+
+
+<a name="listservicespecificationref"></a>
+### ListServiceSpecificationRef
+This class is used to structure list of service(s) retrieved
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**id** <br>*optional*|Unique identifier of the service specification|string|
+|**name** <br>*optional*|Name of the required service specification|string|
+
+
+<a name="relatedpartyref"></a>
+### RelatedPartyRef
+RelatedParty reference. A related party defines party or party role linked to a specific entity.
+Only ONAP Customer is managed in Beijing release.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@referredType** <br>*optional*|Not managed in the Beijing release.|string|
+|**href** <br>*optional*|Reference of a related party.<br>Not filled in Beijing release.|string|
+|**id** <br>*optional*|Unique identifier of a related party|string|
+|**role** <br>*optional*|Role played by the related party.<br>Filled with 'ONAPcustomer'|string|
+
+
+<a name="service"></a>
+### Service
+Instantiated service (service_instance) in AAI
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*|Not managed in Beijing release|string|
+|**@schemaLocation** <br>*optional*|Not managed in Beijing release|string|
+|**@type** <br>*optional*|This attribute allows to dynamically extends TMF class. Not used in Beijing release.|string|
+|**characteristic** <br>*optional*||< [ServiceCharacteristic](#servicecharacteristic) > array|
+|**hasStarted** <br>*optional*|This is a Boolean attribute that, if TRUE, signifies that this Service has already been started. If the value of this attribute is FALSE, then this signifies that this Service has NOT been Started<br>Not managed in Beijing release|boolean|
+|**href** <br>*optional*|Reference of the service<br>Not managed in Beijing release|string|
+|**id** <br>*optional*|Unique identifier of the service - Valued with service-instance-id|string|
+|**name** <br>*optional*|Name of the service - Valued with service-instance-name|string|
+|**relatedParty** <br>*optional*||< [RelatedPartyRef](#relatedpartyref) > array|
+|**serviceSpecification** <br>*optional*||[ServiceSpecificationRef](#servicespecificationref)|
+|**state** <br>*optional*||[stateValues](#statevalues)|
+|**supportingResource** <br>*optional*||< [SupportingResource](#supportingresource) > array|
+|**type** <br>*optional*|Service type - valued with 'service-instance'|string|
+
+
+<a name="servicecharacteristic"></a>
+### ServiceCharacteristic
+A list of name value pairs that define the service characteristics
+Not managed in Beijing release.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**name** <br>*required*|Name of the characteristic<br>Not managed in Beijing release.|string|
+|**value** <br>*optional*||[Value](#value)|
+|**valueType** <br>*optional*|Type of value for this characteristic.<br>Not managed in Beijing release.|string|
+
+
+<a name="servicespecificationref"></a>
+### ServiceSpecificationRef
+Service specification reference: ServiceSpecification of this service (catalog information)
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@referredType** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attribute: invariantUUID|string|
+|**@schemaLocation** <br>*optional*|Not managed in Beijing release|string|
+|**href** <br>*optional*|Reference of the service specification.<br>not managed in Beijing release.|string|
+|**id** <br>*optional*|Unique identifier of the service specification. valued to model-version-id|string|
+|**invariantUUID** <br>*optional*|Additional attribute (not in the TMF API) - extended through @referredType - model-invariant-id|string|
+|**name** <br>*optional*|Name of the required service specification|string|
+|**version** <br>*optional*|Service specification version.<br>Not managed in Beijing release|string|
+
+
+<a name="supportingresource"></a>
+### SupportingResource
+Supporting resource - A supportingResource will be retrieved for each relationship of the relationship-list where related-link describe a vnf
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@referredType** <br>*optional*|This attribute allows to dynamically extends TMF class. Valued with 'ONAP resource'. We used this features to add following attributes:<br> status <br> modelInvariantId<br> modelVersionId<br> modelCustomisationId|string|
+|**@schemaLocation** <br>*optional*|Not managed in Beijing release.|string|
+|**href** <br>*optional*|Reference of the supporting resource|string|
+|**id** <br>*optional*|Unique identifier of the supporting resource - Valued to vnf-id|string|
+|**modelCustomisationId** <br>*optional*|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-customisation-id|string|
+|**modelInvariantId** <br>*optional*|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-invariant-id|string|
+|**modelVersionId** <br>*optional*|Additional attribute (not in the TMF API) - extended through @referredType - valued with model-verson-id|string|
+|**name** <br>*optional*|Name of the supporting resource - Valued with vnf_-name|string|
+|**role** <br>*optional*|Not managed in Beijing release.|string|
+|**status** <br>*optional*|Additional attribute (not in the TMF API) - extended through @referredType - valued with prov-status|string|
+
+
+<a name="value"></a>
+### Value
+Structure used to describe characteristic value.
+Not managed in Beijing release.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|Not managed in Beijing release.|string|
+|**@type** <br>*optional*|Not managed in Beijing release.|string|
+|**serviceCharacteristicValue** <br>*optional*|Not managed in Beijing release.|string|
+
+
+<a name="statevalues"></a>
+### stateValues
+*Type* : enum (feasibilityChecked, designed, reserved, inactive, active, terminated)
+
diff --git a/docs/offeredapis/serviceOrder/apiServiceOrder.plantuml b/docs/offeredapis/serviceOrder/apiServiceOrder.plantuml
new file mode 100644
index 0000000..3199855
--- /dev/null
+++ b/docs/offeredapis/serviceOrder/apiServiceOrder.plantuml
@@ -0,0 +1,168 @@
+@startuml
+
+enum ActionType {
+ add
+ modify
+ delete
+ noChange
+}
+enum StateType {
+ acknowledged
+ rejected
+ pending
+ held
+ inProgress
+ cancelled
+ completed
+ failed
+ partial
+}
+enum RelationshipType {
+ reliesOn
+}
+
+class ErrorRepresentation {
+ code:int
+ reason:string
+ message:string
+ status:string
+ referenceError:string
+ @type:string
+ @schemaLocation:string
+}
+
+class ServiceRelationship
+ ServiceRelationship --> "1-1" RelationshipType : type
+ ServiceRelationship --> "1-1" Service : service
+
+class ServiceRef {
+ id:string
+ href:string
+}
+
+class ServiceCharacteristic {
+ name:string
+ valueType:string
+}
+ ServiceCharacteristic --> "0-1" Value : value
+
+class RelatedParty {
+ id:string
+ href:string
+ role:string
+ name:string
+ @referredType:string
+}
+
+class ServiceSpecificationRef {
+ id:string
+ href:string
+ name:string
+ version:string
+ @type:string
+ @schemaLocation:string
+ @baseType:string
+}
+ ServiceSpecificationRef --> "0-1" TargetServiceSchema : targetServiceSchema
+
+class Service {
+ id:string
+ href:string
+ name:string
+ serviceState:string
+ @type:string
+ @schemaLocation:string
+}
+ Service --> "0-*" ServiceCharacteristic : serviceCharacteristic
+ Service --> "0-*" ServiceRelationship : serviceRelationship
+ Service --> "0-*" RelatedParty : relatedParty
+ Service --> "0-1" ServiceSpecificationRef : serviceSpecification
+
+class OrderItemRelationship {
+ id:string
+}
+ OrderItemRelationship --> "1-1" RelationshipType : type
+
+class ServiceOrderItem {
+ id:string
+ @type:string
+ @schemaLocation:string
+ @baseType:string
+}
+ ServiceOrderItem --> "0-1" ActionType : action
+ ServiceOrderItem --> "0-1" StateType : state
+ ServiceOrderItem --> "0-*" OrderItemRelationship : orderItemRelationship
+ ServiceOrderItem --> "1-1" Service : service
+
+class ServiceOrder {
+ id:string
+ href:string
+ externalId:string
+ priority:string
+ description:string
+ category:string
+ orderDate:dateTime
+ completionDateTime:dateTime
+ requestedStartDate:dateTime
+ requestedCompletionDate:dateTime
+ expectedCompletionDate:dateTime
+ startDate:dateTime
+ @baseType:string
+ @type:string
+ @schemaLocation:string
+}
+ ServiceOrder --> "0-1" StateType : state
+ ServiceOrder --> "0-*" RelatedParty : relatedParty
+ ServiceOrder --> "0-*" OrderRelationship : orderRelationship
+ ServiceOrder --> "0-*" ServiceOrderItem : orderItem
+
+class OrderRelationship {
+ type:string
+ id:string
+ href:string
+ @referredType:string
+}
+
+class TargetServiceSchema {
+ @type:string
+ @schemaLocation:string
+}
+
+class Value {
+ @type:string
+ @schemaLocation:string
+ serviceCharacteristicValue:string
+}
+
+class CreateServiceOrderItem {
+ id:string
+ @type:string
+ @schemaLocation:string
+ @baseType:string
+}
+ CreateServiceOrderItem --> "0-1" ActionType : action
+ CreateServiceOrderItem --> "0-*" OrderItemRelationship : orderItemRelationship
+ CreateServiceOrderItem --> "1-1" Service : service
+
+class CreateServiceOrder {
+ externalId:string
+ priority:string
+ description:string
+ category:string
+ requestedStartDate:dateTime
+ requestedCompletionDate:dateTime
+ @baseType:string
+ @type:string
+ @schemaLocation:string
+}
+ CreateServiceOrder --> "0-*" RelatedParty : relatedParty
+ CreateServiceOrder --> "0-*" OrderRelationship : orderRelationship
+ CreateServiceOrder --> "0-*" CreateServiceOrderItem : orderItem
+
+class Hub {
+ id:string
+ query:string
+ callback:string
+}
+
+@enduml \ No newline at end of file
diff --git a/docs/offeredapis/serviceOrder/asciiDoc.adoc b/docs/offeredapis/serviceOrder/asciiDoc.adoc
new file mode 100644
index 0000000..4a29548
--- /dev/null
+++ b/docs/offeredapis/serviceOrder/asciiDoc.adoc
@@ -0,0 +1,752 @@
+= API ServiceOrder
+
+
+[[_overview]]
+== Overview
+
+=== Api URL
+
+https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/kl1kgvz1zR/swagger.json[Swagger UI]
+
+
+https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/kl1kgvz1zR/plantuml&noCache=934804.0[plant UML UI]
+
+serviceOrder API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0);
+Only operations GET (by id and list) and POST are available.
+
+
+=== Version information
+[%hardbreaks]
+__Version__ : 1.0.0_inProgress
+
+
+=== URI scheme
+[%hardbreaks]
+__Host__ : serverRoot
+__BasePath__ : /nbi/api/v1
+__Schemes__ : HTTPS
+
+
+=== Tags
+
+* ServiceOrder : A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.
+
+
+=== Consumes
+
+* `application/json;charset=utf-8`
+
+
+=== Produces
+
+* `application/json;charset=utf-8`
+
+
+[[_paths]]
+== Resources
+
+[[_serviceorder_resource]]
+=== ServiceOrder
+A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.
+
+
+[[_serviceordercreate]]
+==== Create a service order
+....
+POST /serviceOrder
+....
+
+
+===== Description
+This operation creates a service order entity.
+The TMF Open API specification document provides the list of mandatory and non mandatory attributes when creating a ServiceOrder, including any possible rule conditions and applicable default values.
+POST should be used without specifying the id and the href, the Service Order Management system is in charge of generating the id + href for the ServiceOrder.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+* 100: OrderItem with 'add' action but serviceSpecification id missing
+
+* 101: OrderItem with 'change'/'noChange'/'remove' but service id missing
+
+* 102: OrderItem with 'add' action - serviceSpecification id provided but not existing
+
+* 103: OrderItem with 'add' action but service id already existing in the inventory
+
+* 104: A customer for existing service(s) is provided but he did not exist
+
+* 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory
+
+* 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^4"]
+|===
+|Type|Name|Schema
+|**Body**|**serviceOrder** +
+__required__|<<_createserviceorder,CreateServiceOrder>>
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**201**|Success|<<_createserviceorder,CreateServiceOrder>>
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error
+
+Specific encapsulated business errors for current operation
+
+* 100: OrderItem with 'add' action but serviceSpecification id missing
+
+* 101: OrderItem with 'change'/'noChange'/'remove' but service id missing
+
+* 102: OrderItem with 'add' action - serviceSpecification id provided but not existing
+
+* 103: OrderItem with 'add' action but service id already existing in the inventory
+
+* 104: A customer for existing service(s) is provided but he did not exist
+
+* 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory
+
+* 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_serviceorderfind]]
+==== List service orders
+....
+GET /serviceOrder
+....
+
+
+===== Description
+Retrieve and list service order entities according to given criteria.
+Only a predefined set of attribute is proposed.
+Attribute selection could be described in the fields attribute.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^9,.^4"]
+|===
+|Type|Name|Description|Schema
+|**Query**|**description** +
+__optional__||string
+|**Query**|**externalId** +
+__optional__||string
+|**Query**|**fields** +
+__optional__|this attribute could be used to filter retrieved attribute(s) and/or sort SO.|string
+|**Query**|**limit** +
+__optional__|The maximum number of elements to retrieve (it can be greater than the actual available number of items).|integer (int32)
+|**Query**|**offset** +
+__optional__|The index of the first element to retrieve. Zero is the first element of the collection.|integer (int32)
+|**Query**|**orderDate.gt** +
+__optional__|order date greather than|string
+|**Query**|**orderDate.lt** +
+__optional__|order date lower than|string
+|**Query**|**state** +
+__optional__|state of the order(s) to be retrieved|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success +
+**Headers** : +
+`X-Total-Count` (integer (int32)) +
+`X-Result-Count` (integer (int32))|< <<_serviceorder,ServiceOrder>> > array
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_serviceorderget]]
+==== Retrieve a service order
+....
+GET /serviceOrder/{id}
+....
+
+
+===== Description
+This operation retrieves a service order entity.
+Attribute selection is enabled for all first level attributes.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+===== Parameters
+
+[options="header", cols=".^2,.^3,.^9,.^4"]
+|===
+|Type|Name|Description|Schema
+|**Path**|**id** +
+__required__||string
+|**Query**|**fields** +
+__optional__|Attribute selection|string
+|===
+
+
+===== Responses
+
+[options="header", cols=".^2,.^14,.^4"]
+|===
+|HTTP Code|Description|Schema
+|**200**|Success|<<_serviceorder,ServiceOrder>>
+|**400**|Bad Request
+
+List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value|<<_errorrepresentation,ErrorRepresentation>>
+|**401**|Unauthorized
+
+List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials|<<_errorrepresentation,ErrorRepresentation>>
+|**403**|Forbidden
+
+List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests|<<_errorrepresentation,ErrorRepresentation>>
+|**404**|Not Found
+
+List of supported error codes:
+- 60: Resource not found|<<_errorrepresentation,ErrorRepresentation>>
+|**422**|Unprocessable entity
+
+Functional error|<<_errorrepresentation,ErrorRepresentation>>
+|**500**|Internal Server Error
+
+List of supported error codes:
+- 1: Internal error|<<_errorrepresentation,ErrorRepresentation>>
+|**503**|Service Unavailable
+
+List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !|<<_errorrepresentation,ErrorRepresentation>>
+|===
+
+
+[[_definitions]]
+== Definitions
+
+[[_actiontype]]
+=== ActionType
+Action type to be describer on the order item.
+modify is not managed in Beijing release
+
+__Type__ : enum (add, modify, delete, noChange)
+
+
+[[_createserviceorder]]
+=== CreateServiceOrder
+This structure is used in the operation POST for a serviceOrder request.
+Attribute description is not accurate and should be find in the serviceOrder class.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__||string
+|**@schemaLocation** +
+__optional__||string
+|**@type** +
+__optional__||string
+|**category** +
+__optional__|Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, …)|string
+|**description** +
+__optional__|A free-text description of the service order|string
+|**externalId** +
+__optional__|ID given by the consumer and only understandable by him (to facilitate his searches)|string
+|**orderItem** +
+__optional__||< <<_createserviceorderitem,CreateServiceOrderItem>> > array
+|**orderRelationship** +
+__optional__||< <<_orderrelationship,OrderRelationship>> > array
+|**priority** +
+__optional__|A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)|string
+|**relatedParty** +
+__optional__||< <<_relatedparty,RelatedParty>> > array
+|**requestedCompletionDate** +
+__optional__|Requested delivery date from the requestor perspective|string (date-time)
+|**requestedStartDate** +
+__optional__|Order start date wished by the requestor|string (date-time)
+|===
+
+
+[[_createserviceorderitem]]
+=== CreateServiceOrderItem
+This structure is used in the operation POST for a serviceOrder request to describe an item.
+Attribute description is not accurate and should be find in the serviceOrderItem class.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__|Indicates the base type of the resource.|string
+|**@schemaLocation** +
+__optional__|A link to the schema describing this REST resource|string
+|**@type** +
+__optional__|Indicates the type of resource.|string
+|**action** +
+__optional__||<<_actiontype,ActionType>>
+|**id** +
+__required__|Identifier of the line item (generally it is a sequence number 01, 02, 03, …)|string
+|**orderItemRelationship** +
+__optional__||< <<_orderitemrelationship,OrderItemRelationship>> > array
+|**service** +
+__required__||<<_service,Service>>
+|===
+
+
+[[_errorrepresentation]]
+=== ErrorRepresentation
+Representation of an error.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|it provides a link to the schema describing a REST resource|string
+|**@type** +
+__optional__|The class type of a REST resource|string
+|**code** +
+__required__|Application related code (as defined in the API or from a common list)|integer (int32)
+|**message** +
+__optional__|Text that provide more details and corrective actions related to the error. This can be shown to a client user|string
+|**reason** +
+__required__|Text that explains the reason for error. This can be shown to a client user.|string
+|**referenceError** +
+__optional__|url pointing to documentation describing the error|string
+|**status** +
+__optional__|http error code extension like 400-2|string
+|===
+
+
+[[_hub]]
+=== Hub
+An HUB resource is used by client side to subscribe to notification.
+Not managed in the Beijing release.
+
+
+[options="header", cols=".^3,.^4"]
+|===
+|Name|Schema
+|**callback** +
+__required__|string
+|**id** +
+__optional__|string
+|**query** +
+__optional__|string
+|===
+
+
+[[_orderitemrelationship]]
+=== OrderItemRelationship
+Linked order item to the one containing this attribute.
+nbi component used this relationship to sort request to ONAP.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**id** +
+__required__|Unique identifier of an order item|string
+|**type** +
+__required__||<<_relationshiptype,RelationshipType>>
+|===
+
+
+[[_orderrelationship]]
+=== OrderRelationship
+Linked order to the one containing this attribute.
+This relationship is not used to sort ONAP request.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@referredType** +
+__optional__|Type of the referred order.|string
+|**href** +
+__optional__|A hyperlink to the related order|string
+|**id** +
+__required__|The id of the related order|string
+|**type** +
+__optional__|The type of related order, can be : “dependency” if the order needs to be “not started” until another order item is complete (a service order in this case) or “cross-ref” to keep track of the source order (a productOrder)|string
+|===
+
+
+[[_relatedparty]]
+=== RelatedParty
+A related party defines party which are involved in this order and the role they are playing.
+for Beijing release:
+With the current version of APIs used from SO and AAI we need to manage a ‘customer’. This customer concept is confusing with Customer BSS concept. We took the following rules to manage the ‘customer’ information:
+o It could be provided through a serviceOrder in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided in the serviceOrder header (we will not consider in this release the party at item level); External API component will check if this customer exists and create it in AAI if not.
+o If no relatedParty are provided the service will be affected to ‘generic’ customer (dummy customer) – we assume this ‘generic’ customer always exists.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@referredType** +
+__optional__||string
+|**href** +
+__optional__|An hyperlink to the party - not used in Beijnig release|string
+|**id** +
+__required__|Unique identifier of a related party|string
+|**name** +
+__optional__|Name of the related party|string
+|**role** +
+__required__|The role of the related party (e.g. Owner, requester, fullfiller etc).
+ONLY 'ONAPcustomer' is considered|string
+|===
+
+
+[[_relationshiptype]]
+=== RelationshipType
+Relationship type;
+Only reliesOn is managed in Beijing release.
+
+__Type__ : enum (reliesOn)
+
+
+[[_service]]
+=== Service
+Service (to be added, modified, deleted) description
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|The URL to get the resource schema.
+Not managed in Beijing Release|string
+|**@type** +
+__optional__|To define the service type
+Not managed in Beijing Release|string
+|**href** +
+__optional__|Reference to the Service (useful for delete or modify command).
+Not managed in Beijing release.|string
+|**id** +
+__required__|Identifier of a service instance.
+It must be valued if orderItem action is 'delete' and corresponds to a AAI service.id|string
+|**name** +
+__optional__|Name of the service - When orderItem action is 'add' this name will be used in ONAP/SO request as InstaceName.|string
+|**relatedParty** +
+__optional__||< <<_relatedparty,RelatedParty>> > array
+|**serviceCharacteristic** +
+__optional__||< <<_servicecharacteristic,ServiceCharacteristic>> > array
+|**serviceRelationship** +
+__optional__||< <<_servicerelationship,ServiceRelationship>> > array
+|**serviceSpecification** +
+__optional__||<<_servicespecificationref,ServiceSpecificationRef>>
+|**serviceState** +
+__optional__|The lifecycle state of the service requested;
+Not managed in Beijing release.|string
+|===
+
+
+[[_servicecharacteristic]]
+=== ServiceCharacteristic
+ServiceCharacteristic
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**name** +
+__required__|Name of characteristic|string
+|**value** +
+__optional__||<<_value,Value>>
+|**valueType** +
+__optional__||string
+|===
+
+
+[[_serviceorder]]
+=== ServiceOrder
+A Service Order is a type of order which can be used to place an order between a customer and a service provider or between a service provider and a partner and vice versa
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__||string
+|**@schemaLocation** +
+__optional__||string
+|**@type** +
+__optional__||string
+|**category** +
+__optional__|Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, …)|string
+|**completionDateTime** +
+__optional__|Date when the order was completed|string (date-time)
+|**description** +
+__optional__|A free-text description of the service order|string
+|**expectedCompletionDate** +
+__optional__||string (date-time)
+|**externalId** +
+__optional__|ID given by the consumer and only understandable by him (to facilitate his searches)|string
+|**href** +
+__optional__|Hyperlink to access the order|string
+|**id** +
+__required__|ID created on repository side|string
+|**orderDate** +
+__optional__||string (date-time)
+|**orderItem** +
+__optional__||< <<_serviceorderitem,ServiceOrderItem>> > array
+|**orderRelationship** +
+__optional__||< <<_orderrelationship,OrderRelationship>> > array
+|**priority** +
+__optional__|A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)|string
+|**relatedParty** +
+__optional__||< <<_relatedparty,RelatedParty>> > array
+|**requestedCompletionDate** +
+__optional__|Requested delivery date from the requestor perspective|string (date-time)
+|**requestedStartDate** +
+__optional__|Order start date wished by the requestor|string (date-time)
+|**startDate** +
+__optional__|Date when the order was started for processing|string (date-time)
+|**state** +
+__optional__||<<_statetype,StateType>>
+|===
+
+
+[[_serviceorderitem]]
+=== ServiceOrderItem
+An identified part of the order. A service order is decomposed into one or more order items.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__|not used in Beijing relase|string
+|**@schemaLocation** +
+__optional__|not used in Beijing relase|string
+|**@type** +
+__optional__|Used to extend the order item.
+not used in Beijing relase|string
+|**action** +
+__optional__||<<_actiontype,ActionType>>
+|**id** +
+__required__|Identifier of the line item (generally it is a sequence number 01, 02, 03, …)|string
+|**orderItemRelationship** +
+__optional__||< <<_orderitemrelationship,OrderItemRelationship>> > array
+|**service** +
+__required__||<<_service,Service>>
+|**state** +
+__optional__||<<_statetype,StateType>>
+|===
+
+
+[[_serviceref]]
+=== ServiceRef
+Service references
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**href** +
+__optional__|Reference of the service|string
+|**id** +
+__required__|Unique identifier of the service|string
+|===
+
+
+[[_servicerelationship]]
+=== ServiceRelationship
+Linked Services to the one instantiate
+nbi component used this relationship to sort request to ONAP.
+
+
+[options="header", cols=".^3,.^4"]
+|===
+|Name|Schema
+|**service** +
+__required__|<<_service,Service>>
+|**type** +
+__required__|<<_relationshiptype,RelationshipType>>
+|===
+
+
+[[_servicespecificationref]]
+=== ServiceSpecificationRef
+The service specification (these attributes are fetched from the catalogue).
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@baseType** +
+__optional__|Not used in Beijing release|string
+|**@schemaLocation** +
+__optional__|Not used in Beijing release|string
+|**@type** +
+__optional__|Not used in Beijing release|string
+|**href** +
+__optional__|Reference of the service specification
+Not used in Beijing release.|string
+|**id** +
+__required__|Unique identifier of the service specification
+This information will be used to retrieve SDC information + mapped to SO ModelNameVersionIdin the request.|string
+|**name** +
+__optional__|Name of the service specification
+Not used in Beijing release|string
+|**targetServiceSchema** +
+__optional__||<<_targetserviceschema,TargetServiceSchema>>
+|**version** +
+__optional__|Version of the service Specification
+Not used in Beijing release|string
+|===
+
+
+[[_statetype]]
+=== StateType
+List of possible state for the order and the orderItem.
+
+__Type__ : enum (acknowledged, rejected, pending, held, inProgress, cancelled, completed, failed, partial)
+
+
+[[_targetserviceschema]]
+=== TargetServiceSchema
+Target to the schema describing the service spec resource
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__required__|This field provided a link to the schema describing this REST resource.|string
+|**@type** +
+__required__|Indicates the (class) type of resource.|string
+|===
+
+
+[[_value]]
+=== Value
+Value is a descriptive structure for service characteristic;
+For Beijing we only manage 'basic' attribute - the serviceCharacteristicValue must be used.
+
+
+[options="header", cols=".^3,.^11,.^4"]
+|===
+|Name|Description|Schema
+|**@schemaLocation** +
+__optional__|This field provided a link to the schema describing this REST resource.
+Not used in Beijing Release|string
+|**@type** +
+__optional__|Indicates the (class) type of resource.
+Not used in Beijing Release|string
+|**serviceCharacteristicValue** +
+__optional__|Value of the characteristic.
+This attribute must be used in Beijing Release to provide characteristic value.|string
+|===
+
diff --git a/docs/offeredapis/serviceOrder/documentation.html b/docs/offeredapis/serviceOrder/documentation.html
new file mode 100644
index 0000000..0983ed9
--- /dev/null
+++ b/docs/offeredapis/serviceOrder/documentation.html
@@ -0,0 +1,2030 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 1.5.6.1">
+<title>API ServiceOrder</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
+/* Remove comment around @import statement below when using as a custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
+audio,canvas,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+[hidden],template{display:none}
+script{display:none!important}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:transparent}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
+input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.spread{width:100%}
+p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:none}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite:before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7;font-weight:bold}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
+.clearfix:after,.float-group:after{clear:both}
+*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+*:not(pre)>code.nobreak{word-wrap:normal}
+*:not(pre)>code.nowrap{white-space:nowrap}
+pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
+b.button:before{content:"[";padding:0 3px 0 2px}
+b.button:after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
+#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
+#content{margin-top:1.25em}
+#content:before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
+#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span:before{content:"\00a0\2013\00a0"}
+#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark:before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber:after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
+@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+.sect1{padding-bottom:.625em}
+@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
+.sect1+.sect1{border-top:1px solid #efefed}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
+.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:initial}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
+.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
+.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
+.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
+@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
+@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
+.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
+.listingblock:hover code[data-lang]:before{display:block}
+.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
+.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
+table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
+table.pyhltable td.code{padding-left:.75em;padding-right:0}
+pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
+pre.pygments .lineno{display:inline-block;margin-right:.25em}
+table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
+.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
+.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
+.quoteblock .quoteblock blockquote:before{display:none}
+.verseblock{margin:0 1em 1.25em 1em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
+.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
+.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
+table.tableblock{max-width:100%;border-collapse:separate}
+table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px 0}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot{border-width:1px 0}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+td>div.verse{white-space:pre}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
+ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
+ul.inline>li>*{display:block}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist>table tr>td:first-of-type{padding:.4em .75em 0 .75em;line-height:1;vertical-align:top}
+.colist>table tr>td:first-of-type img{max-width:initial}
+.colist>table tr>td:last-of-type{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
+.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background-color:#00fafa}
+.black{color:#000}
+.black-background{background-color:#000}
+.blue{color:#0000bf}
+.blue-background{background-color:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background-color:#fa00fa}
+.gray{color:#606060}
+.gray-background{background-color:#7d7d7d}
+.green{color:#006000}
+.green-background{background-color:#007d00}
+.lime{color:#00bf00}
+.lime-background{background-color:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background-color:#7d0000}
+.navy{color:#000060}
+.navy-background{background-color:#00007d}
+.olive{color:#606000}
+.olive-background{background-color:#7d7d00}
+.purple{color:#600060}
+.purple-background{background-color:#7d007d}
+.red{color:#bf0000}
+.red-background{background-color:#fa0000}
+.silver{color:#909090}
+.silver-background{background-color:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background-color:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background-color:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background-color:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]:after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@media print{@page{margin:1.25cm .75cm}
+*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]:after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
+.sect1{padding-bottom:0!important}
+.sect1+.sect1{border:0!important}
+#header>h1:first-child{margin-top:1.25rem}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span:before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]:before{display:block}
+#footer{background:none!important;padding:0 .9375em}
+#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+</style>
+</head>
+<body class="article toc2 toc-left">
+<div id="header">
+<h1>API ServiceOrder</h1>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#_overview">Overview</a>
+<ul class="sectlevel2">
+<li><a href="#_api_url">Api URL</a></li>
+<li><a href="#_version_information">Version information</a></li>
+<li><a href="#_uri_scheme">URI scheme</a></li>
+<li><a href="#_tags">Tags</a></li>
+<li><a href="#_consumes">Consumes</a></li>
+<li><a href="#_produces">Produces</a></li>
+</ul>
+</li>
+<li><a href="#_paths">Resources</a>
+<ul class="sectlevel2">
+<li><a href="#_serviceorder_resource">ServiceOrder</a></li>
+</ul>
+</li>
+<li><a href="#_definitions">Definitions</a>
+<ul class="sectlevel2">
+<li><a href="#_actiontype">ActionType</a></li>
+<li><a href="#_createserviceorder">CreateServiceOrder</a></li>
+<li><a href="#_createserviceorderitem">CreateServiceOrderItem</a></li>
+<li><a href="#_errorrepresentation">ErrorRepresentation</a></li>
+<li><a href="#_hub">Hub</a></li>
+<li><a href="#_orderitemrelationship">OrderItemRelationship</a></li>
+<li><a href="#_orderrelationship">OrderRelationship</a></li>
+<li><a href="#_relatedparty">RelatedParty</a></li>
+<li><a href="#_relationshiptype">RelationshipType</a></li>
+<li><a href="#_service">Service</a></li>
+<li><a href="#_servicecharacteristic">ServiceCharacteristic</a></li>
+<li><a href="#_serviceorder">ServiceOrder</a></li>
+<li><a href="#_serviceorderitem">ServiceOrderItem</a></li>
+<li><a href="#_serviceref">ServiceRef</a></li>
+<li><a href="#_servicerelationship">ServiceRelationship</a></li>
+<li><a href="#_servicespecificationref">ServiceSpecificationRef</a></li>
+<li><a href="#_statetype">StateType</a></li>
+<li><a href="#_targetserviceschema">TargetServiceSchema</a></li>
+<li><a href="#_value">Value</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_overview">Overview</h2>
+<div class="sectionbody">
+<div class="sect2">
+<div class="paragraph">
+<p>serviceOrder API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0);
+Only operations GET (by id and list) and POST are available.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_version_information">Version information</h3>
+<div class="paragraph">
+<p><em>Version</em> : 1.0.0_inProgress</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_uri_scheme">URI scheme</h3>
+<div class="paragraph">
+<p><em>Host</em> : serverRoot<br>
+<em>BasePath</em> : /nbi/api/v1<br>
+<em>Schemes</em> : HTTPS</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_tags">Tags</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>ServiceOrder : A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_consumes">Consumes</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_produces">Produces</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><code>application/json;charset=utf-8</code></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_paths">Resources</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_serviceorder_resource">ServiceOrder</h3>
+<div class="paragraph">
+<p>A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.</p>
+</div>
+<div class="sect3">
+<h4 id="_serviceordercreate">Create a service order</h4>
+<div class="literalblock">
+<div class="content">
+<pre>POST /serviceOrder</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description">Description</h5>
+<div class="paragraph">
+<p>This operation creates a service order entity.
+The TMF Open API specification document provides the list of mandatory and non mandatory attributes when creating a ServiceOrder, including any possible rule conditions and applicable default values.
+POST should be used without specifying the id and the href, the Service Order Management system is in charge of generating the id + href for the ServiceOrder.</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>100: OrderItem with 'add' action but serviceSpecification id missing</p>
+</li>
+<li>
+<p>101: OrderItem with 'change'/'noChange'/'remove' but service id missing</p>
+</li>
+<li>
+<p>102: OrderItem with 'add' action - serviceSpecification id provided but not existing</p>
+</li>
+<li>
+<p>103: OrderItem with 'add' action but service id already existing in the inventory</p>
+</li>
+<li>
+<p>104: A customer for existing service(s) is provided but he did not exist</p>
+</li>
+<li>
+<p>105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory</p>
+</li>
+<li>
+<p>106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 22.2222%;">
+<col style="width: 33.3333%;">
+<col style="width: 44.4445%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Body</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceOrder</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_createserviceorder">CreateServiceOrder</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>201</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_createserviceorder">CreateServiceOrder</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p>
+<p class="tableblock">Specific encapsulated business errors for current operation</p>
+<p class="tableblock">* 100: OrderItem with 'add' action but serviceSpecification id missing</p>
+<p class="tableblock">* 101: OrderItem with 'change'/'noChange'/'remove' but service id missing</p>
+<p class="tableblock">* 102: OrderItem with 'add' action - serviceSpecification id provided but not existing</p>
+<p class="tableblock">* 103: OrderItem with 'add' action but service id already existing in the inventory</p>
+<p class="tableblock">* 104: A customer for existing service(s) is provided but he did not exist</p>
+<p class="tableblock">* 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory</p>
+<p class="tableblock">* 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_serviceorderfind">List service orders</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /serviceOrder</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description_2">Description</h5>
+<div class="paragraph">
+<p>Retrieve and list service order entities according to given criteria.
+Only a predefined set of attribute is proposed.
+Attribute selection could be described in the fields attribute.</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters_2">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 16.6666%;">
+<col style="width: 50%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>externalId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>fields</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">this attribute could be used to filter retrieved attribute(s) and/or sort SO.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>limit</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The maximum number of elements to retrieve (it can be greater than the actual available number of items).</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">integer (int32)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>offset</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The index of the first element to retrieve. Zero is the first element of the collection.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">integer (int32)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderDate.gt</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">order date greather than</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderDate.lt</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">order date lower than</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>state</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">state of the order(s) to be retrieved</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses_2">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success<br>
+<strong>Headers</strong> : <br>
+<code>X-Total-Count</code> (integer (int32))<br>
+<code>X-Result-Count</code> (integer (int32))</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_serviceorder">ServiceOrder</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_serviceorderget">Retrieve a service order</h4>
+<div class="literalblock">
+<div class="content">
+<pre>GET /serviceOrder/{id}</pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_description_3">Description</h5>
+<div class="paragraph">
+<p>This operation retrieves a service order entity.
+Attribute selection is enabled for all first level attributes.</p>
+</div>
+<div class="paragraph">
+<p>Specific business errors for current operation will be encapsulated in</p>
+</div>
+<div class="paragraph">
+<p>HTTP Response 422 Unprocessable entity</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_parameters_3">Parameters</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 11.1111%;">
+<col style="width: 16.6666%;">
+<col style="width: 50%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Type</th>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Path</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Query</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>fields</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Attribute selection</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="_responses_3">Responses</h5>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 10%;">
+<col style="width: 70%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">HTTP Code</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Success</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_serviceorder">ServiceOrder</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>400</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Bad Request</p>
+<p class="tableblock">List of supported error codes:
+- 20: Invalid URL parameter value
+- 21: Missing body
+- 22: Invalid body
+- 23: Missing body field
+- 24: Invalid body field
+- 25: Missing header
+- 26: Invalid header value
+- 27: Missing query-string parameter
+- 28: Invalid query-string parameter value</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>401</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unauthorized</p>
+<p class="tableblock">List of supported error codes:
+- 40: Missing credentials
+- 41: Invalid credentials
+- 42: Expired credentials</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>403</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Forbidden</p>
+<p class="tableblock">List of supported error codes:
+- 50: Access denied
+- 51: Forbidden requester
+- 52: Forbidden user
+- 53: Too many requests</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>404</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not Found</p>
+<p class="tableblock">List of supported error codes:
+- 60: Resource not found</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>422</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unprocessable entity</p>
+<p class="tableblock">Functional error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>500</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Internal Server Error</p>
+<p class="tableblock">List of supported error codes:
+- 1: Internal error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>503</strong></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Service Unavailable</p>
+<p class="tableblock">List of supported error codes:
+- 5: The service is temporarily unavailable
+- 6: Orange API is over capacity, retry later !</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_errorrepresentation">ErrorRepresentation</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_definitions">Definitions</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_actiontype">ActionType</h3>
+<div class="paragraph">
+<p>Action type to be describer on the order item.
+modify is not managed in Beijing release</p>
+</div>
+<div class="paragraph">
+<p><em>Type</em> : enum (add, modify, delete, noChange)</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_createserviceorder">CreateServiceOrder</h3>
+<div class="paragraph">
+<p>This structure is used in the operation POST for a serviceOrder request.
+Attribute description is not accurate and should be find in the serviceOrder class.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>category</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, …)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A free-text description of the service order</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>externalId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">ID given by the consumer and only understandable by him (to facilitate his searches)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderItem</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_createserviceorderitem">CreateServiceOrderItem</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderRelationship</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_orderrelationship">OrderRelationship</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>priority</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_relatedparty">RelatedParty</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>requestedCompletionDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Requested delivery date from the requestor perspective</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>requestedStartDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Order start date wished by the requestor</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_createserviceorderitem">CreateServiceOrderItem</h3>
+<div class="paragraph">
+<p>This structure is used in the operation POST for a serviceOrder request to describe an item.
+Attribute description is not accurate and should be find in the serviceOrderItem class.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Indicates the base type of the resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A link to the schema describing this REST resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Indicates the type of resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>action</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_actiontype">ActionType</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Identifier of the line item (generally it is a sequence number 01, 02, 03, …)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderItemRelationship</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_orderitemrelationship">OrderItemRelationship</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>service</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_service">Service</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_errorrepresentation">ErrorRepresentation</h3>
+<div class="paragraph">
+<p>Representation of an error.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">it provides a link to the schema describing a REST resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The class type of a REST resource</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>code</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Application related code (as defined in the API or from a common list)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">integer (int32)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>message</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that provide more details and corrective actions related to the error. This can be shown to a client user</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>reason</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Text that explains the reason for error. This can be shown to a client user.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>referenceError</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">url pointing to documentation describing the error</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>status</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">http error code extension like 400-2</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_hub">Hub</h3>
+<div class="paragraph">
+<p>An HUB resource is used by client side to subscribe to notification.
+Not managed in the Beijing release.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 42.8571%;">
+<col style="width: 57.1429%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>callback</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>query</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_orderitemrelationship">OrderItemRelationship</h3>
+<div class="paragraph">
+<p>Linked order item to the one containing this attribute.
+nbi component used this relationship to sort request to ONAP.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of an order item</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>type</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_relationshiptype">RelationshipType</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_orderrelationship">OrderRelationship</h3>
+<div class="paragraph">
+<p>Linked order to the one containing this attribute.
+This relationship is not used to sort ONAP request.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@referredType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Type of the referred order.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A hyperlink to the related order</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The id of the related order</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The type of related order, can be : “dependency” if the order needs to be “not started” until another order item is complete (a service order in this case) or “cross-ref” to keep track of the source order (a productOrder)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_relatedparty">RelatedParty</h3>
+<div class="paragraph">
+<p>A related party defines party which are involved in this order and the role they are playing.
+for Beijing release:
+With the current version of APIs used from SO and AAI we need to manage a ‘customer’. This customer concept is confusing with Customer BSS concept. We took the following rules to manage the ‘customer’ information:
+o It could be provided through a serviceOrder in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided in the serviceOrder header (we will not consider in this release the party at item level); External API component will check if this customer exists and create it in AAI if not.
+o If no relatedParty are provided the service will be affected to ‘generic’ customer (dummy customer) – we assume this ‘generic’ customer always exists.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@referredType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">An hyperlink to the party - not used in Beijnig release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of a related party</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the related party</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>role</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The role of the related party (e.g. Owner, requester, fullfiller etc).
+ONLY 'ONAPcustomer' is considered</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_relationshiptype">RelationshipType</h3>
+<div class="paragraph">
+<p>Relationship type;
+Only reliesOn is managed in Beijing release.</p>
+</div>
+<div class="paragraph">
+<p><em>Type</em> : enum (reliesOn)</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_service">Service</h3>
+<div class="paragraph">
+<p>Service (to be added, modified, deleted) description</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The URL to get the resource schema.
+Not managed in Beijing Release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">To define the service type
+Not managed in Beijing Release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference to the Service (useful for delete or modify command).
+Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Identifier of a service instance.
+It must be valued if orderItem action is 'delete' and corresponds to a AAI service.id</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the service - When orderItem action is 'add' this name will be used in ONAP/SO request as InstaceName.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_relatedparty">RelatedParty</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceCharacteristic</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicecharacteristic">ServiceCharacteristic</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceRelationship</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_servicerelationship">ServiceRelationship</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceSpecification</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_servicespecificationref">ServiceSpecificationRef</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceState</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">The lifecycle state of the service requested;
+Not managed in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicecharacteristic">ServiceCharacteristic</h3>
+<div class="paragraph">
+<p>ServiceCharacteristic</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of characteristic</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>value</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_value">Value</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>valueType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_serviceorder">ServiceOrder</h3>
+<div class="paragraph">
+<p>A Service Order is a type of order which can be used to place an order between a customer and a service provider or between a service provider and a partner and vice versa</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>category</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, …)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>completionDateTime</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Date when the order was completed</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>description</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A free-text description of the service order</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>expectedCompletionDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>externalId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">ID given by the consumer and only understandable by him (to facilitate his searches)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Hyperlink to access the order</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">ID created on repository side</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderItem</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_serviceorderitem">ServiceOrderItem</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderRelationship</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_orderrelationship">OrderRelationship</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>priority</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>relatedParty</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_relatedparty">RelatedParty</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>requestedCompletionDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Requested delivery date from the requestor perspective</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>requestedStartDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Order start date wished by the requestor</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>startDate</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Date when the order was started for processing</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string (date-time)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>state</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_statetype">StateType</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_serviceorderitem">ServiceOrderItem</h3>
+<div class="paragraph">
+<p>An identified part of the order. A service order is decomposed into one or more order items.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">not used in Beijing relase</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">not used in Beijing relase</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Used to extend the order item.
+not used in Beijing relase</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>action</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_actiontype">ActionType</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Identifier of the line item (generally it is a sequence number 01, 02, 03, …)</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>orderItemRelationship</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">&lt; <a href="#_orderitemrelationship">OrderItemRelationship</a> &gt; array</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>service</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_service">Service</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>state</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_statetype">StateType</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_serviceref">ServiceRef</h3>
+<div class="paragraph">
+<p>Service references</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the service</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicerelationship">ServiceRelationship</h3>
+<div class="paragraph">
+<p>Linked Services to the one instantiate
+nbi component used this relationship to sort request to ONAP.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 42.8571%;">
+<col style="width: 57.1429%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>service</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_service">Service</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>type</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_relationshiptype">RelationshipType</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_servicespecificationref">ServiceSpecificationRef</h3>
+<div class="paragraph">
+<p>The service specification (these attributes are fetched from the catalogue).</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@baseType</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not used in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not used in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Not used in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>href</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Reference of the service specification
+Not used in Beijing release.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>id</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Unique identifier of the service specification
+This information will be used to retrieve SDC information + mapped to SO ModelNameVersionIdin the request.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>name</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Name of the service specification
+Not used in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>targetServiceSchema</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="#_targetserviceschema">TargetServiceSchema</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>version</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Version of the service Specification
+Not used in Beijing release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_statetype">StateType</h3>
+<div class="paragraph">
+<p>List of possible state for the order and the orderItem.</p>
+</div>
+<div class="paragraph">
+<p><em>Type</em> : enum (acknowledged, rejected, pending, held, inProgress, cancelled, completed, failed, partial)</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_targetserviceschema">TargetServiceSchema</h3>
+<div class="paragraph">
+<p>Target to the schema describing the service spec resource</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This field provided a link to the schema describing this REST resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>required</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Indicates the (class) type of resource.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3 id="_value">Value</h3>
+<div class="paragraph">
+<p>Value is a descriptive structure for service characteristic;
+For Beijing we only manage 'basic' attribute - the serviceCharacteristicValue must be used.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 16.6666%;">
+<col style="width: 61.1111%;">
+<col style="width: 22.2223%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-middle">Name</th>
+<th class="tableblock halign-left valign-middle">Description</th>
+<th class="tableblock halign-left valign-middle">Schema</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@schemaLocation</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">This field provided a link to the schema describing this REST resource.
+Not used in Beijing Release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>@type</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Indicates the (class) type of resource.
+Not used in Beijing Release</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceCharacteristicValue</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">Value of the characteristic.
+This attribute must be used in Beijing Release to provide characteristic value.</p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2018-03-22 09:37:52 UTC
+</div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/offeredapis/serviceOrder/markDown.md b/docs/offeredapis/serviceOrder/markDown.md
new file mode 100644
index 0000000..5ee40cf
--- /dev/null
+++ b/docs/offeredapis/serviceOrder/markDown.md
@@ -0,0 +1,463 @@
+# API ServiceOrder
+
+
+<a name="overview"></a>
+## Overview
+
+### Api URL
+
+[Swagger UI](https://api-designer.sso.infra.ftgroup/swagger-ui/?url=https://api-designer.sso.infra.ftgroup/api/1.0/apis/kl1kgvz1zR/swagger.json)
+
+
+[plant UML UI](https://plantuml.rd.francetelecom.fr/proxy?fmt=svg&src=https://api-designer.sso.infra.ftgroup/api/1.0/apis/kl1kgvz1zR/plantuml&noCache=934804.0)
+
+serviceOrder API designed for ONAP Beijing Release.
+This API is build from TMF open API18.0 (applying TMF Guideline 3.0);
+Only operations GET (by id and list) and POST are available.
+
+
+### Version information
+*Version* : 1.0.0_inProgress
+
+
+### URI scheme
+*Host* : serverRoot
+*BasePath* : /nbi/api/v1
+*Schemes* : HTTPS
+
+
+### Tags
+
+* ServiceOrder : A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.
+
+
+### Consumes
+
+* `application/json;charset=utf-8`
+
+
+### Produces
+
+* `application/json;charset=utf-8`
+
+
+<a name="paths"></a>
+## Resources
+
+<a name="serviceorder_resource"></a>
+### ServiceOrder
+A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment.
+
+
+<a name="serviceordercreate"></a>
+#### Create a service order
+```
+POST /serviceOrder
+```
+
+
+##### Description
+This operation creates a service order entity.
+The TMF Open API specification document provides the list of mandatory and non mandatory attributes when creating a ServiceOrder, including any possible rule conditions and applicable default values.
+POST should be used without specifying the id and the href, the Service Order Management system is in charge of generating the id + href for the ServiceOrder.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+ - 100: OrderItem with 'add' action but serviceSpecification id missing
+
+ - 101: OrderItem with 'change'/'noChange'/'remove' but service id missing
+
+ - 102: OrderItem with 'add' action - serviceSpecification id provided but not existing
+
+ - 103: OrderItem with 'add' action but service id already existing in the inventory
+
+ - 104: A customer for existing service(s) is provided but he did not exist
+
+ - 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory
+
+ - 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided
+
+
+##### Parameters
+
+|Type|Name|Schema|
+|---|---|---|
+|**Body**|**serviceOrder** <br>*required*|[CreateServiceOrder](#createserviceorder)|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**201**|Success|[CreateServiceOrder](#createserviceorder)|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error<br><br>Specific encapsulated business errors for current operation<br><br> - 100: OrderItem with 'add' action but serviceSpecification id missing<br> <br> - 101: OrderItem with 'change'/'noChange'/'remove' but service id missing<br> <br> - 102: OrderItem with 'add' action - serviceSpecification id provided but not existing<br> <br> - 103: OrderItem with 'add' action but service id already existing in the inventory<br> <br> - 104: A customer for existing service(s) is provided but he did not exist<br> <br> - 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory<br> <br> - 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="serviceorderfind"></a>
+#### List service orders
+```
+GET /serviceOrder
+```
+
+
+##### Description
+Retrieve and list service order entities according to given criteria.
+Only a predefined set of attribute is proposed.
+Attribute selection could be described in the fields attribute.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Query**|**description** <br>*optional*||string|
+|**Query**|**externalId** <br>*optional*||string|
+|**Query**|**fields** <br>*optional*|this attribute could be used to filter retrieved attribute(s) and/or sort SO.|string|
+|**Query**|**limit** <br>*optional*|The maximum number of elements to retrieve (it can be greater than the actual available number of items).|integer (int32)|
+|**Query**|**offset** <br>*optional*|The index of the first element to retrieve. Zero is the first element of the collection.|integer (int32)|
+|**Query**|**orderDate.gt** <br>*optional*|order date greather than|string|
+|**Query**|**orderDate.lt** <br>*optional*|order date lower than|string|
+|**Query**|**state** <br>*optional*|state of the order(s) to be retrieved|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success <br>**Headers** : <br>`X-Total-Count` (integer (int32)) <br>`X-Result-Count` (integer (int32))|< [ServiceOrder](#serviceorder) > array|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="serviceorderget"></a>
+#### Retrieve a service order
+```
+GET /serviceOrder/{id}
+```
+
+
+##### Description
+This operation retrieves a service order entity.
+Attribute selection is enabled for all first level attributes.
+
+Specific business errors for current operation will be encapsulated in
+
+HTTP Response 422 Unprocessable entity
+
+
+##### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id** <br>*required*||string|
+|**Query**|**fields** <br>*optional*|Attribute selection|string|
+
+
+##### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|Success|[ServiceOrder](#serviceorder)|
+|**400**|Bad Request<br><br>List of supported error codes:<br>- 20: Invalid URL parameter value<br>- 21: Missing body<br>- 22: Invalid body<br>- 23: Missing body field<br>- 24: Invalid body field<br>- 25: Missing header<br>- 26: Invalid header value<br>- 27: Missing query-string parameter<br>- 28: Invalid query-string parameter value|[ErrorRepresentation](#errorrepresentation)|
+|**401**|Unauthorized<br><br>List of supported error codes:<br>- 40: Missing credentials<br>- 41: Invalid credentials<br>- 42: Expired credentials|[ErrorRepresentation](#errorrepresentation)|
+|**403**|Forbidden<br><br>List of supported error codes:<br>- 50: Access denied<br>- 51: Forbidden requester<br>- 52: Forbidden user<br>- 53: Too many requests|[ErrorRepresentation](#errorrepresentation)|
+|**404**|Not Found<br><br>List of supported error codes:<br>- 60: Resource not found|[ErrorRepresentation](#errorrepresentation)|
+|**422**|Unprocessable entity<br><br>Functional error|[ErrorRepresentation](#errorrepresentation)|
+|**500**|Internal Server Error<br><br>List of supported error codes:<br>- 1: Internal error|[ErrorRepresentation](#errorrepresentation)|
+|**503**|Service Unavailable<br><br>List of supported error codes:<br>- 5: The service is temporarily unavailable<br>- 6: Orange API is over capacity, retry later !|[ErrorRepresentation](#errorrepresentation)|
+
+
+<a name="definitions"></a>
+## Definitions
+
+<a name="actiontype"></a>
+### ActionType
+Action type to be describer on the order item.
+modify is not managed in Beijing release
+
+*Type* : enum (add, modify, delete, noChange)
+
+
+<a name="createserviceorder"></a>
+### CreateServiceOrder
+This structure is used in the operation POST for a serviceOrder request.
+Attribute description is not accurate and should be find in the serviceOrder class.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*||string|
+|**@schemaLocation** <br>*optional*||string|
+|**@type** <br>*optional*||string|
+|**category** <br>*optional*|Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, ...)|string|
+|**description** <br>*optional*|A free-text description of the service order|string|
+|**externalId** <br>*optional*|ID given by the consumer and only understandable by him (to facilitate his searches)|string|
+|**orderItem** <br>*optional*||< [CreateServiceOrderItem](#createserviceorderitem) > array|
+|**orderRelationship** <br>*optional*||< [OrderRelationship](#orderrelationship) > array|
+|**priority** <br>*optional*|A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)|string|
+|**relatedParty** <br>*optional*||< [RelatedParty](#relatedparty) > array|
+|**requestedCompletionDate** <br>*optional*|Requested delivery date from the requestor perspective|string (date-time)|
+|**requestedStartDate** <br>*optional*|Order start date wished by the requestor|string (date-time)|
+
+
+<a name="createserviceorderitem"></a>
+### CreateServiceOrderItem
+This structure is used in the operation POST for a serviceOrder request to describe an item.
+Attribute description is not accurate and should be find in the serviceOrderItem class.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*|Indicates the base type of the resource.|string|
+|**@schemaLocation** <br>*optional*|A link to the schema describing this REST resource|string|
+|**@type** <br>*optional*|Indicates the type of resource.|string|
+|**action** <br>*optional*||[ActionType](#actiontype)|
+|**id** <br>*required*|Identifier of the line item (generally it is a sequence number 01, 02, 03, …)|string|
+|**orderItemRelationship** <br>*optional*||< [OrderItemRelationship](#orderitemrelationship) > array|
+|**service** <br>*required*||[Service](#service)|
+
+
+<a name="errorrepresentation"></a>
+### ErrorRepresentation
+Representation of an error.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|it provides a link to the schema describing a REST resource|string|
+|**@type** <br>*optional*|The class type of a REST resource|string|
+|**code** <br>*required*|Application related code (as defined in the API or from a common list)|integer (int32)|
+|**message** <br>*optional*|Text that provide more details and corrective actions related to the error. This can be shown to a client user|string|
+|**reason** <br>*required*|Text that explains the reason for error. This can be shown to a client user.|string|
+|**referenceError** <br>*optional*|url pointing to documentation describing the error|string|
+|**status** <br>*optional*|http error code extension like 400-2|string|
+
+
+<a name="hub"></a>
+### Hub
+An HUB resource is used by client side to subscribe to notification.
+Not managed in the Beijing release.
+
+
+|Name|Schema|
+|---|---|
+|**callback** <br>*required*|string|
+|**id** <br>*optional*|string|
+|**query** <br>*optional*|string|
+
+
+<a name="orderitemrelationship"></a>
+### OrderItemRelationship
+Linked order item to the one containing this attribute.
+nbi component used this relationship to sort request to ONAP.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**id** <br>*required*|Unique identifier of an order item|string|
+|**type** <br>*required*||[RelationshipType](#relationshiptype)|
+
+
+<a name="orderrelationship"></a>
+### OrderRelationship
+Linked order to the one containing this attribute.
+This relationship is not used to sort ONAP request.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@referredType** <br>*optional*|Type of the referred order.|string|
+|**href** <br>*optional*|A hyperlink to the related order|string|
+|**id** <br>*required*|The id of the related order|string|
+|**type** <br>*optional*|The type of related order, can be : “dependency” if the order needs to be “not started” until another order item is complete (a service order in this case) or “cross-ref” to keep track of the source order (a productOrder)|string|
+
+
+<a name="relatedparty"></a>
+### RelatedParty
+A related party defines party which are involved in this order and the role they are playing.
+for Beijing release:
+With the current version of APIs used from SO and AAI we need to manage a ‘customer’. This customer concept is confusing with Customer BSS concept. We took the following rules to manage the ‘customer’ information:
+o It could be provided through a serviceOrder in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided in the serviceOrder header (we will not consider in this release the party at item level); External API component will check if this customer exists and create it in AAI if not.
+o If no relatedParty are provided the service will be affected to ‘generic’ customer (dummy customer) – we assume this ‘generic’ customer always exists.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@referredType** <br>*optional*||string|
+|**href** <br>*optional*|An hyperlink to the party - not used in Beijnig release|string|
+|**id** <br>*required*|Unique identifier of a related party|string|
+|**name** <br>*optional*|Name of the related party|string|
+|**role** <br>*required*|The role of the related party (e.g. Owner, requester, fullfiller etc).<br>ONLY 'ONAPcustomer' is considered|string|
+
+
+<a name="relationshiptype"></a>
+### RelationshipType
+Relationship type;
+Only reliesOn is managed in Beijing release.
+
+*Type* : enum (reliesOn)
+
+
+<a name="service"></a>
+### Service
+Service (to be added, modified, deleted) description
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|The URL to get the resource schema.<br>Not managed in Beijing Release|string|
+|**@type** <br>*optional*|To define the service type<br>Not managed in Beijing Release|string|
+|**href** <br>*optional*|Reference to the Service (useful for delete or modify command).<br>Not managed in Beijing release.|string|
+|**id** <br>*required*|Identifier of a service instance.<br>It must be valued if orderItem action is 'delete' and corresponds to a AAI service.id|string|
+|**name** <br>*optional*|Name of the service - When orderItem action is 'add' this name will be used in ONAP/SO request as InstaceName.|string|
+|**relatedParty** <br>*optional*||< [RelatedParty](#relatedparty) > array|
+|**serviceCharacteristic** <br>*optional*||< [ServiceCharacteristic](#servicecharacteristic) > array|
+|**serviceRelationship** <br>*optional*||< [ServiceRelationship](#servicerelationship) > array|
+|**serviceSpecification** <br>*optional*||[ServiceSpecificationRef](#servicespecificationref)|
+|**serviceState** <br>*optional*|The lifecycle state of the service requested;<br>Not managed in Beijing release.|string|
+
+
+<a name="servicecharacteristic"></a>
+### ServiceCharacteristic
+ServiceCharacteristic
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**name** <br>*required*|Name of characteristic|string|
+|**value** <br>*optional*||[Value](#value)|
+|**valueType** <br>*optional*||string|
+
+
+<a name="serviceorder"></a>
+### ServiceOrder
+A Service Order is a type of order which can be used to place an order between a customer and a service provider or between a service provider and a partner and vice versa
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*||string|
+|**@schemaLocation** <br>*optional*||string|
+|**@type** <br>*optional*||string|
+|**category** <br>*optional*|Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, ...)|string|
+|**completionDateTime** <br>*optional*|Date when the order was completed|string (date-time)|
+|**description** <br>*optional*|A free-text description of the service order|string|
+|**expectedCompletionDate** <br>*optional*||string (date-time)|
+|**externalId** <br>*optional*|ID given by the consumer and only understandable by him (to facilitate his searches)|string|
+|**href** <br>*optional*|Hyperlink to access the order|string|
+|**id** <br>*required*|ID created on repository side|string|
+|**orderDate** <br>*optional*||string (date-time)|
+|**orderItem** <br>*optional*||< [ServiceOrderItem](#serviceorderitem) > array|
+|**orderRelationship** <br>*optional*||< [OrderRelationship](#orderrelationship) > array|
+|**priority** <br>*optional*|A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)|string|
+|**relatedParty** <br>*optional*||< [RelatedParty](#relatedparty) > array|
+|**requestedCompletionDate** <br>*optional*|Requested delivery date from the requestor perspective|string (date-time)|
+|**requestedStartDate** <br>*optional*|Order start date wished by the requestor|string (date-time)|
+|**startDate** <br>*optional*|Date when the order was started for processing|string (date-time)|
+|**state** <br>*optional*||[StateType](#statetype)|
+
+
+<a name="serviceorderitem"></a>
+### ServiceOrderItem
+An identified part of the order. A service order is decomposed into one or more order items.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*|not used in Beijing relase|string|
+|**@schemaLocation** <br>*optional*|not used in Beijing relase|string|
+|**@type** <br>*optional*|Used to extend the order item.<br>not used in Beijing relase|string|
+|**action** <br>*optional*||[ActionType](#actiontype)|
+|**id** <br>*required*|Identifier of the line item (generally it is a sequence number 01, 02, 03, …)|string|
+|**orderItemRelationship** <br>*optional*||< [OrderItemRelationship](#orderitemrelationship) > array|
+|**service** <br>*required*||[Service](#service)|
+|**state** <br>*optional*||[StateType](#statetype)|
+
+
+<a name="serviceref"></a>
+### ServiceRef
+Service references
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**href** <br>*optional*|Reference of the service|string|
+|**id** <br>*required*|Unique identifier of the service|string|
+
+
+<a name="servicerelationship"></a>
+### ServiceRelationship
+Linked Services to the one instantiate
+nbi component used this relationship to sort request to ONAP.
+
+
+|Name|Schema|
+|---|---|
+|**service** <br>*required*|[Service](#service)|
+|**type** <br>*required*|[RelationshipType](#relationshiptype)|
+
+
+<a name="servicespecificationref"></a>
+### ServiceSpecificationRef
+The service specification (these attributes are fetched from the catalogue).
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@baseType** <br>*optional*|Not used in Beijing release|string|
+|**@schemaLocation** <br>*optional*|Not used in Beijing release|string|
+|**@type** <br>*optional*|Not used in Beijing release|string|
+|**href** <br>*optional*|Reference of the service specification<br>Not used in Beijing release.|string|
+|**id** <br>*required*|Unique identifier of the service specification<br>This information will be used to retrieve SDC information + mapped to SO ModelNameVersionIdin the request.|string|
+|**name** <br>*optional*|Name of the service specification<br>Not used in Beijing release|string|
+|**targetServiceSchema** <br>*optional*||[TargetServiceSchema](#targetserviceschema)|
+|**version** <br>*optional*|Version of the service Specification<br>Not used in Beijing release|string|
+
+
+<a name="statetype"></a>
+### StateType
+List of possible state for the order and the orderItem.
+
+*Type* : enum (acknowledged, rejected, pending, held, inProgress, cancelled, completed, failed, partial)
+
+
+<a name="targetserviceschema"></a>
+### TargetServiceSchema
+Target to the schema describing the service spec resource
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*required*|This field provided a link to the schema describing this REST resource.|string|
+|**@type** <br>*required*|Indicates the (class) type of resource.|string|
+
+
+<a name="value"></a>
+### Value
+Value is a descriptive structure for service characteristic;
+For Beijing we only manage 'basic' attribute - the serviceCharacteristicValue must be used.
+
+
+|Name|Description|Schema|
+|---|---|---|
+|**@schemaLocation** <br>*optional*|This field provided a link to the schema describing this REST resource.<br>Not used in Beijing Release|string|
+|**@type** <br>*optional*|Indicates the (class) type of resource.<br>Not used in Beijing Release|string|
+|**serviceCharacteristicValue** <br>*optional*|Value of the characteristic.<br>This attribute must be used in Beijing Release to provide characteristic value.|string|
+
diff --git a/docs/offeredapis/swaggers/serviceCatalog_1_0_0.json b/docs/offeredapis/swaggers/serviceCatalog_1_0_0.json
new file mode 100644
index 0000000..74daf5a
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceCatalog_1_0_0.json
@@ -0,0 +1,652 @@
+
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "serviceCatalog API designed for ONAP Beijing Release.\nThis API is build from TMF open API17.5\nonly operation GET (by id & byList) for resource serviceSpecification is available",
+ "version": "1.0.0",
+ "title": "API ServiceCatalog"
+ },
+ "host": "serverRoot",
+ "basePath": "/nbi/api/v1",
+ "schemes": [
+ "https"
+ ],
+ "consumes": [
+ "application/json;charset=utf-8"
+ ],
+ "produces": [
+ "application/json;charset=utf-8"
+ ],
+ "tags": [
+
+ {
+ "name": "ServiceSpecification",
+ "description": ""
+ }
+ ],
+ "paths": {
+ "/serviceSpecification": {
+ "get": {
+ "tags": [
+ "ServiceSpecification"
+ ],
+ "operationId": "serviceSpecificationFind",
+ "summary": "List service specifications",
+ "description": "This operation returns service specifications from a catalog.\nOnly a predefined set of attribute is proposed : Based on SDC limitations, only attributes category and distributionStatus are available for serviceSpecification filtering\nFields attribute could be used to filter attributes retrieved\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "fields",
+ "required": false,
+ "in": "query",
+ "description": "Field selection - used to filtering the attributes to be retreived",
+
+ "type": "string"
+ },
+ {
+ "name": "category",
+ "required": false,
+ "in": "query",
+ "description": "Service Category (filter)",
+
+ "type": "string"
+ },
+ {
+ "name": "distributionStatus",
+ "required": false,
+ "in": "query",
+ "description": "Service distribution status (filter)",
+
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceSpecification"
+ }
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ },
+ "/serviceSpecification/{id}": {
+ "get": {
+ "tags": [
+ "ServiceSpecification"
+ ],
+ "operationId": "serviceSpecificationGet",
+ "summary": "Retrieve a service specification",
+ "description": "This operation returns a service specification by its id from a catalog. Attribute selection is enabled using the fields attribute.\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "description": ""
+ },
+ {
+ "name": "fields",
+ "required": false,
+ "in": "query",
+ "description": "Attribute selection",
+
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/ServiceSpecification"
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ }
+ },
+"definitions": {
+
+ "LifecycleStatusValues": {
+ "description": "Service lifecycle value from ONAP SDC",
+
+ "type": "string",
+ "enum": [
+ "NOT_CERTIFIED_CHECKOUT",
+ "NOT_CERTIFIED_CHECKIN",
+ "READY_FOR_CERTIFICATION",
+ "CERTIFICATION_IN_PROGRESS",
+ "CERTIFIED"]
+
+ },
+ "DistributionStatus": {
+ "description": "Service distribution status from ONAP.",
+
+ "type": "string",
+ "enum": [
+ "DISTRIBUTION_NOT_APPROVED",
+ "DISTRIBUTION_APPROVED",
+ "DISTRIBUTED",
+ "DISTRIBUTION_REJECTED"]
+
+ },
+
+ "ErrorRepresentation": {
+ "description": "This class is used to describe error.\nfor nbi Beijing release we do not manage additional error for serviceCatalog",
+
+
+ "required": [
+
+ "code",
+ "reason"
+ ],
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "Application related code (as defined in the API or from a common list)",
+ "type": "integer",
+ "format": "int32"
+ },
+ "reason": {
+ "description": "Text that explains the reason for error. This can be shown to a client user.",
+ "type": "string"
+ },
+ "message": {
+ "description": "Text that provide more details and corrective actions related to the error. This can be shown to a client user",
+ "type": "string"
+ },
+ "status": {
+ "description": "http error code extension like 400-2",
+ "type": "string"
+ },
+ "referenceErrror": {
+ "description": "url pointing to documentation describing the error",
+ "type": "string"
+ },
+ "@type": {
+ "description": "The class type of a REST resource.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "it provides a link to the schema describing a REST resource.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "TimePeriod": {
+ "description": "A time period",
+
+
+ "type": "object",
+ "properties": {
+ "startDateTime": {
+ "description": "Start date and time of the period",
+ "type": "string",
+ "format": "date-time"
+ },
+ "endDateTime": {
+ "description": "End date and time of the period",
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+
+ },
+
+ "RelatedPartyRef": {
+ "description": "Party linked to the service catalog.\nin nbi we retrieve information about last updater of the service in SDC",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the related party. Filled with lastUpdaterUserId",
+ "type": "string"
+ },
+ "role": {
+ "description": "Role payed by the related party\nOnly role 'lastUpdater' is retrieved in Beijing release",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the related party - Filled with lastUpdatedFullName",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceSpecification": {
+ "description": "ServiceSpecification is a class that offers characteristics to describe a type of service. Functionally, it acts as a template by which Services may be instantiated. By sharing the same specification, these services would therefore share the same set of characteristics.\nthe service information are retrieved in SDC",
+
+
+ "required": [
+
+ "invariantUUID"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service specification. Filled with SDC Service uuid",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the service specification- not mapped in Beijing",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the service specification- Filled with SDC Service name",
+ "type": "string"
+ },
+ "description": {
+ "description": "A narrative that explains in detail what the service specification is - Filled with SDC Service description",
+ "type": "string"
+ },
+ "@type": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attributes:\ninvariantUUID\ntoscaModelURL\ntoscaResourceName\ncategory (1)\nsubcategory (1)\ndistributionStatus",
+ "type": "string",
+
+ "default": "ONAPservice"
+ },
+ "@schemaLocation": {
+ "description": "Not used for Beijing release",
+ "type": "string"
+ },
+ "@baseType": {
+ "description": "Not used for Beijing release",
+ "type": "string"
+ },
+ "invariantUUID": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - invariantUUID",
+ "type": "string"
+ },
+ "toscaModelURL": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - toscaModelURL",
+ "type": "string"
+ },
+ "toscaResourceName": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - toscaResourceName",
+ "type": "string"
+ },
+ "category": {
+ "description": "Additional attribute - extended through @type - category\nPlease note that this attribute is managed in TMF - in future release we'll introduce category resource",
+ "type": "string"
+ },
+ "subcategory": {
+ "description": "Additional attribute - extended through @type - category\nPlease note that this attribute is managed in TMF - in future release we'll introduce category resourc",
+ "type": "string"
+ },
+ "distributionStatus": {
+
+ "$ref": "#/definitions/DistributionStatus"
+ },
+ "version": {
+ "description": "Service specification version - Filled with SDC Service version",
+ "type": "string"
+ },
+ "lifecycleStatus": {
+
+ "$ref": "#/definitions/LifecycleStatusValues"
+ },
+ "targetServiceSchema": {
+
+ "$ref": "#/definitions/TargetServiceSchemaRef"
+ },
+ "attachment": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Attachment"
+ }
+ },
+ "relatedParty": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/RelatedPartyRef"
+ }
+ },
+ "resourceSpecification": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ResourceSpecificationRef"
+ }
+ },
+ "serviceSpecCharacteristic": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceSpecCharacteristic"
+ }
+ }
+ }
+
+ },
+
+ "ServiceSpecCharacteristic": {
+ "description": "A characteristic quality or distinctive feature of a ServiceSpecification. \nServiceSpecCharacteristic are retrieved in the serviceTosca file in the topology_template section in the inputs section.",
+
+
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "Name of the characteristic - Filled with parameter_name",
+ "type": "string"
+ },
+ "description": {
+ "description": "A narrative that explains in detail what the characteristic is - Filled with parameter_description",
+ "type": "string"
+ },
+ "valueType": {
+ "description": "A kind of value that the characteristic can take on, such as numeric, text and so forth - Filled with parameter_type",
+ "type": "string"
+ },
+ "@type": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with: 'ONAPserviceCharacteristic'. We do not used this features in nbi Beijing release.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "An url pointing to type description - we do not use it in nbi Beijing release",
+ "type": "string"
+ },
+ "required": {
+ "description": "A parameter to define if the characteristic is mandatory - Filled from parameter_required – if not fielded by default ‘true’",
+ "type": "boolean",
+
+ "default": true
+ },
+ "status": {
+ "description": "Status of the characteristic - filled with status_value",
+ "type": "string"
+ },
+ "serviceSpecCharacteristicValue": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceSpecCharacteristicValue"
+ }
+ }
+ }
+
+ },
+
+ "Attachment": {
+ "description": "An attachment is a file uses to describe the service.\nIn nbi we use attachment to retrieve ONAP artifacts.",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the attachment - filled with artifactUUID.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the attachment - filled with artifactName",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description of the attachment - filled with artifactDescription",
+ "type": "string"
+ },
+ "@type": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with 'ONAPartifact'. We used this features to add following attributes: \nartifactLabel\nartifactGroupType\nartifactTimeout\nartifactChecksum\nartifactVersion\ngeneratedFromUUID",
+ "type": "string",
+
+ "default": "ONAPartifact"
+ },
+ "artifactLabel": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - artifactLabel",
+ "type": "string"
+ },
+ "artifactGroupType": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - artifactGroupType",
+ "type": "string"
+ },
+ "artifactTimeout": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - artifactTimeout",
+ "type": "string"
+ },
+ "artifactChecksum": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - artifactChecksum",
+ "type": "string"
+ },
+ "artifactVersion": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - artifactVersion",
+ "type": "string"
+ },
+ "generatedFromUUID": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - generatedFromUUID",
+ "type": "string"
+ },
+ "url": {
+ "description": "Uniform Resource Locator, is a web page address - filled with artifactURL",
+ "type": "string"
+ },
+ "mimeType": {
+ "description": "Filled with artifactType",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceSpecCharacteristicValue": {
+ "description": "A number or text that can be assigned to a service specification characteristic.\nServiceSpecCharacteristicValue are retrieved in the service Tosca file",
+
+
+ "type": "object",
+ "properties": {
+ "valueType": {
+ "description": "A kind of value that the characteristic can take on, such as numeric, text, and so forth\nRetrieved in the Tosca in the topology_template section in the inputs section - parameter_type. \nWe do not manage parameter_type= list or map for Beijing release",
+ "type": "string"
+ },
+ "isDefault": {
+ "description": "Information calculated from parameter default in the Tosca file",
+ "type": "boolean"
+ },
+ "value": {
+ "description": "A discrete value that the characteristic can take on",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ResourceSpecificationRef": {
+ "description": "A list of resourceSpec identified to deliver the service.\nfor nbi we retrieve resource information available in service description (through SDC api) bu as well information retrieved in the TOSCA file.",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the resource specification - filled with resourceUUID",
+ "type": "string"
+ },
+ "version": {
+ "description": "Version for this resource specification - filled with resourceVersion",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the resource specification - filled with resourceName",
+ "type": "string"
+ },
+ "@type": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with: 'ONAPresource'. We used this features to add following attributes:\nresourceInstanceName\nresourceInvariantUUID\nresourceType\nmodelCustomizationName\nmodelCustomizationId",
+ "type": "string",
+
+ "default": "ONAPresource"
+ },
+ "resourceInstanceName": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - resourceInstanceName",
+ "type": "string"
+ },
+ "resourceInvariantUUID": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - resourceInvariantUUID",
+ "type": "string"
+ },
+ "resourceType": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - resoucreType",
+ "type": "string"
+ },
+ "modelCustomizationName": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute name in topology_template/node_template for the resource",
+ "type": "string"
+ },
+ "modelCustomizationId": {
+ "description": "Additional attribute (not in the TMF API) - extended through @type - Retrieved in the TOSCA file : attribute customizationUUID in topology_template/node_template for the resource",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "TargetServiceSchemaRef": {
+ "description": "",
+
+
+ "required": [
+
+ "@type",
+ "@schemaLocation"
+ ],
+ "type": "object",
+ "properties": {
+ "@type": {
+ "description": "",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "",
+ "type": "string"
+ }
+ }
+
+ }
+ }
+}
+ \ No newline at end of file
diff --git a/docs/offeredapis/swaggers/serviceCatalog_1_0_0.yaml b/docs/offeredapis/swaggers/serviceCatalog_1_0_0.yaml
new file mode 100644
index 0000000..95e62fa
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceCatalog_1_0_0.yaml
@@ -0,0 +1,488 @@
+swagger: "2.0"
+info:
+ description: "serviceCatalog API designed for ONAP Beijing Release.\nThis API is\
+ \ build from TMF open API17.5\nonly operation GET (by id & byList) for resource\
+ \ serviceSpecification is available"
+ version: "1.0.0"
+ title: "API ServiceCatalog"
+host: "serverRoot"
+basePath: "/nbi/api/v1"
+schemes:
+- "https"
+consumes:
+- "application/json;charset=utf-8"
+produces:
+- "application/json;charset=utf-8"
+tags:
+- name: "ServiceSpecification"
+ description: ""
+paths:
+ /serviceSpecification:
+ get:
+ tags:
+ - "ServiceSpecification"
+ operationId: "serviceSpecificationFind"
+ summary: "List service specifications"
+ description: "This operation returns service specifications from a catalog.\n\
+ Only a predefined set of attribute is proposed : Based on SDC limitations,\
+ \ only attributes category and distributionStatus are available for serviceSpecification\
+ \ filtering\nFields attribute could be used to filter attributes retrieved\n\
+ \nSpecific business errors for current operation will be encapsulated in\n\
+ \nHTTP Response 422 Unprocessable entity\n"
+ deprecated: false
+ parameters:
+ - name: "fields"
+ required: false
+ in: "query"
+ description: "Field selection - used to filtering the attributes to be retreived"
+ type: "string"
+ - name: "category"
+ required: false
+ in: "query"
+ description: "Service Category (filter)"
+ type: "string"
+ - name: "distributionStatus"
+ required: false
+ in: "query"
+ description: "Service distribution status (filter)"
+ type: "string"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceSpecification"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ /serviceSpecification/{id}:
+ get:
+ tags:
+ - "ServiceSpecification"
+ operationId: "serviceSpecificationGet"
+ summary: "Retrieve a service specification"
+ description: "This operation returns a service specification by its id from\
+ \ a catalog. Attribute selection is enabled using the fields attribute.\n\n\
+ Specific business errors for current operation will be encapsulated in\n\n\
+ HTTP Response 422 Unprocessable entity\n"
+ deprecated: false
+ parameters:
+ - name: "id"
+ in: "path"
+ required: true
+ type: "string"
+ description: ""
+ - name: "fields"
+ required: false
+ in: "query"
+ description: "Attribute selection"
+ type: "string"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ $ref: "#/definitions/ServiceSpecification"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+definitions:
+ LifecycleStatusValues:
+ description: "Service lifecycle value from ONAP SDC"
+ type: "string"
+ enum:
+ - "NOT_CERTIFIED_CHECKOUT"
+ - "NOT_CERTIFIED_CHECKIN"
+ - "READY_FOR_CERTIFICATION"
+ - "CERTIFICATION_IN_PROGRESS"
+ - "CERTIFIED"
+ DistributionStatus:
+ description: "Service distribution status from ONAP."
+ type: "string"
+ enum:
+ - "DISTRIBUTION_NOT_APPROVED"
+ - "DISTRIBUTION_APPROVED"
+ - "DISTRIBUTED"
+ - "DISTRIBUTION_REJECTED"
+ ErrorRepresentation:
+ description: "This class is used to describe error.\nfor nbi Beijing release we\
+ \ do not manage additional error for serviceCatalog"
+ required:
+ - "code"
+ - "reason"
+ type: "object"
+ properties:
+ code:
+ description: "Application related code (as defined in the API or from a common\
+ \ list)"
+ type: "integer"
+ format: "int32"
+ reason:
+ description: "Text that explains the reason for error. This can be shown to\
+ \ a client user."
+ type: "string"
+ message:
+ description: "Text that provide more details and corrective actions related\
+ \ to the error. This can be shown to a client user"
+ type: "string"
+ status:
+ description: "http error code extension like 400-2"
+ type: "string"
+ referenceErrror:
+ description: "url pointing to documentation describing the error"
+ type: "string"
+ '@type':
+ description: "The class type of a REST resource."
+ type: "string"
+ '@schemaLocation':
+ description: "it provides a link to the schema describing a REST resource."
+ type: "string"
+ TimePeriod:
+ description: "A time period"
+ type: "object"
+ properties:
+ startDateTime:
+ description: "Start date and time of the period"
+ type: "string"
+ format: "date-time"
+ endDateTime:
+ description: "End date and time of the period"
+ type: "string"
+ format: "date-time"
+ RelatedPartyRef:
+ description: "Party linked to the service catalog.\nin nbi we retrieve information\
+ \ about last updater of the service in SDC"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the related party. Filled with lastUpdaterUserId"
+ type: "string"
+ role:
+ description: "Role payed by the related party\nOnly role 'lastUpdater' is\
+ \ retrieved in Beijing release"
+ type: "string"
+ name:
+ description: "Name of the related party - Filled with lastUpdatedFullName"
+ type: "string"
+ ServiceSpecification:
+ description: "ServiceSpecification is a class that offers characteristics to describe\
+ \ a type of service. Functionally, it acts as a template by which Services may\
+ \ be instantiated. By sharing the same specification, these services would therefore\
+ \ share the same set of characteristics.\nthe service information are retrieved\
+ \ in SDC"
+ required:
+ - "invariantUUID"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service specification. Filled with\
+ \ SDC Service uuid"
+ type: "string"
+ href:
+ description: "Reference of the service specification- not mapped in Beijing"
+ type: "string"
+ name:
+ description: "Name of the service specification- Filled with SDC Service name"
+ type: "string"
+ description:
+ description: "A narrative that explains in detail what the service specification\
+ \ is - Filled with SDC Service description"
+ type: "string"
+ '@type':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with 'ONAPservice'. We used this features to add following attributes:\n\
+ invariantUUID\ntoscaModelURL\ntoscaResourceName\ncategory (1)\nsubcategory\
+ \ (1)\ndistributionStatus"
+ type: "string"
+ default: "ONAPservice"
+ '@schemaLocation':
+ description: "Not used for Beijing release"
+ type: "string"
+ '@baseType':
+ description: "Not used for Beijing release"
+ type: "string"
+ invariantUUID:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - invariantUUID"
+ type: "string"
+ toscaModelURL:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - toscaModelURL"
+ type: "string"
+ toscaResourceName:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - toscaResourceName"
+ type: "string"
+ category:
+ description: "Additional attribute - extended through @type - category\nPlease\
+ \ note that this attribute is managed in TMF - in future release we'll introduce\
+ \ category resource"
+ type: "string"
+ subcategory:
+ description: "Additional attribute - extended through @type - category\nPlease\
+ \ note that this attribute is managed in TMF - in future release we'll introduce\
+ \ category resourc"
+ type: "string"
+ distributionStatus:
+ $ref: "#/definitions/DistributionStatus"
+ version:
+ description: "Service specification version - Filled with SDC Service version"
+ type: "string"
+ lifecycleStatus:
+ $ref: "#/definitions/LifecycleStatusValues"
+ targetServiceSchema:
+ $ref: "#/definitions/TargetServiceSchemaRef"
+ attachment:
+ type: "array"
+ items:
+ $ref: "#/definitions/Attachment"
+ relatedParty:
+ type: "array"
+ items:
+ $ref: "#/definitions/RelatedPartyRef"
+ resourceSpecification:
+ type: "array"
+ items:
+ $ref: "#/definitions/ResourceSpecificationRef"
+ serviceSpecCharacteristic:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceSpecCharacteristic"
+ ServiceSpecCharacteristic:
+ description: "A characteristic quality or distinctive feature of a ServiceSpecification.\
+ \ \nServiceSpecCharacteristic are retrieved in the serviceTosca file in the\
+ \ topology_template section in the inputs section."
+ type: "object"
+ properties:
+ name:
+ description: "Name of the characteristic - Filled with parameter_name"
+ type: "string"
+ description:
+ description: "A narrative that explains in detail what the characteristic\
+ \ is - Filled with parameter_description"
+ type: "string"
+ valueType:
+ description: "A kind of value that the characteristic can take on, such as\
+ \ numeric, text and so forth - Filled with parameter_type"
+ type: "string"
+ '@type':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with: 'ONAPserviceCharacteristic'. We do not used this features in nbi\
+ \ Beijing release."
+ type: "string"
+ '@schemaLocation':
+ description: "An url pointing to type description - we do not use it in nbi\
+ \ Beijing release"
+ type: "string"
+ required:
+ description: "A parameter to define if the characteristic is mandatory - Filled\
+ \ from parameter_required – if not fielded by default ‘true’"
+ type: "boolean"
+ default: true
+ status:
+ description: "Status of the characteristic - filled with status_value"
+ type: "string"
+ serviceSpecCharacteristicValue:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceSpecCharacteristicValue"
+ Attachment:
+ description: "An attachment is a file uses to describe the service.\nIn nbi we\
+ \ use attachment to retrieve ONAP artifacts."
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the attachment - filled with artifactUUID."
+ type: "string"
+ name:
+ description: "Name of the attachment - filled with artifactName"
+ type: "string"
+ description:
+ description: "Description of the attachment - filled with artifactDescription"
+ type: "string"
+ '@type':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with 'ONAPartifact'. We used this features to add following attributes:\
+ \ \nartifactLabel\nartifactGroupType\nartifactTimeout\nartifactChecksum\n\
+ artifactVersion\ngeneratedFromUUID"
+ type: "string"
+ default: "ONAPartifact"
+ artifactLabel:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - artifactLabel"
+ type: "string"
+ artifactGroupType:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - artifactGroupType"
+ type: "string"
+ artifactTimeout:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - artifactTimeout"
+ type: "string"
+ artifactChecksum:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - artifactChecksum"
+ type: "string"
+ artifactVersion:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - artifactVersion"
+ type: "string"
+ generatedFromUUID:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - generatedFromUUID"
+ type: "string"
+ url:
+ description: "Uniform Resource Locator, is a web page address - filled with\
+ \ artifactURL"
+ type: "string"
+ mimeType:
+ description: "Filled with artifactType"
+ type: "string"
+ ServiceSpecCharacteristicValue:
+ description: "A number or text that can be assigned to a service specification\
+ \ characteristic.\nServiceSpecCharacteristicValue are retrieved in the service\
+ \ Tosca file"
+ type: "object"
+ properties:
+ valueType:
+ description: "A kind of value that the characteristic can take on, such as\
+ \ numeric, text, and so forth\nRetrieved in the Tosca in the topology_template\
+ \ section in the inputs section - parameter_type. \nWe do not manage parameter_type=\
+ \ list or map for Beijing release"
+ type: "string"
+ isDefault:
+ description: "Information calculated from parameter default in the Tosca file"
+ type: "boolean"
+ value:
+ description: "A discrete value that the characteristic can take on"
+ type: "string"
+ ResourceSpecificationRef:
+ description: "A list of resourceSpec identified to deliver the service.\nfor nbi\
+ \ we retrieve resource information available in service description (through\
+ \ SDC api) bu as well information retrieved in the TOSCA file."
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the resource specification - filled with\
+ \ resourceUUID"
+ type: "string"
+ version:
+ description: "Version for this resource specification - filled with resourceVersion"
+ type: "string"
+ name:
+ description: "Name of the resource specification - filled with resourceName"
+ type: "string"
+ '@type':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with: 'ONAPresource'. We used this features to add following attributes:\n\
+ resourceInstanceName\nresourceInvariantUUID\nresourceType\nmodelCustomizationName\n\
+ modelCustomizationId"
+ type: "string"
+ default: "ONAPresource"
+ resourceInstanceName:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - resourceInstanceName"
+ type: "string"
+ resourceInvariantUUID:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - resourceInvariantUUID"
+ type: "string"
+ resourceType:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - resoucreType"
+ type: "string"
+ modelCustomizationName:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - Retrieved in the TOSCA file : attribute name in topology_template/node_template\
+ \ for the resource"
+ type: "string"
+ modelCustomizationId:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @type - Retrieved in the TOSCA file : attribute customizationUUID in topology_template/node_template\
+ \ for the resource"
+ type: "string"
+ TargetServiceSchemaRef:
+ description: ""
+ required:
+ - "@type"
+ - "@schemaLocation"
+ type: "object"
+ properties:
+ '@type':
+ description: ""
+ type: "string"
+ '@schemaLocation':
+ description: ""
+ type: "string"
diff --git a/docs/offeredapis/swaggers/serviceInventory_1_0_0.json b/docs/offeredapis/swaggers/serviceInventory_1_0_0.json
new file mode 100644
index 0000000..5c2c7c5
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceInventory_1_0_0.json
@@ -0,0 +1,620 @@
+
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "serviceInventory API designed for ONAP Beijing Release.\nThis API is build from TMF open API18.0 (applying TMF Guideline 3.0)\nonly operation GET (by id & byList) for resource serviceSpecification is available",
+ "version": "1.0.0",
+ "title": "API ServiceInventory"
+ },
+
+ "host": "serverRoot",
+ "basePath": "/nbi/api/v1",
+ "schemes": [
+ "https"
+ ],
+ "consumes": [
+ "application/json;charset=utf-8"
+ ],
+ "produces": [
+ "application/json;charset=utf-8"
+ ],
+ "tags": [
+
+ {
+ "name": "Service",
+ "description": ""
+ }
+ ],
+ "paths": {
+ "/service": {
+ "get": {
+ "tags": [
+ "Service"
+ ],
+ "operationId": "serviceFind",
+ "summary": "List services",
+ "description": "This operation list service entities. \nAttribute selection is restricted. \nfields attribute may be used to filter retrieved attribute(s) for each service\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "relatedParty.id",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "serviceSpecification.id",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "serviceSpecification.name",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "id",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "fields",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ListService"
+ }
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ },
+ "/service/{id}": {
+ "get": {
+ "tags": [
+ "Service"
+ ],
+ "operationId": "serviceGet",
+ "summary": "Retrieve a service",
+ "description": "This operation retrieves a service entity. \nAttribute selection is enabled for all first level attributes.\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "description": ""
+ },
+ {
+ "name": "relatedParty.id",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "serviceSpecification.id",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "serviceSpecification.name",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/Service"
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ }
+ },
+"definitions": {
+
+ "stateValues": {
+ "description": "",
+
+ "type": "string",
+ "enum": [
+ "feasibilityChecked",
+ "designed",
+ "reserved",
+ "inactive",
+ "active",
+ "terminated"]
+
+ },
+
+ "ErrorRepresentation": {
+ "description": "This class is used to describe error.\nfor nbi Beijing release we do not manage additional error for serviceCatalog",
+
+
+ "required": [
+
+ "code",
+ "reason"
+ ],
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "Application related code (as defined in the API or from a common list)",
+ "type": "integer",
+ "format": "int32"
+ },
+ "reason": {
+ "description": "Text that explains the reason for error. This can be shown to a client user.",
+ "type": "string"
+ },
+ "message": {
+ "description": "Text that provide more details and corrective actions related to the error. This can be shown to a client user.",
+ "type": "string"
+ },
+ "status": {
+ "description": "http error code extension like 400-2",
+ "type": "string"
+ },
+ "referenceError": {
+ "description": "url pointing to documentation describing the error",
+ "type": "string"
+ },
+ "@type": {
+ "description": "The class type of a REST resource.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "it provides a link to the schema describing a REST resource.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "Service": {
+ "description": "Instantiated service (service_instance) in AAI",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service - Valued with service-instance-id",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the service\nNot managed in Beijing release",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the service - Valued with service-instance-name",
+ "type": "string"
+ },
+ "type": {
+ "description": "Service type - valued with 'service-instance'",
+ "type": "string"
+ },
+ "state": {
+
+ "$ref": "#/definitions/stateValues"
+ },
+ "hasStarted": {
+ "description": "This is a Boolean attribute that, if TRUE, signifies that this Service has already been started. If the value of this attribute is FALSE, then this signifies that this Service has NOT been Started\nNot managed in Beijing release",
+ "type": "boolean"
+ },
+ "@type": {
+ "description": "This attribute allows to dynamically extends TMF class. Not used in Beijing release.",
+ "type": "string"
+ },
+ "@baseType": {
+ "description": "Not managed in Beijing release",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "Not managed in Beijing release",
+ "type": "string"
+ },
+ "serviceSpecification": {
+
+ "$ref": "#/definitions/ServiceSpecificationRef"
+ },
+ "characteristic": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceCharacteristic"
+ }
+ },
+ "supportingResource": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/SupportingResource"
+ }
+ },
+ "relatedParty": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/RelatedPartyRef"
+ }
+ }
+ }
+
+ },
+
+ "ServiceSpecificationRef": {
+ "description": "Service specification reference: ServiceSpecification of this service (catalog information)",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service specification. valued to model-version-id",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the service specification.\nnot managed in Beijing release.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the required service specification",
+ "type": "string"
+ },
+ "version": {
+ "description": "Service specification version.\nNot managed in Beijing release",
+ "type": "string"
+ },
+ "@referredType": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with 'ONAPservice'. We used this features to add following attribute: invariantUUID",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "Not managed in Beijing release",
+ "type": "string"
+ },
+ "invariantUUID": {
+ "description": "Additional attribute (not in the TMF API) - extended through @referredType - model-invariant-id",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceCharacteristic": {
+ "description": "A list of name value pairs that define the service characteristics\nNot managed in Beijing release.",
+
+
+ "required": [
+
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "Name of the characteristic\nNot managed in Beijing release.",
+ "type": "string"
+ },
+ "valueType": {
+ "description": "Type of value for this characteristic.\nNot managed in Beijing release.",
+ "type": "string"
+ },
+ "value": {
+
+ "$ref": "#/definitions/Value"
+ }
+ }
+
+ },
+
+ "SupportingResource": {
+ "description": "Supporting resource - A supportingResource will be retrieved for each relationship of the relationship-list where related-link describe a vnf",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the supporting resource - Valued to vnf-id",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the supporting resource",
+ "type": "string"
+ },
+ "role": {
+ "description": "Not managed in Beijing release.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the supporting resource - Valued with vnf_-name",
+ "type": "string"
+ },
+ "@referredType": {
+ "description": "This attribute allows to dynamically extends TMF class. Valued with 'ONAP resource'. We used this features to add following attributes:\n status\t\n modelInvariantId\n modelVersionId\n modelCustomisationId",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "Not managed in Beijing release.",
+ "type": "string"
+ },
+ "status": {
+ "description": "Additional attribute (not in the TMF API) - extended through @referredType - valued with prov-status",
+ "type": "string"
+ },
+ "modelInvariantId": {
+ "description": "Additional attribute (not in the TMF API) - extended through @referredType - valued with model-invariant-id",
+ "type": "string"
+ },
+ "modelVersionId": {
+ "description": "Additional attribute (not in the TMF API) - extended through @referredType - valued with model-verson-id",
+ "type": "string"
+ },
+ "modelCustomisationId": {
+ "description": "Additional attribute (not in the TMF API) - extended through @referredType - valued with model-customisation-id",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "RelatedPartyRef": {
+ "description": "RelatedParty reference. A related party defines party or party role linked to a specific entity.\nOnly ONAP Customer is managed in Beijing release.",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of a related party",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of a related party.\nNot filled in Beijing release.",
+ "type": "string"
+ },
+ "role": {
+ "description": "Role played by the related party.\nFilled with 'ONAPcustomer'",
+ "type": "string"
+ },
+ "@referredType": {
+ "description": "Not managed in the Beijing release.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "Value": {
+ "description": "Structure used to describe characteristic value.\nNot managed in Beijing release.",
+
+
+ "type": "object",
+ "properties": {
+ "@type": {
+ "description": "Not managed in Beijing release.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "Not managed in Beijing release.",
+ "type": "string"
+ },
+ "serviceCharacteristicValue": {
+ "description": "Not managed in Beijing release.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ListRelatedPartyRef": {
+ "description": "This class is used to structure list of service(s) retrieved",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of a related party",
+ "type": "string"
+ },
+ "role": {
+ "description": "Role played by the related party - only role “ONAPcustomer” is managed in Beijing release.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ListServiceSpecificationRef": {
+ "description": "This class is used to structure list of service(s) retrieved",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service specification",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the required service specification",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ListService": {
+ "description": "This class is used to structure list of service(s) retrieved",
+
+
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the service",
+ "type": "string"
+ },
+ "serviceSpecification": {
+
+ "$ref": "#/definitions/ListServiceSpecificationRef"
+ },
+ "relatedParty": {
+
+ "$ref": "#/definitions/ListRelatedPartyRef"
+ }
+ }
+
+ }
+ }
+}
+ \ No newline at end of file
diff --git a/docs/offeredapis/swaggers/serviceInventory_1_0_0.yaml b/docs/offeredapis/swaggers/serviceInventory_1_0_0.yaml
new file mode 100644
index 0000000..99af226
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceInventory_1_0_0.yaml
@@ -0,0 +1,423 @@
+swagger: "2.0"
+info:
+ description: "serviceInventory API designed for ONAP Beijing Release.\nThis API\
+ \ is build from TMF open API18.0 (applying TMF Guideline 3.0)\nonly operation\
+ \ GET (by id & byList) for resource serviceSpecification is available"
+ version: "1.0.0"
+ title: "API ServiceInventory"
+host: "serverRoot"
+basePath: "/nbi/api/v1"
+schemes:
+- "https"
+consumes:
+- "application/json;charset=utf-8"
+produces:
+- "application/json;charset=utf-8"
+tags:
+- name: "Service"
+ description: ""
+paths:
+ /service:
+ get:
+ tags:
+ - "Service"
+ operationId: "serviceFind"
+ summary: "List services"
+ description: "This operation list service entities. \nAttribute selection is\
+ \ restricted. \nfields attribute may be used to filter retrieved attribute(s)\
+ \ for each service\n\nSpecific business errors for current operation will\
+ \ be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n"
+ deprecated: false
+ parameters:
+ - name: "relatedParty.id"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "serviceSpecification.id"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "serviceSpecification.name"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "id"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "fields"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ type: "array"
+ items:
+ $ref: "#/definitions/ListService"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ /service/{id}:
+ get:
+ tags:
+ - "Service"
+ operationId: "serviceGet"
+ summary: "Retrieve a service"
+ description: "This operation retrieves a service entity. \nAttribute selection\
+ \ is enabled for all first level attributes.\n\nSpecific business errors for\
+ \ current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable\
+ \ entity\n"
+ deprecated: false
+ parameters:
+ - name: "id"
+ in: "path"
+ required: true
+ type: "string"
+ description: ""
+ - name: "relatedParty.id"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "serviceSpecification.id"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "serviceSpecification.name"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ $ref: "#/definitions/Service"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+definitions:
+ stateValues:
+ description: ""
+ type: "string"
+ enum:
+ - "feasibilityChecked"
+ - "designed"
+ - "reserved"
+ - "inactive"
+ - "active"
+ - "terminated"
+ ErrorRepresentation:
+ description: "This class is used to describe error.\nfor nbi Beijing release we\
+ \ do not manage additional error for serviceCatalog"
+ required:
+ - "code"
+ - "reason"
+ type: "object"
+ properties:
+ code:
+ description: "Application related code (as defined in the API or from a common\
+ \ list)"
+ type: "integer"
+ format: "int32"
+ reason:
+ description: "Text that explains the reason for error. This can be shown to\
+ \ a client user."
+ type: "string"
+ message:
+ description: "Text that provide more details and corrective actions related\
+ \ to the error. This can be shown to a client user."
+ type: "string"
+ status:
+ description: "http error code extension like 400-2"
+ type: "string"
+ referenceError:
+ description: "url pointing to documentation describing the error"
+ type: "string"
+ '@type':
+ description: "The class type of a REST resource."
+ type: "string"
+ '@schemaLocation':
+ description: "it provides a link to the schema describing a REST resource."
+ type: "string"
+ Service:
+ description: "Instantiated service (service_instance) in AAI"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service - Valued with service-instance-id"
+ type: "string"
+ href:
+ description: "Reference of the service\nNot managed in Beijing release"
+ type: "string"
+ name:
+ description: "Name of the service - Valued with service-instance-name"
+ type: "string"
+ type:
+ description: "Service type - valued with 'service-instance'"
+ type: "string"
+ state:
+ $ref: "#/definitions/stateValues"
+ hasStarted:
+ description: "This is a Boolean attribute that, if TRUE, signifies that this\
+ \ Service has already been started. If the value of this attribute is FALSE,\
+ \ then this signifies that this Service has NOT been Started\nNot managed\
+ \ in Beijing release"
+ type: "boolean"
+ '@type':
+ description: "This attribute allows to dynamically extends TMF class. Not\
+ \ used in Beijing release."
+ type: "string"
+ '@baseType':
+ description: "Not managed in Beijing release"
+ type: "string"
+ '@schemaLocation':
+ description: "Not managed in Beijing release"
+ type: "string"
+ serviceSpecification:
+ $ref: "#/definitions/ServiceSpecificationRef"
+ characteristic:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceCharacteristic"
+ supportingResource:
+ type: "array"
+ items:
+ $ref: "#/definitions/SupportingResource"
+ relatedParty:
+ type: "array"
+ items:
+ $ref: "#/definitions/RelatedPartyRef"
+ ServiceSpecificationRef:
+ description: "Service specification reference: ServiceSpecification of this service\
+ \ (catalog information)"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service specification. valued to model-version-id"
+ type: "string"
+ href:
+ description: "Reference of the service specification.\nnot managed in Beijing\
+ \ release."
+ type: "string"
+ name:
+ description: "Name of the required service specification"
+ type: "string"
+ version:
+ description: "Service specification version.\nNot managed in Beijing release"
+ type: "string"
+ '@referredType':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with 'ONAPservice'. We used this features to add following attribute:\
+ \ invariantUUID"
+ type: "string"
+ '@schemaLocation':
+ description: "Not managed in Beijing release"
+ type: "string"
+ invariantUUID:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @referredType - model-invariant-id"
+ type: "string"
+ ServiceCharacteristic:
+ description: "A list of name value pairs that define the service characteristics\n\
+ Not managed in Beijing release."
+ required:
+ - "name"
+ type: "object"
+ properties:
+ name:
+ description: "Name of the characteristic\nNot managed in Beijing release."
+ type: "string"
+ valueType:
+ description: "Type of value for this characteristic.\nNot managed in Beijing\
+ \ release."
+ type: "string"
+ value:
+ $ref: "#/definitions/Value"
+ SupportingResource:
+ description: "Supporting resource - A supportingResource will be retrieved for\
+ \ each relationship of the relationship-list where related-link describe a vnf"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the supporting resource - Valued to vnf-id"
+ type: "string"
+ href:
+ description: "Reference of the supporting resource"
+ type: "string"
+ role:
+ description: "Not managed in Beijing release."
+ type: "string"
+ name:
+ description: "Name of the supporting resource - Valued with vnf_-name"
+ type: "string"
+ '@referredType':
+ description: "This attribute allows to dynamically extends TMF class. Valued\
+ \ with 'ONAP resource'. We used this features to add following attributes:\n\
+ \ status\t\n modelInvariantId\n modelVersionId\n modelCustomisationId"
+ type: "string"
+ '@schemaLocation':
+ description: "Not managed in Beijing release."
+ type: "string"
+ status:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @referredType - valued with prov-status"
+ type: "string"
+ modelInvariantId:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @referredType - valued with model-invariant-id"
+ type: "string"
+ modelVersionId:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @referredType - valued with model-verson-id"
+ type: "string"
+ modelCustomisationId:
+ description: "Additional attribute (not in the TMF API) - extended through\
+ \ @referredType - valued with model-customisation-id"
+ type: "string"
+ RelatedPartyRef:
+ description: "RelatedParty reference. A related party defines party or party role\
+ \ linked to a specific entity.\nOnly ONAP Customer is managed in Beijing release."
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of a related party"
+ type: "string"
+ href:
+ description: "Reference of a related party.\nNot filled in Beijing release."
+ type: "string"
+ role:
+ description: "Role played by the related party.\nFilled with 'ONAPcustomer'"
+ type: "string"
+ '@referredType':
+ description: "Not managed in the Beijing release."
+ type: "string"
+ Value:
+ description: "Structure used to describe characteristic value.\nNot managed in\
+ \ Beijing release."
+ type: "object"
+ properties:
+ '@type':
+ description: "Not managed in Beijing release."
+ type: "string"
+ '@schemaLocation':
+ description: "Not managed in Beijing release."
+ type: "string"
+ serviceCharacteristicValue:
+ description: "Not managed in Beijing release."
+ type: "string"
+ ListRelatedPartyRef:
+ description: "This class is used to structure list of service(s) retrieved"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of a related party"
+ type: "string"
+ role:
+ description: "Role played by the related party - only role “ONAPcustomer”\
+ \ is managed in Beijing release."
+ type: "string"
+ ListServiceSpecificationRef:
+ description: "This class is used to structure list of service(s) retrieved"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service specification"
+ type: "string"
+ name:
+ description: "Name of the required service specification"
+ type: "string"
+ ListService:
+ description: "This class is used to structure list of service(s) retrieved"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service"
+ type: "string"
+ name:
+ description: "Name of the service"
+ type: "string"
+ serviceSpecification:
+ $ref: "#/definitions/ListServiceSpecificationRef"
+ relatedParty:
+ $ref: "#/definitions/ListRelatedPartyRef"
diff --git a/docs/offeredapis/swaggers/serviceOrder_1_0_0.json b/docs/offeredapis/swaggers/serviceOrder_1_0_0.json
new file mode 100644
index 0000000..9df30a3
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceOrder_1_0_0.json
@@ -0,0 +1,1071 @@
+
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "serviceOrder API designed for ONAP Beijing Release.\nThis API is build from TMF open API18.0 (applying TMF Guideline 3.0);\nOnly operations GET (by id and list) and POST are available.",
+ "version": "1.0.0_inProgress",
+ "title": "API ServiceOrder",
+ "x-logo": {
+ "url": "/redoc/logo.png",
+ "backgroundColor": "#FFFFFF"
+ }
+ },
+
+ "host": "serverRoot",
+ "basePath": "/nbi/api/v1",
+ "schemes": [
+ "https"
+ ],
+ "consumes": [
+ "application/json;charset=utf-8"
+ ],
+ "produces": [
+ "application/json;charset=utf-8"
+ ],
+ "tags": [
+
+ {
+ "name": "ServiceOrder",
+ "description": "A Service Order is a type of order which can be used to describe a group of operations on service – one service order item per service. An action at the level of the service order item describe the operation to be done on a service (add, terminate for example). The service order is triggered from the BSS system in charge of the product order management to ONAP that will manage the service fulfillment."
+ }
+ ],
+ "paths": {
+ "/serviceOrder": {
+ "post": {
+ "tags": [
+ "ServiceOrder"
+ ],
+ "operationId": "serviceOrderCreate",
+ "summary": "Create a service order",
+ "description": "This operation creates a service order entity.\nThe TMF Open API specification document provides the list of mandatory and non mandatory attributes when creating a ServiceOrder, including any possible rule conditions and applicable default values.\nPOST should be used without specifying the id and the href, the Service Order Management system is in charge of generating the id + href for the ServiceOrder.\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n\n - 100: OrderItem with 'add' action but serviceSpecification id missing\n \n - 101: OrderItem with 'change'/'noChange'/'remove' but service id missing\n \n - 102: OrderItem with 'add' action - serviceSpecification id provided but not existing\n \n - 103: OrderItem with 'add' action but service id already existing in the inventory\n \n - 104: A customer for existing service(s) is provided but he did not exist\n \n - 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory\n \n - 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided\n ",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "serviceOrder",
+ "required": true,
+ "in": "body",
+ "description": "",
+ "schema": {
+ "$ref": "#/definitions/CreateServiceOrder"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/CreateServiceOrder"
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error\n\nSpecific encapsulated business errors for current operation\n\n - 100: OrderItem with 'add' action but serviceSpecification id missing\n \n - 101: OrderItem with 'change'/'noChange'/'remove' but service id missing\n \n - 102: OrderItem with 'add' action - serviceSpecification id provided but not existing\n \n - 103: OrderItem with 'add' action but service id already existing in the inventory\n \n - 104: A customer for existing service(s) is provided but he did not exist\n \n - 105: OrderItem with 'change'/'noChange'/'remove' - Service id provided but it is not existing in the inventory\n \n - 106: [Not managed for current Relese] Issue with lcpCloudRegionId and tenantId provided\n ",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ },
+ "get": {
+ "tags": [
+ "ServiceOrder"
+ ],
+ "operationId": "serviceOrderFind",
+ "summary": "List service orders",
+ "description": "Retrieve and list service order entities according to given criteria.\nOnly a predefined set of attribute is proposed.\nAttribute selection could be described in the fields attribute.\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "externalId",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "state",
+ "required": false,
+ "in": "query",
+ "description": "state of the order(s) to be retrieved",
+
+ "type": "string"
+ },
+ {
+ "name": "description",
+ "required": false,
+ "in": "query",
+ "description": "",
+
+ "type": "string"
+ },
+ {
+ "name": "orderDate.gt",
+ "required": false,
+ "in": "query",
+ "description": "order date greather than",
+
+ "type": "string"
+ },
+ {
+ "name": "orderDate.lt",
+ "required": false,
+ "in": "query",
+ "description": "order date lower than",
+
+ "type": "string"
+ },
+ {
+ "name": "fields",
+ "required": false,
+ "in": "query",
+ "description": "this attribute could be used to filter retrieved attribute(s) and/or sort SO.",
+
+ "type": "string"
+ },
+ {
+ "name": "offset",
+ "required": false,
+ "in": "query",
+ "description": "The index of the first element to retrieve. Zero is the first element of the collection.",
+
+ "type": "integer",
+ "format": "int32"
+ },
+ {
+ "name": "limit",
+ "required": false,
+ "in": "query",
+ "description": "The maximum number of elements to retrieve (it can be greater than the actual available number of items).",
+
+ "type": "integer",
+ "format": "int32"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceOrder"
+ }
+ },
+ "headers": {
+ "X-Total-Count": {
+ "description": "",
+ "type": "integer",
+ "format": "int32"
+ },
+ "X-Result-Count": {
+ "description": "",
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ },
+ "/serviceOrder/{id}": {
+ "get": {
+ "tags": [
+ "ServiceOrder"
+ ],
+ "operationId": "serviceOrderGet",
+ "summary": "Retrieve a service order",
+ "description": "This operation retrieves a service order entity. \nAttribute selection is enabled for all first level attributes.\n\nSpecific business errors for current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n",
+ "deprecated": false,
+
+ "parameters": [
+
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "type": "string",
+ "description": ""
+ },
+ {
+ "name": "fields",
+ "required": false,
+ "in": "query",
+ "description": "Attribute selection",
+
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/ServiceOrder"
+ }
+
+ },
+ "400": {
+
+ "description": "Bad Request\n\nList of supported error codes:\n- 20: Invalid URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string parameter value",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "401": {
+
+ "description": "Unauthorized\n\nList of supported error codes:\n- 40: Missing credentials\n- 41: Invalid credentials\n- 42: Expired credentials",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "403": {
+
+ "description": "Forbidden\n\nList of supported error codes:\n- 50: Access denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many requests",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "404": {
+
+ "description": "Not Found\n\nList of supported error codes:\n- 60: Resource not found",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "422": {
+
+ "description": "Unprocessable entity\n\nFunctional error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "500": {
+
+ "description": "Internal Server Error\n\nList of supported error codes:\n- 1: Internal error",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ },
+ "503": {
+
+ "description": "Service Unavailable\n\nList of supported error codes:\n- 5: The service is temporarily unavailable\n- 6: Orange API is over capacity, retry later !",
+ "schema": {
+
+ "$ref": "#/definitions/ErrorRepresentation"
+ }
+ }
+ }
+ }
+ }
+ },
+"definitions": {
+
+ "ActionType": {
+ "description": "Action type to be describer on the order item.\nmodify is not managed in Beijing release",
+
+ "type": "string",
+ "enum": [
+ "add",
+ "modify",
+ "delete",
+ "noChange"]
+
+ },
+ "StateType": {
+ "description": "List of possible state for the order and the orderItem.",
+
+ "type": "string",
+ "enum": [
+ "acknowledged",
+ "rejected",
+ "pending",
+ "held",
+ "inProgress",
+ "cancelled",
+ "completed",
+ "failed",
+ "partial"]
+
+ },
+ "RelationshipType": {
+ "description": "Relationship type;\nOnly reliesOn is managed in Beijing release.",
+
+ "type": "string",
+ "enum": [
+ "reliesOn"]
+
+ },
+
+ "ErrorRepresentation": {
+ "description": "Representation of an error.",
+
+
+ "required": [
+
+ "code",
+ "reason"
+ ],
+ "type": "object",
+ "properties": {
+ "code": {
+ "description": "Application related code (as defined in the API or from a common list)",
+ "type": "integer",
+ "format": "int32"
+ },
+ "reason": {
+ "description": "Text that explains the reason for error. This can be shown to a client user.",
+ "type": "string"
+ },
+ "message": {
+ "description": "Text that provide more details and corrective actions related to the error. This can be shown to a client user",
+ "type": "string"
+ },
+ "status": {
+ "description": "http error code extension like 400-2",
+ "type": "string"
+ },
+ "referenceError": {
+ "description": "url pointing to documentation describing the error",
+ "type": "string"
+ },
+ "@type": {
+ "description": "The class type of a REST resource",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "it provides a link to the schema describing a REST resource",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceRelationship": {
+ "description": "Linked Services to the one instantiate\nnbi component used this relationship to sort request to ONAP.",
+
+
+ "required": [
+
+ "type",
+ "service"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+
+ "$ref": "#/definitions/RelationshipType"
+ },
+ "service": {
+
+ "$ref": "#/definitions/Service"
+ }
+ }
+
+ },
+
+ "ServiceRef": {
+ "description": "Service references",
+
+
+ "required": [
+
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the service",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceCharacteristic": {
+ "description": "ServiceCharacteristic",
+
+
+ "required": [
+
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "Name of characteristic",
+ "type": "string"
+ },
+ "valueType": {
+ "description": "",
+ "type": "string"
+ },
+ "value": {
+
+ "$ref": "#/definitions/Value"
+ }
+ }
+
+ },
+
+ "RelatedParty": {
+ "description": "A related party defines party which are involved in this order and the role they are playing.\nfor Beijing release:\nWith the current version of APIs used from SO and AAI we need to manage a ‘customer’. This customer concept is confusing with Customer BSS concept. We took the following rules to manage the ‘customer’ information:\no\tIt could be provided through a serviceOrder in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided in the serviceOrder header (we will not consider in this release the party at item level); External API component will check if this customer exists and create it in AAI if not.\no\tIf no relatedParty are provided the service will be affected to ‘generic’ customer (dummy customer) – we assume this ‘generic’ customer always exists.",
+
+
+ "required": [
+
+ "id",
+ "role"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of a related party",
+ "type": "string"
+ },
+ "href": {
+ "description": "An hyperlink to the party - not used in Beijnig release",
+ "type": "string"
+ },
+ "role": {
+ "description": "The role of the related party (e.g. Owner, requester, fullfiller etc).\nONLY 'ONAPcustomer' is considered",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the related party",
+ "type": "string"
+ },
+ "@referredType": {
+ "description": "",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceSpecificationRef": {
+ "description": "The service specification (these attributes are fetched from the catalogue).",
+
+
+ "required": [
+
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Unique identifier of the service specification\nThis information will be used to retrieve SDC information + mapped to SO ModelNameVersionIdin the request.",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference of the service specification\nNot used in Beijing release.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the service specification\nNot used in Beijing release",
+ "type": "string"
+ },
+ "version": {
+ "description": "Version of the service Specification\nNot used in Beijing release",
+ "type": "string"
+ },
+ "targetServiceSchema": {
+
+ "$ref": "#/definitions/TargetServiceSchema"
+ },
+ "@type": {
+ "description": "Not used in Beijing release",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "Not used in Beijing release",
+ "type": "string"
+ },
+ "@baseType": {
+ "description": "Not used in Beijing release",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "Service": {
+ "description": "Service (to be added, modified, deleted) description",
+
+
+ "required": [
+
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Identifier of a service instance.\nIt must be valued if orderItem action is 'delete' and corresponds to a AAI service.id",
+ "type": "string"
+ },
+ "href": {
+ "description": "Reference to the Service (useful for delete or modify command).\nNot managed in Beijing release.",
+ "type": "string"
+ },
+ "name": {
+ "description": "Name of the service - When orderItem action is 'add' this name will be used in ONAP/SO request as InstaceName.",
+ "type": "string"
+ },
+ "serviceState": {
+ "description": "The lifecycle state of the service requested;\nNot managed in Beijing release.",
+ "type": "string"
+ },
+ "@type": {
+ "description": "To define the service type\nNot managed in Beijing Release",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "The URL to get the resource schema.\nNot managed in Beijing Release",
+ "type": "string"
+ },
+ "serviceCharacteristic": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceCharacteristic"
+ }
+ },
+ "serviceRelationship": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceRelationship"
+ }
+ },
+ "relatedParty": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/RelatedParty"
+ }
+ },
+ "serviceSpecification": {
+
+ "$ref": "#/definitions/ServiceSpecificationRef"
+ }
+ }
+
+ },
+
+ "OrderItemRelationship": {
+ "description": "Linked order item to the one containing this attribute.\nnbi component used this relationship to sort request to ONAP.",
+
+
+ "required": [
+
+ "type",
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+
+ "$ref": "#/definitions/RelationshipType"
+ },
+ "id": {
+ "description": "Unique identifier of an order item",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "ServiceOrderItem": {
+ "description": "An identified part of the order. A service order is decomposed into one or more order items.",
+
+
+ "required": [
+
+ "id",
+ "service"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Identifier of the line item (generally it is a sequence number 01, 02, 03, …)",
+ "type": "string"
+ },
+ "action": {
+
+ "$ref": "#/definitions/ActionType"
+ },
+ "state": {
+
+ "$ref": "#/definitions/StateType"
+ },
+ "@type": {
+ "description": "Used to extend the order item.\nnot used in Beijing relase",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "not used in Beijing relase",
+ "type": "string"
+ },
+ "@baseType": {
+ "description": "not used in Beijing relase",
+ "type": "string"
+ },
+ "orderItemRelationship": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/OrderItemRelationship"
+ }
+ },
+ "service": {
+
+ "$ref": "#/definitions/Service"
+ }
+ }
+
+ },
+
+ "ServiceOrder": {
+ "description": "A Service Order is a type of order which can be used to place an order between a customer and a service provider or between a service provider and a partner and vice versa",
+
+
+ "required": [
+
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "ID created on repository side",
+ "type": "string"
+ },
+ "href": {
+ "description": "Hyperlink to access the order",
+ "type": "string"
+ },
+ "externalId": {
+ "description": "ID given by the consumer and only understandable by him (to facilitate his searches)",
+ "type": "string"
+ },
+ "priority": {
+ "description": "A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)",
+ "type": "string"
+ },
+ "description": {
+ "description": "A free-text description of the service order",
+ "type": "string"
+ },
+ "category": {
+ "description": "Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, ...)",
+ "type": "string"
+ },
+ "state": {
+
+ "$ref": "#/definitions/StateType"
+ },
+ "orderDate": {
+ "description": "",
+ "type": "string",
+ "format": "date-time"
+ },
+ "completionDateTime": {
+ "description": "Date when the order was completed",
+ "type": "string",
+ "format": "date-time"
+ },
+ "requestedStartDate": {
+ "description": "Order start date wished by the requestor",
+ "type": "string",
+ "format": "date-time"
+ },
+ "requestedCompletionDate": {
+ "description": "Requested delivery date from the requestor perspective",
+ "type": "string",
+ "format": "date-time"
+ },
+ "expectedCompletionDate": {
+ "description": "",
+ "type": "string",
+ "format": "date-time"
+ },
+ "startDate": {
+ "description": "Date when the order was started for processing",
+ "type": "string",
+ "format": "date-time"
+ },
+ "@baseType": {
+ "description": "",
+ "type": "string"
+ },
+ "@type": {
+ "description": "",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "",
+ "type": "string"
+ },
+ "relatedParty": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/RelatedParty"
+ }
+ },
+ "orderRelationship": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/OrderRelationship"
+ }
+ },
+ "orderItem": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServiceOrderItem"
+ }
+ }
+ }
+
+ },
+
+ "OrderRelationship": {
+ "description": "Linked order to the one containing this attribute.\nThis relationship is not used to sort ONAP request.",
+
+
+ "required": [
+
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "description": "The type of related order, can be : “dependency” if the order needs to be “not started” until another order item is complete (a service order in this case) or “cross-ref” to keep track of the source order (a productOrder)",
+ "type": "string"
+ },
+ "id": {
+ "description": "The id of the related order",
+ "type": "string"
+ },
+ "href": {
+ "description": "A hyperlink to the related order",
+ "type": "string"
+ },
+ "@referredType": {
+ "description": "Type of the referred order.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "TargetServiceSchema": {
+ "description": "Target to the schema describing the service spec resource",
+
+
+ "required": [
+
+ "@type",
+ "@schemaLocation"
+ ],
+ "type": "object",
+ "properties": {
+ "@type": {
+ "description": "Indicates the (class) type of resource.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "This field provided a link to the schema describing this REST resource.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "Value": {
+ "description": "Value is a descriptive structure for service characteristic;\nFor Beijing we only manage 'basic' attribute - the serviceCharacteristicValue must be used.",
+
+
+ "type": "object",
+ "properties": {
+ "@type": {
+ "description": "Indicates the (class) type of resource.\nNot used in Beijing Release",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "This field provided a link to the schema describing this REST resource.\nNot used in Beijing Release",
+ "type": "string"
+ },
+ "serviceCharacteristicValue": {
+ "description": "Value of the characteristic.\nThis attribute must be used in Beijing Release to provide characteristic value.",
+ "type": "string"
+ }
+ }
+
+ },
+
+ "CreateServiceOrderItem": {
+ "description": "This structure is used in the operation POST for a serviceOrder request to describe an item.\nAttribute description is not accurate and should be find in the serviceOrderItem class.",
+
+
+ "required": [
+
+ "id",
+ "service"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "Identifier of the line item (generally it is a sequence number 01, 02, 03, …)",
+ "type": "string"
+ },
+ "action": {
+
+ "$ref": "#/definitions/ActionType"
+ },
+ "@type": {
+ "description": "Indicates the type of resource.",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "A link to the schema describing this REST resource",
+ "type": "string"
+ },
+ "@baseType": {
+ "description": "Indicates the base type of the resource.",
+ "type": "string"
+ },
+ "orderItemRelationship": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/OrderItemRelationship"
+ }
+ },
+ "service": {
+
+ "$ref": "#/definitions/Service"
+ }
+ }
+
+ },
+
+ "CreateServiceOrder": {
+ "description": "This structure is used in the operation POST for a serviceOrder request.\nAttribute description is not accurate and should be find in the serviceOrder class.",
+
+
+ "type": "object",
+ "properties": {
+ "externalId": {
+ "description": "ID given by the consumer and only understandable by him (to facilitate his searches)",
+ "type": "string"
+ },
+ "priority": {
+ "description": "A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)",
+ "type": "string"
+ },
+ "description": {
+ "description": "A free-text description of the service order",
+ "type": "string"
+ },
+ "category": {
+ "description": "Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, ...)",
+ "type": "string"
+ },
+ "requestedStartDate": {
+ "description": "Order start date wished by the requestor",
+ "type": "string",
+ "format": "date-time"
+ },
+ "requestedCompletionDate": {
+ "description": "Requested delivery date from the requestor perspective",
+ "type": "string",
+ "format": "date-time"
+ },
+ "@baseType": {
+ "description": "",
+ "type": "string"
+ },
+ "@type": {
+ "description": "",
+ "type": "string"
+ },
+ "@schemaLocation": {
+ "description": "",
+ "type": "string"
+ },
+ "relatedParty": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/RelatedParty"
+ }
+ },
+ "orderRelationship": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/OrderRelationship"
+ }
+ },
+ "orderItem": {
+
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/CreateServiceOrderItem"
+ }
+ }
+ }
+
+ },
+
+ "Hub": {
+ "description": "An HUB resource is used by client side to subscribe to notification.\nNot managed in the Beijing release.",
+
+
+ "discriminator": "id",
+
+ "required": [
+
+ "callback"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "",
+ "type": "string"
+ },
+ "query": {
+ "description": "",
+ "type": "string"
+ },
+ "callback": {
+ "description": "",
+ "type": "string"
+ }
+ }
+
+ }
+ }
+}
+ \ No newline at end of file
diff --git a/docs/offeredapis/swaggers/serviceOrder_1_0_0.yaml b/docs/offeredapis/swaggers/serviceOrder_1_0_0.yaml
new file mode 100644
index 0000000..9d26cd3
--- /dev/null
+++ b/docs/offeredapis/swaggers/serviceOrder_1_0_0.yaml
@@ -0,0 +1,768 @@
+swagger: "2.0"
+info:
+ description: "serviceOrder API designed for ONAP Beijing Release.\nThis API is build\
+ \ from TMF open API18.0 (applying TMF Guideline 3.0);\nOnly operations GET (by\
+ \ id and list) and POST are available."
+ version: "1.0.0_inProgress"
+ title: "API ServiceOrder"
+ x-logo:
+ url: "/redoc/logo.png"
+ backgroundColor: "#FFFFFF"
+host: "serverRoot"
+basePath: "/nbi/api/v1"
+schemes:
+- "https"
+consumes:
+- "application/json;charset=utf-8"
+produces:
+- "application/json;charset=utf-8"
+tags:
+- name: "ServiceOrder"
+ description: "A Service Order is a type of order which can be used to describe a\
+ \ group of operations on service – one service order item per service. An action\
+ \ at the level of the service order item describe the operation to be done on\
+ \ a service (add, terminate for example). The service order is triggered from\
+ \ the BSS system in charge of the product order management to ONAP that will manage\
+ \ the service fulfillment."
+paths:
+ /serviceOrder:
+ post:
+ tags:
+ - "ServiceOrder"
+ operationId: "serviceOrderCreate"
+ summary: "Create a service order"
+ description: "This operation creates a service order entity.\nThe TMF Open API\
+ \ specification document provides the list of mandatory and non mandatory\
+ \ attributes when creating a ServiceOrder, including any possible rule conditions\
+ \ and applicable default values.\nPOST should be used without specifying the\
+ \ id and the href, the Service Order Management system is in charge of generating\
+ \ the id + href for the ServiceOrder.\n\nSpecific business errors for current\
+ \ operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n\
+ \n - 100: OrderItem with 'add' action but serviceSpecification id missing\n\
+ \ \n - 101: OrderItem with 'change'/'noChange'/'remove' but service id missing\n\
+ \ \n - 102: OrderItem with 'add' action - serviceSpecification id provided\
+ \ but not existing\n \n - 103: OrderItem with 'add' action but service id\
+ \ already existing in the inventory\n \n - 104: A customer for existing\
+ \ service(s) is provided but he did not exist\n \n - 105: OrderItem with\
+ \ 'change'/'noChange'/'remove' - Service id provided but it is not existing\
+ \ in the inventory\n \n - 106: [Not managed for current Relese] Issue with\
+ \ lcpCloudRegionId and tenantId provided\n "
+ deprecated: false
+ parameters:
+ - name: "serviceOrder"
+ required: true
+ in: "body"
+ description: ""
+ schema:
+ $ref: "#/definitions/CreateServiceOrder"
+ responses:
+ 201:
+ description: "Success"
+ schema:
+ $ref: "#/definitions/CreateServiceOrder"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error\n\nSpecific encapsulated\
+ \ business errors for current operation\n\n - 100: OrderItem with 'add'\
+ \ action but serviceSpecification id missing\n \n - 101: OrderItem with\
+ \ 'change'/'noChange'/'remove' but service id missing\n \n - 102: OrderItem\
+ \ with 'add' action - serviceSpecification id provided but not existing\n\
+ \ \n - 103: OrderItem with 'add' action but service id already existing\
+ \ in the inventory\n \n - 104: A customer for existing service(s) is\
+ \ provided but he did not exist\n \n - 105: OrderItem with 'change'/'noChange'/'remove'\
+ \ - Service id provided but it is not existing in the inventory\n \n\
+ \ - 106: [Not managed for current Relese] Issue with lcpCloudRegionId\
+ \ and tenantId provided\n "
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ get:
+ tags:
+ - "ServiceOrder"
+ operationId: "serviceOrderFind"
+ summary: "List service orders"
+ description: "Retrieve and list service order entities according to given criteria.\n\
+ Only a predefined set of attribute is proposed.\nAttribute selection could\
+ \ be described in the fields attribute.\n\nSpecific business errors for current\
+ \ operation will be encapsulated in\n\nHTTP Response 422 Unprocessable entity\n"
+ deprecated: false
+ parameters:
+ - name: "externalId"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "state"
+ required: false
+ in: "query"
+ description: "state of the order(s) to be retrieved"
+ type: "string"
+ - name: "description"
+ required: false
+ in: "query"
+ description: ""
+ type: "string"
+ - name: "orderDate.gt"
+ required: false
+ in: "query"
+ description: "order date greather than"
+ type: "string"
+ - name: "orderDate.lt"
+ required: false
+ in: "query"
+ description: "order date lower than"
+ type: "string"
+ - name: "fields"
+ required: false
+ in: "query"
+ description: "this attribute could be used to filter retrieved attribute(s)\
+ \ and/or sort SO."
+ type: "string"
+ - name: "offset"
+ required: false
+ in: "query"
+ description: "The index of the first element to retrieve. Zero is the first\
+ \ element of the collection."
+ type: "integer"
+ format: "int32"
+ - name: "limit"
+ required: false
+ in: "query"
+ description: "The maximum number of elements to retrieve (it can be greater\
+ \ than the actual available number of items)."
+ type: "integer"
+ format: "int32"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceOrder"
+ headers:
+ X-Total-Count:
+ description: ""
+ type: "integer"
+ format: "int32"
+ X-Result-Count:
+ description: ""
+ type: "integer"
+ format: "int32"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ /serviceOrder/{id}:
+ get:
+ tags:
+ - "ServiceOrder"
+ operationId: "serviceOrderGet"
+ summary: "Retrieve a service order"
+ description: "This operation retrieves a service order entity. \nAttribute selection\
+ \ is enabled for all first level attributes.\n\nSpecific business errors for\
+ \ current operation will be encapsulated in\n\nHTTP Response 422 Unprocessable\
+ \ entity\n"
+ deprecated: false
+ parameters:
+ - name: "id"
+ in: "path"
+ required: true
+ type: "string"
+ description: ""
+ - name: "fields"
+ required: false
+ in: "query"
+ description: "Attribute selection"
+ type: "string"
+ responses:
+ 200:
+ description: "Success"
+ schema:
+ $ref: "#/definitions/ServiceOrder"
+ 400:
+ description: "Bad Request\n\nList of supported error codes:\n- 20: Invalid\
+ \ URL parameter value\n- 21: Missing body\n- 22: Invalid body\n- 23: Missing\
+ \ body field\n- 24: Invalid body field\n- 25: Missing header\n- 26: Invalid\
+ \ header value\n- 27: Missing query-string parameter\n- 28: Invalid query-string\
+ \ parameter value"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 401:
+ description: "Unauthorized\n\nList of supported error codes:\n- 40: Missing\
+ \ credentials\n- 41: Invalid credentials\n- 42: Expired credentials"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 403:
+ description: "Forbidden\n\nList of supported error codes:\n- 50: Access\
+ \ denied\n- 51: Forbidden requester\n- 52: Forbidden user\n- 53: Too many\
+ \ requests"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 404:
+ description: "Not Found\n\nList of supported error codes:\n- 60: Resource\
+ \ not found"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 422:
+ description: "Unprocessable entity\n\nFunctional error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 500:
+ description: "Internal Server Error\n\nList of supported error codes:\n\
+ - 1: Internal error"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+ 503:
+ description: "Service Unavailable\n\nList of supported error codes:\n- 5:\
+ \ The service is temporarily unavailable\n- 6: Orange API is over capacity,\
+ \ retry later !"
+ schema:
+ $ref: "#/definitions/ErrorRepresentation"
+definitions:
+ ActionType:
+ description: "Action type to be describer on the order item.\nmodify is not managed\
+ \ in Beijing release"
+ type: "string"
+ enum:
+ - "add"
+ - "modify"
+ - "delete"
+ - "noChange"
+ StateType:
+ description: "List of possible state for the order and the orderItem."
+ type: "string"
+ enum:
+ - "acknowledged"
+ - "rejected"
+ - "pending"
+ - "held"
+ - "inProgress"
+ - "cancelled"
+ - "completed"
+ - "failed"
+ - "partial"
+ RelationshipType:
+ description: "Relationship type;\nOnly reliesOn is managed in Beijing release."
+ type: "string"
+ enum:
+ - "reliesOn"
+ ErrorRepresentation:
+ description: "Representation of an error."
+ required:
+ - "code"
+ - "reason"
+ type: "object"
+ properties:
+ code:
+ description: "Application related code (as defined in the API or from a common\
+ \ list)"
+ type: "integer"
+ format: "int32"
+ reason:
+ description: "Text that explains the reason for error. This can be shown to\
+ \ a client user."
+ type: "string"
+ message:
+ description: "Text that provide more details and corrective actions related\
+ \ to the error. This can be shown to a client user"
+ type: "string"
+ status:
+ description: "http error code extension like 400-2"
+ type: "string"
+ referenceError:
+ description: "url pointing to documentation describing the error"
+ type: "string"
+ '@type':
+ description: "The class type of a REST resource"
+ type: "string"
+ '@schemaLocation':
+ description: "it provides a link to the schema describing a REST resource"
+ type: "string"
+ ServiceRelationship:
+ description: "Linked Services to the one instantiate\nnbi component used this\
+ \ relationship to sort request to ONAP."
+ required:
+ - "type"
+ - "service"
+ type: "object"
+ properties:
+ type:
+ $ref: "#/definitions/RelationshipType"
+ service:
+ $ref: "#/definitions/Service"
+ ServiceRef:
+ description: "Service references"
+ required:
+ - "id"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service"
+ type: "string"
+ href:
+ description: "Reference of the service"
+ type: "string"
+ ServiceCharacteristic:
+ description: "ServiceCharacteristic"
+ required:
+ - "name"
+ type: "object"
+ properties:
+ name:
+ description: "Name of characteristic"
+ type: "string"
+ valueType:
+ description: ""
+ type: "string"
+ value:
+ $ref: "#/definitions/Value"
+ RelatedParty:
+ description: "A related party defines party which are involved in this order and\
+ \ the role they are playing.\nfor Beijing release:\nWith the current version\
+ \ of APIs used from SO and AAI we need to manage a ‘customer’. This customer\
+ \ concept is confusing with Customer BSS concept. We took the following rules\
+ \ to manage the ‘customer’ information:\no\tIt could be provided through a serviceOrder\
+ \ in the service Order a relatedParty with role ‘ONAPcustomer’ should be provided\
+ \ in the serviceOrder header (we will not consider in this release the party\
+ \ at item level); External API component will check if this customer exists\
+ \ and create it in AAI if not.\no\tIf no relatedParty are provided the service\
+ \ will be affected to ‘generic’ customer (dummy customer) – we assume this ‘\
+ generic’ customer always exists."
+ required:
+ - "id"
+ - "role"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of a related party"
+ type: "string"
+ href:
+ description: "An hyperlink to the party - not used in Beijnig release"
+ type: "string"
+ role:
+ description: "The role of the related party (e.g. Owner, requester, fullfiller\
+ \ etc).\nONLY 'ONAPcustomer' is considered"
+ type: "string"
+ name:
+ description: "Name of the related party"
+ type: "string"
+ '@referredType':
+ description: ""
+ type: "string"
+ ServiceSpecificationRef:
+ description: "The service specification (these attributes are fetched from the\
+ \ catalogue)."
+ required:
+ - "id"
+ type: "object"
+ properties:
+ id:
+ description: "Unique identifier of the service specification\nThis information\
+ \ will be used to retrieve SDC information + mapped to SO ModelNameVersionIdin\
+ \ the request."
+ type: "string"
+ href:
+ description: "Reference of the service specification\nNot used in Beijing\
+ \ release."
+ type: "string"
+ name:
+ description: "Name of the service specification\nNot used in Beijing release"
+ type: "string"
+ version:
+ description: "Version of the service Specification\nNot used in Beijing release"
+ type: "string"
+ targetServiceSchema:
+ $ref: "#/definitions/TargetServiceSchema"
+ '@type':
+ description: "Not used in Beijing release"
+ type: "string"
+ '@schemaLocation':
+ description: "Not used in Beijing release"
+ type: "string"
+ '@baseType':
+ description: "Not used in Beijing release"
+ type: "string"
+ Service:
+ description: "Service (to be added, modified, deleted) description"
+ required:
+ - "id"
+ type: "object"
+ properties:
+ id:
+ description: "Identifier of a service instance.\nIt must be valued if orderItem\
+ \ action is 'delete' and corresponds to a AAI service.id"
+ type: "string"
+ href:
+ description: "Reference to the Service (useful for delete or modify command).\n\
+ Not managed in Beijing release."
+ type: "string"
+ name:
+ description: "Name of the service - When orderItem action is 'add' this name\
+ \ will be used in ONAP/SO request as InstaceName."
+ type: "string"
+ serviceState:
+ description: "The lifecycle state of the service requested;\nNot managed in\
+ \ Beijing release."
+ type: "string"
+ '@type':
+ description: "To define the service type\nNot managed in Beijing Release"
+ type: "string"
+ '@schemaLocation':
+ description: "The URL to get the resource schema.\nNot managed in Beijing\
+ \ Release"
+ type: "string"
+ serviceCharacteristic:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceCharacteristic"
+ serviceRelationship:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceRelationship"
+ relatedParty:
+ type: "array"
+ items:
+ $ref: "#/definitions/RelatedParty"
+ serviceSpecification:
+ $ref: "#/definitions/ServiceSpecificationRef"
+ OrderItemRelationship:
+ description: "Linked order item to the one containing this attribute.\nnbi component\
+ \ used this relationship to sort request to ONAP."
+ required:
+ - "type"
+ - "id"
+ type: "object"
+ properties:
+ type:
+ $ref: "#/definitions/RelationshipType"
+ id:
+ description: "Unique identifier of an order item"
+ type: "string"
+ ServiceOrderItem:
+ description: "An identified part of the order. A service order is decomposed into\
+ \ one or more order items."
+ required:
+ - "id"
+ - "service"
+ type: "object"
+ properties:
+ id:
+ description: "Identifier of the line item (generally it is a sequence number\
+ \ 01, 02, 03, …)"
+ type: "string"
+ action:
+ $ref: "#/definitions/ActionType"
+ state:
+ $ref: "#/definitions/StateType"
+ '@type':
+ description: "Used to extend the order item.\nnot used in Beijing relase"
+ type: "string"
+ '@schemaLocation':
+ description: "not used in Beijing relase"
+ type: "string"
+ '@baseType':
+ description: "not used in Beijing relase"
+ type: "string"
+ orderItemRelationship:
+ type: "array"
+ items:
+ $ref: "#/definitions/OrderItemRelationship"
+ service:
+ $ref: "#/definitions/Service"
+ ServiceOrder:
+ description: "A Service Order is a type of order which can be used to place an\
+ \ order between a customer and a service provider or between a service provider\
+ \ and a partner and vice versa"
+ required:
+ - "id"
+ type: "object"
+ properties:
+ id:
+ description: "ID created on repository side"
+ type: "string"
+ href:
+ description: "Hyperlink to access the order"
+ type: "string"
+ externalId:
+ description: "ID given by the consumer and only understandable by him (to\
+ \ facilitate his searches)"
+ type: "string"
+ priority:
+ description: "A way that can be used by consumers to prioritize orders in\
+ \ Service Order Management system (from 0 to 4 : 0 is the highest priority,\
+ \ and 4 the lowest)"
+ type: "string"
+ description:
+ description: "A free-text description of the service order"
+ type: "string"
+ category:
+ description: "Used to categorize the order that can be useful for the OM system\
+ \ (e.g. “broadband”, “TVOption”, ...)"
+ type: "string"
+ state:
+ $ref: "#/definitions/StateType"
+ orderDate:
+ description: ""
+ type: "string"
+ format: "date-time"
+ completionDateTime:
+ description: "Date when the order was completed"
+ type: "string"
+ format: "date-time"
+ requestedStartDate:
+ description: "Order start date wished by the requestor"
+ type: "string"
+ format: "date-time"
+ requestedCompletionDate:
+ description: "Requested delivery date from the requestor perspective"
+ type: "string"
+ format: "date-time"
+ expectedCompletionDate:
+ description: ""
+ type: "string"
+ format: "date-time"
+ startDate:
+ description: "Date when the order was started for processing"
+ type: "string"
+ format: "date-time"
+ '@baseType':
+ description: ""
+ type: "string"
+ '@type':
+ description: ""
+ type: "string"
+ '@schemaLocation':
+ description: ""
+ type: "string"
+ relatedParty:
+ type: "array"
+ items:
+ $ref: "#/definitions/RelatedParty"
+ orderRelationship:
+ type: "array"
+ items:
+ $ref: "#/definitions/OrderRelationship"
+ orderItem:
+ type: "array"
+ items:
+ $ref: "#/definitions/ServiceOrderItem"
+ OrderRelationship:
+ description: "Linked order to the one containing this attribute.\nThis relationship\
+ \ is not used to sort ONAP request."
+ required:
+ - "id"
+ type: "object"
+ properties:
+ type:
+ description: "The type of related order, can be : “dependency” if the order\
+ \ needs to be “not started” until another order item is complete (a service\
+ \ order in this case) or “cross-ref” to keep track of the source order (a\
+ \ productOrder)"
+ type: "string"
+ id:
+ description: "The id of the related order"
+ type: "string"
+ href:
+ description: "A hyperlink to the related order"
+ type: "string"
+ '@referredType':
+ description: "Type of the referred order."
+ type: "string"
+ TargetServiceSchema:
+ description: "Target to the schema describing the service spec resource"
+ required:
+ - "@type"
+ - "@schemaLocation"
+ type: "object"
+ properties:
+ '@type':
+ description: "Indicates the (class) type of resource."
+ type: "string"
+ '@schemaLocation':
+ description: "This field provided a link to the schema describing this REST\
+ \ resource."
+ type: "string"
+ Value:
+ description: "Value is a descriptive structure for service characteristic;\nFor\
+ \ Beijing we only manage 'basic' attribute - the serviceCharacteristicValue\
+ \ must be used."
+ type: "object"
+ properties:
+ '@type':
+ description: "Indicates the (class) type of resource.\nNot used in Beijing\
+ \ Release"
+ type: "string"
+ '@schemaLocation':
+ description: "This field provided a link to the schema describing this REST\
+ \ resource.\nNot used in Beijing Release"
+ type: "string"
+ serviceCharacteristicValue:
+ description: "Value of the characteristic.\nThis attribute must be used in\
+ \ Beijing Release to provide characteristic value."
+ type: "string"
+ CreateServiceOrderItem:
+ description: "This structure is used in the operation POST for a serviceOrder\
+ \ request to describe an item.\nAttribute description is not accurate and should\
+ \ be find in the serviceOrderItem class."
+ required:
+ - "id"
+ - "service"
+ type: "object"
+ properties:
+ id:
+ description: "Identifier of the line item (generally it is a sequence number\
+ \ 01, 02, 03, …)"
+ type: "string"
+ action:
+ $ref: "#/definitions/ActionType"
+ '@type':
+ description: "Indicates the type of resource."
+ type: "string"
+ '@schemaLocation':
+ description: "A link to the schema describing this REST resource"
+ type: "string"
+ '@baseType':
+ description: "Indicates the base type of the resource."
+ type: "string"
+ orderItemRelationship:
+ type: "array"
+ items:
+ $ref: "#/definitions/OrderItemRelationship"
+ service:
+ $ref: "#/definitions/Service"
+ CreateServiceOrder:
+ description: "This structure is used in the operation POST for a serviceOrder\
+ \ request.\nAttribute description is not accurate and should be find in the\
+ \ serviceOrder class."
+ type: "object"
+ properties:
+ externalId:
+ description: "ID given by the consumer and only understandable by him (to\
+ \ facilitate his searches)"
+ type: "string"
+ priority:
+ description: "A way that can be used by consumers to prioritize orders in\
+ \ Service Order Management system (from 0 to 4 : 0 is the highest priority,\
+ \ and 4 the lowest)"
+ type: "string"
+ description:
+ description: "A free-text description of the service order"
+ type: "string"
+ category:
+ description: "Used to categorize the order that can be useful for the OM system\
+ \ (e.g. “broadband”, “TVOption”, ...)"
+ type: "string"
+ requestedStartDate:
+ description: "Order start date wished by the requestor"
+ type: "string"
+ format: "date-time"
+ requestedCompletionDate:
+ description: "Requested delivery date from the requestor perspective"
+ type: "string"
+ format: "date-time"
+ '@baseType':
+ description: ""
+ type: "string"
+ '@type':
+ description: ""
+ type: "string"
+ '@schemaLocation':
+ description: ""
+ type: "string"
+ relatedParty:
+ type: "array"
+ items:
+ $ref: "#/definitions/RelatedParty"
+ orderRelationship:
+ type: "array"
+ items:
+ $ref: "#/definitions/OrderRelationship"
+ orderItem:
+ type: "array"
+ items:
+ $ref: "#/definitions/CreateServiceOrderItem"
+ Hub:
+ description: "An HUB resource is used by client side to subscribe to notification.\n\
+ Not managed in the Beijing release."
+ discriminator: "id"
+ required:
+ - "callback"
+ type: "object"
+ properties:
+ id:
+ description: ""
+ type: "string"
+ query:
+ description: ""
+ type: "string"
+ callback:
+ description: ""
+ type: "string"
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..9e03cc6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.nbi</groupId>
+ <artifactId>nbi-rest-services</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>nbi-rest-services</name>
+
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>1.5.10.RELEASE</version>
+ <relativePath /> <!-- lookup parent from repository -->
+ </parent>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
+ <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
+ <stagingNexusPath>/content/repositories/staging/</stagingNexusPath>
+ <java.version>1.8</java.version>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>maven2-repository.java.net</id>
+ <name>Java.net Repository for Maven</name>
+ <url>http://download.java.net/maven/2/</url>
+ <layout>default</layout>
+ </repository>
+ <repository>
+ <id>ecomp-snapshots</id>
+ <name>Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </repository>
+ <repository>
+ <id>ecomp-staging</id>
+ <name>Staging Repository</name>
+ <url>${nexusproxy}/${stagingNexusPath}</url>
+ </repository>
+ </repositories>
+
+ <distributionManagement>
+ <repository>
+ <id>ecomp-releases</id>
+ <name>Release Repository</name>
+ <url>${nexusproxy}/${releaseNexusPath}</url>
+ </repository>
+ <snapshotRepository>
+ <id>ecomp-snapshots</id>
+ <name>Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </snapshotRepository>
+ </distributionManagement>
+
+ <licenses>
+ <license>
+ <name>Apache2</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ </license>
+ </licenses>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ <version>1.9.3</version>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>2.0.1.Final</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.4</version>
+ </dependency>
+
+ <!-- mongo -->
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-mongodb</artifactId>
+ </dependency>
+
+ <!-- mysql -->
+
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </dependency>
+
+ <!-- swagger -->
+
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-annotations</artifactId>
+ <version>1.5.18</version>
+ </dependency>
+
+ <!-- jackson -->
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.dataformat</groupId>
+ <artifactId>jackson-dataformat-yaml</artifactId>
+ <version>2.8.0</version>
+ </dependency>
+
+ <!-- jolt -->
+
+ <dependency>
+ <groupId>com.bazaarvoice.jolt</groupId>
+ <artifactId>jolt-core</artifactId>
+ <version>0.1.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.bazaarvoice.jolt</groupId>
+ <artifactId>json-utils</artifactId>
+ <version>0.1.0</version>
+ </dependency>
+
+ <!-- test -->
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- test h2 -->
+
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>de.flapdoodle.embed</groupId>
+ <artifactId>de.flapdoodle.embed.mongo</artifactId>
+ <version>${embedded-mongo.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- test wiremock -->
+
+ <dependency>
+ <groupId>org.springframework.cloud</groupId>
+ <artifactId>spring-cloud-contract-wiremock</artifactId>
+ <version>1.0.0.RELEASE</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>9.4.7.RC0</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlets</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- runtime dev -->
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-devtools</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.sonatype.plugins</groupId>
+ <artifactId>nexus-staging-maven-plugin</artifactId>
+ <version>1.6.7</version>
+ <extensions>true</extensions>
+ <configuration>
+ <nexusUrl>${nexusproxy}</nexusUrl>
+ <stagingProfileId>176c31dfe190a</stagingProfileId>
+ <serverId>ecomp-staging</serverId>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-site-plugin</artifactId>
+ <version>3.6</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-webdav-jackrabbit</artifactId>
+ <version>2.10</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/restclient/.vscode/settings.json b/restclient/.vscode/settings.json
new file mode 100644
index 0000000..1753f9a
--- /dev/null
+++ b/restclient/.vscode/settings.json
@@ -0,0 +1,12 @@
+{
+ // CHARLES WEB DEBUGGING PROXY
+ //"http.proxy": "http://localhost:8888/",
+ "http.proxyStrictSSL" :false,
+ // REST CLIENT
+ "rest-client.fontSize":12,
+ "rest-client.environmentVariables": {
+ "ONAP external api nbi local": {
+ "serviceOrder.url": "http://localhost:8080/nbi/api/v1"
+ }
+ }
+} \ No newline at end of file
diff --git a/restclient/json/serviceOrder_create_in_completed.json b/restclient/json/serviceOrder_create_in_completed.json
new file mode 100644
index 0000000..64fcec9
--- /dev/null
+++ b/restclient/json/serviceOrder_create_in_completed.json
@@ -0,0 +1,43 @@
+{
+ "externalId": "LudONAP001",
+ "priority": "1",
+ "description": "Ludo first ONAP Order",
+ "category": "Consumer",
+ "requestedStartDate": "2018-02-28T13:33:37.299Z",
+ "requestedCompletionDate": "2018-02-28T13:33:37.299Z",
+ "relatedParty": [
+ {
+ "id": "6490",
+ "role": "ONAPcustomer",
+ "name": "Jean Pontus",
+ "@referredType": "individual"
+ }
+ ],
+ "orderItem": [
+ {
+ "id": "A",
+ "action": "add",
+ "service": {
+ "serviceState": "active",
+ "serviceSpecification": {
+ "id": "1e3feeb0-8e36-46c6-862c-236d9c626439"
+ }
+ }
+ },
+ {
+ "id": "B",
+ "action": "add",
+ "service": {
+ "serviceState": "active",
+ "serviceSpecification": {
+ "id": "1e3feeb0-8e36-46c6-862c-236d9c626439"
+ }
+ },
+ "orderItemRelationship": [
+ {
+ "id": "A"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/restclient/json/serviceOrder_create_in_rejected.json b/restclient/json/serviceOrder_create_in_rejected.json
new file mode 100644
index 0000000..fa0426c
--- /dev/null
+++ b/restclient/json/serviceOrder_create_in_rejected.json
@@ -0,0 +1,29 @@
+{
+ "externalId": "LudONAP001",
+ "priority": "1",
+ "description": "Ludo first ONAP Order",
+ "category": "Consumer",
+ "requestedStartDate": "2018-02-28T13:33:37.299Z",
+ "requestedCompletionDate": "2018-02-28T13:33:37.299Z",
+ "relatedParty": [
+ {
+ "id": "6490",
+ "role": "ONAPcustomer",
+ "name": "Jean Pontus",
+ "@referredType": "individual"
+ }
+ ],
+ "orderItem": [
+ {
+ "id": "1",
+ "action": "add",
+ "service": {
+ "id": "vFW0001",
+ "serviceState": "active",
+ "serviceSpecification": {
+ "id": "1e3feeb0-8e36-46c6-862c-236d9c626439"
+ }
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/restclient/onap.http b/restclient/onap.http
new file mode 100644
index 0000000..cbec294
--- /dev/null
+++ b/restclient/onap.http
@@ -0,0 +1,60 @@
+
+## SDC Get catalog service list
+
+GET {{sdc.url}}/sdc/v1/catalog/services HTTP/1.1
+Accept: application/json
+Authorization: {{sdc.token}}
+USER_ID: {{sdc.userId}}
+X-TransactionId: {{sdc.transactionId}}
+X-FromAppId: {{sdc.appId}}
+x-ecomp-instanceid: {{sdc.instanceId}}
+
+### SDC Get Vendor Software Products
+
+GET {{sdc.url}}/onboarding-api/v1.0/vendor-software-products HTTP/1.1
+Accept: application/json
+Authorization: {{sdc.token}}
+USER_ID: {{sdc.userId}}
+X-TransactionId: {{sdc.transactionId}}
+X-FromAppId: {{sdc.appId}}
+x-ecomp-instanceid: {{sdc.instanceId}}
+
+### SO Query orchestrationRequests
+
+GET {{so.url}} HTTP/1.1
+Accept: application/json
+Authorization: {{so.token}}
+X-TransactionId: {{so.transactionId}}
+X-FromAppId: {{so.appId}}
+
+### AAI Get all Customer Accounts
+
+GET {{aai.url}}/business/customers HTTP/1.1
+Accept: application/json
+Authorization: {{aai.token}}
+X-TransactionId: {{aai.transactionId}}
+X-FromAppId: {{aai.appId}}
+
+### AAI vnfs
+
+GET {{aai.url}}/network/generic-vnfs HTTP/1.1
+Accept: application/json
+Authorization: {{aai.token}}
+X-TransactionId: {{aai.transactionId}}
+X-FromAppId: {{aai.appId}}
+
+## AAI Services list
+
+GET {{aai.url}}/service-design-and-creation/services HTTP/1.1
+Accept: application/json
+Authorization: {{aai.token}}
+X-TransactionId: {{aai.transactionId}}
+X-FromAppId: {{aai.appId}}
+
+## AAI Serivce Instance for service vMRFaaS3
+
+GET {{aai.url}}/business/customers/customer/Sina/service-subscriptions/service-subscription/vIMS/service-instances/ HTTP/1.1
+Accept: application/json
+Authorization: {{aai.token}}
+X-TransactionId: {{aai.transactionId}}
+X-FromAppId: {{aai.appId}} \ No newline at end of file
diff --git a/restclient/serviceOrder.http b/restclient/serviceOrder.http
new file mode 100644
index 0000000..c8c6905
--- /dev/null
+++ b/restclient/serviceOrder.http
@@ -0,0 +1,29 @@
+### Create REJECTED
+POST {{serviceOrder.url}}/serviceOrder
+ ?fields=id,state,description,relatedParty.id,toto
+Accept: application/json
+Content-Type: application/json
+
+< ./json/serviceOrder_create_in_rejected.json
+
+### Create COMPLETED
+POST {{serviceOrder.url}}/serviceOrder
+ ?fields=id,state,description,relatedParty.id,toto
+Accept: application/json
+Content-Type: application/json
+
+< ./json/serviceOrder_create_in_completed.json
+
+### List
+GET {{serviceOrder.url}}/serviceOrder/
+Accept: application/json
+
+### List with fields
+GET {{serviceOrder.url}}/serviceOrder
+ ?fields=id,state,description,relatedParty.id
+Accept: application/json
+
+### List COMPLETED
+GET {{serviceOrder.url}}/serviceOrder
+ ?state=COMPLETED
+Accept: application/json \ No newline at end of file
diff --git a/src/main/java/org/onap/nbi/Application.java b/src/main/java/org/onap/nbi/Application.java
new file mode 100644
index 0000000..0609f9c
--- /dev/null
+++ b/src/main/java/org/onap/nbi/Application.java
@@ -0,0 +1,13 @@
+package org.onap.nbi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java b/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
new file mode 100644
index 0000000..3214f17
--- /dev/null
+++ b/src/main/java/org/onap/nbi/OnapComponentsUrlPaths.java
@@ -0,0 +1,33 @@
+package org.onap.nbi;
+
+/**
+ * Contains ONAP SDC and AAI urlPaths
+ *
+ */
+public final class OnapComponentsUrlPaths {
+
+ private OnapComponentsUrlPaths() {}
+
+ // SDC
+ public static final String SDC_ROOT_URL = "/sdc/v1/catalog/services/";
+ public static final String SDC_GET_PATH = "/metadata";
+ public static final String SDC_TOSCA_PATH = "/toscaModel";
+
+ // AAI
+ public static final String AAI_GET_TENANTS_PATH =
+ "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/$onap.cloudOwner/$onap.lcpCloudRegionId/tenants";
+ public static final String AAI_GET_CUSTOMER_PATH = "/aai/v11/business/customers/customer/";
+ public static final String AAI_GET_SERVICES_FOR_CUSTOMER_PATH =
+ "/aai/v11/business/customers/customer/$customerId/service-subscriptions";
+ public static final String AAI_PUT_SERVICE_FOR_CUSTOMER_PATH =
+ "/aai/v11/business/customers/customer/$customerId/service-subscriptions/service-subscription/";
+ public static final String AAI_GET_SERVICE_FOR_CUSTOMER_PATH =
+ "/aai/v11/business/customers/customer/$customerId/service-subscriptions/service-subscription/$serviceSpecName/service-instances/service-instance/$serviceId";
+ public static final String AAI_GET_SERVICE_INSTANCES_PATH =
+ "/aai/v11/business/customers/customer/$customerId/service-subscriptions/service-subscription/$serviceSpecName/service-instances/";
+
+ // MSO
+ public static final String MSO_CREATE_SERVICE_INSTANCE_PATH = "/ecomp/mso/infra/serviceInstance/v4";
+ public static final String MSO_GET_REQUEST_STATUS_PATH = "/ecomp/mso/infra/orchestrationRequests/v4/";
+ public static final String MSO_DELETE_REQUEST_STATUS_PATH = "/ecomp/mso/infra/serviceInstances/";
+}
diff --git a/src/main/java/org/onap/nbi/apis/RestConfiguration.java b/src/main/java/org/onap/nbi/apis/RestConfiguration.java
new file mode 100644
index 0000000..8152d6f
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/RestConfiguration.java
@@ -0,0 +1,18 @@
+package org.onap.nbi.apis;
+
+import org.onap.nbi.exceptions.BackendErrorHandler;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestConfiguration {
+
+ @Bean
+ public RestTemplate restTemplate(RestTemplateBuilder builder) {
+ RestTemplate restTemplate = builder.build();
+ restTemplate.setErrorHandler(new BackendErrorHandler());
+ return restTemplate;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java b/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
new file mode 100644
index 0000000..5bab982
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/SdcClient.java
@@ -0,0 +1,144 @@
+package org.onap.nbi.apis.servicecatalog;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.io.IOUtils;
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+/**
+ * @author user
+ *
+ */
+@Service
+public class SdcClient {
+
+ public static final String HTTP_CALL_SDC_ON = "HTTP call SDC on ";
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @Value("${sdc.host}")
+ private String sdcHost;
+
+ @Value("${sdc.header.ecompInstanceId}")
+ private String ecompInstanceId;
+
+ @Value("${sdc.header.authorization}")
+ private String sdcHeaderAuthorization;
+
+ private static final String HEADER_ECOMP_INSTANCE_ID = "x-ecomp-instanceid";
+ private static final String HEADER_AUTHORIZATION = "Authorization";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SdcClient.class);
+
+
+ public LinkedHashMap callGet(String id) {
+ StringBuilder callURL = new StringBuilder().append(sdcHost).append(OnapComponentsUrlPaths.SDC_ROOT_URL)
+ .append(id).append(OnapComponentsUrlPaths.SDC_GET_PATH);
+
+ ResponseEntity<Object> response = callSdc(callURL.toString());
+ return (LinkedHashMap) response.getBody();
+
+ }
+
+ public List<LinkedHashMap> callFind(MultiValueMap<String, String> parametersMap) {
+
+ UriComponentsBuilder callURL = UriComponentsBuilder.fromHttpUrl(sdcHost + OnapComponentsUrlPaths.SDC_ROOT_URL);
+ if (parametersMap != null) {
+ Map<String, String> stringStringMap = parametersMap.toSingleValueMap();
+ for (String key : stringStringMap.keySet()) {
+ if (!key.equals("fields")) {
+ callURL.queryParam(key, stringStringMap.get(key));
+ }
+ }
+ }
+
+ ResponseEntity<Object> response = callSdc(callURL.build().encode().toUri().toString());
+ return (List<LinkedHashMap>) response.getBody();
+
+ }
+
+
+ public File callGetWithAttachment(String toscaModelUrl) {
+ StringBuilder callURL = new StringBuilder().append(sdcHost).append(toscaModelUrl);
+
+ String fileName = System.currentTimeMillis() + "tosca.csar";
+ ResponseEntity<byte[]> response = callSdcWithAttachment(callURL.toString());
+ File toscaFile = new File(fileName);
+ try {
+ FileOutputStream toscaFileStream = new FileOutputStream(toscaFile);
+ if (response != null) {
+ IOUtils.write(response.getBody(), toscaFileStream);
+ }
+ toscaFileStream.close();
+ } catch (IOException e) {
+ LOGGER.error("cannot get TOSCA File for url " + toscaModelUrl);
+ }
+ return toscaFile;
+
+ }
+
+ private HttpEntity<String> buildRequestHeader() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HEADER_ECOMP_INSTANCE_ID, ecompInstanceId);
+ httpHeaders.add(HEADER_AUTHORIZATION, sdcHeaderAuthorization);
+ HttpEntity<String> entity = new HttpEntity<>("parameters", httpHeaders);
+
+ return entity;
+ }
+
+
+ private ResponseEntity<Object> callSdc(String callURL) {
+ ResponseEntity<Object> response =
+ restTemplate.exchange(callURL, HttpMethod.GET, buildRequestHeader(), Object.class);
+ LOGGER.debug("response body : " + response.getBody().toString());
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ loggDebugIfResponseKo(callURL, response);
+ return response;
+ }
+
+ private void loggDebugIfResponseKo(String callURL, ResponseEntity<Object> response) {
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn(HTTP_CALL_SDC_ON + callURL + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ }
+
+ private ResponseEntity<byte[]> callSdcWithAttachment(String callURL) {
+ try {
+ ResponseEntity<byte[]> response =
+ restTemplate.exchange(callURL.toString(), HttpMethod.GET, buildRequestHeader(), byte[].class);
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn(HTTP_CALL_SDC_ON + callURL.toString() + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ return response;
+
+ } catch (BackendFunctionalException e) {
+ LOGGER.error(HTTP_CALL_SDC_ON + callURL.toString() + " error " + e);
+ return null;
+ }
+ }
+
+
+}
+
+
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
new file mode 100644
index 0000000..512b088
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationResource.java
@@ -0,0 +1,46 @@
+package org.onap.nbi.apis.servicecatalog;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.commons.JsonRepresentation;
+import org.onap.nbi.commons.Resource;
+import org.onap.nbi.commons.ResourceManagement;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/serviceSpecification")
+public class ServiceSpecificationResource extends ResourceManagement<Resource> {
+
+
+ @Autowired
+ ServiceSpecificationService serviceSpecificationService;
+
+ @GetMapping(value = "/{serviceSpecId}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> getServiceSpecification(@PathVariable String serviceSpecId,
+ @RequestParam MultiValueMap<String, String> params) {
+ LinkedHashMap response = serviceSpecificationService.get(serviceSpecId);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ if (response.get("serviceSpecCharacteristic") != null) {
+ return this.getResponse(response, filter);
+ } else {
+ return this.getPartialResponse(response, filter);
+
+ }
+ }
+
+ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> findServiceSpecification(@RequestParam MultiValueMap<String, String> params) {
+ List<LinkedHashMap> response = serviceSpecificationService.find(params);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.findResponse(response, filter, null);
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
new file mode 100644
index 0000000..3b56819
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ServiceSpecificationService.java
@@ -0,0 +1,51 @@
+package org.onap.nbi.apis.servicecatalog;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.apis.servicecatalog.jolt.FindServiceSpecJsonTransformer;
+import org.onap.nbi.apis.servicecatalog.jolt.GetServiceSpecJsonTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.MultiValueMap;
+
+@Service
+public class ServiceSpecificationService {
+
+ @Autowired
+ SdcClient sdcClient;
+
+ @Autowired
+ GetServiceSpecJsonTransformer getServiceSpecJsonTransformer;
+
+ @Autowired
+ FindServiceSpecJsonTransformer findServiceSpecJsonTransformer;
+
+ @Autowired
+ ToscaInfosProcessor toscaInfosProcessor;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSpecificationService.class);
+
+
+ public LinkedHashMap get(String serviceSpecId) {
+ LinkedHashMap sdcResponse = sdcClient.callGet(serviceSpecId);
+ LinkedHashMap serviceCatalogResponse = (LinkedHashMap) getServiceSpecJsonTransformer.transform(sdcResponse);
+ LinkedHashMap toscaInfosTopologyTemplate = toscaInfosProcessor.getToscaInfos(serviceCatalogResponse);
+ if (toscaInfosTopologyTemplate != null) {
+ LOGGER.debug("tosca file found, retrieving informations");
+ toscaInfosProcessor.buildResponseWithToscaInfos(toscaInfosTopologyTemplate, serviceCatalogResponse);
+ } else {
+ LOGGER.debug("no tosca file found, partial response");
+ }
+ return serviceCatalogResponse;
+ }
+
+
+ public List<LinkedHashMap> find(MultiValueMap<String, String> parametersMap) {
+ List<LinkedHashMap> sdcResponse = sdcClient.callFind(parametersMap);
+ List<LinkedHashMap> serviceCatalogResponse =
+ (List<LinkedHashMap>) findServiceSpecJsonTransformer.transform(sdcResponse);
+ return serviceCatalogResponse;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
new file mode 100644
index 0000000..4bfbd7b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/ToscaInfosProcessor.java
@@ -0,0 +1,249 @@
+package org.onap.nbi.apis.servicecatalog;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+@Service
+public class ToscaInfosProcessor {
+
+ @Autowired
+ SdcClient sdcClient;
+
+ final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ToscaInfosProcessor.class);
+
+ public void buildResponseWithToscaInfos(LinkedHashMap toscaInfosTopologyTemplate,
+ LinkedHashMap serviceCatalogResponse) {
+ if (toscaInfosTopologyTemplate.get("inputs") != null) {
+ ArrayList serviceSpecCharacteristic = new ArrayList();
+ LinkedHashMap toscaInfos = (LinkedHashMap) toscaInfosTopologyTemplate.get("inputs");
+ for (Object key : toscaInfos.keySet()) {
+ String keyString = (String) key;
+ LinkedHashMap inputParameter = (LinkedHashMap) toscaInfos.get(key);
+ LinkedHashMap mapParameter = new LinkedHashMap();
+ String parameterType = (String) inputParameter.get("type");
+ mapParameter.put("name", keyString);
+ mapParameter.put("description", inputParameter.get("description"));
+ mapParameter.put("valueType", parameterType);
+ mapParameter.put("@type", "ONAPserviceCharacteristic");
+ mapParameter.put("required", inputParameter.get("required"));
+ mapParameter.put("status", inputParameter.get("status"));
+ List<LinkedHashMap> serviceSpecCharacteristicValues =
+ buildServiceSpecCharacteristicsValues(inputParameter, parameterType);
+ mapParameter.put("serviceSpecCharacteristicValue", serviceSpecCharacteristicValues);
+ serviceSpecCharacteristic.add(mapParameter);
+ }
+
+ serviceCatalogResponse.put("serviceSpecCharacteristic", serviceSpecCharacteristic);
+ }
+ LinkedHashMap node_templates = (LinkedHashMap) toscaInfosTopologyTemplate.get("node_templates");
+
+ List<LinkedHashMap> resourceSpecifications =
+ (List<LinkedHashMap>) serviceCatalogResponse.get("resourceSpecification");
+ for (LinkedHashMap resourceSpecification : resourceSpecifications) {
+ String id = (String) resourceSpecification.get("id");
+ LOGGER.debug("get tosca infos for service id: " + id);
+ LinkedHashMap toscaInfosFromResourceId = getToscaInfosFromResourceUUID(node_templates, id);
+ resourceSpecification.put("modelCustomizationId", toscaInfosFromResourceId.get("customizationUUID"));
+ resourceSpecification.put("modelCustomizationName", toscaInfosFromResourceId.get("name"));
+
+ }
+ }
+
+ private List<LinkedHashMap> buildServiceSpecCharacteristicsValues(LinkedHashMap parameter, String parameterType) {
+ List<LinkedHashMap> serviceSpecCharacteristicValues = new ArrayList<>();
+ if (!"map".equalsIgnoreCase(parameterType) && !"list".equalsIgnoreCase(parameterType)) {
+ LOGGER.debug("get tosca infos for serviceSpecCharacteristicValues of type map or string : " + parameter);
+ Object aDefault = parameter.get("default");
+ if (parameter.get("entry_schema") != null) {
+ ArrayList entry_schema = (ArrayList) parameter.get("entry_schema");
+ if (CollectionUtils.isNotEmpty(entry_schema)) {
+ buildCharacteristicValuesFormShema(parameterType, serviceSpecCharacteristicValues, aDefault,
+ entry_schema);
+ }
+ }
+ }
+ return serviceSpecCharacteristicValues;
+ }
+
+ private void buildCharacteristicValuesFormShema(String parameterType,
+ List<LinkedHashMap> serviceSpecCharacteristicValues, Object aDefault, ArrayList entry_schema) {
+ LinkedHashMap constraints = (LinkedHashMap) entry_schema.get(0);
+ if (constraints != null) {
+ ArrayList constraintsList = (ArrayList) constraints.get("constraints");
+ if (CollectionUtils.isNotEmpty(constraintsList)) {
+ LinkedHashMap valuesMap = (LinkedHashMap) constraintsList.get(0);
+ if (valuesMap != null) {
+ List<Object> values = (List<Object>) valuesMap.get("valid_values");
+ for (Object value : values) {
+ String stringValue = value.toString();
+ LinkedHashMap serviceSpecCharacteristicValue = new LinkedHashMap();
+ serviceSpecCharacteristicValue.put("isDefault",
+ aDefault != null && aDefault.toString().equals(stringValue));
+ serviceSpecCharacteristicValue.put("value", stringValue);
+ serviceSpecCharacteristicValue.put("valueType", parameterType);
+ serviceSpecCharacteristicValues.add(serviceSpecCharacteristicValue);
+ }
+ }
+ }
+ }
+ }
+
+
+ private LinkedHashMap getToscaInfosFromResourceUUID(LinkedHashMap node_templates, String name) {
+ for (Object nodeTemplateObject : node_templates.values()) {
+ LinkedHashMap nodeTemplate = (LinkedHashMap) nodeTemplateObject;
+ LinkedHashMap metadata = (LinkedHashMap) nodeTemplate.get("metadata");
+ String metadataUUID = (String) metadata.get("UUID");
+ String metadataType = (String) metadata.get("type");
+ if ("VF".equalsIgnoreCase(metadataType) && name.equalsIgnoreCase(metadataUUID)) {
+ return metadata;
+ }
+ }
+ return null;
+ }
+
+
+ public LinkedHashMap getToscaInfos(LinkedHashMap sdcResponse) {
+ String toscaModelUrl = (String) sdcResponse.get("toscaModelURL");
+ String serviceId = (String) sdcResponse.get("uuid");
+ File toscaFile = sdcClient.callGetWithAttachment(toscaModelUrl);
+ Timestamp timestamp = new Timestamp(System.currentTimeMillis());
+ String tempFolderName = serviceId + timestamp;
+ File folderTemp = null;
+ LinkedHashMap topology_template = null;
+ try {
+ unZipArchive(toscaFile.getName(), tempFolderName);
+ folderTemp = new File(tempFolderName);
+ LOGGER.debug("temp folder for tosca files : " + folderTemp.getName());
+
+ LinkedHashMap toscaMetaFileHashMap = parseToscaFile(tempFolderName + "/TOSCA-Metadata/TOSCA.meta");
+ if (toscaMetaFileHashMap.get("Entry-Definitions") == null) {
+ throw new NullPointerException("no Entry-Definitions node in TOSCA.meta");
+ }
+ String toscaFilePath = (String) toscaMetaFileHashMap.get("Entry-Definitions");
+ LinkedHashMap toscaFileHashMap = parseToscaFile(tempFolderName + "/" + toscaFilePath);
+
+ if (toscaFileHashMap.get("topology_template") == null) {
+ throw new NullPointerException("no topology_template node in tosca file");
+ }
+ topology_template = (LinkedHashMap) toscaFileHashMap.get("topology_template");
+
+ } catch (NullPointerException e) {
+ LOGGER.error("unable to parse tosca file for id : " + serviceId + ", " + e.getMessage());
+ return null;
+ } finally {
+ try {
+ LOGGER.debug("deleting temp folder for tosca files : " + folderTemp.getName());
+ FileUtils.deleteDirectory(folderTemp);
+ LOGGER.debug("deleting tosca archive : " + toscaFile.getName());
+ FileUtils.forceDelete(toscaFile);
+ return topology_template;
+ } catch (IOException e) {
+ LOGGER.error("unable to delete temp directory tosca file for id : " + serviceId);
+ return null;
+
+ }
+ }
+ }
+
+
+ private LinkedHashMap parseToscaFile(String fileName) {
+
+ File toscaFile = new File(fileName);
+ if (toscaFile == null) {
+ throw new TechnicalException("unable to find file : " + fileName);
+ }
+ try {
+ return (LinkedHashMap) mapper.readValue(toscaFile, Object.class);
+ } catch (IOException e) {
+ LOGGER.error("unable to parse tosca file : " + fileName);
+ LOGGER.error(e.getMessage());
+ throw new TechnicalException("Unable to parse tosca file : " + fileName);
+
+ } catch (NullPointerException e) {
+ LOGGER.error("unable to find tosca file : " + fileName);
+ LOGGER.error(e.getMessage());
+ throw new TechnicalException("unable to find tosca file : " + fileName);
+ }
+ }
+
+
+ /**
+ * Unzip it
+ *
+ * @param zipFile input zip file
+ * @param outputFolder zip file output folder
+ */
+ private void unZipArchive(String zipFile, String outputFolder) {
+
+ byte[] buffer = new byte[1024];
+
+ try {
+
+ // create output directory is not exists
+ File folder = new File(outputFolder);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+
+ // get the zip file content
+ try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
+ // get the zipped file list entry
+ ZipEntry ze = zis.getNextEntry();
+
+ while (ze != null) {
+
+ String fileName = ze.getName();
+ File newFile = new File(outputFolder + File.separator + fileName);
+
+ LOGGER.debug("File to unzip : " + newFile.getAbsoluteFile());
+
+ // create all non exists folders
+ // else you will hit FileNotFoundException for compressed folder
+ new File(newFile.getParent()).mkdirs();
+
+ try (FileOutputStream fos = new FileOutputStream(newFile)) {
+
+ int len;
+ while ((len = zis.read(buffer)) > 0) {
+ fos.write(buffer, 0, len);
+ }
+
+ fos.close();
+ }
+ ze = zis.getNextEntry();
+ }
+
+ zis.closeEntry();
+ zis.close();
+ }
+
+ LOGGER.debug("Done");
+
+ } catch (IOException ex) {
+ LOGGER.error("Error while unzipping ToscaModel archive from ONAP : " + ex.getMessage());
+ throw new TechnicalException("Error while unzipping ToscaModel archive from ONAP");
+ }
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/FindServiceSpecJsonTransformer.java b/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/FindServiceSpecJsonTransformer.java
new file mode 100644
index 0000000..742a3d4
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/FindServiceSpecJsonTransformer.java
@@ -0,0 +1,35 @@
+package org.onap.nbi.apis.servicecatalog.jolt;
+
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class FindServiceSpecJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FindServiceSpecJsonTransformer.class);
+
+ public FindServiceSpecJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/findServiceCatalog.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/GetServiceSpecJsonTransformer.java b/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/GetServiceSpecJsonTransformer.java
new file mode 100644
index 0000000..27a8dee
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/servicecatalog/jolt/GetServiceSpecJsonTransformer.java
@@ -0,0 +1,36 @@
+package org.onap.nbi.apis.servicecatalog.jolt;
+
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class GetServiceSpecJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GetServiceSpecJsonTransformer.class);
+
+
+ public GetServiceSpecJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/getServiceCatalog.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java
new file mode 100644
index 0000000..1f5f74d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/AaiClient.java
@@ -0,0 +1,82 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AaiClient extends BaseClient {
+
+ public static final String CUSTOMER_ID = "$customerId";
+
+ @Value("${aai.host}")
+ private String aaiHost;
+
+ @Value("${aai.header.authorization}")
+ private String aaiHeaderAuthorization;
+
+ @Value("${aai.api.id}")
+ private String aaiApiId;
+
+ private static final String HEADER_AUTHORIZATION = "Authorization";
+ private static final String X_FROM_APP_ID = "X-FromAppId";
+
+ private HttpHeaders buildRequestHeaderForAAI() {
+
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HEADER_AUTHORIZATION, aaiHeaderAuthorization);
+ httpHeaders.add(X_FROM_APP_ID, aaiApiId);
+ httpHeaders.add("Accept", "application/json");
+ httpHeaders.add("Content-Type", "application/json");
+ return httpHeaders;
+
+ }
+
+ public LinkedHashMap getCatalogService(String customerId, String serviceSpecName, String serviceId) {
+
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICE_FOR_CUSTOMER_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+ callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceSpecName);
+ callUrlFormated = callUrlFormated.replace("$serviceId", serviceId);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+ return (LinkedHashMap) response.getBody();
+ }
+ return null;
+ }
+
+
+ public LinkedHashMap getVNF(String relatedLink) {
+
+ StringBuilder callURL = new StringBuilder().append(aaiHost).append(relatedLink);
+
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+
+ }
+
+ public LinkedHashMap getServicesInAaiForCustomer(String customerId) {
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICES_FOR_CUSTOMER_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+ }
+
+ public LinkedHashMap getServiceInstancesInAaiForCustomer(String customerId, String serviceType) {
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICE_INSTANCES_PATH);
+ String callUrlFormated = callURL.toString().replace(CUSTOMER_ID, customerId);
+ callUrlFormated = callUrlFormated.replace("$serviceSpecName", serviceType);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI());
+ return (LinkedHashMap) response.getBody();
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java
new file mode 100644
index 0000000..b9a93d0
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/BaseClient.java
@@ -0,0 +1,33 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+public abstract class BaseClient {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BaseClient.class);
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ protected ResponseEntity<Object> callApiGet(String callURL, HttpHeaders httpHeaders) {
+
+ ResponseEntity<Object> response = restTemplate.exchange(callURL, HttpMethod.GET,
+ new HttpEntity<>("parameters", httpHeaders), Object.class);
+ LOGGER.debug("response body : " + response.getBody().toString());
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn("HTTP call on " + callURL + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ return response;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java b/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java
new file mode 100644
index 0000000..cbbd88d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/NbiClient.java
@@ -0,0 +1,20 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service
+public class NbiClient extends BaseClient {
+
+ @Value("${nbi.url}")
+ private String nbiUrl;
+
+ public LinkedHashMap getServiceSpecification(String id) {
+ StringBuilder callURL = new StringBuilder().append(nbiUrl).append("/serviceSpecification/").append(id);
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), new HttpHeaders());
+ return (LinkedHashMap) response.getBody();
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java
new file mode 100644
index 0000000..9092381
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryResource.java
@@ -0,0 +1,45 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.commons.JsonRepresentation;
+import org.onap.nbi.commons.ResourceManagement;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/service")
+public class ServiceInventoryResource extends ResourceManagement {
+
+ @Autowired
+ ServiceInventoryService serviceInventoryService;
+
+ @GetMapping(value = "/{serviceId}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> getServiceInventory(@PathVariable String serviceId,
+ @RequestParam MultiValueMap<String, String> params) {
+
+ LinkedHashMap response = serviceInventoryService.get(serviceId, params);
+
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.getResponse(response, filter);
+
+ }
+
+ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> findServiceInventory(@RequestParam MultiValueMap<String, String> params) {
+
+ List<LinkedHashMap> response = serviceInventoryService.find(params);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.findResponse(response, filter, null);
+
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java
new file mode 100644
index 0000000..886a464
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/ServiceInventoryService.java
@@ -0,0 +1,149 @@
+package org.onap.nbi.apis.serviceinventory;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.apis.serviceinventory.jolt.FindServiceInventoryJsonTransformer;
+import org.onap.nbi.apis.serviceinventory.jolt.GetServiceInventoryJsonTransformer;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+
+@Service
+public class ServiceInventoryService {
+
+ @Autowired
+ NbiClient nbiClient;
+
+ @Autowired
+ AaiClient aaiClient;
+
+ @Autowired
+ GetServiceInventoryJsonTransformer getServiceInventoryJsonTransformer;
+
+ @Autowired
+ FindServiceInventoryJsonTransformer findServiceInventoryJsonTransformer;
+
+ public LinkedHashMap get(String serviceId, MultiValueMap<String, String> params) {
+
+ String clientId = params.getFirst("relatedParty.id");
+ String serviceSpecId = params.getFirst("serviceSpecification.id");
+ String serviceSpecName = params.getFirst("serviceSpecification.name");
+
+ if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
+ throw new BackendFunctionalException(HttpStatus.NOT_FOUND,
+ "serviceSpecName or serviceSpecId must be provided");
+ }
+
+ String customerId = getCustomerId(clientId);
+ String serviceName = getServiceName(serviceSpecName, serviceSpecId);
+ LinkedHashMap serviceResponse = aaiClient.getCatalogService(customerId, serviceName, serviceId);
+
+ if (serviceResponse != null) {
+ addVnfsToResponse(serviceResponse);
+ LinkedHashMap serviceInventoryResponse =
+ (LinkedHashMap) getServiceInventoryJsonTransformer.transform(serviceResponse);
+ addRelatedPartyId(customerId, serviceInventoryResponse);
+ return serviceInventoryResponse;
+ } else {
+ throw new BackendFunctionalException(HttpStatus.NOT_FOUND, "no catalog service found");
+ }
+
+ }
+
+
+ private String getCustomerId(String clientId) {
+
+ if (StringUtils.isEmpty(clientId)) {
+ return "generic";
+ } else {
+ return clientId;
+ }
+
+ }
+
+ private String getServiceName(String serviceSpecificationName, String serviceSpecificationId) {
+
+ if (StringUtils.isEmpty(serviceSpecificationName)) {
+ LinkedHashMap serviceSpecification = nbiClient.getServiceSpecification(serviceSpecificationId);
+ return (String) serviceSpecification.get("name");
+ } else {
+ return serviceSpecificationName;
+ }
+
+ }
+
+ private void addRelatedPartyId(String customerId, LinkedHashMap serviceInventoryResponse) {
+
+ LinkedHashMap relatedParty = (LinkedHashMap) serviceInventoryResponse.get("relatedParty");
+ relatedParty.put("id", customerId);
+
+ }
+
+ private void addVnfsToResponse(LinkedHashMap serviceResponse) {
+
+ List<LinkedHashMap> vnfs = new ArrayList<>();
+ LinkedHashMap relationShip = (LinkedHashMap) serviceResponse.get("relationship-list");
+ List<LinkedHashMap> relationsList = (List<LinkedHashMap>) relationShip.get("relationship");
+ for (LinkedHashMap relation : relationsList) {
+ String relatedLink = (String) relation.get("related-link");
+ LinkedHashMap vnf = aaiClient.getVNF(relatedLink);
+ if (vnf != null) {
+ vnfs.add(vnf);
+ }
+ }
+ serviceResponse.put("vnfs", vnfs);
+
+ }
+
+
+ public List<LinkedHashMap> find(MultiValueMap<String, String> params) {
+
+ String clientId = params.getFirst("relatedParty.id");
+ String serviceSpecId = params.getFirst("serviceSpecification.id");
+ String serviceSpecName = params.getFirst("serviceSpecification.name");
+ String customerId = getCustomerId(clientId);
+ String serviceName;
+ List<LinkedHashMap> serviceInstances = new ArrayList<>();
+ if (StringUtils.isEmpty(serviceSpecId) && StringUtils.isEmpty(serviceSpecName)) {
+ LinkedHashMap servicesInAaiForCustomer = aaiClient.getServicesInAaiForCustomer(customerId);
+ List<LinkedHashMap> servicesInAAI =
+ (List<LinkedHashMap>) servicesInAaiForCustomer.get("service-subscription");
+ for (LinkedHashMap service : servicesInAAI) {
+ String serviceType = (String) service.get("service-type");
+ buildServiceInstances(serviceInstances, customerId, serviceType);
+ }
+ } else {
+ serviceName = getServiceName(serviceSpecName, serviceSpecId);
+ buildServiceInstances(serviceInstances, customerId, serviceName);
+ }
+
+ List<LinkedHashMap> serviceInventoryResponse =
+ (List<LinkedHashMap>) findServiceInventoryJsonTransformer.transform(serviceInstances);
+ for (LinkedHashMap serviceInventory : serviceInventoryResponse) {
+ LinkedHashMap party = (LinkedHashMap) serviceInventory.get("relatedParty");
+ party.put("id", customerId);
+ }
+ return serviceInventoryResponse;
+
+ }
+
+ private void buildServiceInstances(List<LinkedHashMap> serviceInstances, String customerId, String serviceType) {
+
+ LinkedHashMap serviceInstancesInAaiForCustomer =
+ aaiClient.getServiceInstancesInAaiForCustomer(customerId, serviceType);
+ List<LinkedHashMap> serviceInstancesForServiceType =
+ (List<LinkedHashMap>) serviceInstancesInAaiForCustomer.get("service-instance");
+
+ // add service type for jolt
+ for (LinkedHashMap serviceInstanceForServiceType : serviceInstancesForServiceType) {
+ serviceInstanceForServiceType.put("service-type", serviceType);
+ }
+ serviceInstances.addAll(serviceInstancesForServiceType);
+
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java
new file mode 100644
index 0000000..8173215
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/FindServiceInventoryJsonTransformer.java
@@ -0,0 +1,35 @@
+package org.onap.nbi.apis.serviceinventory.jolt;
+
+import java.util.List;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+
+@Service
+public class FindServiceInventoryJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FindServiceInventoryJsonTransformer.class);
+
+ public FindServiceInventoryJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/findServiceInventory.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java
new file mode 100644
index 0000000..f82c696
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceinventory/jolt/GetServiceInventoryJsonTransformer.java
@@ -0,0 +1,36 @@
+package org.onap.nbi.apis.serviceinventory.jolt;
+
+import java.util.List;
+import org.onap.nbi.exceptions.TechnicalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import com.bazaarvoice.jolt.Chainr;
+import com.bazaarvoice.jolt.JsonUtils;
+import com.bazaarvoice.jolt.exception.JoltException;
+
+@Service
+public class GetServiceInventoryJsonTransformer {
+
+ private Chainr chainr;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GetServiceInventoryJsonTransformer.class);
+
+
+ public GetServiceInventoryJsonTransformer() {
+ List<Object> specs = JsonUtils.classpathToList("/jolt/getServiceInventory.json");
+ this.chainr = Chainr.fromSpec(specs);
+ }
+
+ public Object transform(Object serviceSpec) {
+ Object output = null;
+ try {
+ output = chainr.transform(serviceSpec);
+ } catch (JoltException joE) {
+ LOGGER.error("Unable to transform SDC response with JOLT Transformer : " + joE.getMessage());
+ throw new TechnicalException("Error while parsing ONAP response");
+ }
+ return output;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/MultiClient.java b/src/main/java/org/onap/nbi/apis/serviceorder/MultiClient.java
new file mode 100644
index 0000000..223e408
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/MultiClient.java
@@ -0,0 +1,196 @@
+package org.onap.nbi.apis.serviceorder;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+public class MultiClient {
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @Value("${aai.host}")
+ private String aaiHost;
+
+ @Value("${aai.header.authorization}")
+ private String aaiHeaderAuthorization;
+
+ @Value("${aai.api.id}")
+ private String aaiApiId;
+
+ @Value("${onap.lcpCloudRegionId}")
+ private String lcpCloudRegionId;
+
+ @Value("${onap.tenantId}")
+ private String tenantId;
+
+ @Value("${onap.cloudOwner}")
+ private String cloudOwner;
+
+ @Autowired
+ private ServiceCatalogUrl serviceCatalogUrl;
+
+ @Autowired
+ private ServiceInventoryUrl serviceInventoryUrl;
+
+
+ private static final String HEADER_AUTHORIZATION = "Authorization";
+ private static final String X_FROM_APP_ID = "X-FromAppId";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MultiClient.class);
+
+ public ResponseEntity<Object> getServiceCatalog(String id) {
+ StringBuilder callURL = new StringBuilder().append(serviceCatalogUrl.getServiceCatalogUrl()).append(id);
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), new HttpHeaders(), null);
+ return response;
+ }
+
+ public boolean doesServiceExistInServiceInventory(String id, String serviceName, String globalSubscriberId) {
+ StringBuilder callURL = new StringBuilder().append(serviceInventoryUrl.getServiceInventoryUrl()).append(id);
+ Map<String, String> param = new HashMap<>();
+ param.put("serviceSpecification.name", serviceName);
+ param.put("relatedParty.id", globalSubscriberId);
+
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), new HttpHeaders(), param);
+ if (response == null || !response.getStatusCode().equals(HttpStatus.OK)) {
+ return false;
+ }
+ return true;
+ }
+
+
+ private HttpHeaders buildRequestHeaderForAAI() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HEADER_AUTHORIZATION, aaiHeaderAuthorization);
+ httpHeaders.add(X_FROM_APP_ID, aaiApiId);
+ httpHeaders.add("Accept", "application/json");
+ httpHeaders.add("Content-Type", "application/json");
+ return httpHeaders;
+ }
+
+
+ public boolean isTenantIdPresentInAAI() {
+ StringBuilder callURL = new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_TENANTS_PATH);
+ String callUrlFormated = callURL.toString().replace("$onap.lcpCloudRegionId", lcpCloudRegionId);
+ callUrlFormated = callUrlFormated.replace("$onap.cloudOwner", cloudOwner);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI(), null);
+ if (response != null) {
+ LinkedHashMap body = (LinkedHashMap) response.getBody();
+ List<LinkedHashMap> tenants = (List<LinkedHashMap>) body.get("tenant");
+ for (LinkedHashMap tenant : tenants) {
+ if (tenantId.equalsIgnoreCase((String) tenant.get("tenant-id"))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean isCustomerPresentInAAI(String customerId) {
+ StringBuilder callURL = new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_CUSTOMER_PATH)
+ .append(customerId);
+ ResponseEntity<Object> response = callApiGet(callURL.toString(), buildRequestHeaderForAAI(), null);
+ if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+ return true;
+ }
+ return false;
+ }
+
+
+ public void putCustomer(SubscriberInfo subscriberInfo) {
+ Map<String, String> param = new HashMap<>();
+ param.put("global-customer-id", subscriberInfo.getGlobalSubscriberId());
+ param.put("subscriber-name", subscriberInfo.getSubscriberName());
+ param.put("subscriber-type", "BSS");
+ String callURL =
+ aaiHost + OnapComponentsUrlPaths.AAI_GET_CUSTOMER_PATH + subscriberInfo.getGlobalSubscriberId();
+
+ putRequest(param, callURL, buildRequestHeaderForAAI());
+ }
+
+
+ public LinkedHashMap getServicesInAaiForCustomer(String customerId) {
+ StringBuilder callURL =
+ new StringBuilder().append(aaiHost).append(OnapComponentsUrlPaths.AAI_GET_SERVICES_FOR_CUSTOMER_PATH);
+ String callUrlFormated = callURL.toString().replace("$customerId", customerId);
+
+ ResponseEntity<Object> response = callApiGet(callUrlFormated, buildRequestHeaderForAAI(), null);
+ if (response != null && response.getStatusCode().equals(HttpStatus.OK)) {
+ return (LinkedHashMap) response.getBody();
+ }
+ return null;
+ }
+
+ public void putServiceType(String globalSubscriberId, String serviceName) {
+ Map<String, String> param = new HashMap<>();
+ param.put("service-type", serviceName);
+ String callURL = aaiHost + OnapComponentsUrlPaths.AAI_PUT_SERVICE_FOR_CUSTOMER_PATH + serviceName;
+ String callUrlFormated = callURL.toString().replace("$customerId", globalSubscriberId);
+ putRequest(param, callUrlFormated, buildRequestHeaderForAAI());
+ }
+
+
+ private void putRequest(Map<String, String> param, String callUrl, HttpHeaders httpHeaders) {
+ try {
+ ResponseEntity<Object> response =
+ restTemplate.exchange(callUrl, HttpMethod.PUT, new HttpEntity<>(param, httpHeaders), Object.class);
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.CREATED)) {
+ LOGGER.warn("HTTP call on " + callUrl + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ } catch (BackendFunctionalException e) {
+ LOGGER.error("error on calling " + callUrl + " ," + e);
+ }
+ }
+
+ private ResponseEntity<Object> callApiGet(String callURL, HttpHeaders httpHeaders, Map<String, String> param) {
+
+
+ try {
+
+ UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(callURL);
+ if (param != null) {
+ for (String paramName : param.keySet()) {
+ builder.queryParam(paramName, param.get(paramName));
+ }
+ }
+ String uriBuilder = builder.build().encode().toUriString();
+
+
+ ResponseEntity<Object> response =
+ restTemplate.exchange(uriBuilder, HttpMethod.GET, new HttpEntity<>(httpHeaders), Object.class);
+ LOGGER.debug("response body : " + response.getBody().toString());
+ LOGGER.info("response status : " + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn("HTTP call on " + callURL + " returns " + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ return response;
+
+ } catch (BackendFunctionalException e) {
+ LOGGER.error("error on calling " + callURL + " ," + e);
+ return null;
+ }
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/MultiCriteriaRequestBuilder.java b/src/main/java/org/onap/nbi/apis/serviceorder/MultiCriteriaRequestBuilder.java
new file mode 100644
index 0000000..b15b1c5
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/MultiCriteriaRequestBuilder.java
@@ -0,0 +1,106 @@
+package org.onap.nbi.apis.serviceorder;
+
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.MultiValueMap;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class MultiCriteriaRequestBuilder {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOrderResource.class);
+
+
+ public Query buildRequest(MultiValueMap<String, String> params) {
+ Query query = new Query();
+
+ List<String> externalIds = params.get("externalId");
+ if (!CollectionUtils.isEmpty(externalIds)) {
+ String externalId = externalIds.get(0);
+ LOGGER.debug("add criterion externalId {0}", externalId);
+ query.addCriteria(Criteria.where("externalId").is(externalId));
+
+ }
+ List<String> states = params.get("state");
+ if (!CollectionUtils.isEmpty(states)) {
+ String state = states.get(0);
+ LOGGER.debug("add criterion state {0}", state);
+ query.addCriteria(Criteria.where("state").is(StateType.fromValue(state)));
+
+ }
+ List<String> descriptions = params.get("description");
+ if (!CollectionUtils.isEmpty(descriptions)) {
+ String description = descriptions.get(0);
+ LOGGER.debug("add criterion description {0}", description);
+ query.addCriteria(Criteria.where("description").is(description));
+
+ }
+
+ handleDate(params, query);
+
+ handleOffsetAndLimit(params, query);
+
+ return query;
+ }
+
+ private void handleDate(MultiValueMap<String, String> params, Query query) {
+ List<String> orderDateLts = params.get("orderDate.lt");
+ List<String> orderDateGts = params.get("orderDate.gt");
+ if (!CollectionUtils.isEmpty(orderDateLts) || !CollectionUtils.isEmpty(orderDateGts)) {
+ Criteria orderDateCriteria = Criteria.where("orderDate");
+
+ if (!CollectionUtils.isEmpty(orderDateLts)) {
+ String orderDateLt = orderDateLts.get(0);
+ LOGGER.debug("add criterion orderDate.lt {0}", orderDateLt);
+ orderDateCriteria.lt(convertDate(orderDateLt));
+ }
+ if (!CollectionUtils.isEmpty(orderDateGts)) {
+ String orderDateGt = orderDateGts.get(0);
+ LOGGER.debug("add criterion orderDate.gt {0}", orderDateGt);
+ orderDateCriteria.gt(convertDate(orderDateGt));
+ }
+ query.addCriteria(orderDateCriteria);
+ }
+ }
+
+ private void handleOffsetAndLimit(MultiValueMap<String, String> params, Query query) {
+ List<String> offsets = params.get("offset");
+ List<String> limits = params.get("limit");
+ if (!CollectionUtils.isEmpty(offsets) && !CollectionUtils.isEmpty(limits)) {
+ String offsetString = offsets.get(0);
+ String limitString = limits.get(0);
+ int offset = Integer.parseInt(offsetString);
+ int limit = Integer.parseInt(limitString);
+ final Pageable pageableRequest = new PageRequest(offset, limit);
+ query.with(pageableRequest);
+ } else if (!CollectionUtils.isEmpty(limits)) {
+ String limitString = limits.get(0);
+ int limit = Integer.parseInt(limitString);
+ final Pageable pageableRequest = new PageRequest(0, limit);
+ query.with(pageableRequest);
+ }
+ }
+
+ private Date convertDate(String dateString) {
+ String dateFormat = "yyyy-MM-dd HH:mm:ss.SSS";
+ SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
+ try {
+ return formatter.parse(dateString);
+ } catch (ParseException e) {
+ LOGGER.error("unable to convert date " + dateString + ", the pattern is " + dateFormat + " ; " + e);
+ }
+ return null;
+
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/ServiceCatalogUrl.java b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceCatalogUrl.java
new file mode 100644
index 0000000..d76bb2d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceCatalogUrl.java
@@ -0,0 +1,21 @@
+package org.onap.nbi.apis.serviceorder;
+
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ServiceCatalogUrl {
+
+
+ @Value("${nbi.url}")
+ private String nbiUrl;
+
+ public String getServiceCatalogUrl() {
+
+ return new StringBuilder().append(nbiUrl).append("/serviceSpecification/").toString();
+
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/ServiceInventoryUrl.java b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceInventoryUrl.java
new file mode 100644
index 0000000..7165bb0
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceInventoryUrl.java
@@ -0,0 +1,21 @@
+package org.onap.nbi.apis.serviceorder;
+
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ServiceInventoryUrl {
+
+ @Value("${nbi.url}")
+ private String nbiUrl;
+
+
+ public String getServiceInventoryUrl() {
+
+ return new StringBuilder().append(nbiUrl).append("/service/").toString();
+
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/ServiceOrderResource.java b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceOrderResource.java
new file mode 100644
index 0000000..1842cfe
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/ServiceOrderResource.java
@@ -0,0 +1,158 @@
+package org.onap.nbi.apis.serviceorder;
+
+import java.util.Date;
+import java.util.List;
+import javax.validation.Valid;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderInfoRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.workflow.CheckOrderConsistenceManager;
+import org.onap.nbi.apis.serviceorder.workflow.CreateAAICustomerManager;
+import org.onap.nbi.apis.serviceorder.workflow.CreateAAIServiceTypeManager;
+import org.onap.nbi.apis.serviceorder.workflow.SOTaskManager;
+import org.onap.nbi.commons.JsonRepresentation;
+import org.onap.nbi.commons.ResourceManagement;
+import org.onap.nbi.exceptions.ValidationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.MultiValueMap;
+import org.springframework.validation.Errors;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/serviceOrder")
+@EnableScheduling
+public class ServiceOrderResource extends ResourceManagement<ServiceOrder> {
+
+ @Autowired
+ ServiceOrderRepository serviceOrderRepository;
+
+ @Autowired
+ CheckOrderConsistenceManager checkOrderConsistenceManager;
+
+ @Autowired
+ CreateAAICustomerManager createAAICustomer;
+
+ @Autowired
+ CreateAAIServiceTypeManager createAAIServiceType;
+
+ @Autowired
+ MongoTemplate mongoTemplate;
+
+ @Autowired
+ SOTaskManager serviceOrchestratorManager;
+
+ @Autowired
+ ServiceOrderInfoRepository serviceOrderInfoRepository;
+
+ @Autowired
+ MultiCriteriaRequestBuilder multiCriteriaRequestBuilder;
+
+
+ @GetMapping(value = "/{serviceOrderId}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> getServiceOrder(@PathVariable String serviceOrderId,
+ @RequestParam MultiValueMap<String, String> params) {
+
+ ServiceOrder serviceOrder = serviceOrderRepository.findOne(serviceOrderId);
+ if (serviceOrder == null) {
+ return ResponseEntity.notFound().build();
+ }
+
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.getResponse(serviceOrder, filter);
+ }
+
+ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> findServiceOrder(@RequestParam MultiValueMap<String, String> params) {
+
+ Query query = multiCriteriaRequestBuilder.buildRequest(params);
+ List<ServiceOrder> serviceOrders = mongoTemplate.find(query, ServiceOrder.class);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ long totalCount = serviceOrderRepository.count();
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("X-Total-Count", String.valueOf(totalCount));
+ headers.add("X-Result-Count", String.valueOf(serviceOrders.size()));
+
+ ResponseEntity<Object> response = this.findResponse(serviceOrders, filter, headers);
+ return response;
+
+ }
+
+ @DeleteMapping(value = "/{serviceOrderId}")
+ public ResponseEntity<Object> deleteServiceOrder(@PathVariable String serviceOrderId) {
+
+ serviceOrderRepository.delete(serviceOrderId);
+
+ return this.deleteResponse();
+
+ }
+
+ @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> createServiceOrder(@Valid @RequestBody ServiceOrder serviceOrder, Errors errors,
+ @RequestParam MultiValueMap<String, String> params) {
+
+
+ if (errors != null && errors.hasErrors()) {
+ throw new ValidationException(errors.getAllErrors());
+ }
+
+ serviceOrder.setState(StateType.ACKNOWLEDGED);
+ serviceOrder.setOrderDate(new Date());
+ for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+ serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+ }
+
+ ServiceOrder serviceOrderSaved = serviceOrderRepository.save(serviceOrder);
+ serviceOrderSaved.setHref("serviceOrder/" + serviceOrderSaved.getId());
+ serviceOrderRepository.save(serviceOrderSaved);
+ JsonRepresentation filter = new JsonRepresentation(params);
+ return this.createResponse(serviceOrderSaved, filter);
+
+ }
+
+ @Scheduled(fixedDelay = 5000)
+ public void scheduleCheckServiceOrders() {
+ List<ServiceOrder> acknowledgedOrders = serviceOrderRepository.findByState(StateType.ACKNOWLEDGED);
+ for (ServiceOrder serviceOrder : acknowledgedOrders) {
+ ServiceOrderInfo serviceOrderInfo = checkOrderConsistenceManager.checkServiceOrder(serviceOrder);
+ if (serviceOrderInfo.isServiceOrderRejected()) {
+ changeServiceOrderState(serviceOrder, StateType.REJECTED);
+ } else if (serviceOrderInfo.isAllItemsCompleted()) {
+ changeServiceOrderState(serviceOrder, StateType.COMPLETED);
+ } else {
+ serviceOrderRepository.save(serviceOrder);
+ createAAICustomer.createAAICustomer(serviceOrderInfo);
+ createAAIServiceType.createAAIServiceType(serviceOrder, serviceOrderInfo);
+ serviceOrchestratorManager.registerServiceOrder(serviceOrder, serviceOrderInfo);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param serviceOrder
+ * @param stateType
+ */
+ private void changeServiceOrderState(ServiceOrder serviceOrder, StateType stateType) {
+ serviceOrder.setState(stateType);
+ serviceOrder.setCompletionDateTime(new Date());
+ serviceOrderRepository.save(serviceOrder);
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/SoClient.java b/src/main/java/org/onap/nbi/apis/serviceorder/SoClient.java
new file mode 100644
index 0000000..96d9893
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/SoClient.java
@@ -0,0 +1,138 @@
+package org.onap.nbi.apis.serviceorder;
+
+import org.onap.nbi.OnapComponentsUrlPaths;
+import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestDetails;
+import org.onap.nbi.exceptions.BackendFunctionalException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+public class SoClient {
+
+ public static final String RESPONSE_STATUS = "response status : ";
+ public static final String RESPONSE_BODY = "response body : ";
+ public static final String RETURNS = " returns ";
+ public static final String ERROR_ON_CALLING = "error on calling ";
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @Value("${so.host}")
+ private String soHostname;
+
+ @Value("${so.api.id}")
+ private String soApiId;
+
+ @Value("${so.header.authorization}")
+ private String soHeaderAuthorization;
+
+ private static final String HEADER_AUTHORIZATION = "Authorization";
+ private static final String X_FROM_APP_ID = "X-FromAppId";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SoClient.class);
+
+
+ public ResponseEntity<CreateServiceInstanceResponse> callCreateServiceInstance(RequestDetails requestDetails) {
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Calling SO CreateServiceInstance with requestDetails : " + requestDetails.toString());
+ }
+
+ String url = soHostname + OnapComponentsUrlPaths.MSO_CREATE_SERVICE_INSTANCE_PATH;
+
+ HttpEntity<RequestDetails> requestDetailEntity = new HttpEntity<>(requestDetails, buildRequestHeader());
+
+ try {
+ ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.POST,
+ new HttpEntity<>(requestDetailEntity, buildRequestHeader()), CreateServiceInstanceResponse.class);
+
+ logResponsePost(url, response);
+ return response;
+
+ } catch (BackendFunctionalException e) {
+ LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
+ return null;
+ }
+ }
+
+ public ResponseEntity<CreateServiceInstanceResponse> callDeleteServiceInstance(RequestDetails requestDetails,
+ String serviceId) {
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Calling SO DeleteServiceInstance with requestDetails : " + requestDetails.toString());
+ }
+
+ String url = soHostname + OnapComponentsUrlPaths.MSO_DELETE_REQUEST_STATUS_PATH + serviceId;
+
+ HttpEntity<RequestDetails> requestDetailEntity = new HttpEntity<>(requestDetails, buildRequestHeader());
+
+ try {
+ ResponseEntity<CreateServiceInstanceResponse> response = restTemplate.exchange(url, HttpMethod.DELETE,
+ new HttpEntity<>(requestDetailEntity, buildRequestHeader()), CreateServiceInstanceResponse.class);
+
+ logResponsePost(url, response);
+ return response;
+
+ } catch (BackendFunctionalException e) {
+ LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
+ return null;
+ }
+
+ }
+
+ private void logResponsePost(String url, ResponseEntity<CreateServiceInstanceResponse> response) {
+ LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
+ LOGGER.debug(RESPONSE_BODY + response.getBody().toString());
+
+ if (!response.getStatusCode().equals(HttpStatus.CREATED)) {
+ LOGGER.warn("HTTP call SO on " + url + RETURNS + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ }
+
+
+ public GetRequestStatusResponse callGetRequestStatus(String requestId) {
+ String url = soHostname + OnapComponentsUrlPaths.MSO_GET_REQUEST_STATUS_PATH + requestId;
+
+ try {
+
+ ResponseEntity<GetRequestStatusResponse> response = restTemplate.exchange(url, HttpMethod.GET,
+ new HttpEntity<>(buildRequestHeader()), GetRequestStatusResponse.class);
+ logResponseGet(url, response);
+ return response.getBody();
+
+ } catch (BackendFunctionalException e) {
+ LOGGER.error(ERROR_ON_CALLING + url + " ," + e);
+ return null;
+ }
+ }
+
+ private void logResponseGet(String url, ResponseEntity<GetRequestStatusResponse> response) {
+ LOGGER.debug(RESPONSE_BODY + response.getBody().toString());
+ LOGGER.info(RESPONSE_STATUS + response.getStatusCodeValue());
+ if (!response.getStatusCode().equals(HttpStatus.OK)) {
+ LOGGER.warn("HTTP call on " + url + RETURNS + response.getStatusCodeValue() + ", "
+ + response.getBody().toString());
+ }
+ }
+
+ private HttpHeaders buildRequestHeader() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HEADER_AUTHORIZATION, soHeaderAuthorization);
+ httpHeaders.add(X_FROM_APP_ID, soApiId);
+ httpHeaders.add("Accept", "application/json");
+ httpHeaders.add("Content-Type", "application/json");
+ return httpHeaders;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ActionType.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ActionType.java
new file mode 100644
index 0000000..f9543e6
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ActionType.java
@@ -0,0 +1,60 @@
+package org.onap.nbi.apis.serviceorder.model;
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+/**
+ *
+ */
+public enum ActionType {
+
+ ADD("add"),
+
+ MODIFY("modify"),
+
+ DELETE("delete"),
+
+ NOCHANGE("noChange");
+
+ private String value;
+
+ ActionType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static ActionType fromValue(String text) {
+ for (ActionType b : ActionType.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ return null;
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/AppointmentRef.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/AppointmentRef.java
new file mode 100755
index 0000000..98ac0a1
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/AppointmentRef.java
@@ -0,0 +1,150 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Used to precise that an appointment was set-up with a related party for this order item
+ */
+@ApiModel(description = "Used to precise that an appointment was set-up with a related party for this order item")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class AppointmentRef {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("@referredType")
+ private String referredType = null;
+
+ public AppointmentRef id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the appointment
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of the appointment")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public AppointmentRef href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Reference of the appointmenrt
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(required = true, value = "Reference of the appointmenrt")
+ @NotNull
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public AppointmentRef referredType(String referredType) {
+ this.referredType = referredType;
+ return this;
+ }
+
+ /**
+ * @return referredType
+ **/
+ @JsonProperty("@referredType")
+ @ApiModelProperty(value = "")
+ public String getReferredType() {
+ return referredType;
+ }
+
+ public void setReferredType(String referredType) {
+ this.referredType = referredType;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ AppointmentRef appointmentRef = (AppointmentRef) o;
+ return Objects.equals(this.id, appointmentRef.id) && Objects.equals(this.href, appointmentRef.href)
+ && Objects.equals(this.referredType, appointmentRef.referredType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, referredType);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class AppointmentRef {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" referredType: ").append(toIndentedString(referredType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ErrorRepresentation.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ErrorRepresentation.java
new file mode 100755
index 0000000..ed35a63
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ErrorRepresentation.java
@@ -0,0 +1,256 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ *
+ */
+@ApiModel(description = "")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ErrorRepresentation {
+ @JsonProperty("code")
+ private Integer code = null;
+
+ @JsonProperty("reason")
+ private String reason = null;
+
+ @JsonProperty("message")
+ private String message = null;
+
+ @JsonProperty("status")
+ private String status = null;
+
+ @JsonProperty("referenceError")
+ private String referenceError = null;
+
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ public ErrorRepresentation code(Integer code) {
+ this.code = code;
+ return this;
+ }
+
+ /**
+ * Application related code (as defined in the API or from a common list)
+ *
+ * @return code
+ **/
+ @JsonProperty("code")
+ @ApiModelProperty(required = true, value = "Application related code (as defined in the API or from a common list)")
+ @NotNull
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public ErrorRepresentation reason(String reason) {
+ this.reason = reason;
+ return this;
+ }
+
+ /**
+ * Text that explains the reason for error. This can be shown to a client user.
+ *
+ * @return reason
+ **/
+ @JsonProperty("reason")
+ @ApiModelProperty(required = true,
+ value = "Text that explains the reason for error. This can be shown to a client user.")
+ @NotNull
+ public String getReason() {
+ return reason;
+ }
+
+ public void setReason(String reason) {
+ this.reason = reason;
+ }
+
+ public ErrorRepresentation message(String message) {
+ this.message = message;
+ return this;
+ }
+
+ /**
+ * Text that provide more details and corrective actions related to the error. This can be shown
+ * to a client user
+ *
+ * @return message
+ **/
+ @JsonProperty("message")
+ @ApiModelProperty(
+ value = "Text that provide more details and corrective actions related to the error. This can be shown to a client user")
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public ErrorRepresentation status(String status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * http error code extension like 400-2
+ *
+ * @return status
+ **/
+ @JsonProperty("status")
+ @ApiModelProperty(value = "http error code extension like 400-2")
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public ErrorRepresentation referenceError(String referenceError) {
+ this.referenceError = referenceError;
+ return this;
+ }
+
+ /**
+ * url pointing to documentation describing the error
+ *
+ * @return referenceError
+ **/
+ @JsonProperty("referenceError")
+ @ApiModelProperty(value = "url pointing to documentation describing the error")
+ public String getReferenceError() {
+ return referenceError;
+ }
+
+ public void setReferenceError(String referenceError) {
+ this.referenceError = referenceError;
+ }
+
+ public ErrorRepresentation type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * The class type of a REST resource
+ *
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "The class type of a REST resource")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public ErrorRepresentation schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * it provides a link to the schema describing a REST resource
+ *
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "it provides a link to the schema describing a REST resource")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ErrorRepresentation errorRepresentation = (ErrorRepresentation) o;
+ return Objects.equals(this.code, errorRepresentation.code)
+ && Objects.equals(this.reason, errorRepresentation.reason)
+ && Objects.equals(this.message, errorRepresentation.message)
+ && Objects.equals(this.status, errorRepresentation.status)
+ && Objects.equals(this.referenceError, errorRepresentation.referenceError)
+ && Objects.equals(this.type, errorRepresentation.type)
+ && Objects.equals(this.schemaLocation, errorRepresentation.schemaLocation);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(code, reason, message, status, referenceError, type, schemaLocation);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ErrorRepresentation {\n");
+
+ sb.append(" code: ").append(toIndentedString(code)).append("\n");
+ sb.append(" reason: ").append(toIndentedString(reason)).append("\n");
+ sb.append(" message: ").append(toIndentedString(message)).append("\n");
+ sb.append(" status: ").append(toIndentedString(status)).append("\n");
+ sb.append(" referenceError: ").append(toIndentedString(referenceError)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/Note.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/Note.java
new file mode 100755
index 0000000..04cef33
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/Note.java
@@ -0,0 +1,154 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * Extra-information about the order (e.g. useful to add extra delivery information that could be
+ * useful for a human process
+ */
+@ApiModel(
+ description = "Extra-information about the order (e.g. useful to add extra delivery information that could be useful for a human process")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class Note {
+ @JsonProperty("date")
+ private Date date = null;
+
+ @JsonProperty("author")
+ private String author = null;
+
+ @JsonProperty("text")
+ private String text = null;
+
+ public Note date(Date date) {
+ this.date = date;
+ return this;
+ }
+
+ /**
+ * Date of the note
+ *
+ * @return date
+ **/
+ @JsonProperty("date")
+ @ApiModelProperty(value = "Date of the note")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public Note author(String author) {
+ this.author = author;
+ return this;
+ }
+
+ /**
+ * Author of the note
+ *
+ * @return author
+ **/
+ @JsonProperty("author")
+ @ApiModelProperty(value = "Author of the note")
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public Note text(String text) {
+ this.text = text;
+ return this;
+ }
+
+ /**
+ * Text of the note
+ *
+ * @return text
+ **/
+ @JsonProperty("text")
+ @ApiModelProperty(value = "Text of the note")
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Note note = (Note) o;
+ return Objects.equals(this.date, note.date) && Objects.equals(this.author, note.author)
+ && Objects.equals(this.text, note.text);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(date, author, text);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Note {\n");
+
+ sb.append(" date: ").append(toIndentedString(date)).append("\n");
+ sb.append(" author: ").append(toIndentedString(author)).append("\n");
+ sb.append(" text: ").append(toIndentedString(text)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRef.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRef.java
new file mode 100755
index 0000000..141726d
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRef.java
@@ -0,0 +1,126 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Reference of an order item
+ */
+@ApiModel(description = "Reference of an order item")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class OrderItemRef {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ public OrderItemRef id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the order irtem
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of the order irtem")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public OrderItemRef href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Unique reference of the order item
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Unique reference of the order item")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderItemRef orderItemRef = (OrderItemRef) o;
+ return Objects.equals(this.id, orderItemRef.id) && Objects.equals(this.href, orderItemRef.href);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderItemRef {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRelationship.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRelationship.java
new file mode 100755
index 0000000..0bd296c
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderItemRelationship.java
@@ -0,0 +1,130 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Linked order item to the one containing this attribute
+ */
+@ApiModel(description = "Linked order item to the one containing this attribute")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class OrderItemRelationship {
+ @JsonProperty("type")
+ private RelationshipType type = null;
+
+ @JsonProperty("id")
+ private String id = null;
+
+ public OrderItemRelationship type(RelationshipType type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * The type of related order item, can be : dependancy if the order item needs to be “not
+ * started” until another order item is complete
+ *
+ * @return type
+ **/
+ @JsonProperty("type")
+ @ApiModelProperty(required = true,
+ value = "The type of related order item, can be : dependancy if the order item needs to be “not started” until another order item is complete")
+ @NotNull
+ public RelationshipType getType() {
+ return type;
+ }
+
+ public void setType(RelationshipType type) {
+ this.type = type;
+ }
+
+ public OrderItemRelationship id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of an order item
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of an order item")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderItemRelationship orderItemRelationship = (OrderItemRelationship) o;
+ return Objects.equals(this.type, orderItemRelationship.type)
+ && Objects.equals(this.id, orderItemRelationship.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, id);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderItemRelationship {\n");
+
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderRelationship.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderRelationship.java
new file mode 100755
index 0000000..4856d7e
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/OrderRelationship.java
@@ -0,0 +1,177 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Linked order to the one containing this attribute
+ */
+@ApiModel(description = "Linked order to the one containing this attribute")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class OrderRelationship {
+ @JsonProperty("type")
+ private String type = null;
+
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("@referredType")
+ private String referredType = null;
+
+ public OrderRelationship type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * The type of related order, can be : “dependency” if the order needs to be “not started” until
+ * another order item is complete (a service order in this case) or “cross-ref” to keep track of
+ * the source order (a productOrder)
+ *
+ * @return type
+ **/
+ @JsonProperty("type")
+ @ApiModelProperty(
+ value = "The type of related order, can be : “dependency” if the order needs to be “not started” until another order item is complete (a service order in this case) or “cross-ref” to keep track of the source order (a productOrder)")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public OrderRelationship id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * The id of the related order
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "The id of the related order")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public OrderRelationship href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * A hyperlink to the related order
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "A hyperlink to the related order")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public OrderRelationship referredType(String referredType) {
+ this.referredType = referredType;
+ return this;
+ }
+
+ /**
+ * @return referredType
+ **/
+ @JsonProperty("@referredType")
+ @ApiModelProperty(value = "")
+ public String getReferredType() {
+ return referredType;
+ }
+
+ public void setReferredType(String referredType) {
+ this.referredType = referredType;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderRelationship orderRelationship = (OrderRelationship) o;
+ return Objects.equals(this.type, orderRelationship.type) && Objects.equals(this.id, orderRelationship.id)
+ && Objects.equals(this.href, orderRelationship.href)
+ && Objects.equals(this.referredType, orderRelationship.referredType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, id, href, referredType);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderRelationship {\n");
+
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" referredType: ").append(toIndentedString(referredType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/Place.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/Place.java
new file mode 100755
index 0000000..f39fa95
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/Place.java
@@ -0,0 +1,217 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Used to defined a place useful for the service (for example a delivery geographical place)
+ */
+@ApiModel(description = "Used to defined a place useful for the service (for example a delivery geographical place)")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class Place {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("name")
+ private String name = null;
+
+ @JsonProperty("role")
+ private String role = null;
+
+ @JsonProperty("@referredType")
+ private String referredType = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ public Place id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(value = "")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Place href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Reference of a place (for instance in google map)
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Reference of a place (for instance in google map)")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public Place name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @return name
+ **/
+ @JsonProperty("name")
+ @ApiModelProperty(value = "")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Place role(String role) {
+ this.role = role;
+ return this;
+ }
+
+ /**
+ * The role of the place (e.g. delivery address, install site etc)
+ *
+ * @return role
+ **/
+ @JsonProperty("role")
+ @ApiModelProperty(required = true, value = "The role of the place (e.g. delivery address, install site etc)")
+ @NotNull
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public Place referredType(String referredType) {
+ this.referredType = referredType;
+ return this;
+ }
+
+ /**
+ * @return referredType
+ **/
+ @JsonProperty("@referredType")
+ @ApiModelProperty(value = "")
+ public String getReferredType() {
+ return referredType;
+ }
+
+ public void setReferredType(String referredType) {
+ this.referredType = referredType;
+ }
+
+ public Place schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Place place = (Place) o;
+ return Objects.equals(this.id, place.id) && Objects.equals(this.href, place.href)
+ && Objects.equals(this.name, place.name) && Objects.equals(this.role, place.role)
+ && Objects.equals(this.referredType, place.referredType)
+ && Objects.equals(this.schemaLocation, place.schemaLocation);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, name, role, referredType, schemaLocation);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Place {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" role: ").append(toIndentedString(role)).append("\n");
+ sb.append(" referredType: ").append(toIndentedString(referredType)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/RelatedParty.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/RelatedParty.java
new file mode 100755
index 0000000..ae69f67
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/RelatedParty.java
@@ -0,0 +1,199 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * A related party defines party which are involved in this order and the role they are playing
+ */
+@ApiModel(description = "A related party defines party which are involved in this order and the role they are playing")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class RelatedParty {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("role")
+ private String role = null;
+
+ @JsonProperty("name")
+ private String name = null;
+
+ @JsonProperty("@referredType")
+ private String referredType = null;
+
+ public RelatedParty id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of a related party
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of a related party")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public RelatedParty href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * An hyperlink to the party
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "An hyperlink to the party")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public RelatedParty role(String role) {
+ this.role = role;
+ return this;
+ }
+
+ /**
+ * The role of the related party (e.g. Owner, requester, fullfiller etc)
+ *
+ * @return role
+ **/
+ @JsonProperty("role")
+ @ApiModelProperty(required = true, value = "The role of the related party (e.g. Owner, requester, fullfiller etc)")
+ @NotNull
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public RelatedParty name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Name of the related party
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ @ApiModelProperty(value = "Name of the related party")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public RelatedParty referredType(String referredType) {
+ this.referredType = referredType;
+ return this;
+ }
+
+ /**
+ * @return referredType
+ **/
+ @JsonProperty("@referredType")
+ @ApiModelProperty(value = "")
+ public String getReferredType() {
+ return referredType;
+ }
+
+ public void setReferredType(String referredType) {
+ this.referredType = referredType;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RelatedParty relatedParty = (RelatedParty) o;
+ return Objects.equals(this.id, relatedParty.id) && Objects.equals(this.href, relatedParty.href)
+ && Objects.equals(this.role, relatedParty.role) && Objects.equals(this.name, relatedParty.name)
+ && Objects.equals(this.referredType, relatedParty.referredType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, role, name, referredType);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class RelatedParty {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" role: ").append(toIndentedString(role)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" referredType: ").append(toIndentedString(referredType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/RelationshipType.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/RelationshipType.java
new file mode 100644
index 0000000..396bd04
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/RelationshipType.java
@@ -0,0 +1,56 @@
+package org.onap.nbi.apis.serviceorder.model;
+
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+/**
+ *
+ */
+public enum RelationshipType {
+
+ RELIESON("reliesOn");
+
+ private String value;
+
+ RelationshipType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static RelationshipType fromValue(String text) {
+ for (RelationshipType b : RelationshipType.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ return null;
+ }
+}
+
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/Service.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/Service.java
new file mode 100755
index 0000000..1253ce6
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/Service.java
@@ -0,0 +1,357 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Service attributes description (these are as per the Service ODE model as used in the Service
+ * Inventory specification)
+ */
+@ApiModel(
+ description = "Service attributes description (these are as per the Service ODE model as used in the Service Inventory specification)")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class Service {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("name")
+ private String name = null;
+
+ @JsonProperty("serviceState")
+ private String serviceState = null;
+
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ @JsonProperty("serviceCharacteristic")
+ private List<ServiceCharacteristic> serviceCharacteristic = null;
+
+ @JsonProperty("serviceRelationship")
+ private List<ServiceRelationship> serviceRelationship = null;
+
+ @JsonProperty("relatedParty")
+ private List<RelatedParty> relatedParty = null;
+
+ @JsonProperty("serviceSpecification")
+ private ServiceSpecificationRef serviceSpecification = null;
+
+ public Service id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Identifier of a service instance
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Identifier of a service instance")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Service href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Reference to the owned Service (useful for delete or modify command)
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Reference to the owned Service (useful for delete or modify command)")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public Service name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Name of the service
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ @ApiModelProperty(value = "Name of the service")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Service serviceState(String serviceState) {
+ this.serviceState = serviceState;
+ return this;
+ }
+
+ /**
+ * The lifecycle state of the service
+ *
+ * @return serviceState
+ **/
+ @JsonProperty("serviceState")
+ @ApiModelProperty(value = "The lifecycle state of the service")
+ public String getServiceState() {
+ return serviceState;
+ }
+
+ public void setServiceState(String serviceState) {
+ this.serviceState = serviceState;
+ }
+
+ public Service type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Service schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+ public Service serviceCharacteristic(List<ServiceCharacteristic> serviceCharacteristic) {
+ this.serviceCharacteristic = serviceCharacteristic;
+ return this;
+ }
+
+ public Service addServiceCharacteristicItem(ServiceCharacteristic serviceCharacteristicItem) {
+ if (this.serviceCharacteristic == null) {
+ this.serviceCharacteristic = new ArrayList<ServiceCharacteristic>();
+ }
+ this.serviceCharacteristic.add(serviceCharacteristicItem);
+ return this;
+ }
+
+ /**
+ * A list of service characteristics .A name/value pair list used to store instance specific
+ * values of attributes. The behavior is equivalent to a MAP data structure where only one entry
+ * for any given value of \&quot;name\&quot; can exist
+ *
+ * @return serviceCharacteristic
+ **/
+ @JsonProperty("serviceCharacteristic")
+ @ApiModelProperty(
+ value = "A list of service characteristics .A name/value pair list used to store instance specific values of attributes. The behavior is equivalent to a MAP data structure where only one entry for any given value of \"name\" can exist")
+ public List<ServiceCharacteristic> getServiceCharacteristic() {
+ return serviceCharacteristic;
+ }
+
+ public void setServiceCharacteristic(List<ServiceCharacteristic> serviceCharacteristic) {
+ this.serviceCharacteristic = serviceCharacteristic;
+ }
+
+ public Service serviceRelationship(List<ServiceRelationship> serviceRelationship) {
+ this.serviceRelationship = serviceRelationship;
+ return this;
+ }
+
+ public Service addServiceRelationshipItem(ServiceRelationship serviceRelationshipItem) {
+ if (this.serviceRelationship == null) {
+ this.serviceRelationship = new ArrayList<ServiceRelationship>();
+ }
+ this.serviceRelationship.add(serviceRelationshipItem);
+ return this;
+ }
+
+ /**
+ * A list or service relationships (ServiceRelationship[*]). Linked Services to the one
+ * instantiate, it can be : “reliesOn” if the Service needs another already owned Service to
+ * rely on (e.g. an option on an already owned mobile access Service) or “targets” or
+ * “isTargeted” (depending on the way of expressing the link) for any other kind of links that
+ * may be useful
+ *
+ * @return serviceRelationship
+ **/
+ @JsonProperty("serviceRelationship")
+ @ApiModelProperty(
+ value = "A list or service relationships (ServiceRelationship[*]). Linked Services to the one instantiate, it can be : “reliesOn” if the Service needs another already owned Service to rely on (e.g. an option on an already owned mobile access Service) or “targets” or “isTargeted” (depending on the way of expressing the link) for any other kind of links that may be useful")
+ public List<ServiceRelationship> getServiceRelationship() {
+ return serviceRelationship;
+ }
+
+ public void setServiceRelationship(List<ServiceRelationship> serviceRelationship) {
+ this.serviceRelationship = serviceRelationship;
+ }
+
+ public Service relatedParty(List<RelatedParty> relatedParty) {
+ this.relatedParty = relatedParty;
+ return this;
+ }
+
+ public Service addRelatedPartyItem(RelatedParty relatedPartyItem) {
+ if (this.relatedParty == null) {
+ this.relatedParty = new ArrayList<RelatedParty>();
+ }
+ this.relatedParty.add(relatedPartyItem);
+ return this;
+ }
+
+ /**
+ * A list of related party parties linked at the Service level (it may be a User for example)
+ *
+ * @return relatedParty
+ **/
+ @JsonProperty("relatedParty")
+ @ApiModelProperty(
+ value = "A list of related party parties linked at the Service level (it may be a User for example)")
+ public List<RelatedParty> getRelatedParty() {
+ return relatedParty;
+ }
+
+ public void setRelatedParty(List<RelatedParty> relatedParty) {
+ this.relatedParty = relatedParty;
+ }
+
+ public Service serviceSpecification(ServiceSpecificationRef serviceSpecification) {
+ this.serviceSpecification = serviceSpecification;
+ return this;
+ }
+
+ /**
+ * @return serviceSpecification
+ **/
+ @JsonProperty("serviceSpecification")
+ @ApiModelProperty(value = "")
+ @NotNull
+ public ServiceSpecificationRef getServiceSpecification() {
+ return serviceSpecification;
+ }
+
+ public void setServiceSpecification(ServiceSpecificationRef serviceSpecification) {
+ this.serviceSpecification = serviceSpecification;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Service service = (Service) o;
+ return Objects.equals(this.id, service.id) && Objects.equals(this.href, service.href)
+ && Objects.equals(this.name, service.name) && Objects.equals(this.serviceState, service.serviceState)
+ && Objects.equals(this.type, service.type)
+ && Objects.equals(this.schemaLocation, service.schemaLocation)
+ && Objects.equals(this.serviceCharacteristic, service.serviceCharacteristic)
+ && Objects.equals(this.serviceRelationship, service.serviceRelationship)
+ && Objects.equals(this.relatedParty, service.relatedParty)
+ && Objects.equals(this.serviceSpecification, service.serviceSpecification);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, name, serviceState, type, schemaLocation, serviceCharacteristic,
+ serviceRelationship, relatedParty, serviceSpecification);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Service {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" serviceState: ").append(toIndentedString(serviceState)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append(" serviceCharacteristic: ").append(toIndentedString(serviceCharacteristic)).append("\n");
+ sb.append(" serviceRelationship: ").append(toIndentedString(serviceRelationship)).append("\n");
+ sb.append(" relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+ sb.append(" serviceSpecification: ").append(toIndentedString(serviceSpecification)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceCharacteristic.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceCharacteristic.java
new file mode 100755
index 0000000..a0eaa86
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceCharacteristic.java
@@ -0,0 +1,148 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * ServiceCharacteristic
+ */
+@ApiModel(description = "ServiceCharacteristic")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ServiceCharacteristic {
+ @JsonProperty("name")
+ private String name = null;
+
+ @JsonProperty("valueType")
+ private String valueType = null;
+
+ @JsonProperty("value")
+ private Value value = null;
+
+ public ServiceCharacteristic name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Name of characteristic
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ @ApiModelProperty(required = true, value = "Name of characteristic")
+ @NotNull
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ServiceCharacteristic valueType(String valueType) {
+ this.valueType = valueType;
+ return this;
+ }
+
+ /**
+ * @return valueType
+ **/
+ @JsonProperty("valueType")
+ @ApiModelProperty(value = "")
+ public String getValueType() {
+ return valueType;
+ }
+
+ public void setValueType(String valueType) {
+ this.valueType = valueType;
+ }
+
+ public ServiceCharacteristic value(Value value) {
+ this.value = value;
+ return this;
+ }
+
+ /**
+ * @return value
+ **/
+ @JsonProperty("value")
+ @ApiModelProperty(value = "")
+ public Value getValue() {
+ return value;
+ }
+
+ public void setValue(Value value) {
+ this.value = value;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceCharacteristic serviceCharacteristic = (ServiceCharacteristic) o;
+ return Objects.equals(this.name, serviceCharacteristic.name)
+ && Objects.equals(this.valueType, serviceCharacteristic.valueType)
+ && Objects.equals(this.value, serviceCharacteristic.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, valueType, value);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceCharacteristic {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" valueType: ").append(toIndentedString(valueType)).append("\n");
+ sb.append(" value: ").append(toIndentedString(value)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrder.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrder.java
new file mode 100755
index 0000000..1726f0e
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrder.java
@@ -0,0 +1,589 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.onap.nbi.apis.serviceorder.serviceordervalidator.ValidServiceOrder;
+import org.onap.nbi.commons.Resource;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * A Service Order is a type of order which can be used to place an order between a customer and a
+ * service provider or between a service provider and a partner and vice versa
+ */
+@ApiModel(
+ description = "A Service Order is a type of order which can be used to place an order between a customer and a service provider or between a service provider and a partner and vice versa")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+@Document
+@ValidServiceOrder
+public class ServiceOrder implements Resource {
+
+ @Id
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("externalId")
+ private String externalId = null;
+
+ @JsonProperty("priority")
+ private String priority = null;
+
+ @JsonProperty("description")
+ private String description = null;
+
+ @JsonProperty("category")
+ private String category = null;
+
+ @JsonProperty("state")
+ private StateType state = null;
+
+ @JsonProperty("orderDate")
+ private Date orderDate = null;
+
+ @JsonProperty("completionDateTime")
+ private Date completionDateTime = null;
+
+ @JsonProperty("expectedCompletionDate")
+ private Date expectedCompletionDate = null;
+
+ @JsonProperty("requestedStartDate")
+ private Date requestedStartDate = null;
+
+ @JsonProperty("requestedCompletionDate")
+ private Date requestedCompletionDate = null;
+
+ @JsonProperty("startDate")
+ private Date startDate = null;
+
+ @JsonProperty("@baseType")
+ private String baseType = null;
+
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ @JsonProperty("relatedParty")
+ private List<RelatedParty> relatedParty = null;
+
+ @JsonProperty("orderRelationship")
+ private List<OrderRelationship> orderRelationship = null;
+
+ @JsonProperty("orderItem")
+ private List<ServiceOrderItem> orderItem = null;
+
+ public ServiceOrder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+
+ /**
+ * ID created on repository side
+ *
+ * @return id
+ **/
+ @Override
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "ID created on repository side")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ServiceOrder href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Hyperlink to access the order
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Hyperlink to access the order")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public ServiceOrder externalId(String externalId) {
+ this.externalId = externalId;
+ return this;
+ }
+
+ /**
+ * ID given by the consumer and only understandable by him (to facilitate his searches)
+ *
+ * @return externalId
+ **/
+ @JsonProperty("externalId")
+ @ApiModelProperty(value = "ID given by the consumer and only understandable by him (to facilitate his searches)")
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+
+ public ServiceOrder priority(String priority) {
+ this.priority = priority;
+ return this;
+ }
+
+ /**
+ * A way that can be used by consumers to prioritize orders in Service Order Management system
+ * (from 0 to 4 : 0 is the highest priority, and 4 the lowest)
+ *
+ * @return priority
+ **/
+ @JsonProperty("priority")
+ @ApiModelProperty(
+ value = "A way that can be used by consumers to prioritize orders in Service Order Management system (from 0 to 4 : 0 is the highest priority, and 4 the lowest)")
+ public String getPriority() {
+ return priority;
+ }
+
+ public void setPriority(String priority) {
+ this.priority = priority;
+ }
+
+ public ServiceOrder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * A free-text description of the service order
+ *
+ * @return description
+ **/
+ @JsonProperty("description")
+ @ApiModelProperty(value = "A free-text description of the service order")
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public ServiceOrder category(String category) {
+ this.category = category;
+ return this;
+ }
+
+ /**
+ * Used to categorize the order that can be useful for the OM system (e.g. “broadband”,
+ * “TVOption”, ...)
+ *
+ * @return category
+ **/
+ @JsonProperty("category")
+ @ApiModelProperty(
+ value = "Used to categorize the order that can be useful for the OM system (e.g. “broadband”, “TVOption”, ...)")
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(String category) {
+ this.category = category;
+ }
+
+ public ServiceOrder state(StateType state) {
+ this.state = state;
+ return this;
+ }
+
+ /**
+ * State of the order : described in the state-machine diagram
+ *
+ * @return state
+ **/
+ @JsonProperty("state")
+ @ApiModelProperty(value = "State of the order : described in the state-machine diagram")
+ public StateType getState() {
+ return state;
+ }
+
+ public void setState(StateType state) {
+ this.state = state;
+ }
+
+ public ServiceOrder orderDate(Date orderDate) {
+ this.orderDate = orderDate;
+ return this;
+ }
+
+ /**
+ * @return orderDate
+ **/
+ @JsonProperty("orderDate")
+ @ApiModelProperty(value = "")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getOrderDate() {
+ return orderDate;
+ }
+
+ public void setOrderDate(Date orderDate) {
+ this.orderDate = orderDate;
+ }
+
+ public ServiceOrder completionDateTime(Date completionDateTime) {
+ this.completionDateTime = completionDateTime;
+ return this;
+ }
+
+ /**
+ * Date when the order was completed
+ *
+ * @return completionDateTime
+ **/
+ @JsonProperty("completionDateTime")
+ @ApiModelProperty(value = "Date when the order was completed")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getCompletionDateTime() {
+ return completionDateTime;
+ }
+
+ public void setCompletionDateTime(Date completionDateTime) {
+ this.completionDateTime = completionDateTime;
+ }
+
+
+ /**
+ * @return expectedCompletionDate
+ **/
+ @JsonProperty("expectedCompletionDate")
+ @ApiModelProperty(value = "")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getExpectedCompletionDate() {
+ return expectedCompletionDate;
+ }
+
+ public void setExpectedCompletionDate(Date expectedCompletionDate) {
+ this.expectedCompletionDate = expectedCompletionDate;
+ }
+
+ public ServiceOrder requestedStartDate(Date requestedStartDate) {
+ this.requestedStartDate = requestedStartDate;
+ return this;
+ }
+
+ /**
+ * Order start date wished by the requestor
+ *
+ * @return requestedStartDate
+ **/
+ @JsonProperty("requestedStartDate")
+ @ApiModelProperty(value = "Order start date wished by the requestor")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getRequestedStartDate() {
+ return requestedStartDate;
+ }
+
+ public void setRequestedStartDate(Date requestedStartDate) {
+ this.requestedStartDate = requestedStartDate;
+ }
+
+ public ServiceOrder requestedCompletionDate(Date requestedCompletionDate) {
+ this.requestedCompletionDate = requestedCompletionDate;
+ return this;
+ }
+
+ /**
+ * Requested delivery date from the requestor perspective
+ *
+ * @return requestedCompletionDate
+ **/
+ @JsonProperty("requestedCompletionDate")
+ @ApiModelProperty(value = "Requested delivery date from the requestor perspective")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getRequestedCompletionDate() {
+ return requestedCompletionDate;
+ }
+
+ public void setRequestedCompletionDate(Date requestedCompletionDate) {
+ this.requestedCompletionDate = requestedCompletionDate;
+ }
+
+ public ServiceOrder startDate(Date startDate) {
+ this.startDate = startDate;
+ return this;
+ }
+
+ /**
+ * Date when the order was started for processing
+ *
+ * @return startDate
+ **/
+ @JsonProperty("startDate")
+ @ApiModelProperty(value = "Date when the order was started for processing")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(Date startDate) {
+ this.startDate = startDate;
+ }
+
+ public ServiceOrder baseType(String baseType) {
+ this.baseType = baseType;
+ return this;
+ }
+
+ /**
+ * @return baseType
+ **/
+ @JsonProperty("@baseType")
+ @ApiModelProperty(value = "")
+ public String getBaseType() {
+ return baseType;
+ }
+
+ public void setBaseType(String baseType) {
+ this.baseType = baseType;
+ }
+
+ public ServiceOrder type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public ServiceOrder schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+ public ServiceOrder relatedParty(List<RelatedParty> relatedParty) {
+ this.relatedParty = relatedParty;
+ return this;
+ }
+
+ public ServiceOrder addRelatedPartyItem(RelatedParty relatedPartyItem) {
+ if (this.relatedParty == null) {
+ this.relatedParty = new ArrayList<RelatedParty>();
+ }
+ this.relatedParty.add(relatedPartyItem);
+ return this;
+ }
+
+ /**
+ * A list of related parties which are involved in this order and the role they are playing.
+ *
+ * @return relatedParty
+ **/
+ @JsonProperty("relatedParty")
+ @ApiModelProperty(
+ value = "A list of related parties which are involved in this order and the role they are playing.")
+ public List<RelatedParty> getRelatedParty() {
+ return relatedParty;
+ }
+
+ public void setRelatedParty(List<RelatedParty> relatedParty) {
+ this.relatedParty = relatedParty;
+ }
+
+ public ServiceOrder orderRelationship(List<OrderRelationship> orderRelationship) {
+ this.orderRelationship = orderRelationship;
+ return this;
+ }
+
+ public ServiceOrder addOrderRelationshipItem(OrderRelationship orderRelationshipItem) {
+ if (this.orderRelationship == null) {
+ this.orderRelationship = new ArrayList<OrderRelationship>();
+ }
+ this.orderRelationship.add(orderRelationshipItem);
+ return this;
+ }
+
+ /**
+ * A list of related order references .Linked order to the one containing this attribute
+ *
+ * @return orderRelationship
+ **/
+ @JsonProperty("orderRelationship")
+ @ApiModelProperty(value = "A list of related order references .Linked order to the one containing this attribute")
+ public List<OrderRelationship> getOrderRelationship() {
+ return orderRelationship;
+ }
+
+ public void setOrderRelationship(List<OrderRelationship> orderRelationship) {
+ this.orderRelationship = orderRelationship;
+ }
+
+ public ServiceOrder orderItem(List<ServiceOrderItem> orderItem) {
+ this.orderItem = orderItem;
+ return this;
+ }
+
+ public ServiceOrder addOrderItemItem(ServiceOrderItem orderItemItem) {
+ if (this.orderItem == null) {
+ this.orderItem = new ArrayList<ServiceOrderItem>();
+ }
+ this.orderItem.add(orderItemItem);
+ return this;
+ }
+
+ /**
+ * A list of order items that have to be processed.
+ *
+ * @return orderItem
+ **/
+ @JsonProperty("orderItem")
+ @ApiModelProperty(value = "A list of order items that have to be processed.")
+ @NotEmpty
+ public List<ServiceOrderItem> getOrderItem() {
+ return orderItem;
+ }
+
+ public void setOrderItem(List<ServiceOrderItem> orderItem) {
+ this.orderItem = orderItem;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceOrder serviceOrder = (ServiceOrder) o;
+ return Objects.equals(this.id, serviceOrder.id) && Objects.equals(this.href, serviceOrder.href)
+ && Objects.equals(this.externalId, serviceOrder.externalId)
+ && Objects.equals(this.priority, serviceOrder.priority)
+ && Objects.equals(this.description, serviceOrder.description)
+ && Objects.equals(this.category, serviceOrder.category)
+ && Objects.equals(this.state, serviceOrder.state)
+ && Objects.equals(this.orderDate, serviceOrder.orderDate)
+ && Objects.equals(this.completionDateTime, serviceOrder.completionDateTime)
+ && Objects.equals(this.expectedCompletionDate, serviceOrder.expectedCompletionDate)
+ && Objects.equals(this.requestedStartDate, serviceOrder.requestedStartDate)
+ && Objects.equals(this.requestedCompletionDate, serviceOrder.requestedCompletionDate)
+ && Objects.equals(this.startDate, serviceOrder.startDate)
+ && Objects.equals(this.baseType, serviceOrder.baseType) && Objects.equals(this.type, serviceOrder.type)
+ && Objects.equals(this.schemaLocation, serviceOrder.schemaLocation)
+ && Objects.equals(this.relatedParty, serviceOrder.relatedParty)
+ && Objects.equals(this.orderRelationship, serviceOrder.orderRelationship)
+ && Objects.equals(this.orderItem, serviceOrder.orderItem);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, externalId, priority, description, category, state, orderDate, completionDateTime,
+ expectedCompletionDate, requestedStartDate, requestedCompletionDate, startDate, baseType, type,
+ schemaLocation, relatedParty, orderRelationship, orderItem);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceOrder {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" externalId: ").append(toIndentedString(externalId)).append("\n");
+ sb.append(" priority: ").append(toIndentedString(priority)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+ sb.append(" category: ").append(toIndentedString(category)).append("\n");
+ sb.append(" state: ").append(toIndentedString(state)).append("\n");
+ sb.append(" orderDate: ").append(toIndentedString(orderDate)).append("\n");
+ sb.append(" completionDateTime: ").append(toIndentedString(completionDateTime)).append("\n");
+ sb.append(" expectedCompletionDate: ").append(toIndentedString(expectedCompletionDate)).append("\n");
+ sb.append(" requestedStartDate: ").append(toIndentedString(requestedStartDate)).append("\n");
+ sb.append(" requestedCompletionDate: ").append(toIndentedString(requestedCompletionDate)).append("\n");
+ sb.append(" startDate: ").append(toIndentedString(startDate)).append("\n");
+ sb.append(" baseType: ").append(toIndentedString(baseType)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append(" relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+ sb.append(" orderRelationship: ").append(toIndentedString(orderRelationship)).append("\n");
+ sb.append(" orderItem: ").append(toIndentedString(orderItem)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrderItem.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrderItem.java
new file mode 100755
index 0000000..50f9cfe
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceOrderItem.java
@@ -0,0 +1,300 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * An identified part of the order. A service order is decomposed into one or more order items.
+ */
+@ApiModel(description = "An identified part of the order. A service order is decomposed into one or more order items.")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ServiceOrderItem {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("action")
+ private ActionType action = null;
+
+ @JsonProperty("state")
+ private StateType state = null;
+
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ @JsonProperty("@baseType")
+ private String baseType = null;
+
+ @JsonIgnore
+ private String requestId;
+
+ @JsonProperty("orderItemRelationship")
+ private List<OrderItemRelationship> orderItemRelationship = new ArrayList<>();
+
+ @JsonProperty("service")
+ private Service service = null;
+
+ public ServiceOrderItem id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Identifier of the line item (generally it is a sequence number 01, 02, 03, …)
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true,
+ value = "Identifier of the line item (generally it is a sequence number 01, 02, 03, …)")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ServiceOrderItem action(ActionType action) {
+ this.action = action;
+ return this;
+ }
+
+ /**
+ * The action to be carried out on the Service. Can be add, modify, delete, noChange
+ *
+ * @return action
+ **/
+ @JsonProperty("action")
+ @ApiModelProperty(value = "The action to be carried out on the Service. Can be add, modify, delete, noChange")
+ public ActionType getAction() {
+ return action;
+ }
+
+ public void setAction(ActionType action) {
+ this.action = action;
+ }
+
+ public ServiceOrderItem state(StateType state) {
+ this.state = state;
+ return this;
+ }
+
+ /**
+ * State of the order item (described in the state machine diagram)
+ *
+ * @return state
+ **/
+ @JsonProperty("state")
+ @ApiModelProperty(value = "State of the order item (described in the state machine diagram)")
+ public StateType getState() {
+ return state;
+ }
+
+ public void setState(StateType state) {
+ this.state = state;
+ }
+
+ public ServiceOrderItem type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ *
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public ServiceOrderItem schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ *
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+ public ServiceOrderItem baseType(String baseType) {
+ this.baseType = baseType;
+ return this;
+ }
+
+ /**
+ *
+ * @return baseType
+ **/
+ @JsonProperty("@baseType")
+ @ApiModelProperty(value = "")
+ public String getBaseType() {
+ return baseType;
+ }
+
+ public void setBaseType(String baseType) {
+ this.baseType = baseType;
+ }
+
+ public ServiceOrderItem orderItemRelationship(List<OrderItemRelationship> orderItemRelationship) {
+ this.orderItemRelationship = orderItemRelationship;
+ return this;
+ }
+
+ public ServiceOrderItem addOrderItemRelationshipItem(OrderItemRelationship orderItemRelationshipItem) {
+ if (this.orderItemRelationship == null) {
+ this.orderItemRelationship = new ArrayList<OrderItemRelationship>();
+ }
+ this.orderItemRelationship.add(orderItemRelationshipItem);
+ return this;
+ }
+
+ /**
+ * Linked order item to the one containing this attribute
+ *
+ * @return orderItemRelationship
+ **/
+ @JsonProperty("orderItemRelationship")
+ @ApiModelProperty(value = "Linked order item to the one containing this attribute")
+ public List<OrderItemRelationship> getOrderItemRelationship() {
+ return orderItemRelationship;
+ }
+
+ public void setOrderItemRelationship(List<OrderItemRelationship> orderItemRelationship) {
+ this.orderItemRelationship = orderItemRelationship;
+ }
+
+ public ServiceOrderItem service(Service service) {
+ this.service = service;
+ return this;
+ }
+
+ /**
+ * The Service to be acted on by the order item
+ *
+ * @return service
+ **/
+ @JsonProperty("service")
+ @ApiModelProperty(required = true, value = "The Service to be acted on by the order item")
+ @NotNull
+ public Service getService() {
+ return service;
+ }
+
+ public void setService(Service service) {
+ this.service = service;
+ }
+
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceOrderItem serviceOrderItem = (ServiceOrderItem) o;
+ return Objects.equals(this.id, serviceOrderItem.id) && Objects.equals(this.action, serviceOrderItem.action)
+ && Objects.equals(this.state, serviceOrderItem.state)
+ && Objects.equals(this.type, serviceOrderItem.type)
+ && Objects.equals(this.schemaLocation, serviceOrderItem.schemaLocation)
+ && Objects.equals(this.baseType, serviceOrderItem.baseType)
+ && Objects.equals(this.orderItemRelationship, serviceOrderItem.orderItemRelationship)
+ && Objects.equals(this.service, serviceOrderItem.service)
+ && Objects.equals(this.requestId, serviceOrderItem.requestId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, action, state, type, schemaLocation, baseType, orderItemRelationship, service,
+ requestId);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceOrderItem {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" action: ").append(toIndentedString(action)).append("\n");
+ sb.append(" state: ").append(toIndentedString(state)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append(" baseType: ").append(toIndentedString(baseType)).append("\n");
+ sb.append(" orderItemRelationship: ").append(toIndentedString(orderItemRelationship)).append("\n");
+ sb.append(" requestId: ").append(toIndentedString(requestId)).append("\n");
+ sb.append(" service: ").append(toIndentedString(service)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRef.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRef.java
new file mode 100755
index 0000000..e538d09
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRef.java
@@ -0,0 +1,126 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Service references
+ */
+@ApiModel(description = "Service references")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ServiceRef {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ public ServiceRef id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the service
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of the service")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ServiceRef href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Reference of the service
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Reference of the service")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceRef serviceRef = (ServiceRef) o;
+ return Objects.equals(this.id, serviceRef.id) && Objects.equals(this.href, serviceRef.href);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceRef {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRelationship.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRelationship.java
new file mode 100755
index 0000000..2119916
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceRelationship.java
@@ -0,0 +1,132 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * Linked Services to the one instantiate
+ */
+@ApiModel(description = "Linked Services to the one instantiate")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ServiceRelationship {
+ @JsonProperty("type")
+ private RelationshipType type = null;
+
+ @JsonProperty("service")
+ private Service service = null;
+
+ public ServiceRelationship type(RelationshipType type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Relationship type. It can be : “reliesOn” if the Service needs another already owned Service
+ * to rely on (e.g. an option on an already owned mobile access Service) or “targets” or
+ * “isTargeted” (depending on the way of expressing the link) for any other kind of links that
+ * may be useful
+ *
+ * @return type
+ **/
+ @JsonProperty("type")
+ @ApiModelProperty(required = true,
+ value = "Relationship type. It can be : “reliesOn” if the Service needs another already owned Service to rely on (e.g. an option on an already owned mobile access Service) or “targets” or “isTargeted” (depending on the way of expressing the link) for any other kind of links that may be useful")
+ @NotNull
+ public RelationshipType getType() {
+ return type;
+ }
+
+ public void setType(RelationshipType type) {
+ this.type = type;
+ }
+
+ public ServiceRelationship service(Service service) {
+ this.service = service;
+ return this;
+ }
+
+ /**
+ * Service reference
+ *
+ * @return service
+ **/
+ @JsonProperty("service")
+ @ApiModelProperty(required = true, value = "Service reference")
+ @NotNull
+ public Service getService() {
+ return service;
+ }
+
+ public void setService(Service service) {
+ this.service = service;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceRelationship serviceRelationship = (ServiceRelationship) o;
+ return Objects.equals(this.type, serviceRelationship.type)
+ && Objects.equals(this.service, serviceRelationship.service);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, service);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceRelationship {\n");
+
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" service: ").append(toIndentedString(service)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceSpecificationRef.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceSpecificationRef.java
new file mode 100755
index 0000000..2a22216
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/ServiceSpecificationRef.java
@@ -0,0 +1,265 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ * The service specification (default values, etc. are fetched from the catalogue).
+ */
+@ApiModel(description = "The service specification (default values, etc. are fetched from the catalogue).")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class ServiceSpecificationRef {
+ @JsonProperty("id")
+ private String id = null;
+
+ @JsonProperty("href")
+ private String href = null;
+
+ @JsonProperty("name")
+ private String name = null;
+
+ @JsonProperty("version")
+ private String version = null;
+
+ @JsonProperty("targetServiceSchema")
+ private TargetServiceSchema targetServiceSchema = null;
+
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ @JsonProperty("@baseType")
+ private String baseType = null;
+
+ public ServiceSpecificationRef id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the service specification
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ @ApiModelProperty(required = true, value = "Unique identifier of the service specification")
+ @NotNull
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ServiceSpecificationRef href(String href) {
+ this.href = href;
+ return this;
+ }
+
+ /**
+ * Reference of the service specification
+ *
+ * @return href
+ **/
+ @JsonProperty("href")
+ @ApiModelProperty(value = "Reference of the service specification")
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public ServiceSpecificationRef name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @return name
+ **/
+ @JsonProperty("name")
+ @ApiModelProperty(value = "")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ServiceSpecificationRef version(String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * @return version
+ **/
+ @JsonProperty("version")
+ @ApiModelProperty(value = "")
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public ServiceSpecificationRef targetServiceSchema(TargetServiceSchema targetServiceSchema) {
+ this.targetServiceSchema = targetServiceSchema;
+ return this;
+ }
+
+ /**
+ * @return targetServiceSchema
+ **/
+ @JsonProperty("targetServiceSchema")
+ @ApiModelProperty(value = "")
+ public TargetServiceSchema getTargetServiceSchema() {
+ return targetServiceSchema;
+ }
+
+ public void setTargetServiceSchema(TargetServiceSchema targetServiceSchema) {
+ this.targetServiceSchema = targetServiceSchema;
+ }
+
+ public ServiceSpecificationRef type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public ServiceSpecificationRef schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+ public ServiceSpecificationRef baseType(String baseType) {
+ this.baseType = baseType;
+ return this;
+ }
+
+ /**
+ * @return baseType
+ **/
+ @JsonProperty("@baseType")
+ @ApiModelProperty(value = "")
+ public String getBaseType() {
+ return baseType;
+ }
+
+ public void setBaseType(String baseType) {
+ this.baseType = baseType;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ServiceSpecificationRef serviceSpecificationRef = (ServiceSpecificationRef) o;
+ return Objects.equals(this.id, serviceSpecificationRef.id)
+ && Objects.equals(this.href, serviceSpecificationRef.href)
+ && Objects.equals(this.name, serviceSpecificationRef.name)
+ && Objects.equals(this.version, serviceSpecificationRef.version)
+ && Objects.equals(this.targetServiceSchema, serviceSpecificationRef.targetServiceSchema)
+ && Objects.equals(this.type, serviceSpecificationRef.type)
+ && Objects.equals(this.schemaLocation, serviceSpecificationRef.schemaLocation)
+ && Objects.equals(this.baseType, serviceSpecificationRef.baseType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, href, name, version, targetServiceSchema, type, schemaLocation, baseType);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ServiceSpecificationRef {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" href: ").append(toIndentedString(href)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" version: ").append(toIndentedString(version)).append("\n");
+ sb.append(" targetServiceSchema: ").append(toIndentedString(targetServiceSchema)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append(" baseType: ").append(toIndentedString(baseType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/StateType.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/StateType.java
new file mode 100755
index 0000000..9e26a1b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/StateType.java
@@ -0,0 +1,72 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+/**
+ *
+ */
+public enum StateType {
+
+ ACKNOWLEDGED("acknowledged"),
+
+ REJECTED("rejected"),
+
+ PENDING("pending"),
+
+ HELD("held"),
+
+ INPROGRESS("inProgress"),
+
+ CANCELLED("cancelled"),
+
+ COMPLETED("completed"),
+
+ FAILED("failed"),
+
+ PARTIAL("partial");
+
+ private String value;
+
+ StateType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static StateType fromValue(String text) {
+ for (StateType b : StateType.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ return null;
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/TargetServiceSchema.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/TargetServiceSchema.java
new file mode 100755
index 0000000..98e6052
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/TargetServiceSchema.java
@@ -0,0 +1,124 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
+import java.util.Objects;
+
+/**
+ *
+ */
+@ApiModel(description = "")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class TargetServiceSchema {
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ public TargetServiceSchema type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(required = true, value = "")
+ @NotNull
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public TargetServiceSchema schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(required = true, value = "")
+ @NotNull
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ TargetServiceSchema targetServiceSchema = (TargetServiceSchema) o;
+ return Objects.equals(this.type, targetServiceSchema.type)
+ && Objects.equals(this.schemaLocation, targetServiceSchema.schemaLocation);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, schemaLocation);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class TargetServiceSchema {\n");
+
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/Value.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/Value.java
new file mode 100755
index 0000000..4d5acaa
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/Value.java
@@ -0,0 +1,143 @@
+/*
+ * API ServiceOrder serviceOrder API designed for ONAP Beijing Release. This API is build from TMF
+ * open API16.5 + applied TMF guideline 3.0
+ *
+ * OpenAPI spec version: 0.1.1_inProgress
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git Do not edit the class manually.
+ *
+ * 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.
+ */
+
+
+package org.onap.nbi.apis.serviceorder.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Objects;
+
+/**
+ * Value is a descriptive structure for service characteristic
+ */
+@ApiModel(description = "Value is a descriptive structure for service characteristic")
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaJerseyServerCodegen",
+ date = "2018-02-19T14:00:30.767Z")
+public class Value {
+ @JsonProperty("@type")
+ private String type = null;
+
+ @JsonProperty("@schemaLocation")
+ private String schemaLocation = null;
+
+ @JsonProperty("serviceCharacteristicValue")
+ private String serviceCharacteristicValue = null;
+
+ public Value type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @return type
+ **/
+ @JsonProperty("@type")
+ @ApiModelProperty(value = "")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Value schemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ return this;
+ }
+
+ /**
+ * @return schemaLocation
+ **/
+ @JsonProperty("@schemaLocation")
+ @ApiModelProperty(value = "")
+ public String getSchemaLocation() {
+ return schemaLocation;
+ }
+
+ public void setSchemaLocation(String schemaLocation) {
+ this.schemaLocation = schemaLocation;
+ }
+
+ public Value serviceCharacteristicValue(String serviceCharacteristicValue) {
+ this.serviceCharacteristicValue = serviceCharacteristicValue;
+ return this;
+ }
+
+ /**
+ * @return serviceCharacteristicValue
+ **/
+ @JsonProperty("serviceCharacteristicValue")
+ @ApiModelProperty(value = "")
+ public String getServiceCharacteristicValue() {
+ return serviceCharacteristicValue;
+ }
+
+ public void setServiceCharacteristicValue(String serviceCharacteristicValue) {
+ this.serviceCharacteristicValue = serviceCharacteristicValue;
+ }
+
+
+ @Override
+ public boolean equals(java.lang.Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Value value = (Value) o;
+ return Objects.equals(this.type, value.type) && Objects.equals(this.schemaLocation, value.schemaLocation)
+ && Objects.equals(this.serviceCharacteristicValue, value.serviceCharacteristicValue);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, schemaLocation, serviceCharacteristicValue);
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Value {\n");
+
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
+ sb.append(" serviceCharacteristicValue: ").append(toIndentedString(serviceCharacteristicValue)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first
+ * line).
+ */
+ private String toIndentedString(java.lang.Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CloudConfiguration.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CloudConfiguration.java
new file mode 100644
index 0000000..e905c09
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CloudConfiguration.java
@@ -0,0 +1,35 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class CloudConfiguration {
+
+ private String lcpCloudRegionId;
+
+ private String tenantId;
+
+ public CloudConfiguration(String lcpCloudRegionId, String tenantId) {
+ this.lcpCloudRegionId = lcpCloudRegionId;
+ this.tenantId = tenantId;
+ }
+
+ public String getLcpCloudRegionId() {
+ return lcpCloudRegionId;
+ }
+
+ public void setLcpCloudRegionId(String lcpCloudRegionId) {
+ this.lcpCloudRegionId = lcpCloudRegionId;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ @Override
+ public String toString() {
+ return "CloudConfiguration{" + "lcpCloudRegionId='" + lcpCloudRegionId + '\'' + ", tenantId='" + tenantId + '\''
+ + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CreateServiceInstanceResponse.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CreateServiceInstanceResponse.java
new file mode 100644
index 0000000..46268cb
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/CreateServiceInstanceResponse.java
@@ -0,0 +1,14 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class CreateServiceInstanceResponse {
+
+ public RequestReference getRequestReference() {
+ return requestReference;
+ }
+
+ public void setRequestReference(RequestReference requestReference) {
+ this.requestReference = requestReference;
+ }
+
+ private RequestReference requestReference;
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/GetRequestStatusResponse.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/GetRequestStatusResponse.java
new file mode 100644
index 0000000..d3c2ccf
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/GetRequestStatusResponse.java
@@ -0,0 +1,45 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+import java.util.Objects;
+
+public class GetRequestStatusResponse {
+
+ private Request request;
+
+
+ public Request getRequest() {
+
+ return request;
+ }
+
+ public void setRequest(Request request) {
+ this.request = request;
+ }
+
+ public GetRequestStatusResponse(Request request) {
+
+ this.request = request;
+ }
+
+ public GetRequestStatusResponse() {}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ GetRequestStatusResponse that = (GetRequestStatusResponse) o;
+ return Objects.equals(request, that.request);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(request);
+ }
+
+ @Override
+ public String toString() {
+ return "GetRequestStatusResponse{" + "request=" + request + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/ModelInfo.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/ModelInfo.java
new file mode 100644
index 0000000..0efd4ee
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/ModelInfo.java
@@ -0,0 +1,82 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class ModelInfo {
+
+ private String modelType;
+
+ private String modelInvariantId;
+
+ private String modelNameVersionId;
+
+ private String modelName;
+
+ private String modelVersion;
+
+ private String modelCustomizationName;
+
+ private String modelCustomizationId;
+
+ public String getModelType() {
+ return modelType;
+ }
+
+ public void setModelType(String modelType) {
+ this.modelType = modelType;
+ }
+
+ public String getModelInvariantId() {
+ return modelInvariantId;
+ }
+
+ public void setModelInvariantId(String modelInvariantId) {
+ this.modelInvariantId = modelInvariantId;
+ }
+
+ public String getModelNameVersionId() {
+ return modelNameVersionId;
+ }
+
+ public void setModelNameVersionId(String modelNameVersionId) {
+ this.modelNameVersionId = modelNameVersionId;
+ }
+
+ public String getModelName() {
+ return modelName;
+ }
+
+ public void setModelName(String modelName) {
+ this.modelName = modelName;
+ }
+
+ public String getModelVersion() {
+ return modelVersion;
+ }
+
+ public void setModelVersion(String modelVersion) {
+ this.modelVersion = modelVersion;
+ }
+
+ public String getModelCustomizationName() {
+ return modelCustomizationName;
+ }
+
+ public void setModelCustomizationName(String modelCustomizationName) {
+ this.modelCustomizationName = modelCustomizationName;
+ }
+
+ public String getModelCustomizationId() {
+ return modelCustomizationId;
+ }
+
+ public void setModelCustomizationId(String modelCustomizationId) {
+ this.modelCustomizationId = modelCustomizationId;
+ }
+
+ @Override
+ public String toString() {
+ return "ModelInfo{" + "modelType='" + modelType + '\'' + ", modelInvariantId='" + modelInvariantId + '\''
+ + ", modelNameVersionId='" + modelNameVersionId + '\'' + ", modelName='" + modelName + '\''
+ + ", modelVersion='" + modelVersion + '\'' + ", modelCustomizationName='" + modelCustomizationName
+ + '\'' + ", modelCustomizationId='" + modelCustomizationId + '\'' + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/Request.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/Request.java
new file mode 100644
index 0000000..8f4313f
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/Request.java
@@ -0,0 +1,42 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+import java.util.Objects;
+
+public class Request {
+
+ private RequestStatus requestStatus;
+
+ public Request() {}
+
+ public Request(RequestStatus requestStatus) {
+ this.requestStatus = requestStatus;
+ }
+
+ public RequestStatus getRequestStatus() {
+ return requestStatus;
+ }
+
+ public void setRequestStatus(RequestStatus requestStatus) {
+ this.requestStatus = requestStatus;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Request request = (Request) o;
+ return Objects.equals(requestStatus, request.requestStatus);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(requestStatus);
+ }
+
+ @Override
+ public String toString() {
+ return "Request{" + "requestStatus=" + requestStatus + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestDetails.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestDetails.java
new file mode 100644
index 0000000..020e454
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestDetails.java
@@ -0,0 +1,62 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class RequestDetails {
+
+ private ModelInfo modelInfo;
+
+ private SubscriberInfo subscriberInfo;
+
+ private RequestInfo requestInfo;
+
+ private RequestParameters requestParameters;
+
+ private CloudConfiguration cloudConfiguration;
+
+
+ public CloudConfiguration getCloudConfiguration() {
+ return cloudConfiguration;
+ }
+
+ public void setCloudConfiguration(CloudConfiguration cloudConfiguration) {
+ this.cloudConfiguration = cloudConfiguration;
+ }
+
+ public ModelInfo getModelInfo() {
+ return modelInfo;
+ }
+
+ public void setModelInfo(ModelInfo modelInfo) {
+ this.modelInfo = modelInfo;
+ }
+
+ public SubscriberInfo getSubscriberInfo() {
+ return subscriberInfo;
+ }
+
+ public void setSubscriberInfo(SubscriberInfo subscriberInfo) {
+ this.subscriberInfo = subscriberInfo;
+ }
+
+ public RequestInfo getRequestInfo() {
+ return requestInfo;
+ }
+
+ public void setRequestInfo(RequestInfo requestInfo) {
+ this.requestInfo = requestInfo;
+ }
+
+ public RequestParameters getRequestParameters() {
+ return requestParameters;
+ }
+
+ public void setRequestParameters(RequestParameters requestParameters) {
+ this.requestParameters = requestParameters;
+ }
+
+ @Override
+ public String toString() {
+ return "RequestDetails{" + "modelInfo=" + modelInfo + ", subscriberInfo=" + subscriberInfo + ", requestInfo="
+ + requestInfo + ", requestParameters=" + requestParameters + ", cloudConfiguration="
+ + cloudConfiguration + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestInfo.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestInfo.java
new file mode 100644
index 0000000..a05e9db
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestInfo.java
@@ -0,0 +1,50 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class RequestInfo {
+
+ private String instanceName;
+
+ private String productFamilyId;
+
+ private String source;
+
+ private boolean suppressRollback;
+
+ public String getInstanceName() {
+ return instanceName;
+ }
+
+ public void setInstanceName(String instanceName) {
+ this.instanceName = instanceName;
+ }
+
+ public String getProductFamilyId() {
+ return productFamilyId;
+ }
+
+ public void setProductFamilyId(String productFamilyId) {
+ this.productFamilyId = productFamilyId;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public boolean isSuppressRollback() {
+ return suppressRollback;
+ }
+
+ public void setSuppressRollback(boolean suppressRollback) {
+ this.suppressRollback = suppressRollback;
+ }
+
+ @Override
+ public String toString() {
+ return "RequestInfo{" + "instanceName='" + instanceName + '\'' + ", productFamilyId='" + productFamilyId + '\''
+ + ", source='" + source + '\'' + ", suppressRollback=" + suppressRollback + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestParameters.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestParameters.java
new file mode 100644
index 0000000..9f66f21
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestParameters.java
@@ -0,0 +1,60 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+import java.util.List;
+import java.util.Objects;
+
+public class RequestParameters {
+
+ private String subscriptionServiceType;
+
+ private List<UserParams> userParams;
+
+ private boolean aLaCarte;
+
+
+ public String getSubscriptionServiceType() {
+ return subscriptionServiceType;
+ }
+
+ public void setSubscriptionServiceType(String subscriptionServiceType) {
+ subscriptionServiceType = subscriptionServiceType;
+ }
+
+ public List<UserParams> getUserParams() {
+ return userParams;
+ }
+
+ public void setUserParams(List<UserParams> userParams) {
+ this.userParams = userParams;
+ }
+
+ public boolean isaLaCarte() {
+ return aLaCarte;
+ }
+
+ public void setaLaCarte(boolean aLaCarte) {
+ this.aLaCarte = aLaCarte;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ RequestParameters that = (RequestParameters) o;
+ return aLaCarte == that.aLaCarte && Objects.equals(subscriptionServiceType, that.subscriptionServiceType)
+ && Objects.equals(userParams, that.userParams);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(subscriptionServiceType, userParams, aLaCarte);
+ }
+
+ @Override
+ public String toString() {
+ return "RequestParameters{" + "subscriptionServiceType='" + subscriptionServiceType + '\'' + ", userParams="
+ + userParams + ", aLaCarte=" + aLaCarte + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestReference.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestReference.java
new file mode 100644
index 0000000..7c7d481
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestReference.java
@@ -0,0 +1,29 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class RequestReference {
+
+ private String instanceId;
+
+ private String requestId;
+
+ public String getInstanceId() {
+ return instanceId;
+ }
+
+ public void setInstanceId(String instanceId) {
+ this.instanceId = instanceId;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ @Override
+ public String toString() {
+ return "RequestReference{" + "instanceId='" + instanceId + '\'' + ", requestId='" + requestId + '\'' + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestState.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestState.java
new file mode 100644
index 0000000..c657f9b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestState.java
@@ -0,0 +1,34 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+public enum RequestState {
+
+ FAILED("FAILED"),
+
+ COMPLETE("COMPLETE");
+
+ private String value;
+
+ RequestState(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static RequestState fromValue(String text) {
+ for (RequestState b : RequestState.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestStatus.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestStatus.java
new file mode 100644
index 0000000..06e5961
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/RequestStatus.java
@@ -0,0 +1,53 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+import java.util.Objects;
+
+public class RequestStatus {
+
+ private RequestState requestState;
+
+ private int percentProgress;
+
+ public RequestStatus(RequestState requestState, int percentProgress) {
+ this.requestState = requestState;
+ this.percentProgress = percentProgress;
+ }
+
+ public RequestStatus() {}
+
+ public RequestState getRequestState() {
+ return requestState;
+ }
+
+ public void setRequestState(RequestState requestState) {
+ this.requestState = requestState;
+ }
+
+ public int getPercentProgress() {
+ return percentProgress;
+ }
+
+ public void setPercentProgress(int percentProgress) {
+ this.percentProgress = percentProgress;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ RequestStatus that = (RequestStatus) o;
+ return percentProgress == that.percentProgress && requestState == that.requestState;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(requestState, percentProgress);
+ }
+
+ @Override
+ public String toString() {
+ return "RequestStatus{" + "requestState=" + requestState + ", percentProgress=" + percentProgress + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/SubscriberInfo.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/SubscriberInfo.java
new file mode 100644
index 0000000..0a26ff8
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/SubscriberInfo.java
@@ -0,0 +1,30 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class SubscriberInfo {
+
+ private String globalSubscriberId;
+
+ private String subscriberName;
+
+ public String getGlobalSubscriberId() {
+ return globalSubscriberId;
+ }
+
+ public void setGlobalSubscriberId(String globalSubscriberId) {
+ this.globalSubscriberId = globalSubscriberId;
+ }
+
+ public String getSubscriberName() {
+ return subscriberName;
+ }
+
+ public void setSubscriberName(String subscriberName) {
+ this.subscriberName = subscriberName;
+ }
+
+ @Override
+ public String toString() {
+ return "SubscriberInfo{" + "globalSubscriberId='" + globalSubscriberId + '\'' + ", subscriberName='"
+ + subscriberName + '\'' + '}';
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/UserParams.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/UserParams.java
new file mode 100644
index 0000000..1f82744
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/consumer/UserParams.java
@@ -0,0 +1,29 @@
+package org.onap.nbi.apis.serviceorder.model.consumer;
+
+public class UserParams {
+
+ private String name;
+
+ private String value;
+
+ public UserParams(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ExecutionTask.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ExecutionTask.java
new file mode 100644
index 0000000..0556939
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ExecutionTask.java
@@ -0,0 +1,96 @@
+package org.onap.nbi.apis.serviceorder.model.orchestrator;
+
+import java.util.Date;
+import java.util.Objects;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+@Entity
+public class ExecutionTask {
+
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long internalId;
+
+ private String orderItemId;
+
+ private String reliedTasks;
+
+ private int nbRetries;
+
+ private Date lastAttemptDate;
+
+ @OneToOne
+ private ServiceOrderInfoJson serviceOrderInfoJson;
+
+ public ServiceOrderInfoJson getServiceOrderInfoJson() {
+ return serviceOrderInfoJson;
+ }
+
+ public void setServiceOrderInfoJson(ServiceOrderInfoJson serviceOrderInfoJson) {
+ this.serviceOrderInfoJson = serviceOrderInfoJson;
+ }
+
+ public Date getLastAttemptDate() {
+ return lastAttemptDate;
+ }
+
+ public void setLastAttemptDate(Date lastAttemptDate) {
+ this.lastAttemptDate = lastAttemptDate;
+ }
+
+ public String getOrderItemId() {
+ return orderItemId;
+ }
+
+ public void setOrderItemId(String orderItemId) {
+ this.orderItemId = orderItemId;
+ }
+
+ public String getReliedTasks() {
+ return reliedTasks;
+ }
+
+ public void setReliedTasks(String reliedTasks) {
+ this.reliedTasks = reliedTasks;
+ }
+
+ public int getNbRetries() {
+ return nbRetries;
+ }
+
+ public void setNbRetries(int nbRetries) {
+ this.nbRetries = nbRetries;
+ }
+
+ public Long getInternalId() {
+ return internalId;
+ }
+
+ public void setInternalId(Long internalId) {
+ this.internalId = internalId;
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ ExecutionTask that = (ExecutionTask) o;
+ return nbRetries == that.nbRetries && Objects.equals(internalId, that.internalId)
+ && Objects.equals(orderItemId, that.orderItemId) && Objects.equals(reliedTasks, that.reliedTasks)
+ && Objects.equals(lastAttemptDate, that.lastAttemptDate)
+ && Objects.equals(serviceOrderInfoJson, that.serviceOrderInfoJson);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(internalId, orderItemId, reliedTasks, nbRetries, lastAttemptDate, serviceOrderInfoJson);
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfo.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfo.java
new file mode 100644
index 0000000..6a6c966
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfo.java
@@ -0,0 +1,67 @@
+package org.onap.nbi.apis.serviceorder.model.orchestrator;
+
+
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ServiceOrderInfo {
+
+ private boolean useServiceOrderCustomer;
+ private SubscriberInfo subscriberInfo;
+ private Map<String, ServiceOrderItemInfo> serviceOrderItemInfos = new HashMap<>();
+ private boolean allItemsInAdd;
+ private boolean allItemsCompleted;
+ private boolean serviceOrderRejected;
+
+ public boolean isAllItemsInAdd() {
+ return allItemsInAdd;
+ }
+
+ public void setAllItemsInAdd(boolean allItemsInAdd) {
+ this.allItemsInAdd = allItemsInAdd;
+ }
+
+ public boolean isAllItemsCompleted() {
+ return allItemsCompleted;
+ }
+
+ public void setAllItemsCompleted(boolean allItemsCompleted) {
+ this.allItemsCompleted = allItemsCompleted;
+ }
+
+ public boolean isServiceOrderRejected() {
+ return serviceOrderRejected;
+ }
+
+ public void setIsServiceOrderRejected(boolean isServiceOrderRejected) {
+ this.serviceOrderRejected = isServiceOrderRejected;
+ }
+
+ public Map<String, ServiceOrderItemInfo> getServiceOrderItemInfos() {
+ return serviceOrderItemInfos;
+ }
+
+ public void addServiceOrderItemInfos(String id, ServiceOrderItemInfo serviceOrderItemInfo) {
+ this.serviceOrderItemInfos.put(id, serviceOrderItemInfo);
+ }
+
+ public SubscriberInfo getSubscriberInfo() {
+ return subscriberInfo;
+ }
+
+ public void setSubscriberInfo(SubscriberInfo subscriberInfo) {
+ this.subscriberInfo = subscriberInfo;
+ }
+
+
+ public boolean isUseServiceOrderCustomer() {
+ return useServiceOrderCustomer;
+ }
+
+ public void setUseServiceOrderCustomer(boolean useServiceOrderCustomer) {
+ this.useServiceOrderCustomer = useServiceOrderCustomer;
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfoJson.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfoJson.java
new file mode 100644
index 0000000..eca36ae
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderInfoJson.java
@@ -0,0 +1,43 @@
+package org.onap.nbi.apis.serviceorder.model.orchestrator;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+@Entity
+public class ServiceOrderInfoJson {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long internalId;
+
+ private String serviceOrderId;
+
+ @Lob
+ private String serviceOrderInfoJson;
+
+ public ServiceOrderInfoJson() {}
+
+ public ServiceOrderInfoJson(String serviceOrderId, String serviceOrderInfoJson) {
+ this.serviceOrderId = serviceOrderId;
+ this.serviceOrderInfoJson = serviceOrderInfoJson;
+ }
+
+ public String getServiceOrderId() {
+ return serviceOrderId;
+ }
+
+ public void setServiceOrderId(String serviceOrderId) {
+ this.serviceOrderId = serviceOrderId;
+ }
+
+ public String getServiceOrderInfoJson() {
+ return serviceOrderInfoJson;
+ }
+
+ public void setServiceOrderInfoJson(String serviceOrderInfoJson) {
+ this.serviceOrderInfoJson = serviceOrderInfoJson;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderItemInfo.java b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderItemInfo.java
new file mode 100644
index 0000000..a37c0b5
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/model/orchestrator/ServiceOrderItemInfo.java
@@ -0,0 +1,27 @@
+package org.onap.nbi.apis.serviceorder.model.orchestrator;
+
+
+import java.util.LinkedHashMap;
+
+public class ServiceOrderItemInfo {
+
+ private String id;
+
+ private LinkedHashMap catalogResponse;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public LinkedHashMap getCatalogResponse() {
+ return catalogResponse;
+ }
+
+ public void setCatalogResponse(LinkedHashMap catalogResponse) {
+ this.catalogResponse = catalogResponse;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ExecutionTaskRepository.java b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ExecutionTaskRepository.java
new file mode 100644
index 0000000..31d882b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ExecutionTaskRepository.java
@@ -0,0 +1,25 @@
+package org.onap.nbi.apis.serviceorder.repositories;
+
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+
+public interface ExecutionTaskRepository extends CrudRepository<ExecutionTask, Long> {
+
+ @Query("SELECT t FROM ExecutionTask t WHERE TRIM(t.reliedTasks) LIKE '' ")
+ List<ExecutionTask> findByReliedTasksIsEmpty();
+
+ @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
+ @Modifying
+ @Query("UPDATE ExecutionTask t SET t.reliedTasks = REPLACE(t.reliedTasks, :internalId, '') WHERE t.reliedTasks "
+ + "LIKE CONCAT('%', :internalId, '%')")
+ void updateReliedTaskAfterDelete(@Param("internalId") Long internalId);
+
+ @Query("SELECT t FROM ExecutionTask t WHERE t.reliedTasks LIKE CONCAT('%', :internalId, '%')")
+ List<ExecutionTask> findTasksReliedToAnOrderItemId(@Param("internalId") Long internalId);
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderInfoRepository.java b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderInfoRepository.java
new file mode 100644
index 0000000..4689b20
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderInfoRepository.java
@@ -0,0 +1,9 @@
+package org.onap.nbi.apis.serviceorder.repositories;
+
+
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfoJson;
+import org.springframework.data.repository.CrudRepository;
+
+public interface ServiceOrderInfoRepository extends CrudRepository<ServiceOrderInfoJson, String> {
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderRepository.java b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderRepository.java
new file mode 100644
index 0000000..165ad44
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/repositories/ServiceOrderRepository.java
@@ -0,0 +1,11 @@
+package org.onap.nbi.apis.serviceorder.repositories;
+
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import java.util.List;
+
+public interface ServiceOrderRepository extends MongoRepository<ServiceOrder, String> {
+
+ List<ServiceOrder> findByState(StateType state);
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ServiceOrderValidator.java b/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ServiceOrderValidator.java
new file mode 100644
index 0000000..f26e95b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ServiceOrderValidator.java
@@ -0,0 +1,26 @@
+package org.onap.nbi.apis.serviceorder.serviceordervalidator;
+
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import org.onap.nbi.apis.serviceorder.model.ActionType;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.springframework.util.StringUtils;
+
+public class ServiceOrderValidator implements ConstraintValidator<ValidServiceOrder, ServiceOrder> {
+
+
+ @Override
+ public boolean isValid(ServiceOrder serviceOrder, ConstraintValidatorContext context) {
+ for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+ if (ActionType.ADD != serviceOrderItem.getAction()
+ && StringUtils.isEmpty(serviceOrderItem.getService().getId())) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ValidServiceOrder.java b/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ValidServiceOrder.java
new file mode 100644
index 0000000..105703b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/serviceordervalidator/ValidServiceOrder.java
@@ -0,0 +1,18 @@
+package org.onap.nbi.apis.serviceorder.serviceordervalidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+
+@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = ServiceOrderValidator.class)
+@Documented
+public @interface ValidServiceOrder {
+ String message() default "one of orderItem action is not add : serviceOrderItem.service.id is mandatory.";
+
+ Class<?>[] groups() default {};
+
+ Class<? extends Payload>[] payload() default {};
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/utils/JsonEntityConverter.java b/src/main/java/org/onap/nbi/apis/serviceorder/utils/JsonEntityConverter.java
new file mode 100644
index 0000000..f63f9c5
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/utils/JsonEntityConverter.java
@@ -0,0 +1,18 @@
+package org.onap.nbi.apis.serviceorder.utils;
+
+import java.io.IOException;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public final class JsonEntityConverter {
+
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
+ public static String convertServiceOrderInfoToJson(ServiceOrderInfo serviceOrderInfo) {
+ return MAPPER.valueToTree(serviceOrderInfo).toString();
+ }
+
+ public static ServiceOrderInfo convertJsonToServiceOrderInfo(String serviceOrderInfoJson) throws IOException {
+ return MAPPER.treeToValue(MAPPER.readTree(serviceOrderInfoJson), ServiceOrderInfo.class);
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CheckOrderConsistenceManager.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CheckOrderConsistenceManager.java
new file mode 100644
index 0000000..44e3db0
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CheckOrderConsistenceManager.java
@@ -0,0 +1,145 @@
+package org.onap.nbi.apis.serviceorder.workflow;
+
+import org.onap.nbi.apis.serviceorder.MultiClient;
+import org.onap.nbi.apis.serviceorder.model.RelatedParty;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderItemInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import java.util.LinkedHashMap;
+
+@Service
+public class CheckOrderConsistenceManager {
+
+
+ @Autowired
+ private MultiClient serviceOrderConsumerService;
+
+ public ServiceOrderInfo checkServiceOrder(ServiceOrder serviceOrder) {
+ ServiceOrderInfo serviceOrderInfo = new ServiceOrderInfo();
+ manageCustomer(serviceOrder, serviceOrderInfo);
+ int nbItemsCompleted = 0;
+ boolean isServiceOrderRejected = false;
+ boolean isAllItemsInAdd = true;
+
+ for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+ ServiceOrderItemInfo serviceOrderItemInfo = new ServiceOrderItemInfo();
+ serviceOrderItemInfo.setId(serviceOrderItem.getId());
+ handleServiceFromCatalog(serviceOrderItem, serviceOrderItemInfo);
+ switch (serviceOrderItem.getAction()) {
+ case ADD:
+ if (existServiceInCatalog(serviceOrderItemInfo)
+ && StringUtils.isEmpty(serviceOrderItem.getService().getId())
+ && serviceOrderConsumerService.isTenantIdPresentInAAI()) {
+ serviceOrderInfo.addServiceOrderItemInfos(serviceOrderItem.getId(), serviceOrderItemInfo);
+ } else {
+ isServiceOrderRejected = true;
+ serviceOrderItem.setState(StateType.REJECTED);
+ }
+ break;
+ case MODIFY:
+ case DELETE:
+ isAllItemsInAdd = false;
+ if (isCustomerFromServiceOrderPresentInInventory(serviceOrderInfo)
+ && existServiceInInventory(serviceOrderItem, serviceOrderItemInfo,
+ serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId())) {
+ serviceOrderInfo.addServiceOrderItemInfos(serviceOrderItem.getId(), serviceOrderItemInfo);
+ } else {
+ isServiceOrderRejected = true;
+ serviceOrderItem.setState(StateType.REJECTED);
+ }
+ break;
+ case NOCHANGE:
+ isAllItemsInAdd = false;
+ serviceOrderItem.setState(StateType.COMPLETED);
+ nbItemsCompleted++;
+ break;
+ }
+ }
+ if (serviceOrder.getOrderItem().size() != nbItemsCompleted) {
+ serviceOrderInfo.setAllItemsCompleted(false);
+ } else {
+ serviceOrderInfo.setAllItemsCompleted(true);
+ }
+ serviceOrderInfo.setAllItemsInAdd(isAllItemsInAdd);
+ serviceOrderInfo.setIsServiceOrderRejected(isServiceOrderRejected);
+
+ return serviceOrderInfo;
+
+ }
+
+ private void manageCustomer(ServiceOrder serviceOrder, ServiceOrderInfo serviceOrderInfo) {
+ RelatedParty customerFromServiceOrder = getCustomerFromServiceOrder(serviceOrder);
+ SubscriberInfo subscriberInfo = new SubscriberInfo();
+ if (customerFromServiceOrder != null) {
+ subscriberInfo.setSubscriberName(customerFromServiceOrder.getName());
+ subscriberInfo.setGlobalSubscriberId(customerFromServiceOrder.getId());
+ serviceOrderInfo.setUseServiceOrderCustomer(true);
+ } else {
+ subscriberInfo.setSubscriberName("generic");
+ subscriberInfo.setGlobalSubscriberId("generic");
+ serviceOrderInfo.setUseServiceOrderCustomer(false);
+ }
+ serviceOrderInfo.setSubscriberInfo(subscriberInfo);
+
+ }
+
+
+ private RelatedParty getCustomerFromServiceOrder(ServiceOrder serviceOrder) {
+ for (RelatedParty relatedParty : serviceOrder.getRelatedParty()) {
+ if ("ONAPcustomer".equalsIgnoreCase(relatedParty.getRole())) {
+ return relatedParty;
+ }
+ }
+ return null;
+ }
+
+ private boolean isCustomerFromServiceOrderPresentInInventory(ServiceOrderInfo serviceOrderInfo) {
+
+ if (serviceOrderInfo.isUseServiceOrderCustomer()) {
+
+ boolean customerPresentInAAI = serviceOrderConsumerService
+ .isCustomerPresentInAAI(serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId());
+ return customerPresentInAAI;
+ }
+ return true;
+ }
+
+ private boolean existServiceInInventory(ServiceOrderItem serviceOrderItem,
+ ServiceOrderItemInfo serviceOrderItemInfo, String globalSubscriberId) {
+ if (!StringUtils.isEmpty(serviceOrderItem.getService().getId())) {
+ String serviceName = (String) serviceOrderItemInfo.getCatalogResponse().get("name");
+ boolean serviceExistInInventory = serviceOrderConsumerService.doesServiceExistInServiceInventory(
+ serviceOrderItem.getService().getId(), serviceName, globalSubscriberId);
+ if (serviceExistInInventory) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean existServiceInCatalog(ServiceOrderItemInfo serviceOrderItemInfo) {
+ return serviceOrderItemInfo.getCatalogResponse() != null;
+ }
+
+ private void handleServiceFromCatalog(ServiceOrderItem serviceOrderItem,
+ ServiceOrderItemInfo serviceOrderItemInfo) {
+ ResponseEntity<Object> response = serviceOrderConsumerService
+ .getServiceCatalog(serviceOrderItem.getService().getServiceSpecification().getId());
+ if (response != null && (response.getStatusCode().equals(HttpStatus.OK)
+ || response.getStatusCode().equals(HttpStatus.PARTIAL_CONTENT))) {
+ LinkedHashMap body = (LinkedHashMap) response.getBody();
+ serviceOrderItemInfo.setCatalogResponse(body);
+ }
+ }
+
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAICustomerManager.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAICustomerManager.java
new file mode 100644
index 0000000..6b8c55b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAICustomerManager.java
@@ -0,0 +1,29 @@
+package org.onap.nbi.apis.serviceorder.workflow;
+
+import org.onap.nbi.apis.serviceorder.MultiClient;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CreateAAICustomerManager {
+
+
+ @Autowired
+ private MultiClient serviceOrderConsumerService;
+
+
+ public void createAAICustomer(ServiceOrderInfo serviceOrderInfo) {
+
+
+ if (serviceOrderInfo.isUseServiceOrderCustomer() && serviceOrderInfo.isAllItemsInAdd()
+ && !serviceOrderConsumerService
+ .isCustomerPresentInAAI(serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId())) {
+ serviceOrderConsumerService.putCustomer(serviceOrderInfo.getSubscriberInfo());
+ }
+ }
+
+
+}
+
+
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAIServiceTypeManager.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAIServiceTypeManager.java
new file mode 100644
index 0000000..625a869
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/CreateAAIServiceTypeManager.java
@@ -0,0 +1,58 @@
+package org.onap.nbi.apis.serviceorder.workflow;
+
+import org.onap.nbi.apis.serviceorder.MultiClient;
+import org.onap.nbi.apis.serviceorder.model.ActionType;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderItemInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+@Service
+public class CreateAAIServiceTypeManager {
+
+ @Autowired
+ private MultiClient serviceOrderConsumerService;
+
+
+ public void createAAIServiceType(ServiceOrder serviceOrder, ServiceOrderInfo serviceOrderInfo) {
+
+ LinkedHashMap servicesInAaiForCustomer = serviceOrderConsumerService
+ .getServicesInAaiForCustomer(serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId());
+
+ for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+ if (ActionType.ADD == serviceOrderItem.getAction()) {
+ ServiceOrderItemInfo serviceOrderItemInfo =
+ serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId());
+ String sdcServiceName = (String) serviceOrderItemInfo.getCatalogResponse().get("name");
+ if (!serviceNameExistsInAAI(servicesInAaiForCustomer, sdcServiceName)) {
+ serviceOrderConsumerService.putServiceType(
+ serviceOrderInfo.getSubscriberInfo().getGlobalSubscriberId(), sdcServiceName);
+ }
+ }
+ }
+
+ }
+
+ private boolean serviceNameExistsInAAI(LinkedHashMap servicesInAaiForCustomer, String sdcServiceName) {
+
+ if (servicesInAaiForCustomer != null && servicesInAaiForCustomer.get("service-subscription") != null) {
+ List<LinkedHashMap> servicesInAAI =
+ (List<LinkedHashMap>) servicesInAaiForCustomer.get("service-subscription");
+ for (LinkedHashMap service : servicesInAAI) {
+ String serviceType = (String) service.get("service-type");
+ if (sdcServiceName.equalsIgnoreCase(serviceType)) {
+ return true;
+ }
+
+ }
+ }
+
+ return false;
+
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskManager.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskManager.java
new file mode 100644
index 0000000..57d3621
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskManager.java
@@ -0,0 +1,94 @@
+package org.onap.nbi.apis.serviceorder.workflow;
+
+import org.onap.nbi.apis.serviceorder.model.OrderItemRelationship;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfoJson;
+import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderInfoRepository;
+import org.onap.nbi.apis.serviceorder.utils.JsonEntityConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@EnableScheduling
+public class SOTaskManager {
+
+ @Autowired
+ private ExecutionTaskRepository executionTaskRepository;
+
+ @Autowired
+ private ServiceOrderInfoRepository serviceOrderInfoRepository;
+
+ @Autowired
+ private SOTaskProcessor soTaskProcessor;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SOTaskManager.class);
+
+ /**
+ * @param orderItems
+ * @param serviceOrderInfoJson
+ */
+ private void registerOrderItemExecutionPlan(List<ServiceOrderItem> orderItems,
+ ServiceOrderInfoJson serviceOrderInfoJson) {
+ List<ExecutionTask> executionTasksSaved = new ArrayList<>();
+ Map<String, Long> internalIdOrderItemsMap = new HashMap<>();
+ if (orderItems != null) {
+ // first we save create all the execution tasks with order item id in relied tasks
+ for (ServiceOrderItem orderItem : orderItems) {
+ ExecutionTask task = new ExecutionTask();
+ task.setOrderItemId(orderItem.getId());
+ task.setNbRetries(3);
+ StringBuilder sb = new StringBuilder();
+ for (OrderItemRelationship orderItemRelationship : orderItem.getOrderItemRelationship()) {
+ sb.append(orderItemRelationship.getId()).append(" ");
+ }
+ task.setReliedTasks(sb.toString());
+ task.setServiceOrderInfoJson(serviceOrderInfoJson);
+ ExecutionTask savedTask = executionTaskRepository.save(task);
+ executionTasksSaved.add(savedTask);
+ internalIdOrderItemsMap.put(savedTask.getOrderItemId(), savedTask.getInternalId());
+ }
+ // then we replace all orderitem ids in reliedtasks field with internalid of the tasks
+ for (ExecutionTask executionTask : executionTasksSaved) {
+ for (String key : internalIdOrderItemsMap.keySet()) {
+ String replace = executionTask.getReliedTasks().replace(key,
+ String.valueOf(internalIdOrderItemsMap.get(key)));
+ executionTask.setReliedTasks(replace);
+ }
+ executionTaskRepository.save(executionTask);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param serviceOrder
+ * @param serviceOrderInfo
+ */
+ public void registerServiceOrder(ServiceOrder serviceOrder, ServiceOrderInfo serviceOrderInfo) {
+ String json = JsonEntityConverter.convertServiceOrderInfoToJson(serviceOrderInfo);
+ ServiceOrderInfoJson serviceOrderInfoJson = new ServiceOrderInfoJson(serviceOrder.getId(), json);
+ serviceOrderInfoRepository.save(serviceOrderInfoJson);
+ registerOrderItemExecutionPlan(serviceOrder.getOrderItem(), serviceOrderInfoJson);
+ }
+
+
+ @Scheduled(fixedRate = 2000)
+ private void processExecutionPlan() {
+ List<ExecutionTask> taskToExecute = executionTaskRepository.findByReliedTasksIsEmpty();
+ for (ExecutionTask executionTask : taskToExecute) {
+ soTaskProcessor.processOrderItem(executionTask);
+ }
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java
new file mode 100644
index 0000000..0bc7185
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/serviceorder/workflow/SOTaskProcessor.java
@@ -0,0 +1,349 @@
+package org.onap.nbi.apis.serviceorder.workflow;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.apis.serviceorder.SoClient;
+import org.onap.nbi.apis.serviceorder.model.ServiceCharacteristic;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.model.consumer.CloudConfiguration;
+import org.onap.nbi.apis.serviceorder.model.consumer.CreateServiceInstanceResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.GetRequestStatusResponse;
+import org.onap.nbi.apis.serviceorder.model.consumer.ModelInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestDetails;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestParameters;
+import org.onap.nbi.apis.serviceorder.model.consumer.RequestState;
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import org.onap.nbi.apis.serviceorder.model.consumer.UserParams;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfoJson;
+import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.utils.JsonEntityConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+@Service
+public class SOTaskProcessor {
+
+ @Value("${nbi.callForVNF}")
+ private boolean enableCallForVNF;
+
+ @Value("${onap.lcpCloudRegionId}")
+ private String lcpCloudRegionId;
+
+ @Value("${onap.tenantId}")
+ private String tenantId;
+
+ @Autowired
+ private ServiceOrderRepository serviceOrderRepository;
+
+ @Autowired
+ private ExecutionTaskRepository executionTaskRepository;
+
+ @Autowired
+ private SoClient soClient;
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SOTaskProcessor.class);
+
+ /**
+ * Run the ServiceOrchestrator processing for a serviceOrderItem which with any sub relations
+ */
+ public void processOrderItem(ExecutionTask executionTask) {
+
+
+ ServiceOrderInfoJson serviceOrderInfoJson = executionTask.getServiceOrderInfoJson();
+ ServiceOrder serviceOrder = serviceOrderRepository.findOne(serviceOrderInfoJson.getServiceOrderId());
+ ServiceOrderItem serviceOrderItem = null;
+ for (ServiceOrderItem item : serviceOrder.getOrderItem()) {
+ if (item.getId().equals(executionTask.getOrderItemId())) {
+ serviceOrderItem = item;
+ }
+ }
+
+ ServiceOrderInfo serviceOrderInfo = null;
+ try {
+ serviceOrderInfo =
+ JsonEntityConverter.convertJsonToServiceOrderInfo(serviceOrderInfoJson.getServiceOrderInfoJson());
+ } catch (IOException e) {
+ LOGGER.error("Unable to read ServiceOrderInfo Json for serviceOrderId " + serviceOrder.getId() + ", "
+ + e.getMessage());
+ }
+
+ if (StateType.ACKNOWLEDGED == serviceOrderItem.getState()) {
+
+ ResponseEntity<CreateServiceInstanceResponse> response = postSORequest(serviceOrderItem, serviceOrderInfo);
+
+ updateServiceOrderItem(response.getBody(), serviceOrderItem);
+
+ if (response.getStatusCode() != HttpStatus.CREATED || response.getBody() == null
+ || response.getBody().getRequestReference() == null) {
+ serviceOrderItem.setState(StateType.FAILED);
+ } else {
+ serviceOrderItem.setState(StateType.INPROGRESS);
+ }
+ }
+
+ if (executionTask.getNbRetries() > 0) {
+ // TODO lancer en asynchrone
+ pollSoRequestStatus(serviceOrderItem);
+ if (serviceOrderItem.getState().equals(StateType.COMPLETED)) {
+ updateSuccessTask(executionTask);
+ } else {
+ int nbRetries = executionTask.getNbRetries();
+ executionTask.setNbRetries(--nbRetries);
+ executionTask.setLastAttemptDate(new Date());
+ executionTaskRepository.save(executionTask);
+ }
+ } else {
+ updateFailedTask(executionTask, serviceOrder);
+ }
+
+
+ updateServiceOrder(serviceOrder);
+ }
+
+ private ResponseEntity<CreateServiceInstanceResponse> postSORequest(ServiceOrderItem serviceOrderItem,
+ ServiceOrderInfo serviceOrderInfo) {
+ RequestDetails requestDetails = buildSoRequest(serviceOrderItem,
+ serviceOrderInfo.getServiceOrderItemInfos().get(serviceOrderItem.getId()).getCatalogResponse(),
+ serviceOrderInfo.getSubscriberInfo());
+ ResponseEntity<CreateServiceInstanceResponse> response = null;
+
+ switch (serviceOrderItem.getAction()) {
+ case ADD:
+ response = soClient.callCreateServiceInstance(requestDetails);
+ break;
+ case DELETE:
+ response = soClient.callDeleteServiceInstance(requestDetails, serviceOrderItem.getService().getId());
+ break;
+ default:
+ break;
+ }
+ return response;
+ }
+
+ private void updateServiceOrder(ServiceOrder serviceOrder) {
+ boolean atLeastOneCompleted = false;
+ boolean atLeastOneNotFinished = false;
+ boolean atLeastOneFailed = false;
+
+
+ for (ServiceOrderItem serviceOrderItem : serviceOrder.getOrderItem()) {
+ switch (serviceOrderItem.getState()) {
+ case COMPLETED:
+ atLeastOneCompleted = true;
+ break;
+ case INPROGRESS:
+ case ACKNOWLEDGED:
+ atLeastOneNotFinished = true;
+ break;
+ case FAILED:
+ atLeastOneFailed = true;
+ break;
+ default:
+ break;
+
+ }
+ }
+
+ if (atLeastOneNotFinished) {
+ serviceOrder.setState(StateType.INPROGRESS);
+ } else {
+ serviceOrder.setCompletionDateTime(new Date());
+ if (atLeastOneFailed) {
+ if (!atLeastOneCompleted) {
+ serviceOrder.setState(StateType.FAILED);
+ } else {
+ serviceOrder.setState(StateType.PARTIAL);
+ }
+ } else {
+ serviceOrder.setState(StateType.COMPLETED);
+ }
+ }
+ serviceOrderRepository.save(serviceOrder);
+ }
+
+
+ /**
+ * * @param orderItem
+ */
+ private void pollSoRequestStatus(ServiceOrderItem orderItem) {
+ boolean stopPolling = false;
+ String requestId = orderItem.getRequestId();
+ GetRequestStatusResponse response = null;
+ int nbRetries = 0;
+
+ while (!stopPolling) {
+ response = soClient.callGetRequestStatus(requestId);
+ if (response != null) {
+ if (response.getRequest().getRequestStatus().getPercentProgress() != 100) {
+ nbRetries++;
+ orderItem.setState(StateType.INPROGRESS);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } else if (RequestState.COMPLETE != response.getRequest().getRequestStatus().getRequestState()) {
+ orderItem.setState(StateType.FAILED);
+ stopPolling = true;
+ } else {
+ orderItem.setState(StateType.COMPLETED);
+ stopPolling = true;
+ }
+ } else {
+ orderItem.setState(StateType.INPROGRESS);
+ stopPolling = true;
+ }
+ if (nbRetries == 3) {
+ stopPolling = true;
+ }
+ }
+ }
+
+ /**
+ * Build SO CREATE request from the ServiceOrder and catalog informations from SDC
+ *
+ * @param orderItem
+ * @param sdcInfos
+ * @param subscriberInfo
+ * @return
+ */
+ private RequestDetails buildSoRequest(ServiceOrderItem orderItem, LinkedHashMap<String, Object> sdcInfos,
+ SubscriberInfo subscriberInfo) {
+ RequestDetails requestDetails = new RequestDetails();
+
+ requestDetails.setSubscriberInfo(subscriberInfo);
+
+ ModelInfo modelInfo = new ModelInfo();
+ modelInfo.setModelType("service");
+ modelInfo.setModelInvariantId((String) sdcInfos.get("invariantUUID"));
+ modelInfo.setModelNameVersionId(orderItem.getService().getServiceSpecification().getId());
+ modelInfo.setModelName((String) sdcInfos.get("name"));
+ modelInfo.setModelVersion((String) sdcInfos.get("version"));
+ requestDetails.setModelInfo(modelInfo);
+
+ RequestInfo requestInfo = new RequestInfo();
+ requestInfo.setInstanceName(orderItem.getService().getName());
+ requestInfo.setSource("VID");
+ requestInfo.setSuppressRollback(false);
+ requestDetails.setRequestInfo(requestInfo);
+
+ RequestParameters requestParameters = new RequestParameters();
+ requestParameters.setSubscriptionServiceType((String) sdcInfos.get("name"));
+ requestParameters.setUserParams(
+ retrieveUserParamsFromServiceCharacteristics(orderItem.getService().getServiceCharacteristic()));
+ requestParameters.setaLaCarte(true);
+ requestDetails.setRequestParameters(requestParameters);
+
+ CloudConfiguration cloudConfiguration = new CloudConfiguration(lcpCloudRegionId, tenantId);
+ requestDetails.setCloudConfiguration(cloudConfiguration);
+ return requestDetails;
+ }
+
+ /**
+ * Build a list of UserParams for the SO request by browsing a list of ServiceCharacteristics
+ * from SDC
+ *
+ * @param characteristics
+ * @return
+ */
+ private List<UserParams> retrieveUserParamsFromServiceCharacteristics(List<ServiceCharacteristic> characteristics) {
+ List<UserParams> userParams = new ArrayList<UserParams>();
+
+ if (!CollectionUtils.isEmpty(characteristics)) {
+ for (ServiceCharacteristic characteristic : characteristics) {
+ UserParams userParam = new UserParams(characteristic.getName(),
+ characteristic.getValue().getServiceCharacteristicValue());
+ userParams.add(userParam);
+ }
+ }
+
+ return userParams;
+ }
+
+
+ /**
+ * Update ServiceOrderItem with SO response by using serviceOrderRepository with the
+ * serviceOrderId
+ *
+ * @param createServiceInstanceResponse
+ * @param orderItem
+ */
+ private void updateServiceOrderItem(CreateServiceInstanceResponse createServiceInstanceResponse,
+ ServiceOrderItem orderItem) {
+
+ if (createServiceInstanceResponse != null && !orderItem.getState().equals(StateType.FAILED)) {
+ orderItem.getService().setId(createServiceInstanceResponse.getRequestReference().getInstanceId());
+ orderItem.setRequestId(createServiceInstanceResponse.getRequestReference().getRequestId());
+ }
+ }
+
+ /**
+ * Update an executionTask in database when it's process with a success
+ *
+ * @param executionTask
+ */
+ private void updateSuccessTask(ExecutionTask executionTask) {
+ executionTaskRepository.delete(executionTask.getInternalId());
+ executionTaskRepository.updateReliedTaskAfterDelete(executionTask.getInternalId());
+ }
+
+ /**
+ * @param executionTask
+ * @param serviceOrder
+ */
+ private void updateFailedTask(ExecutionTask executionTask, ServiceOrder serviceOrder) {
+ List<ExecutionTask> executionTasksToDelete = findExecutionTasksRecursively(executionTask);
+ for (ExecutionTask taskId : executionTasksToDelete) {
+ executionTaskRepository.delete(taskId);
+ }
+
+ for (ServiceOrderItem item : serviceOrder.getOrderItem()) {
+ for (ExecutionTask taskToDelete : executionTasksToDelete) {
+ if (taskToDelete.getOrderItemId().equals(item.getId())) {
+ item.setState(StateType.FAILED);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param executionTask
+ * @return
+ */
+ private List<ExecutionTask> findExecutionTasksRecursively(ExecutionTask executionTask) {
+
+ List<ExecutionTask> executionTasks = new ArrayList<>();
+
+ List<ExecutionTask> tasksReliedToAnOrderItemId =
+ executionTaskRepository.findTasksReliedToAnOrderItemId(executionTask.getInternalId());
+
+ if (CollectionUtils.isEmpty(tasksReliedToAnOrderItemId)) {
+ return Arrays.asList(executionTask);
+ } else {
+ for (ExecutionTask task : tasksReliedToAnOrderItemId) {
+ executionTasks.addAll(findExecutionTasksRecursively(task));
+ }
+ }
+ executionTasks.add(executionTask);
+ return executionTasks;
+ }
+
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/StatusResource.java b/src/main/java/org/onap/nbi/apis/status/StatusResource.java
new file mode 100644
index 0000000..f4b0bcd
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/status/StatusResource.java
@@ -0,0 +1,55 @@
+package org.onap.nbi.apis.status;
+
+import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.StatusType;
+import org.onap.nbi.commons.JsonRepresentation;
+import org.onap.nbi.commons.ResourceManagement;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import javax.servlet.http.HttpServletRequest;
+
+
+@RestController
+@RequestMapping("/status")
+public class StatusResource extends ResourceManagement<ApplicationStatus> {
+
+ @Autowired
+ private StatusService statusService;
+
+ private JsonRepresentation fullRepresentation = new JsonRepresentation().add("name").add("status").add("version")
+ .add("components.name").add("components.status");
+
+ @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity<Object> status(HttpServletRequest request) {
+
+ ResponseEntity<Object> responseEntity = null;
+
+ final String[] splitPath = request.getRequestURI().split("/");
+
+ final String applicationName = splitPath[1];
+ final String applicationVersion = splitPath[3];
+
+ final ApplicationStatus applicationStatus = this.statusService.get(applicationName, applicationVersion);
+
+ final boolean isServiceFullyFunctional =
+ StatusType.OK.equals(applicationStatus.getStatus()) ? applicationStatus.getComponents().stream()
+ .allMatch(componentStatus -> StatusType.OK.equals(componentStatus.getStatus())) : false;
+
+ // filter object
+ Object response = this.getEntity(applicationStatus, fullRepresentation);
+
+ if (isServiceFullyFunctional) {
+ responseEntity = ResponseEntity.ok(response);
+ } else {
+ responseEntity = ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);
+ }
+
+ return responseEntity;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/StatusService.java b/src/main/java/org/onap/nbi/apis/status/StatusService.java
new file mode 100644
index 0000000..2309da4
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/status/StatusService.java
@@ -0,0 +1,9 @@
+package org.onap.nbi.apis.status;
+
+import org.onap.nbi.apis.status.model.ApplicationStatus;
+
+public interface StatusService {
+
+ ApplicationStatus get(String serviceName, String serviceVersion);
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/StatusServiceImpl.java b/src/main/java/org/onap/nbi/apis/status/StatusServiceImpl.java
new file mode 100644
index 0000000..7262aea
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/status/StatusServiceImpl.java
@@ -0,0 +1,28 @@
+package org.onap.nbi.apis.status;
+
+import org.onap.nbi.apis.status.model.ApplicationStatus;
+import org.onap.nbi.apis.status.model.StatusType;
+import org.springframework.stereotype.Service;
+
+@Service("statusService")
+public class StatusServiceImpl implements StatusService {
+
+ @Override
+ public ApplicationStatus get(final String serviceName, final String serviceVersion) {
+
+ final boolean applicationIsUp = true;
+
+
+ final ApplicationStatus applicationStatus =
+ new ApplicationStatus(serviceName, (applicationIsUp ? StatusType.OK : StatusType.KO), serviceVersion);
+
+
+ return applicationStatus;
+ }
+
+
+ public boolean serviceIsUp() {
+ return true;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/model/ApplicationStatus.java b/src/main/java/org/onap/nbi/apis/status/model/ApplicationStatus.java
new file mode 100644
index 0000000..ecaa89e
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/status/model/ApplicationStatus.java
@@ -0,0 +1,55 @@
+package org.onap.nbi.apis.status.model;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.onap.nbi.commons.Resource;
+
+public class ApplicationStatus implements Resource {
+
+ private String name;
+
+ private StatusType status;
+
+ private String version;
+
+ private Set<ApplicationStatus> components = new HashSet<>();
+
+ /**
+ * Builds a new {@code ApplicationStatus} with the following attributes :
+ *
+ * @param name name of the service
+ * @param state state of the service ({@code OK} | {@code KO})
+ * @param version version of the service ({@code x.y.z})
+ */
+ public ApplicationStatus(final String name, final StatusType status, final String version) {
+ this.name = name;
+ this.status = status;
+ this.version = version;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public StatusType getStatus() {
+ return this.status;
+ }
+
+ public String getVersion() {
+ return this.version;
+ }
+
+ public Set<ApplicationStatus> getComponents() {
+ return this.components;
+ }
+
+ public ApplicationStatus component(final ApplicationStatus componentStatus) {
+ this.components.add(componentStatus);
+ return this;
+ }
+
+ @Override
+ public String getId() {
+ return null;
+ }
+}
diff --git a/src/main/java/org/onap/nbi/apis/status/model/StatusType.java b/src/main/java/org/onap/nbi/apis/status/model/StatusType.java
new file mode 100644
index 0000000..a54dc50
--- /dev/null
+++ b/src/main/java/org/onap/nbi/apis/status/model/StatusType.java
@@ -0,0 +1,30 @@
+package org.onap.nbi.apis.status.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum StatusType {
+
+ OK("ok"), KO("ko");
+ private final String value;
+
+ StatusType(String v) {
+ this.value = v;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return this.value;
+ }
+
+ @JsonCreator
+ public static StatusType fromValue(String v) {
+ for (StatusType c : StatusType.values()) {
+ if (c.value.equals(v)) {
+ return c;
+ }
+ }
+ throw new IllegalArgumentException(v);
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/BeanUtils.java b/src/main/java/org/onap/nbi/commons/BeanUtils.java
new file mode 100644
index 0000000..1d14f12
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/BeanUtils.java
@@ -0,0 +1,39 @@
+package org.onap.nbi.commons;
+
+import org.apache.commons.beanutils.PropertyUtilsBean;
+
+/**
+ *
+ */
+public class BeanUtils {
+
+ private static final PropertyUtilsBean PUB = new PropertyUtilsBean();
+
+ /**
+ *
+ * @param bean
+ * @param name
+ * @return
+ */
+ public static Object getNestedProperty(Object bean, String name) {
+ try {
+ return BeanUtils.PUB.getNestedProperty(bean, name);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ *
+ * @param bean
+ * @param name
+ * @param value
+ */
+ public static void setNestedProperty(Object bean, String name, Object value) {
+ try {
+ BeanUtils.PUB.setNestedProperty(bean, name, value);
+ } catch (Exception ex) {
+ }
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/JacksonFilter.java b/src/main/java/org/onap/nbi/commons/JacksonFilter.java
new file mode 100644
index 0000000..bc173c3
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/JacksonFilter.java
@@ -0,0 +1,169 @@
+package org.onap.nbi.commons;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class JacksonFilter {
+
+ private final static List<String> SKIPPED_FIELDS = Arrays.asList("internalId");
+
+
+ public static <R> List<ObjectNode> createNodes(List<R> list, JsonRepresentation jsonRepresentation) {
+
+ Set<R> set;
+ if (list == null) {
+ set = new LinkedHashSet<>();
+ } else {
+ set = new LinkedHashSet<>(list);
+ }
+ return createNodes(set, jsonRepresentation);
+ }
+
+ public static <R> List<ObjectNode> createNodes(Collection<R> collection, JsonRepresentation jsonRepresentation) {
+ List<ObjectNode> nodeList = new ArrayList<>();
+ for (R element : collection) {
+ ObjectNode node = createNode(element, jsonRepresentation);
+ nodeList.add(node);
+ }
+ return nodeList;
+ }
+
+ public static <R> ObjectNode createNode(R bean, JsonRepresentation jsonRepresentation) {
+ ObjectMapper mapper = new ObjectMapper();
+ return JacksonFilter.createNode(mapper, bean, jsonRepresentation.getAttributes());
+ }
+
+ private static <R> ObjectNode createNode(ObjectMapper mapper, R bean, Set<String> names) {
+ // split fieldNames in 2 categories :
+ // simpleFields for simple property names with no '.'
+ // nestedFields for nested property names with a '.'
+ Set<String> simpleFields = new LinkedHashSet<String>();
+ MultiValueMap nestedFields = new LinkedMultiValueMap();
+ buildFields(names, simpleFields, nestedFields);
+
+ // create a simple node with only one level containing all simples
+ // properties
+ ObjectNode rootNode = JacksonFilter.createNodeWithSimpleFields(mapper, bean, simpleFields);
+
+ // create nested nodes with deeper levels
+ Set<Map.Entry<String, List<String>>> entrySet = nestedFields.entrySet();
+ // for each nested value, create recursively a node
+ for (Map.Entry<String, List<String>> entry : entrySet) {
+ String rootFieldName = entry.getKey();
+ // add in current node only if full value is not already present in
+ // 1st level
+ if (!simpleFields.contains(rootFieldName)) {
+ Object nestedBean = BeanUtils.getNestedProperty(bean, rootFieldName);
+ // add only non null fields
+ if (nestedBean == null) {
+ continue;
+ }
+ Set<String> nestedFieldNames = new LinkedHashSet<String>(entry.getValue());
+ // current node is an array or a list
+ if ((nestedBean.getClass().isArray()) || (Collection.class.isAssignableFrom(nestedBean.getClass()))) {
+ handleListNode(mapper, rootNode, rootFieldName, nestedBean, nestedFieldNames);
+ } else {
+ // create recursively a node and add it in current root node
+ createNodeRecursively(mapper, rootNode, rootFieldName, nestedBean, nestedFieldNames);
+ }
+ }
+ }
+ return rootNode;
+ }
+
+ private static void createNodeRecursively(ObjectMapper mapper, ObjectNode rootNode, String rootFieldName,
+ Object nestedBean, Set<String> nestedFieldNames) {
+ ObjectNode nestedNode = JacksonFilter.createNode(mapper, nestedBean, nestedFieldNames);
+ if ((nestedNode != null) && (nestedNode.size() > 0)) {
+ rootNode.set(rootFieldName, nestedNode);
+ }
+ }
+
+ private static void buildFields(Set<String> names, Set<String> simpleFields, MultiValueMap nestedFields) {
+ for (String name : names) {
+ int index = name.indexOf('.');
+ boolean isNestedField = (index > 0) && (index < name.length());
+ if (isNestedField) {
+ String rootFieldName = name.substring(0, index);
+ String subFieldName = name.substring(index + 1);
+ nestedFields.add(rootFieldName, subFieldName);
+ } else {
+ simpleFields.add(name);
+ }
+ }
+ }
+
+ private static void handleListNode(ObjectMapper mapper, ObjectNode rootNode, String rootFieldName,
+ Object nestedBean, Set<String> nestedFieldNames) {
+ Object[] array = null;
+ if ((nestedBean.getClass().isArray())) {
+ array = (Object[]) nestedBean;
+ } else {
+ Collection<?> collection = (Collection<?>) nestedBean;
+ array = collection.toArray();
+ }
+ if (array.length > 0) {
+ // create a node for each element in array
+ // and add created node in an arrayNode
+ Collection<JsonNode> nodes = new LinkedList<JsonNode>();
+ for (Object object : array) {
+ ObjectNode nestedNode = JacksonFilter.createNode(mapper, object, nestedFieldNames);
+ if ((nestedNode != null) && (nestedNode.size() > 0)) {
+ nodes.add(nestedNode);
+ }
+ }
+ ArrayNode arrayNode = mapper.createArrayNode();
+ arrayNode.addAll(nodes);
+ if (arrayNode.size() > 0) {
+ rootNode.set(rootFieldName, arrayNode);
+ }
+ }
+ }
+
+ private static <R> ObjectNode createNodeWithSimpleFields(ObjectMapper mapper, R bean, Set<String> names) {
+ ObjectNode node = mapper.createObjectNode();
+ for (String name : names) {
+ // Prevent getting value of some fields
+ if (SKIPPED_FIELDS.contains(name)) {
+ continue;
+ }
+
+ JacksonFilter.nodePut(node, name, BeanUtils.getNestedProperty(bean, name));
+ }
+ return node;
+ }
+
+ private static void nodePut(ObjectNode node, String name, Object value) {
+ if (value instanceof Boolean) {
+ node.put(name, (Boolean) value);
+ } else if (value instanceof Integer) {
+ node.put(name, (Integer) value);
+ } else if (value instanceof Long) {
+ node.put(name, (Long) value);
+ } else if (value instanceof Float) {
+ node.put(name, (Float) value);
+ } else if (value instanceof Double) {
+ node.put(name, (Double) value);
+ } else if (value instanceof BigDecimal) {
+ node.put(name, (BigDecimal) value);
+ } else if (value instanceof String) {
+ node.put(name, (String) value);
+ } else {
+ node.putPOJO(name, value);
+ }
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/JsonRepresentation.java b/src/main/java/org/onap/nbi/commons/JsonRepresentation.java
new file mode 100644
index 0000000..0c71262
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/JsonRepresentation.java
@@ -0,0 +1,35 @@
+package org.onap.nbi.commons;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import org.springframework.util.MultiValueMap;
+
+public class JsonRepresentation {
+
+ private Set<String> attributes = new LinkedHashSet<>();
+
+ public JsonRepresentation() {}
+
+ public JsonRepresentation(MultiValueMap<String, String> queryParameters) {
+ this.attributes = QueryParserUtils.getFields(queryParameters);
+ }
+
+ public JsonRepresentation(Set<String> attributes) {
+ this.attributes.addAll(attributes);
+ }
+
+ public JsonRepresentation add(String attributePath) {
+ this.attributes.add(attributePath);
+ return this;
+ }
+
+ public JsonRepresentation add(JsonRepresentation jsonRepresentation) {
+ this.attributes.addAll(jsonRepresentation.getAttributes());
+ return this;
+ }
+
+ public Set<String> getAttributes() {
+ return attributes;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/Query.java b/src/main/java/org/onap/nbi/commons/Query.java
new file mode 100644
index 0000000..8ee453f
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/Query.java
@@ -0,0 +1,26 @@
+package org.onap.nbi.commons;
+
+import org.springframework.util.MultiValueMap;
+
+
+
+public class Query {
+
+ private MultiValueMap<String, String> parameters;
+
+ private JsonRepresentation jsonRepresentation;
+
+ public Query(MultiValueMap<String, String> queryParameters) {
+ this.parameters = queryParameters;
+ this.jsonRepresentation = new JsonRepresentation(queryParameters);
+ }
+
+ public MultiValueMap<String, String> getParameters() {
+ return parameters;
+ }
+
+ public JsonRepresentation getRepresentation() {
+ return jsonRepresentation;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/QueryParserUtils.java b/src/main/java/org/onap/nbi/commons/QueryParserUtils.java
new file mode 100644
index 0000000..69c32df
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/QueryParserUtils.java
@@ -0,0 +1,65 @@
+package org.onap.nbi.commons;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+/**
+ *
+ */
+public class QueryParserUtils {
+
+ private QueryParserUtils() {}
+
+ /**
+ *
+ * @param queryParameters
+ * @return
+ */
+ public static Set<String> getFields(MultiValueMap<String, String> queryParameters) {
+
+ Set<String> fieldSet = new HashSet<>();
+ if (queryParameters != null) {
+ // search for "all" parameter
+ if (queryParameters.containsKey(ReservedKeys.ALL_FIELDS)) {
+ queryParameters.remove(ReservedKeys.ALL_FIELDS);
+ fieldSet.add(ReservedKeys.ALL_FIELDS);
+ }
+ // search for "fields" parameters
+ List<String> queryParameterField =
+ queryParameters.remove(ReservedKeys.QUERY_KEY_FIELD_ESCAPE + ReservedKeys.QUERY_KEY_FIELD);
+ if (queryParameterField == null) {
+ queryParameterField = queryParameters.remove(ReservedKeys.QUERY_KEY_FIELD);
+ }
+ if (queryParameterField != null && !queryParameterField.isEmpty()) {
+ String queryParameterValue = queryParameterField.get(0);
+ if (queryParameterValue != null) {
+ String[] tokenArray = queryParameterValue.split(",");
+ fieldSet.addAll(Arrays.asList(tokenArray));
+ }
+ }
+ }
+ return fieldSet;
+ }
+
+ public static MultiValueMap<String, String> popCriteria(MultiValueMap<String, String> queryParameters) {
+
+ Set<Entry<String, List<String>>> entrySet = queryParameters.entrySet();
+
+ MultiValueMap<String, String> criterias = new LinkedMultiValueMap<String, String>();
+
+ entrySet.stream().forEach(entry -> {
+ final List<String> tempValues = new ArrayList<String>();
+ entry.getValue().stream().forEach(value -> tempValues.addAll(Arrays.asList(value.split(","))));
+ criterias.put(entry.getKey(), tempValues);
+ });
+
+ return criterias;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/ReservedKeys.java b/src/main/java/org/onap/nbi/commons/ReservedKeys.java
new file mode 100644
index 0000000..dad59f2
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/ReservedKeys.java
@@ -0,0 +1,18 @@
+package org.onap.nbi.commons;
+
+/**
+ *
+ */
+public class ReservedKeys {
+
+ public static final String ALL_FIELDS = "all";
+
+ public static final String ID_FIELD = "id";
+
+ public static final String QUERY_KEY_FIELD = "fields";
+
+ public static final String QUERY_KEY_FIELD_ESCAPE = ":";
+
+ private ReservedKeys() {}
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/Resource.java b/src/main/java/org/onap/nbi/commons/Resource.java
new file mode 100644
index 0000000..4b374b0
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/Resource.java
@@ -0,0 +1,8 @@
+package org.onap.nbi.commons;
+
+
+public interface Resource {
+
+ public String getId();
+
+}
diff --git a/src/main/java/org/onap/nbi/commons/ResourceManagement.java b/src/main/java/org/onap/nbi/commons/ResourceManagement.java
new file mode 100644
index 0000000..67c0e3e
--- /dev/null
+++ b/src/main/java/org/onap/nbi/commons/ResourceManagement.java
@@ -0,0 +1,149 @@
+package org.onap.nbi.commons;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+public class ResourceManagement<T extends Resource> {
+
+ /**
+ * Build default 201 filtered response for resource
+ *
+ * @param resource
+ * @param jsonRepresentation
+ * @return
+ */
+ protected ResponseEntity<Object> createResponse(final Resource resource,
+ final JsonRepresentation jsonRepresentation) {
+
+ URI location = null;
+ if (RequestContextHolder.getRequestAttributes() != null) {
+ location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(resource.getId())
+ .toUri();
+ } else {
+ location = URI.create("/");
+ }
+
+
+ // Get entity representation
+ final Object entity = this.getEntity(resource, jsonRepresentation);
+
+ return ResponseEntity.created(location).body(entity);
+
+ }
+
+ /**
+ * Build default 200 filtered response for resource
+ *
+ * @param resource
+ * @param jsonRepresentation
+ * @return
+ */
+ protected ResponseEntity<Object> getResponse(final Object resource, final JsonRepresentation jsonRepresentation) {
+
+ // Get entity representation
+ final Object entity = this.getEntity(resource, jsonRepresentation);
+
+ return ResponseEntity.ok(entity);
+
+ }
+
+
+
+ /**
+ * Build default 206 filtered partial response for resource
+ *
+ * @param resource
+ * @param jsonRepresentation
+ * @return
+ */
+ protected ResponseEntity<Object> getPartialResponse(final Object resource,
+ final JsonRepresentation jsonRepresentation) {
+
+ // Get entity representation
+ final Object entity = this.getEntity(resource, jsonRepresentation);
+
+ return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT).body(entity);
+
+ }
+
+
+ /**
+ * Build default 200 filtered response for resource collection
+ *
+ * @param resources
+ * @param jsonRepresentation
+ * @param headers
+ * @return
+ */
+ protected ResponseEntity<Object> findResponse(final List<?> resources, final JsonRepresentation jsonRepresentation,
+ HttpHeaders headers) {
+
+ // Get entities representation
+ final Object entities = this.getEntities(resources, jsonRepresentation);
+
+ return ResponseEntity.ok().headers(headers).body(entities);
+
+ }
+
+
+ /**
+ * Build 204 Empty response
+ *
+ * @return
+ */
+ protected ResponseEntity<Object> deleteResponse() {
+
+ return ResponseEntity.noContent().build();
+ }
+
+ /**
+ * Get entity, as resource or jacksonNode depending fields value
+ *
+ * @param resource
+ * @param jsonRepresentation
+ * @return
+ */
+ protected Object getEntity(final Object resource, JsonRepresentation jsonRepresentation) {
+
+ Object entity;
+
+ Set<String> attributes = jsonRepresentation.getAttributes();
+
+ if (attributes == null || attributes.isEmpty() || attributes.contains(ReservedKeys.ALL_FIELDS)) {
+ entity = resource;
+ } else {
+ entity = JacksonFilter.createNode(resource, jsonRepresentation);
+ }
+
+ return entity;
+ }
+
+ /**
+ * Get entities, as resource list or jacksonNode depending fields value
+ *
+ * @param resources
+ * @param jsonRepresentation
+ * @return
+ */
+ protected Object getEntities(final List<?> resources, JsonRepresentation jsonRepresentation) {
+
+ Object entities;
+
+ Set<String> attributes = jsonRepresentation.getAttributes();
+
+ if (attributes == null || attributes.isEmpty() || attributes.contains(ReservedKeys.ALL_FIELDS)) {
+ entities = resources;
+ } else {
+ entities = JacksonFilter.createNodes(resources, jsonRepresentation);
+ }
+
+ return entities;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/ApiError.java b/src/main/java/org/onap/nbi/exceptions/ApiError.java
new file mode 100644
index 0000000..d829aae
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/ApiError.java
@@ -0,0 +1,61 @@
+package org.onap.nbi.exceptions;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Error", propOrder = {"code", "message", "description", "infoURL"})
+public class ApiError {
+ @XmlElement(required = true)
+ protected String code;
+ @XmlElement(required = true)
+ protected String message;
+ @XmlElement(required = true)
+ private String description;
+ @XmlElement(required = true)
+ protected String infoURL;
+
+ public ApiError() {}
+
+ public ApiError(String code, String message, String description, String infoURL) {
+ this.code = code;
+ this.message = message;
+ this.description = description;
+ this.infoURL = infoURL;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getInfoURL() {
+ return infoURL;
+ }
+
+ public void setInfoURL(String infoURL) {
+ this.infoURL = infoURL;
+ }
+}
+
diff --git a/src/main/java/org/onap/nbi/exceptions/ApiException.java b/src/main/java/org/onap/nbi/exceptions/ApiException.java
new file mode 100644
index 0000000..d07d9db
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/ApiException.java
@@ -0,0 +1,33 @@
+package org.onap.nbi.exceptions;
+
+import java.io.Serializable;
+
+public class ApiException extends RuntimeException implements Serializable {
+
+ protected final String localisationClass;
+ protected final String localisationMethod;
+
+ public ApiException() {
+ super();
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ public ApiException(String message) {
+ super(message);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ public ApiException(String message, Throwable cause) {
+ super(message, cause);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+
+ public ApiException(Throwable cause) {
+ super(cause);
+ localisationClass = "";
+ localisationMethod = "";
+ }
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/ApiExceptionHandler.java b/src/main/java/org/onap/nbi/exceptions/ApiExceptionHandler.java
new file mode 100644
index 0000000..1781701
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/ApiExceptionHandler.java
@@ -0,0 +1,48 @@
+package org.onap.nbi.exceptions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.RestClientException;
+
+@ControllerAdvice
+public class ApiExceptionHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiExceptionHandler.class);
+
+
+ @ExceptionHandler(BackendFunctionalException.class)
+ @ResponseBody
+ public ResponseEntity<ApiError> backendExceptionHandler(final BackendFunctionalException exception) {
+ ApiError apiError =
+ new ApiError(String.valueOf(exception.getHttpStatus().value()), exception.getMessage(), "", "");
+ return new ResponseEntity<ApiError>(apiError, exception.getHttpStatus());
+ }
+
+ @ExceptionHandler(TechnicalException.class)
+ @ResponseBody
+ public ResponseEntity<ApiError> technicalExceptionHandler(final TechnicalException exception) {
+ ApiError apiError =
+ new ApiError(String.valueOf(exception.getHttpStatus().value()), exception.getMessage(), "", "");
+ return new ResponseEntity<ApiError>(apiError, exception.getHttpStatus());
+ }
+
+ @ExceptionHandler(RestClientException.class)
+ @ResponseBody
+ public ResponseEntity<ApiError> RestClientExceptionHandler(final RestClientException exception) {
+ ApiError apiError = new ApiError("500", HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(),
+ "Unable to " + "reach ONAP services", "");
+ return new ResponseEntity<ApiError>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+
+ @ExceptionHandler(ValidationException.class)
+ @ResponseBody
+ public ResponseEntity<ApiError> ValidationExceptionHandler(final ValidationException exception) {
+ ApiError apiError = new ApiError("400", HttpStatus.BAD_REQUEST.getReasonPhrase(), exception.getMessages(), "");
+ return new ResponseEntity<ApiError>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/BackendErrorHandler.java b/src/main/java/org/onap/nbi/exceptions/BackendErrorHandler.java
new file mode 100644
index 0000000..7c28b05
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/BackendErrorHandler.java
@@ -0,0 +1,23 @@
+package org.onap.nbi.exceptions;
+
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.web.client.DefaultResponseErrorHandler;
+import org.springframework.web.client.ResponseErrorHandler;
+import java.io.IOException;
+
+public class BackendErrorHandler implements ResponseErrorHandler {
+
+ private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();
+
+ @Override
+ public boolean hasError(ClientHttpResponse response) throws IOException {
+ return errorHandler.hasError(response);
+ }
+
+ @Override
+ public void handleError(ClientHttpResponse response) throws IOException {
+ if (response.getStatusCode() != null) {
+ throw new BackendFunctionalException(response.getStatusCode(), response.getStatusText());
+ }
+ }
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/BackendFunctionalException.java b/src/main/java/org/onap/nbi/exceptions/BackendFunctionalException.java
new file mode 100644
index 0000000..cfddb2b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/BackendFunctionalException.java
@@ -0,0 +1,22 @@
+package org.onap.nbi.exceptions;
+
+import org.springframework.http.HttpStatus;
+
+public class BackendFunctionalException extends ApiException {
+
+ private HttpStatus httpStatus;
+
+ public BackendFunctionalException(HttpStatus httpStatus, String message) {
+ super(message);
+ this.httpStatus = httpStatus;
+ }
+
+ public BackendFunctionalException() {
+ super();
+ }
+
+ public HttpStatus getHttpStatus() {
+ return httpStatus;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/TechnicalException.java b/src/main/java/org/onap/nbi/exceptions/TechnicalException.java
new file mode 100644
index 0000000..e30006e
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/TechnicalException.java
@@ -0,0 +1,26 @@
+package org.onap.nbi.exceptions;
+
+import org.springframework.http.HttpStatus;
+
+public class TechnicalException extends ApiException {
+
+ private HttpStatus httpStatus;
+
+ public TechnicalException(String message) {
+ super(message);
+ this.httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
+ }
+
+ public TechnicalException() {
+ super();
+ }
+
+ public HttpStatus getHttpStatus() {
+ return httpStatus;
+ }
+
+ public void setHttpStatus(HttpStatus httpStatus) {
+ this.httpStatus = httpStatus;
+ }
+
+}
diff --git a/src/main/java/org/onap/nbi/exceptions/ValidationException.java b/src/main/java/org/onap/nbi/exceptions/ValidationException.java
new file mode 100644
index 0000000..72ea01b
--- /dev/null
+++ b/src/main/java/org/onap/nbi/exceptions/ValidationException.java
@@ -0,0 +1,29 @@
+package org.onap.nbi.exceptions;
+
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import java.util.List;
+
+public class ValidationException extends ApiException {
+
+ private String messages;
+
+ public ValidationException(List<ObjectError> listErrors) {
+ super();
+ StringBuilder sb = new StringBuilder();
+ for (ObjectError error : listErrors) {
+ if (error instanceof FieldError) {
+ sb.append(((FieldError) error).getField()).append(" ").append(((FieldError) error).getDefaultMessage())
+ .append(". ");
+ } else {
+ sb.append(" ").append(error.getDefaultMessage()).append(". ");
+ }
+ }
+ messages = sb.toString();
+
+ }
+
+ public String getMessages() {
+ return messages;
+ }
+}
diff --git a/src/main/resources/application-localhost.properties b/src/main/resources/application-localhost.properties
new file mode 100644
index 0000000..6a210a7
--- /dev/null
+++ b/src/main/resources/application-localhost.properties
@@ -0,0 +1,50 @@
+# LOGGING
+logging.level.org.onap.nbi=INFO
+
+# ONAP
+onap.lcpCloudRegionId=RegionOne
+onap.tenantId=31047205ce114b60833b23e400d6a535
+onap.cloudOwner=CloudOwner
+
+# NBI
+nbi.url=http://127.0.0.1:8080/nbi/api/v1
+nbi.callForVNF=false
+
+# SDC
+sdc.host=http://127.0.0.1:8090
+sdc.header.ecompInstanceId=Rene
+sdc.header.authorization=Basic YWFpOktwOGJKNFNYc3pNMFdYbGhhazNlSGxjc2UyZ0F3ODR2YW9HR21KdlV5MlU=
+
+# AAI
+aai.host=http://127.0.0.1:8090
+aai.header.authorization=Basic QUFJOkFBSQ==
+aai.api.id=AAI
+
+# SO
+so.host=http://127.0.0.1:8090
+so.header.authorization=
+so.api.id=SO
+
+# MONGO
+spring.data.mongodb.host=localhost
+spring.data.mongodb.port=27017
+spring.data.mongodb.database=ServiceOrderDB
+
+# MYSQL
+spring.datasource.testWhileIdle=true
+spring.datasource.validationQuery=SELECT 1
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.datasource.url=jdbc:mysql://localhost:3306/nbi
+spring.jpa.show-sql=false
+spring.datasource.username=root
+spring.datasource.password=toto
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
+
+# H2
+# spring.datasource.url=jdbc:h2:mem:~/db
+# spring.datasource.username=sa
+# spring.datasource.password=
+# spring.datasource.driver-class-name=org.h2.Driver
+# spring.h2.console.enabled=true
+# spring.h2.console.path=/h2-console \ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..61f2d0c
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,7 @@
+# SERVER
+server.contextPath=/nbi/api/v1
+server.port = 8080
+
+# LOGGING
+logging.level.=INFO
+
diff --git a/src/main/resources/jolt/findServiceCatalog.json b/src/main/resources/jolt/findServiceCatalog.json
new file mode 100644
index 0000000..ffe5fe3
--- /dev/null
+++ b/src/main/resources/jolt/findServiceCatalog.json
@@ -0,0 +1,28 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "*": {
+ "uuid": "[&1].id",
+ "description": "[&1].description",
+ "name": "[&1].name",
+ "invariantUUID": "[&1].invariantUUID",
+ "category": "[&1].category",
+ "distributionStatus": "[&1].distributionStatus",
+ "version": "[&1].version",
+ "lifecycleState": "[&1].lifecycleStatus",
+ "lastUpdaterUserId": "[&1].relatedParty.id"
+ }
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "*": {
+ "relatedParty": {
+ "role": "lastUpdater"
+ }
+ }
+ }
+ }
+] \ No newline at end of file
diff --git a/src/main/resources/jolt/findServiceInventory.json b/src/main/resources/jolt/findServiceInventory.json
new file mode 100644
index 0000000..7188edc
--- /dev/null
+++ b/src/main/resources/jolt/findServiceInventory.json
@@ -0,0 +1,24 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "*": {
+ "service-instance-id": "[&1].id",
+ "service-instance-name": "[&1].name",
+ "service-type": "[&1].serviceSpecification.name",
+ "model-version-id": "[&1].serviceSpecification.id"
+ }
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "*": {
+ "relatedParty": {
+
+ "role": "ONAPcustomer"
+ }
+ }
+ }
+ }
+] \ No newline at end of file
diff --git a/src/main/resources/jolt/getServiceCatalog.json b/src/main/resources/jolt/getServiceCatalog.json
new file mode 100644
index 0000000..cac223e
--- /dev/null
+++ b/src/main/resources/jolt/getServiceCatalog.json
@@ -0,0 +1,77 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "uuid": "id",
+ "name": "name",
+ "description": "description",
+ "invariantUUID": "invariantUUID",
+ "toscaModelURL": "toscaModelURL",
+ "toscaResourceName": "toscaResourceName",
+ "category ": "category",
+ "subcategory": "subcategory",
+ "distributionStatus": "distributionStatus",
+ "version": "version",
+ "lifecycleState":"lifecycleStatus" ,
+ "artifacts" : {
+ "*": {
+ "artifactUUID": "attachment[&1].id",
+ "artifactName": "attachment[&1].name",
+ "artifactDescription": "attachment[&1].description",
+ "artifactLabel": "attachment[&1].artifactLabel",
+ "artifactGroupType": "attachment[&1].artifactGroupType",
+ "artifactTimeout": "attachment[&1].artifactTimeout",
+ "artifactChecksum": "attachment[&1].artifactChecksum",
+ "artifactVersion": "attachment[&1].artifactVersion",
+ "generatedFromUUID": "attachment[&1].generatedFromUUID",
+ "artifactURL": "attachment[&1].url",
+ "artifactType": "attachment[&1].mimeType"
+ }
+
+ },
+ "lastUpdaterUserId" : "relatedParty.id",
+ "lastUpdaterFullName" : "relatedParty.name",
+ "resources" : {
+ "*": {
+ "resourceUUID": "resourceSpecification[&1].id",
+ "resourceVersion": "resourceSpecification[&1].version",
+ "resourceName": "resourceSpecification[&1].name",
+ "resourceInstanceName": "resourceSpecification[&1].instanceName",
+ "resourceInvariantUUID": "resourceSpecification[&1].resourceInvariantUUID",
+ "resourceType": "resourceSpecification[&1].resourceType"
+ }
+
+ }
+
+
+
+ }
+ },
+ {
+ "operation": "modify-overwrite-beta",
+ "spec": {
+ "href": "=concat('serviceSpecification/',@(1,id))"
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "@type": "ONAPservice",
+ "attachment[]" : {
+ "*": {
+ "@type": "ONAPartifact"
+ }
+
+ },
+ "relatedParty" : {
+ "role": "lastUpdater"
+ },
+ "resourceSpecification[]" : {
+ "*": {
+ "@type": "ONAPresource"
+ }
+
+ }
+ }
+ }
+] \ No newline at end of file
diff --git a/src/main/resources/jolt/getServiceInventory.json b/src/main/resources/jolt/getServiceInventory.json
new file mode 100644
index 0000000..df4f14c
--- /dev/null
+++ b/src/main/resources/jolt/getServiceInventory.json
@@ -0,0 +1,44 @@
+[
+ {
+ "operation": "shift",
+ "spec": {
+ "service-instance-id": "id",
+ "service-instance-name": "name",
+ "model-version-id" : "serviceSpecification.id",
+ "model-invariant-id": "serviceSpecification.invariantUUID",
+ "vnfs" : {
+ "*": {
+ "vnf-id": "supportingResource[&1].id",
+ "related-link": "supportingResource[&1].href",
+ "vnf-name": "supportingResource[&1].name",
+ "prov-status": "supportingResource[&1].status",
+ "model-invariant-id": "supportingResource[&1].modelInvariantId",
+ "model-version-id": "supportingResource[&1].modelVersionId",
+ "model-customisation-id": "supportingResource[&1].status"
+
+ }
+ }
+ }
+ },
+ {
+ "operation": "default",
+ "spec": {
+ "type": "service-instance",
+ "hasStarted": "yes",
+ "@type": "serviceONAP",
+ "serviceSpecification" : {
+ "@type" :"ONAPservice"
+ },
+ "supportingResource[]" : {
+ "*": {
+ "@referredType": "ONAP resource"
+ }
+
+ },
+ "relatedParty" : {
+ "role" :"ONAPcustomer"
+ }
+
+ }
+ }
+] \ No newline at end of file
diff --git a/src/test/java/org/onap/nbi/apis/ApiTest.java b/src/test/java/org/onap/nbi/apis/ApiTest.java
new file mode 100644
index 0000000..cdd9f61
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/ApiTest.java
@@ -0,0 +1,591 @@
+package org.onap.nbi.apis;
+
+
+import static org.assertj.core.api.Assertions.assertThat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.nbi.apis.assertions.ServiceCatalogAssertions;
+import org.onap.nbi.apis.assertions.ServiceInventoryAssertions;
+import org.onap.nbi.apis.assertions.ServiceOrderAssertions;
+import org.onap.nbi.apis.servicecatalog.ServiceSpecificationResource;
+import org.onap.nbi.apis.serviceinventory.ServiceInventoryResource;
+import org.onap.nbi.apis.serviceorder.ServiceOrderResource;
+import org.onap.nbi.apis.serviceorder.model.ActionType;
+import org.onap.nbi.apis.serviceorder.model.RelatedParty;
+import org.onap.nbi.apis.serviceorder.model.Service;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
+import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderInfoRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.workflow.SOTaskProcessor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.embedded.LocalServerPort;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.stubbing.ListStubMappingsResult;
+import com.github.tomakehurst.wiremock.stubbing.StubMapping;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class ApiTest {
+
+ @LocalServerPort
+ int randomServerPort;
+
+ String realServerPort;
+
+ static public WireMockServer wireMockServer = new WireMockServer(8091);
+
+ @Autowired
+ ServiceSpecificationResource serviceSpecificationResource;
+
+ @Autowired
+ ServiceInventoryResource serviceInventoryResource;
+
+ @Autowired
+ ServiceOrderResource serviceOrderResource;
+
+ @Autowired
+ ServiceOrderRepository serviceOrderRepository;
+
+ @Autowired
+ ServiceOrderInfoRepository serviceOrderInfoRepository;
+
+ @Autowired
+ ExecutionTaskRepository executionTaskRepository;
+
+ @Autowired
+ SOTaskProcessor SoTaskProcessor;
+
+ static Validator validator;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ wireMockServer.start();
+ ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+ validator = factory.getValidator();
+ }
+
+ @AfterClass
+ public static void tearsDown() throws Exception {
+ wireMockServer.stop();
+
+ }
+
+ @After
+ public void tearsDownUpPort() throws Exception {
+ executionTaskRepository.deleteAll();
+ serviceOrderInfoRepository.deleteAll();
+ serviceOrderRepository.deleteAll();
+ wireMockServer.resetToDefaultMappings();
+
+ }
+
+
+ public ExecutionTask getExecutionTask(String orderItemId) {
+ for (ExecutionTask executionTask : executionTaskRepository.findAll()) {
+ if (executionTask.getOrderItemId().equalsIgnoreCase(orderItemId)) {
+ return executionTask;
+ }
+
+ }
+ return null;
+ }
+
+ // serviceCatalog
+
+ @Test
+ @Ignore
+ public void testServiceResourceGetCatalog() throws Exception {
+
+ ResponseEntity<Object> resource =
+ serviceSpecificationResource.getServiceSpecification("1e3feeb0-8e36-46c6-862c-236d9c626439", null);
+ ServiceCatalogAssertions.assertGetServiceCatalog(resource);
+
+ }
+
+ @Test
+ public void testServiceCatalogGetResourceWithoutTosca() throws Exception {
+
+ ResponseEntity<Object> resource = serviceSpecificationResource
+ .getServiceSpecification("1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca", null);
+ ServiceCatalogAssertions.asserGetServiceCatalogWithoutTosca(resource);
+
+ }
+
+ @Test
+ public void testServiceCatalogFind() throws Exception {
+
+ ResponseEntity<Object> resource = serviceSpecificationResource.findServiceSpecification(null);
+ ServiceCatalogAssertions.assertFindServiceCatalog(resource);
+
+ }
+
+
+ @Test
+ public void testServiceCatalogFindWithFilter() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("fields", "name");
+ ResponseEntity<Object> resource = serviceSpecificationResource.findServiceSpecification(params);
+ ServiceCatalogAssertions.assertFindServiceCatalogWIthFilter(resource);
+
+ }
+
+ // serviceInventory
+
+ @Test
+ public void testServiceResourceGetInventory() throws Exception {
+
+ String serviceName = "vFW";
+ String serviceId = "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb";
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.name", serviceName);
+ params.add("relatedParty.id", "6490");
+ ResponseEntity<Object> resource = serviceInventoryResource.getServiceInventory(serviceId, params);
+ ServiceInventoryAssertions.assertServiceInventoryGet(resource);
+
+ }
+
+
+ @Test
+ public void testServiceResourceGetInventoryWithServiceSpecId() throws Exception {
+
+ String serviceId = "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb";
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.id", "1e3feeb0-8e36-46c6-862c-236d9c626439");
+ params.add("relatedParty.id", "6490");
+ ResponseEntity<Object> resource = serviceInventoryResource.getServiceInventory(serviceId, params);
+ ServiceInventoryAssertions.assertServiceInventoryGet(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFind() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ String serviceName = "vFW";
+ params.add("serviceSpecification.name", serviceName);
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFind(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFindWithServiceSpecId() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("serviceSpecification.id", "1e3feeb0-8e36-46c6-862c-236d9c626439");
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFind(resource);
+
+ }
+
+
+ @Test
+ public void testServiceInventoryFindWithoutParameter() throws Exception {
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("relatedParty.id", "6490");
+
+ ResponseEntity<Object> resource = serviceInventoryResource.findServiceInventory(params);
+ ServiceInventoryAssertions.assertServiceInventoryFindWithoutParameter(resource);
+
+ }
+
+ @Test
+ public void testCreateServiceOrderResource() throws Exception {
+
+ ResponseEntity<Object> serviceOrder = serviceOrderResource
+ .createServiceOrder(ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD), null, null);
+ assertThat(serviceOrder.getStatusCodeValue()).isEqualTo(201);
+ ServiceOrder body = (ServiceOrder) serviceOrder.getBody();
+ assertThat(body.getId()).isNotNull();
+ assertThat(body.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+
+
+ }
+
+ @Test
+ public void testCheckServiceOrder() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+
+ }
+
+ @Test
+ public void testCheckServiceOrderWithGenericCustomer() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ testServiceOrder.setRelatedParty(new ArrayList<>());
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+
+ }
+
+ @Test
+ public void testCheckServiceOrderWithUnKnonwCustomer() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ List<RelatedParty> customers = new ArrayList<>();
+ RelatedParty customer = new RelatedParty();
+ customer.setId("new");
+ customer.setRole("ONAPcustomer");
+ customer.setName("romain");
+ customers.add(customer);
+ testServiceOrder.setRelatedParty(customers);
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+
+ }
+
+ @Test
+ public void testCheckServiceOrderDelete() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.DELETE);
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+ }
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+
+ }
+
+ @Test
+ public void testCheckServiceOrderDeleteRejected() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.DELETE);
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ serviceOrderItem.getService().setId("no_response");
+
+ }
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.REJECTED);
+
+ }
+
+ @Test
+ public void testCheckServiceOrderNoChange() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.DELETE);
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ serviceOrderItem.setAction(ActionType.NOCHANGE);
+ }
+
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.COMPLETED);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+ }
+
+ }
+
+
+
+ @Test
+ public void testCheckServiceOrderNoChangeAndDelete() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.DELETE);
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ if (serviceOrderItem.getId().equals("A")) {
+ serviceOrderItem.setAction(ActionType.NOCHANGE);
+ }
+ serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+ }
+
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ if (serviceOrderItem.getId().equals("A"))
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+ }
+ }
+
+
+
+ @Test
+ public void testCheckServiceOrderRejected() throws Exception {
+
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrderRejected();
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ serviceOrderResource.scheduleCheckServiceOrders();
+
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.REJECTED);
+
+ }
+
+ @Test
+ public void validateServiceOrderBeanWithAnnotation() {
+ ServiceOrder serviceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ Set violations = validator.validate(serviceOrder);
+ assertThat(violations).isEmpty();
+
+ ServiceOrderItem item = new ServiceOrderItem();
+ item.setAction(ActionType.DELETE);
+ item.setService(new Service());
+ serviceOrder.addOrderItemItem(item);
+
+ violations = validator.validate(serviceOrder);
+ assertThat(violations).isNotEmpty();
+ }
+
+
+
+ @Test
+ public void testFindAndGetServiceOrder() throws Exception {
+
+ ServiceOrder testServiceOrder = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+ }
+ testServiceOrder.setExternalId("extid1");
+ testServiceOrder.setOrderDate(new Date());
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setDescription("toto");
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+
+ ServiceOrder testServiceOrder2 = ServiceOrderAssertions.createTestServiceOrder(ActionType.ADD);
+ testServiceOrder2.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder2.setDescription("toto");
+ testServiceOrder2.setId("test2");
+ testServiceOrder2.setExternalId("extid2");
+ testServiceOrder2.setOrderDate(new Date());
+
+ serviceOrderRepository.save(testServiceOrder2);
+
+
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("fields", "id");
+
+ ResponseEntity<Object> serviceOrdersResponse = serviceOrderResource.findServiceOrder(params);
+ ArrayList serviceOrders = (ArrayList) serviceOrdersResponse.getBody();
+ assertThat(serviceOrders.size()).isEqualTo(2);
+
+ params.add("externalId", "extid1");
+ params.add("state", "acknowledged");
+
+ serviceOrdersResponse = serviceOrderResource.findServiceOrder(params);
+ serviceOrders = (ArrayList) serviceOrdersResponse.getBody();
+ assertThat(serviceOrders.size()).isEqualTo(1);
+
+ MultiValueMap<String, String> paramsDate = new LinkedMultiValueMap<>();
+ paramsDate.add("orderDate.gt", "2017-01-01 00:00:00.000");
+ paramsDate.add("orderDate.lt", "2030-01-01 00:00:00.000");
+ paramsDate.add("offset", "0");
+ paramsDate.add("limit", "2");
+
+ serviceOrdersResponse = serviceOrderResource.findServiceOrder(paramsDate);
+ serviceOrders = (ArrayList) serviceOrdersResponse.getBody();
+ assertThat(serviceOrders.size()).isEqualTo(2);
+
+
+ ResponseEntity<Object> serviceOrderResponse =
+ serviceOrderResource.getServiceOrder("test2", new LinkedMultiValueMap<>());
+ ServiceOrder serviceOrder = (ServiceOrder) serviceOrderResponse.getBody();
+ assertThat(serviceOrder).isNotNull();
+ }
+
+
+
+ @Test
+ public void testExecutionTaskSuccess() throws Exception {
+
+ ExecutionTask executionTaskA = ServiceOrderAssertions.setUpBddForExecutionTaskSucess(serviceOrderRepository,
+ serviceOrderInfoRepository, executionTaskRepository, ActionType.ADD);
+ ExecutionTask executionTaskB;
+
+
+ SoTaskProcessor.processOrderItem(executionTaskA);
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.INPROGRESS);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ if (serviceOrderItem.getId().equals("A")) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+ } else {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+ }
+ }
+
+ executionTaskB = getExecutionTask("B");
+ assertThat(executionTaskB.getReliedTasks()).isNullOrEmpty();
+ executionTaskA = getExecutionTask("A");
+ assertThat(executionTaskA).isNull();
+
+ SoTaskProcessor.processOrderItem(executionTaskB);
+ serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.COMPLETED);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+
+ }
+
+ executionTaskB = getExecutionTask("B");
+ assertThat(executionTaskB).isNull();
+
+
+ }
+
+
+ @Test
+ public void testExecutionTaskDeleteSuccess() throws Exception {
+
+ ExecutionTask executionTaskA = ServiceOrderAssertions.setUpBddForExecutionTaskSucess(serviceOrderRepository,
+ serviceOrderInfoRepository, executionTaskRepository, ActionType.DELETE);
+ ExecutionTask executionTaskB;
+
+
+ SoTaskProcessor.processOrderItem(executionTaskA);
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.INPROGRESS);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ if (serviceOrderItem.getId().equals("A")) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+ } else {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+ }
+ }
+
+ executionTaskB = getExecutionTask("B");
+ assertThat(executionTaskB.getReliedTasks()).isNullOrEmpty();
+ executionTaskA = getExecutionTask("A");
+ assertThat(executionTaskA).isNull();
+
+ SoTaskProcessor.processOrderItem(executionTaskB);
+ serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.COMPLETED);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.COMPLETED);
+
+ }
+
+ executionTaskB = getExecutionTask("B");
+ assertThat(executionTaskB).isNull();
+
+
+ }
+
+
+ @Test
+ public void testExecutionTaskFailed() throws Exception {
+
+ ExecutionTask executionTaskA = ServiceOrderAssertions.setUpBddForExecutionTaskSucess(serviceOrderRepository,
+ serviceOrderInfoRepository, executionTaskRepository, ActionType.ADD);
+
+ ListStubMappingsResult listStubMappingsResult = wireMockServer.listAllStubMappings();
+ StubMapping mappingToDelete = null;
+ List<StubMapping> mappings = listStubMappingsResult.getMappings();
+ for (StubMapping mapping : mappings) {
+ if (mapping.getRequest().getUrl().equals("/ecomp/mso/infra/orchestrationRequests/v4/requestId")) {
+ mappingToDelete = mapping;
+ }
+ }
+ wireMockServer.removeStubMapping(mappingToDelete);
+
+
+ SoTaskProcessor.processOrderItem(executionTaskA);
+ ServiceOrder serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.INPROGRESS);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ if (serviceOrderItem.getId().equals("A")) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.INPROGRESS);
+ } else {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.ACKNOWLEDGED);
+ }
+ }
+ executionTaskA = getExecutionTask("A");
+ assertThat(executionTaskA.getNbRetries()).isEqualTo(2);
+ SoTaskProcessor.processOrderItem(executionTaskA);
+ executionTaskA = getExecutionTask("A");
+ SoTaskProcessor.processOrderItem(executionTaskA);
+ executionTaskA = getExecutionTask("A");
+ SoTaskProcessor.processOrderItem(executionTaskA);
+
+ serviceOrderChecked = serviceOrderRepository.findOne("test");
+ assertThat(serviceOrderChecked.getState()).isEqualTo(StateType.FAILED);
+ for (ServiceOrderItem serviceOrderItem : serviceOrderChecked.getOrderItem()) {
+ assertThat(serviceOrderItem.getState()).isEqualTo(StateType.FAILED);
+
+ }
+
+ ExecutionTask executionTaskB = executionTaskRepository.findOne(Long.parseLong("2"));
+ assertThat(executionTaskB).isNull();
+
+
+ }
+
+}
diff --git a/src/test/java/org/onap/nbi/apis/ServiceOrderRepositoryTest.java b/src/test/java/org/onap/nbi/apis/ServiceOrderRepositoryTest.java
new file mode 100644
index 0000000..93c9000
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/ServiceOrderRepositoryTest.java
@@ -0,0 +1,45 @@
+package org.onap.nbi.apis;
+
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ServiceOrderRepositoryTest {
+
+ @Autowired
+ ServiceOrderRepository serviceOrderRepository;
+
+
+ @Before
+ public void setUp() {
+ ServiceOrder serviceOrder = new ServiceOrder();
+ serviceOrder.setId("test");
+ serviceOrder.setState(StateType.INPROGRESS);
+ serviceOrderRepository.save(serviceOrder);
+ }
+
+ @Test
+ public void findById() {
+ ServiceOrder result = serviceOrderRepository.findOne("test");
+ assertNotNull(result);
+ }
+
+ @Test
+ public void findByState() {
+ List<ServiceOrder> result = serviceOrderRepository.findByState(StateType.INPROGRESS);
+ assertFalse(result.isEmpty());
+ }
+
+}
diff --git a/src/test/java/org/onap/nbi/apis/StatusResourceTest.java b/src/test/java/org/onap/nbi/apis/StatusResourceTest.java
new file mode 100644
index 0000000..f988996
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/StatusResourceTest.java
@@ -0,0 +1,42 @@
+package org.onap.nbi.apis;
+
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.nbi.apis.status.StatusResource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.test.context.junit4.SpringRunner;
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class StatusResourceTest {
+
+ @Autowired
+ StatusResource statusResource;
+
+ private MockHttpServletRequest request;
+
+ @Before
+ public void setup() {
+ request = new MockHttpServletRequest();
+ request.setRequestURI("/nbi/api/v1/status");
+ }
+
+ @Test
+ public void testHealthCheck() {
+ ResponseEntity<Object> response = statusResource.status(request);
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ObjectNode status = (ObjectNode) response.getBody();
+ assertThat(status.get("name").textValue()).isEqualTo("nbi");
+ assertThat(status.get("status").toString()).isEqualTo("OK");
+ assertThat(status.get("version").textValue()).isEqualTo("v1");
+ }
+}
diff --git a/src/test/java/org/onap/nbi/apis/assertions/ServiceCatalogAssertions.java b/src/test/java/org/onap/nbi/apis/assertions/ServiceCatalogAssertions.java
new file mode 100644
index 0000000..3f44640
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/assertions/ServiceCatalogAssertions.java
@@ -0,0 +1,135 @@
+package org.onap.nbi.apis.assertions;
+
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import static org.assertj.core.api.Assertions.assertThat;
+
+
+public class ServiceCatalogAssertions {
+
+
+ public static void assertGetServiceCatalog(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ LinkedHashMap service = (LinkedHashMap) resource.getBody();
+ assertThat(service.get("id")).isEqualTo("1e3feeb0-8e36-46c6-862c-236d9c626439");
+ assertThat(service.get("name")).isEqualTo("vFW");
+ assertThat(service.get("invariantUUID")).isEqualTo("b58a118e-eeb9-4f6e-bdca-e292f84d17df");
+ assertThat(service.get("toscaModelURL"))
+ .isEqualTo("/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/toscaModel");
+ assertThat(service.get("distributionStatus")).isEqualTo("DISTRIBUTED");
+ assertThat(service.get("version")).isEqualTo("2.0");
+ assertThat(service.get("lifecycleStatus")).isEqualTo("CERTIFIED");
+ assertThat(service.get("@type")).isEqualTo("ONAPservice");
+ assertThat(((ArrayList) service.get("attachment")).size()).isEqualTo(5);
+ LinkedHashMap relatedParty = (LinkedHashMap) service.get("relatedParty");
+ assertThat(relatedParty.get("name")).isEqualTo("Joni Mitchell");
+ assertThat(relatedParty.get("role")).isEqualTo("lastUpdater");
+
+
+ assertThat(((ArrayList) service.get("resourceSpecification")).size()).isEqualTo(2);
+ LinkedHashMap resource1 = (LinkedHashMap) ((ArrayList) service.get("resourceSpecification")).get(0);
+ assertThat(resource1.get("name")).isEqualTo("vFW-vSINK");
+ assertThat(resource1.get("instanceName")).isEqualTo("vFW-vSINK 0");
+ assertThat(resource1.get("resourceInvariantUUID")).isEqualTo("18b90934-aa82-456f-938e-e74a07a426f3");
+ assertThat(resource1.get("@type")).isEqualTo("ONAPresource");
+ assertThat(resource1.get("modelCustomizationId")).isEqualTo("f7ae574e-fd5f-41e7-9b21-75e001561c96");
+ assertThat(resource1.get("modelCustomizationName")).isEqualTo("vFW-vSINK");
+
+ assertThat(((ArrayList) service.get("serviceSpecCharacteristic")).size()).isEqualTo(4);
+ ArrayList serviceSPecCharacteristics = (ArrayList) service.get("serviceSpecCharacteristic");
+ for (Object serviceSPecCharacteristic : serviceSPecCharacteristics) {
+ LinkedHashMap serviceSPecCharacteristicMap = (LinkedHashMap) serviceSPecCharacteristic;
+ if (serviceSPecCharacteristicMap.get("name").toString().equals("cpus")) {
+ assertThat(serviceSPecCharacteristicMap.get("valueType")).isEqualTo("integer");
+ assertThat(serviceSPecCharacteristicMap.get("@type")).isEqualTo("ONAPserviceCharacteristic");
+ ArrayList serviceSpecCharacteristicValues =
+ (ArrayList) serviceSPecCharacteristicMap.get("serviceSpecCharacteristicValue");
+ for (Object serviceSpecCharacteristicValue : serviceSpecCharacteristicValues) {
+ LinkedHashMap serviceSpecCharacteristicValueMap = (LinkedHashMap) serviceSpecCharacteristicValue;
+ if (serviceSpecCharacteristicValueMap.get("value").toString().equals("2")) {
+ assertThat(serviceSpecCharacteristicValueMap.get("isDefault")).isEqualTo(true);
+ assertThat(serviceSpecCharacteristicValueMap.get("valueType")).isEqualTo("integer");
+ } else {
+ assertThat(serviceSpecCharacteristicValueMap.get("isDefault")).isEqualTo(false);
+ assertThat(serviceSpecCharacteristicValueMap.get("valueType")).isEqualTo("integer");
+ }
+ }
+ }
+ }
+ }
+
+
+
+ public static void asserGetServiceCatalogWithoutTosca(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.PARTIAL_CONTENT);
+ LinkedHashMap service = (LinkedHashMap) resource.getBody();
+ assertThat(service.get("id")).isEqualTo("1e3feeb0-8e36-46c6-862c-236d9c626439");
+ assertThat(service.get("name")).isEqualTo("vFW");
+ assertThat(service.get("invariantUUID")).isEqualTo("b58a118e-eeb9-4f6e-bdca-e292f84d17df");
+ assertThat(service.get("toscaModelURL"))
+ .isEqualTo("/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439toto/toscaModel");
+ assertThat(service.get("distributionStatus")).isEqualTo("DISTRIBUTED");
+ assertThat(service.get("version")).isEqualTo("2.0");
+ assertThat(service.get("lifecycleStatus")).isEqualTo("CERTIFIED");
+ assertThat(service.get("@type")).isEqualTo("ONAPservice");
+ assertThat(((ArrayList) service.get("attachment")).size()).isEqualTo(5);
+ LinkedHashMap relatedParty = (LinkedHashMap) service.get("relatedParty");
+ assertThat(relatedParty.get("name")).isEqualTo("Joni Mitchell");
+ assertThat(relatedParty.get("role")).isEqualTo("lastUpdater");
+
+
+ assertThat(((ArrayList) service.get("resourceSpecification")).size()).isEqualTo(2);
+ LinkedHashMap resource1 = (LinkedHashMap) ((ArrayList) service.get("resourceSpecification")).get(0);
+ assertThat(resource1.get("name")).isEqualTo("vFW-vSINK");
+ assertThat(resource1.get("instanceName")).isEqualTo("vFW-vSINK 0");
+ assertThat(resource1.get("resourceInvariantUUID")).isEqualTo("18b90934-aa82-456f-938e-e74a07a426f3");
+ assertThat(resource1.get("@type")).isEqualTo("ONAPresource");
+ assertThat(resource1.get("modelCustomizationId")).isNull();
+ assertThat(resource1.get("modelCustomizationName")).isNull();
+
+ assertThat(service.get("serviceSpecCharacteristic")).isNull();
+ }
+
+
+
+ public static void assertFindServiceCatalog(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList) resource.getBody();
+ assertThat(body.size()).isEqualTo(21);
+ LinkedHashMap service1 = (LinkedHashMap) body.get(0);
+ assertThat(service1.get("id")).isEqualTo("446afaf6-79b5-420e-aff8-7551b00bb510");
+ assertThat(service1.get("name")).isEqualTo("FreeRadius-service");
+ assertThat(service1.get("invariantUUID")).isEqualTo("7e4781e8-6c6e-41c5-b889-6a321d5f2490");
+ assertThat(service1.get("category")).isEqualTo("Network L4+");
+ assertThat(service1.get("distributionStatus")).isEqualTo("DISTRIBUTED");
+ assertThat(service1.get("version")).isEqualTo("1.0");
+ assertThat(service1.get("lifecycleStatus")).isEqualTo("CERTIFIED");
+ LinkedHashMap relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("lastUpdater");
+ }
+
+
+
+ public static void assertFindServiceCatalogWIthFilter(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList) resource.getBody();
+ assertThat(body.size()).isEqualTo(21);
+
+
+ ObjectNode service1 = (ObjectNode) body.get(0);
+ assertThat(service1.get("id")).isNull();
+ assertThat(service1.get("name").asText()).isEqualTo("FreeRadius-service");
+ assertThat(service1.get("invariantUUID")).isNull();
+ assertThat(service1.get("category")).isNull();
+ assertThat(service1.get("distributionStatus")).isNull();
+ assertThat(service1.get("version")).isNull();
+ assertThat(service1.get("lifecycleStatus")).isNull();
+ assertThat(service1.get("relatedParty")).isNull();
+ }
+
+}
+
diff --git a/src/test/java/org/onap/nbi/apis/assertions/ServiceInventoryAssertions.java b/src/test/java/org/onap/nbi/apis/assertions/ServiceInventoryAssertions.java
new file mode 100644
index 0000000..426b1a1
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/assertions/ServiceInventoryAssertions.java
@@ -0,0 +1,85 @@
+package org.onap.nbi.apis.assertions;
+
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ServiceInventoryAssertions {
+
+
+
+ public static void assertServiceInventoryGet(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ LinkedHashMap service = (LinkedHashMap) resource.getBody();
+ assertThat(service.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ assertThat(service.get("hasStarted")).isEqualTo("yes");
+ assertThat(service.get("type")).isEqualTo("service-instance");
+ assertThat(service.get("@type")).isEqualTo("serviceONAP");
+ LinkedHashMap relatedParty = (LinkedHashMap) service.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap) service.get("serviceSpecification");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+ assertThat(serviceSpecification.get("invariantUUID")).isEqualTo("709d157b-52fb-4250-976e-7133dff5c347");
+ assertThat(serviceSpecification.get("@type")).isEqualTo("ONAPservice");
+
+
+ assertThat(((ArrayList) service.get("supportingResource")).size()).isEqualTo(2);
+ LinkedHashMap resource1 = (LinkedHashMap) ((ArrayList) service.get("supportingResource")).get(0);
+ assertThat(resource1.get("id")).isEqualTo("cb80fbb6-9aa7-4ac5-9541-e14f45de533e");
+ assertThat(resource1.get("name")).isEqualTo("NewFreeRadius-VNF-instance-01");
+ assertThat(resource1.get("status")).isEqualTo("PREPROV");
+ assertThat(resource1.get("modelInvariantId")).isEqualTo("f5993703-977f-4346-a1c9-c1884f8cfd8d");
+ assertThat(resource1.get("modelVersionId")).isEqualTo("902438f7-1e4c-492d-b7cc-8650e13b8aeb");
+ assertThat(resource1.get("@referredType")).isEqualTo("ONAP resource");
+ }
+
+
+ public static void assertServiceInventoryFind(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList) resource.getBody();
+ assertThat(body.size()).isEqualTo(1);
+ LinkedHashMap service1 = (LinkedHashMap) body.get(0);
+ assertThat(service1.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service1.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ LinkedHashMap relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap) service1.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+ }
+
+
+ public static void assertServiceInventoryFindWithoutParameter(ResponseEntity<Object> resource) {
+ assertThat(resource.getStatusCode()).isEqualTo(HttpStatus.OK);
+ ArrayList body = (ArrayList) resource.getBody();
+ assertThat(body.size()).isEqualTo(2);
+ LinkedHashMap service1 = (LinkedHashMap) body.get(0);
+ assertThat(service1.get("id")).isEqualTo("vfw-service-id");
+ assertThat(service1.get("name")).isEqualTo("vfw-service-name");
+ LinkedHashMap relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ LinkedHashMap serviceSpecification = (LinkedHashMap) service1.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW-service-2VF-based");
+ assertThat(serviceSpecification.get("id")).isEqualTo("9vfw-service-modek-version-id");
+
+
+ LinkedHashMap service2 = (LinkedHashMap) body.get(1);
+ assertThat(service2.get("id")).isEqualTo("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ assertThat(service2.get("name")).isEqualTo("NewFreeRadius-service-instance-01");
+ relatedParty = (LinkedHashMap) service1.get("relatedParty");
+ assertThat(relatedParty.get("role")).isEqualTo("ONAPcustomer");
+ assertThat(relatedParty.get("id")).isEqualTo("6490");
+ serviceSpecification = (LinkedHashMap) service2.get("serviceSpecification");
+ assertThat(serviceSpecification.get("name")).isEqualTo("vFW");
+ assertThat(serviceSpecification.get("id")).isEqualTo("98d95267-5e0f-4531-abf8-f14b90031dc5");
+
+ }
+
+}
diff --git a/src/test/java/org/onap/nbi/apis/assertions/ServiceOrderAssertions.java b/src/test/java/org/onap/nbi/apis/assertions/ServiceOrderAssertions.java
new file mode 100644
index 0000000..2e89a8a
--- /dev/null
+++ b/src/test/java/org/onap/nbi/apis/assertions/ServiceOrderAssertions.java
@@ -0,0 +1,206 @@
+package org.onap.nbi.apis.assertions;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.onap.nbi.apis.serviceorder.model.ActionType;
+import org.onap.nbi.apis.serviceorder.model.OrderItemRelationship;
+import org.onap.nbi.apis.serviceorder.model.OrderRelationship;
+import org.onap.nbi.apis.serviceorder.model.RelatedParty;
+import org.onap.nbi.apis.serviceorder.model.Service;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrder;
+import org.onap.nbi.apis.serviceorder.model.ServiceOrderItem;
+import org.onap.nbi.apis.serviceorder.model.ServiceSpecificationRef;
+import org.onap.nbi.apis.serviceorder.model.StateType;
+import org.onap.nbi.apis.serviceorder.model.consumer.SubscriberInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ExecutionTask;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfo;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderInfoJson;
+import org.onap.nbi.apis.serviceorder.model.orchestrator.ServiceOrderItemInfo;
+import org.onap.nbi.apis.serviceorder.repositories.ExecutionTaskRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderInfoRepository;
+import org.onap.nbi.apis.serviceorder.repositories.ServiceOrderRepository;
+import org.onap.nbi.apis.serviceorder.utils.JsonEntityConverter;
+
+
+public class ServiceOrderAssertions {
+
+ public static ServiceOrder createTestServiceOrderRejected() {
+ ServiceOrder serviceOrder = new ServiceOrder();
+ serviceOrder.setExternalId("LudONAP001");
+ serviceOrder.setPriority("1");
+ serviceOrder.setDescription("Ludo first ONAP Order");
+ serviceOrder.setCategory("Consumer");
+ serviceOrder.setRequestedStartDate(new Date());
+ serviceOrder.setRequestedCompletionDate(new Date());
+
+ RelatedParty party = new RelatedParty();
+ party.setId("6490");
+ party.setRole("ONAPcustomer");
+ party.setReferredType("individual");
+ party.setName("Jean Pontus");
+ List<RelatedParty> relatedPartyList = new ArrayList<>();
+ relatedPartyList.add(party);
+ serviceOrder.setRelatedParty(relatedPartyList);
+
+ List<ServiceOrderItem> items = new ArrayList<>();
+
+ ServiceOrderItem itemA = new ServiceOrderItem();
+ itemA.id("A");
+ itemA.action(ActionType.ADD);
+ Service serviceA = new Service();
+ serviceA.setServiceState("active");
+ ServiceSpecificationRef serviceSpecificationRefA = new ServiceSpecificationRef();
+ serviceSpecificationRefA.setId("333");
+ serviceA.setServiceSpecification(serviceSpecificationRefA);
+ itemA.setService(serviceA);
+ items.add(itemA);
+
+ ServiceOrderItem itemB = new ServiceOrderItem();
+ itemB.id("B");
+ itemB.action(ActionType.ADD);
+ Service serviceB = new Service();
+ serviceB.setServiceState("active");
+ ServiceSpecificationRef serviceSpecificationRefB = new ServiceSpecificationRef();
+ serviceSpecificationRefB.setId("1e3feeb0-8e36-46c6-862c-236d9c626439");
+ serviceB.setServiceSpecification(serviceSpecificationRefB);
+ itemB.setService(serviceB);
+ List<OrderItemRelationship> orderItemRelationships = new ArrayList<>();
+ OrderItemRelationship orderItemRelationship = new OrderItemRelationship();
+ orderItemRelationship.setId("A");
+ orderItemRelationships.add(orderItemRelationship);
+ itemB.setOrderItemRelationship(orderItemRelationships);
+ items.add(itemB);
+ serviceOrder.setOrderItem(items);
+ return serviceOrder;
+
+ }
+
+
+ public static ServiceOrder createTestServiceOrder(ActionType actionType) {
+ ServiceOrder serviceOrder = new ServiceOrder();
+ serviceOrder.setExternalId("LudONAP001");
+ serviceOrder.setPriority("1");
+ serviceOrder.setDescription("Ludo first ONAP Order");
+ serviceOrder.setCategory("Consumer");
+ serviceOrder.setRequestedStartDate(new Date());
+ serviceOrder.setRequestedCompletionDate(new Date());
+ serviceOrder.setBaseType("toto");
+ serviceOrder.setCompletionDateTime(new Date());
+ serviceOrder.setExpectedCompletionDate(new Date());
+ serviceOrder.setSchemaLocation("/tutu");
+
+ OrderRelationship orderRelationship = new OrderRelationship();
+ orderRelationship.setId("test");
+ orderRelationship.setHref("test");
+ orderRelationship.setReferredType("test");
+ orderRelationship.setType("type");
+ List<OrderRelationship> relationships = new ArrayList<>();
+ serviceOrder.setOrderRelationship(relationships);
+
+ RelatedParty party = new RelatedParty();
+ party.setId("6490");
+ party.setRole("ONAPcustomer");
+ party.setReferredType("individual");
+ party.setName("Jean Pontus");
+ List<RelatedParty> relatedPartyList = new ArrayList<>();
+ relatedPartyList.add(party);
+ serviceOrder.setRelatedParty(relatedPartyList);
+
+ List<ServiceOrderItem> items = new ArrayList<>();
+
+ ServiceOrderItem itemA = new ServiceOrderItem();
+ itemA.id("A");
+ itemA.action(actionType);
+ Service serviceA = new Service();
+ if (actionType != ActionType.ADD) {
+ serviceA.setId("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ }
+ serviceA.setServiceState("active");
+ ServiceSpecificationRef serviceSpecificationRefA = new ServiceSpecificationRef();
+ serviceSpecificationRefA.setId("1e3feeb0-8e36-46c6-862c-236d9c626439");
+ serviceA.setServiceSpecification(serviceSpecificationRefA);
+ itemA.setService(serviceA);
+ items.add(itemA);
+
+ ServiceOrderItem itemB = new ServiceOrderItem();
+ itemB.id("B");
+ itemB.action(actionType);
+ Service serviceB = new Service();
+ if (actionType != ActionType.ADD) {
+ serviceB.setId("e4688e5f-61a0-4f8b-ae02-a2fbde623bcb");
+ }
+ serviceB.setServiceState("active");
+ ServiceSpecificationRef serviceSpecificationRefB = new ServiceSpecificationRef();
+ serviceSpecificationRefB.setId("1e3feeb0-8e36-46c6-862c-236d9c626439");
+ serviceB.setServiceSpecification(serviceSpecificationRefB);
+ itemB.setService(serviceB);
+ List<OrderItemRelationship> orderItemRelationships = new ArrayList<>();
+ OrderItemRelationship orderItemRelationship = new OrderItemRelationship();
+ orderItemRelationship.setId("A");
+ orderItemRelationships.add(orderItemRelationship);
+ itemB.setOrderItemRelationship(orderItemRelationships);
+ items.add(itemB);
+ serviceOrder.setOrderItem(items);
+ return serviceOrder;
+
+ }
+
+
+ public static ExecutionTask setUpBddForExecutionTaskSucess(ServiceOrderRepository serviceOrderRepository,
+ ServiceOrderInfoRepository serviceOrderInfoRepository, ExecutionTaskRepository executionTaskRepository,
+ ActionType actionType) {
+ ServiceOrder testServiceOrder = createTestServiceOrder(actionType);
+
+ for (ServiceOrderItem serviceOrderItem : testServiceOrder.getOrderItem()) {
+ serviceOrderItem.setState(StateType.ACKNOWLEDGED);
+ }
+
+ testServiceOrder.setState(StateType.ACKNOWLEDGED);
+ testServiceOrder.setId("test");
+ serviceOrderRepository.save(testServiceOrder);
+
+ LinkedHashMap<String, String> sdcResponse = new LinkedHashMap<>();
+ sdcResponse.put("invariantUUID", "uuid");
+ sdcResponse.put("name", "vFW");
+ sdcResponse.put("version", "v1");
+
+ ServiceOrderInfo serviceOrderInfo = new ServiceOrderInfo();
+
+ SubscriberInfo subscriberInfo = new SubscriberInfo();
+ subscriberInfo.setGlobalSubscriberId("6490");
+ subscriberInfo.setSubscriberName("edgar");
+ serviceOrderInfo.setSubscriberInfo(subscriberInfo);
+
+ ServiceOrderItemInfo serviceOrderItemInfoA = new ServiceOrderItemInfo();
+ serviceOrderItemInfoA.setId("A");
+ serviceOrderItemInfoA.setCatalogResponse(sdcResponse);
+
+ ServiceOrderItemInfo serviceOrderItemInfoB = new ServiceOrderItemInfo();
+ serviceOrderItemInfoB.setId("B");
+ serviceOrderItemInfoB.setCatalogResponse(sdcResponse);
+ serviceOrderInfo.addServiceOrderItemInfos("A", serviceOrderItemInfoA);
+ serviceOrderInfo.addServiceOrderItemInfos("B", serviceOrderItemInfoB);
+
+ String json = JsonEntityConverter.convertServiceOrderInfoToJson(serviceOrderInfo);
+ ServiceOrderInfoJson serviceOrderInfoJson = new ServiceOrderInfoJson("test", json);
+ serviceOrderInfoRepository.save(serviceOrderInfoJson);
+
+ ExecutionTask executionTaskA = new ExecutionTask();
+ executionTaskA.setNbRetries(3);
+ executionTaskA.setOrderItemId("A");
+ executionTaskA.setServiceOrderInfoJson(serviceOrderInfoJson);
+ executionTaskA = executionTaskRepository.save(executionTaskA);
+ ExecutionTask executionTaskB = new ExecutionTask();
+ executionTaskB.setNbRetries(3);
+ executionTaskB.setOrderItemId("B");
+ executionTaskB.setReliedTasks(String.valueOf(executionTaskA.getInternalId()));
+ executionTaskB.setServiceOrderInfoJson(serviceOrderInfoJson);
+ executionTaskRepository.save(executionTaskB);
+ return executionTaskA;
+ }
+
+
+
+}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
new file mode 100644
index 0000000..793da56
--- /dev/null
+++ b/src/test/resources/application.properties
@@ -0,0 +1,32 @@
+# SERVER
+server.contextPath=/nbi/api/v1
+server.port = 8080
+
+# LOGGING
+logging.level.org.onap.nbi=DEBUG
+
+# ONAP
+onap.lcpCloudRegionId=RegionOne
+onap.tenantId=31047205ce114b60833b23e400d6a535
+onap.cloudOwner=CloudOwner
+
+# NBI
+nbi.url=http://127.0.0.1:8080/nbi/api/v1
+nbi.callForVNF=false
+
+# SDC
+sdc.host=http://127.0.0.1:8091
+sdc.header.ecompInstanceId=Rene
+sdc.header.authorization=Basic YWFpOktwOGJKNFNYc3pNMFdYbGhhazNlSGxjc2UyZ0F3ODR2YW9HR21KdlV5MlU=
+
+# AAI
+aai.host=http://127.0.0.1:8091
+aai.header.authorization=Basic QUFJOkFBSQ==
+aai.api.id=AAI
+
+# SO
+so.host=http://127.0.0.1:8091
+so.header.authorization=
+so.api.id=SO
+
+
diff --git a/src/test/resources/mappings/aai_get_6490_service-subscriptions.json b/src/test/resources/mappings/aai_get_6490_service-subscriptions.json
new file mode 100644
index 0000000..5582990
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_6490_service-subscriptions.json
@@ -0,0 +1,24 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-subscription": [
+ {
+ "service-type": "vFW-service-2VF-based",
+ "resource-version": "1519809287769"
+ },
+ {
+ "service-type": "vFW",
+ "resource-version": "1519660513613"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_customer_6490.json b/src/test/resources/mappings/aai_get_customer_6490.json
new file mode 100644
index 0000000..eaf5a4b
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_customer_6490.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "global-customer-id": "6490",
+ "subscriber-name": "Jean Pontus",
+ "subscriber-type": "BSS",
+ "resource-version": "1518595364087"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_customer_generic.json b/src/test/resources/mappings/aai_get_customer_generic.json
new file mode 100644
index 0000000..250f5d6
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_customer_generic.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/generic"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "global-customer-id": "generic",
+ "subscriber-name": "generic",
+ "subscriber-type": "BSS",
+ "resource-version": "1518595364087"
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_generic_service-subscriptions.json b/src/test/resources/mappings/aai_get_generic_service-subscriptions.json
new file mode 100644
index 0000000..5cf9ddd
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_generic_service-subscriptions.json
@@ -0,0 +1,20 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/generic/service-subscriptions"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-subscription": [
+ {
+ "service-type": "vFW",
+ "resource-version": "1519660513613"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscription.json b/src/test/resources/mappings/aai_get_service-subscription.json
new file mode 100644
index 0000000..03558a9
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscription.json
@@ -0,0 +1,55 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW/service-instances/service-instance/e4688e5f-61a0-4f8b-ae02-a2fbde623bcb"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance-id": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "service-instance-name": "NewFreeRadius-service-instance-01",
+ "model-invariant-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "model-version-id": "98d95267-5e0f-4531-abf8-f14b90031dc5",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ },
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscription_vnf.json b/src/test/resources/mappings/aai_get_service-subscription_vnf.json
new file mode 100644
index 0000000..7c33979
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscription_vnf.json
@@ -0,0 +1,58 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "vnf-id": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "vnf-name": "NewFreeRadius-VNF-instance-01",
+ "vnf-type": "NewFreeRadius-service/New-FreeRadius 0",
+ "service-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "prov-status": "PREPROV",
+ "orchestration-status": "Created",
+ "in-maint": false,
+ "is-closed-loop-disabled": false,
+ "resource-version": "1516871905399",
+ "model-invariant-id": "f5993703-977f-4346-a1c9-c1884f8cfd8d",
+ "model-version-id": "902438f7-1e4c-492d-b7cc-8650e13b8aeb",
+ "model-customization-id": "a2def5c8-ab15-482b-a2cd-2af0b987300f",
+ "nf-type": "",
+ "nf-function": "",
+ "nf-role": "",
+ "nf-naming-code": "",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-instance",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/NewFreeRadius-service/service-instances/service-instance/e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "NewFreeRadius-service"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "service-instance.service-instance-name",
+ "property-value": "NewFreeRadius-service-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json b/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json
new file mode 100644
index 0000000..093dd96
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscriptionsVFW.json
@@ -0,0 +1,43 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW/service-instances/"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance": [
+ {
+ "service-instance-id": "e4688e5f-61a0-4f8b-ae02-a2fbde623bcb",
+ "service-instance-name": "NewFreeRadius-service-instance-01",
+ "model-invariant-id": "709d157b-52fb-4250-976e-7133dff5c347",
+ "model-version-id": "98d95267-5e0f-4531-abf8-f14b90031dc5",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json b/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json
new file mode 100644
index 0000000..444e3cd
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_service-subscriptionsvFW-service-2VF-based.json
@@ -0,0 +1,43 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/business/customers/customer/6490/service-subscriptions/service-subscription/vFW-service-2VF-based/service-instances/"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "service-instance": [
+ {
+ "service-instance-id": "vfw-service-id",
+ "service-instance-name": "vfw-service-name",
+ "model-invariant-id": "vfw-service-invariant-id",
+ "model-version-id": "9vfw-service-modek-version-id",
+ "resource-version": "1518508381261",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "generic-vnf",
+ "related-link": "/aai/v11/network/generic-vnfs/generic-vnf/cb80fbb6-9aa7-4ac5-9541-e14f45de533e",
+ "relationship-data": [
+ {
+ "relationship-key": "generic-vnf.vnf-id",
+ "relationship-value": "cb80fbb6-9aa7-4ac5-9541-e14f45de533e"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "generic-vnf.vnf-name",
+ "property-value": "NewFreeRadius-VNF-instance-01"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_get_tenants.json b/src/test/resources/mappings/aai_get_tenants.json
new file mode 100644
index 0000000..7581a91
--- /dev/null
+++ b/src/test/resources/mappings/aai_get_tenants.json
@@ -0,0 +1,167 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+
+ "tenant": [
+ {
+ "tenant-id": "31047205ce114b60833b23e400d6a535",
+ "tenant-name": "onap-vnfs",
+ "resource-version": "1516022902124",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/OPL-User/service-subscriptions/service-subscription/OPL_FWtest1_service_type",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "OPL-User"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "OPL_FWtest1_service_type"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/NewFreeRadius-service",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "NewFreeRadius-service"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/vMRFaaS3",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vMRFaaS3"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/FreeRadius-service",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "FreeRadius-service"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6401/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6401"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6404/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6404"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6405/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6405"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/6406/service-subscriptions/service-subscription/vFW-service-model",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "6406"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "vFW-service-model"
+ }
+ ]
+ },
+ {
+ "related-to": "service-subscription",
+ "related-link": "/aai/v11/business/customers/customer/Sina/service-subscriptions/service-subscription/serviceFRDBS",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "Sina"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "serviceFRDBS"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_put_customer.json b/src/test/resources/mappings/aai_put_customer.json
new file mode 100644
index 0000000..ec28b72
--- /dev/null
+++ b/src/test/resources/mappings/aai_put_customer.json
@@ -0,0 +1,12 @@
+{
+ "request": {
+ "method": "PUT",
+ "url": "/aai/v11/business/customers/customer/new"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/aai_put_customer_service.json b/src/test/resources/mappings/aai_put_customer_service.json
new file mode 100644
index 0000000..889627a
--- /dev/null
+++ b/src/test/resources/mappings/aai_put_customer_service.json
@@ -0,0 +1,12 @@
+{
+ "request": {
+ "method": "PUT",
+ "url": "/aai/v11/business/customers/customer/new/service-subscriptions/service-subscription/vFW"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/sdc_find.json b/src/test/resources/mappings/sdc_find.json
new file mode 100644
index 0000000..6aa4dc5
--- /dev/null
+++ b/src/test/resources/mappings/sdc_find.json
@@ -0,0 +1,244 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/sdc/v1/catalog/services/"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": [{
+ "uuid": "446afaf6-79b5-420e-aff8-7551b00bb510",
+ "invariantUUID": "7e4781e8-6c6e-41c5-b889-6a321d5f2490",
+ "name": "FreeRadius-service",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/446afaf6-79b5-420e-aff8-7551b00bb510/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "35911438-4621-439b-a23d-3e07680c724b",
+ "invariantUUID": "ca2f0af5-95e4-4058-b037-5c0de0f80bfa",
+ "name": "vIMS",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/35911438-4621-439b-a23d-3e07680c724b/toscaModel",
+ "category": "E2E Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "8cdc744a-9327-47cc-a9de-67d8d46b816f",
+ "invariantUUID": "d2b9c343-c41a-4f85-ae36-c53cd4b7abcc",
+ "name": "vIMSservice3",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/8cdc744a-9327-47cc-a9de-67d8d46b816f/toscaModel",
+ "category": "VoIP Call Control",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "fcea1d5b-c8de-4355-8fda-64e0d84494e6",
+ "invariantUUID": "b58a118e-eeb9-4f6e-bdca-e292f84d17df",
+ "name": "vFW-service-2VF-based",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/fcea1d5b-c8de-4355-8fda-64e0d84494e6/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "9d356a71-ac7a-40f0-b2b2-b302c8b4ef63",
+ "invariantUUID": "4526a034-e4fc-4ea3-87d0-8b8fca4a93b1",
+ "name": "serviceFRDBS",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/9d356a71-ac7a-40f0-b2b2-b302c8b4ef63/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "b821e80a-40a5-4fab-ac5d-3d49a54c4db3",
+ "invariantUUID": "9765d74e-c8f2-4982-bc90-548c854cbde6",
+ "name": "EricDebeau",
+ "version": "0.1",
+ "toscaModelURL": "/sdc/v1/catalog/services/b821e80a-40a5-4fab-ac5d-3d49a54c4db3/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "NOT_CERTIFIED_CHECKIN",
+ "lastUpdaterUserId": "cs0008",
+ "distributionStatus": "DISTRIBUTION_NOT_APPROVED"
+ },
+ {
+ "uuid": "cc3ec088-227c-49e2-b4c3-237214b88c84",
+ "invariantUUID": "e1685613-136b-4990-a590-d0651a640a68",
+ "name": "vMRFaaS4",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/cc3ec088-227c-49e2-b4c3-237214b88c84/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "10be4044-8217-4397-8b62-85c58688d4ba",
+ "invariantUUID": "a62a335f-a6e3-40dd-8b60-de8410301240",
+ "name": "OPL_FWtest1_service",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/10be4044-8217-4397-8b62-85c58688d4ba/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "3dd3923d-1681-4f5b-99bb-f695ab147004",
+ "invariantUUID": "026e8046-4d3a-41d9-b4c2-6793186fd83d",
+ "name": "vFW",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/3dd3923d-1681-4f5b-99bb-f695ab147004/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "d15de0e3-d8fe-4cc3-a0b1-809ea95cbac8",
+ "invariantUUID": "6046d5f5-b39e-4306-a47e-0762c88d8b93",
+ "name": "1f298e99-082b-4a7f-a579",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/d15de0e3-d8fe-4cc3-a0b1-809ea95cbac8/toscaModel",
+ "category": "Network L1-3",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "f5ab9333-692f-42bc-b5dc-3ed753aa0d14",
+ "invariantUUID": "83a9f465-24d2-4dd3-98b8-328481cf9340",
+ "name": "c55011b0-f26c-43dd-9a62",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/f5ab9333-692f-42bc-b5dc-3ed753aa0d14/toscaModel",
+ "category": "Network L1-3",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "33826edf-fddd-4891-b726-8f16ea0e020c",
+ "invariantUUID": "0475334e-e141-42b3-b3ee-4df049c3cd53",
+ "name": "ccfc0cb4-bdff-4ae2-aa0e",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/33826edf-fddd-4891-b726-8f16ea0e020c/toscaModel",
+ "category": "Network L1-3",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "340bf137-8c6c-4d5b-b185-19364dfc74ed",
+ "invariantUUID": "7e4781e8-6c6e-41c5-b889-6a321d5f2490",
+ "name": "FreeRadius-service",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/340bf137-8c6c-4d5b-b185-19364dfc74ed/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "d0cac11e-332f-47e8-86d8-cb0b82655bb9",
+ "invariantUUID": "ca2f0af5-95e4-4058-b037-5c0de0f80bfa",
+ "name": "vIMS",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/d0cac11e-332f-47e8-86d8-cb0b82655bb9/toscaModel",
+ "category": "E2E Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "e245a0a2-34fc-46c7-912c-bd39305275c1",
+ "invariantUUID": "29db0b2c-a877-45e8-8175-4ac526d87eee",
+ "name": "vMRFaaS",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/e245a0a2-34fc-46c7-912c-bd39305275c1/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "b9e06990-99e2-480f-96ac-c6e50c83f2bb",
+ "invariantUUID": "008943ad-73be-4d57-9105-962c4cb16a71",
+ "name": "vMRFaas2",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/b9e06990-99e2-480f-96ac-c6e50c83f2bb/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "98d95267-5e0f-4531-abf8-f14b90031dc5",
+ "invariantUUID": "709d157b-52fb-4250-976e-7133dff5c347",
+ "name": "NewFreeRadius-service",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/98d95267-5e0f-4531-abf8-f14b90031dc5/toscaModel",
+ "category": "Network L4+",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "d8d2429b-0863-462c-adc7-cd38d77331ed",
+ "invariantUUID": "e1685613-136b-4990-a590-d0651a640a68",
+ "name": "vMRFaaS4",
+ "version": "1.1",
+ "toscaModelURL": "/sdc/v1/catalog/services/d8d2429b-0863-462c-adc7-cd38d77331ed/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "NOT_CERTIFIED_CHECKOUT",
+ "lastUpdaterUserId": "cs0008",
+ "distributionStatus": "DISTRIBUTION_NOT_APPROVED"
+ },
+ {
+ "uuid": "9cfc73ad-795d-42ad-8a4f-54e6b3f33ef9",
+ "invariantUUID": "79f0574e-caf8-4bac-8189-909b2127e9e9",
+ "name": "vMRFaaS3",
+ "version": "1.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/9cfc73ad-795d-42ad-8a4f-54e6b3f33ef9/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "af1ac9db-9d8b-4ca0-964c-58755826b59a",
+ "invariantUUID": "d2b9c343-c41a-4f85-ae36-c53cd4b7abcc",
+ "name": "vIMSservice3",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/af1ac9db-9d8b-4ca0-964c-58755826b59a/toscaModel",
+ "category": "VoIP Call Control",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ },
+ {
+ "uuid": "1e3feeb0-8e36-46c6-862c-236d9c626439",
+ "invariantUUID": "b58a118e-eeb9-4f6e-bdca-e292f84d17df",
+ "name": "vFW-service-2VF-based",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED"
+ }
+ ],
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+}
diff --git a/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json
new file mode 100644
index 0000000..4956be7
--- /dev/null
+++ b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439.json
@@ -0,0 +1,213 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/metadata"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "uuid": "1e3feeb0-8e36-46c6-862c-236d9c626439",
+ "invariantUUID": "b58a118e-eeb9-4f6e-bdca-e292f84d17df",
+ "name": "vFW",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED",
+ "lastUpdaterFullName": "Joni Mitchell",
+ "resources": [{
+ "resourceInstanceName": "vFW-vSINK 0",
+ "resourceName": "vFW-vSINK",
+ "resourceInvariantUUID": "18b90934-aa82-456f-938e-e74a07a426f3",
+ "resourceVersion": "2.0",
+ "resoucreType": "VF",
+ "resourceUUID": "89a6b4c5-3973-4c19-b651-fae3713ca8d5",
+ "artifacts": [{
+ "artifactName": "vf-license-model.xml",
+ "artifactType": "VF_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/f6fa3f94-f5cd-4233-a7b2-b5e8dc2e1ec6",
+ "artifactDescription": "VF license file",
+ "artifactChecksum": "NDQ2NzIxNzgyMjZhNTc1NDNlMWU0ODI1ZmIyNjc3Zjg=",
+ "artifactUUID": "f6fa3f94-f5cd-4233-a7b2-b5e8dc2e1ec6",
+ "artifactVersion": "1",
+ "artifactLabel": "vflicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vfwvsink0_modules.json",
+ "artifactType": "VF_MODULES_METADATA",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/d0aaecf9-6ffb-4b4b-81fd-c59c1e8e6fb6",
+ "artifactDescription": "Auto-generated VF Modules information artifact",
+ "artifactChecksum": "ZGIyOWY3YzE0MTM2MjlhMjY1ZjkzNDg3YjE2ZmQxY2Y=",
+ "artifactUUID": "d0aaecf9-6ffb-4b4b-81fd-c59c1e8e6fb6",
+ "artifactVersion": "1",
+ "artifactLabel": "vfModulesMetadata",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vfw.yaml",
+ "artifactType": "HEAT",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/c94e8eec-b1a7-431c-ab6f-2fda5f0ee920",
+ "artifactDescription": "created from csar",
+ "artifactTimeout": 60,
+ "artifactChecksum": "YTY0MDg5ODUwZDE4YzQyYWI0NjE5Y2NjYmM3ZDg5ZGE=",
+ "artifactUUID": "c94e8eec-b1a7-431c-ab6f-2fda5f0ee920",
+ "artifactVersion": "4",
+ "artifactLabel": "heat1",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vendor-license-model.xml",
+ "artifactType": "VENDOR_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/423d2c66-6c3a-4257-9342-7b57ebf9dd54",
+ "artifactDescription": " Vendor license file",
+ "artifactChecksum": "YTNhYTc3ZGE4ZWViMmYzOThkOGQ3ZTVjZGNmNmU0ZmQ=",
+ "artifactUUID": "423d2c66-6c3a-4257-9342-7b57ebf9dd54",
+ "artifactVersion": "1",
+ "artifactLabel": "vendorlicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vfw.env",
+ "artifactType": "HEAT_ENV",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/a1a58cc9-8225-4b6f-b81a-02fa3c7fb6ec",
+ "artifactDescription": "Auto-generated HEAT Environment deployment artifact",
+ "artifactChecksum": "ZmVkM2MwODhlZjcwNWY5MDk5ZGEyMjI5ZTAyYWRjNjY=",
+ "artifactUUID": "a1a58cc9-8225-4b6f-b81a-02fa3c7fb6ec",
+ "artifactVersion": "2",
+ "generatedFromUUID": "32591489-33c9-4461-a47c-7c463250788d.heat1",
+ "artifactLabel": "heat1env",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ },
+ {
+ "resourceInstanceName": "vPkG 0",
+ "resourceName": "vPkG",
+ "resourceInvariantUUID": "8d8a20c0-746c-4d5e-a1a2-fa49fa5786ad",
+ "resourceVersion": "2.0",
+ "resoucreType": "VF",
+ "resourceUUID": "31961e27-2a2c-4beb-87c9-bfe0067088f5",
+ "artifacts": [{
+ "artifactName": "vf-license-model.xml",
+ "artifactType": "VF_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/7af6cc3b-2ba3-4164-9d7d-65b3b46a71f4",
+ "artifactDescription": "VF license file",
+ "artifactChecksum": "MWM5NDlmNjdhZTdmZTA5MzIzY2RhYjcxZmFkYzQyZDM=",
+ "artifactUUID": "7af6cc3b-2ba3-4164-9d7d-65b3b46a71f4",
+ "artifactVersion": "1",
+ "artifactLabel": "vflicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vpkg0_modules.json",
+ "artifactType": "VF_MODULES_METADATA",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/37b16173-bd54-447f-a5a2-1a5e24db8afb",
+ "artifactDescription": "Auto-generated VF Modules information artifact",
+ "artifactChecksum": "ZDA3MWQ3MTE3MTA1MzNkY2M1ODQ4YTUxN2YwMDk0MmM=",
+ "artifactUUID": "37b16173-bd54-447f-a5a2-1a5e24db8afb",
+ "artifactVersion": "1",
+ "artifactLabel": "vfModulesMetadata",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vpkg.yaml",
+ "artifactType": "HEAT",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/43184998-c107-40a7-92f6-00ba74de8539",
+ "artifactDescription": "created from csar",
+ "artifactTimeout": 60,
+ "artifactChecksum": "NDZhY2U0YTExZjllNTFmZjc4ZTE4YzU2Zjk1ZDc2MWI=",
+ "artifactUUID": "43184998-c107-40a7-92f6-00ba74de8539",
+ "artifactVersion": "4",
+ "artifactLabel": "heat1",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vendor-license-model.xml",
+ "artifactType": "VENDOR_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/6cd5f968-20aa-4b86-9a50-97db5e4ca806",
+ "artifactDescription": " Vendor license file",
+ "artifactChecksum": "YTNhYTc3ZGE4ZWViMmYzOThkOGQ3ZTVjZGNmNmU0ZmQ=",
+ "artifactUUID": "6cd5f968-20aa-4b86-9a50-97db5e4ca806",
+ "artifactVersion": "1",
+ "artifactLabel": "vendorlicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vpkg.env",
+ "artifactType": "HEAT_ENV",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/60944038-d382-4aa6-b387-7b87c9c9df19",
+ "artifactDescription": "Auto-generated HEAT Environment deployment artifact",
+ "artifactChecksum": "OGU0OGFlZTFiZDdhYmQ0MmM0MjAyY2U5YjljYWViYTA=",
+ "artifactUUID": "60944038-d382-4aa6-b387-7b87c9c9df19",
+ "artifactVersion": "2",
+ "generatedFromUUID": "0d3918df-ea14-4fc3-a5c9-34032eaae573.heat1",
+ "artifactLabel": "heat1env",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ }
+ ],
+ "artifacts": [{
+ "artifactName": "AAI-vFW-service-2VF-based-service-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/2e6cd967-93c2-4f53-82bd-c56ab98e8df7",
+ "artifactDescription": "AAI Service Model",
+ "artifactChecksum": "ZTY5ZTJmYTY4YzE2NGUxMTQxNWNkN2QzMmI4MWIzNDU=",
+ "artifactUUID": "2e6cd967-93c2-4f53-82bd-c56ab98e8df7",
+ "artifactVersion": "1",
+ "artifactLabel": "aaiservice1603481860",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-Vpkg..base_vpkg..module-0-resource-2.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/ad600a09-edde-4356-bb0a-9e638a671d06",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "MzQyMjczOGVmYzM1OWQ1NmFhZjBhOWUxM2JjMmYxZTQ=",
+ "artifactUUID": "ad600a09-edde-4356-bb0a-9e638a671d06",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource529289386",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-vFW-vSINK-resource-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/413a631e-69c4-453b-ab68-fac09b390259",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "ZWRmMzQzYzc0MThlYjQ1YjY2ZTFkYzJmMjAyNzQ1YWU=",
+ "artifactUUID": "413a631e-69c4-453b-ab68-fac09b390259",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource1461475898",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-vPkG-resource-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/aee30754-eec4-4820-ae3a-790b80b76e81",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "OGQ4ZTdhYjkyZDRkYmFiZTBhNWU4MDc4YTM2YjY1NmI=",
+ "artifactUUID": "aee30754-eec4-4820-ae3a-790b80b76e81",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource936479495",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-VfwVsink..base_vfw..module-0-resource-2.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/ac9a3bbf-a052-4176-abff-fe2d2741194a",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "OWIzNjVhNmI2ZWYyZThlMjk1NjA2MDFhZTU3MGQ0ZDU=",
+ "artifactUUID": "ac9a3bbf-a052-4176-abff-fe2d2741194a",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource1106409880",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json
new file mode 100644
index 0000000..ebf72bb
--- /dev/null
+++ b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_tosca.json
@@ -0,0 +1,10 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/toscaModel"
+ },
+ "response": {
+ "status": 200,
+ "bodyFileName": "response"
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json
new file mode 100644
index 0000000..55edc99
--- /dev/null
+++ b/src/test/resources/mappings/sdc_get_1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca.json
@@ -0,0 +1,213 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439_withoutTosca/metadata"
+ },
+ "response": {
+ "status": 200,
+ "jsonBody": {
+ "uuid": "1e3feeb0-8e36-46c6-862c-236d9c626439",
+ "invariantUUID": "b58a118e-eeb9-4f6e-bdca-e292f84d17df",
+ "name": "vFW",
+ "version": "2.0",
+ "toscaModelURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439toto/toscaModel",
+ "category": "Network Service",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "jm0007",
+ "distributionStatus": "DISTRIBUTED",
+ "lastUpdaterFullName": "Joni Mitchell",
+ "resources": [{
+ "resourceInstanceName": "vFW-vSINK 0",
+ "resourceName": "vFW-vSINK",
+ "resourceInvariantUUID": "18b90934-aa82-456f-938e-e74a07a426f3",
+ "resourceVersion": "2.0",
+ "resoucreType": "VF",
+ "resourceUUID": "89a6b4c5-3973-4c19-b651-fae3713ca8d5",
+ "artifacts": [{
+ "artifactName": "vf-license-model.xml",
+ "artifactType": "VF_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/f6fa3f94-f5cd-4233-a7b2-b5e8dc2e1ec6",
+ "artifactDescription": "VF license file",
+ "artifactChecksum": "NDQ2NzIxNzgyMjZhNTc1NDNlMWU0ODI1ZmIyNjc3Zjg=",
+ "artifactUUID": "f6fa3f94-f5cd-4233-a7b2-b5e8dc2e1ec6",
+ "artifactVersion": "1",
+ "artifactLabel": "vflicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vfwvsink0_modules.json",
+ "artifactType": "VF_MODULES_METADATA",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/d0aaecf9-6ffb-4b4b-81fd-c59c1e8e6fb6",
+ "artifactDescription": "Auto-generated VF Modules information artifact",
+ "artifactChecksum": "ZGIyOWY3YzE0MTM2MjlhMjY1ZjkzNDg3YjE2ZmQxY2Y=",
+ "artifactUUID": "d0aaecf9-6ffb-4b4b-81fd-c59c1e8e6fb6",
+ "artifactVersion": "1",
+ "artifactLabel": "vfModulesMetadata",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vfw.yaml",
+ "artifactType": "HEAT",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/c94e8eec-b1a7-431c-ab6f-2fda5f0ee920",
+ "artifactDescription": "created from csar",
+ "artifactTimeout": 60,
+ "artifactChecksum": "YTY0MDg5ODUwZDE4YzQyYWI0NjE5Y2NjYmM3ZDg5ZGE=",
+ "artifactUUID": "c94e8eec-b1a7-431c-ab6f-2fda5f0ee920",
+ "artifactVersion": "4",
+ "artifactLabel": "heat1",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vendor-license-model.xml",
+ "artifactType": "VENDOR_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/423d2c66-6c3a-4257-9342-7b57ebf9dd54",
+ "artifactDescription": " Vendor license file",
+ "artifactChecksum": "YTNhYTc3ZGE4ZWViMmYzOThkOGQ3ZTVjZGNmNmU0ZmQ=",
+ "artifactUUID": "423d2c66-6c3a-4257-9342-7b57ebf9dd54",
+ "artifactVersion": "1",
+ "artifactLabel": "vendorlicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vfw.env",
+ "artifactType": "HEAT_ENV",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vfwvsink0/artifacts/a1a58cc9-8225-4b6f-b81a-02fa3c7fb6ec",
+ "artifactDescription": "Auto-generated HEAT Environment deployment artifact",
+ "artifactChecksum": "ZmVkM2MwODhlZjcwNWY5MDk5ZGEyMjI5ZTAyYWRjNjY=",
+ "artifactUUID": "a1a58cc9-8225-4b6f-b81a-02fa3c7fb6ec",
+ "artifactVersion": "2",
+ "generatedFromUUID": "32591489-33c9-4461-a47c-7c463250788d.heat1",
+ "artifactLabel": "heat1env",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ },
+ {
+ "resourceInstanceName": "vPkG 0",
+ "resourceName": "vPkG",
+ "resourceInvariantUUID": "8d8a20c0-746c-4d5e-a1a2-fa49fa5786ad",
+ "resourceVersion": "2.0",
+ "resoucreType": "VF",
+ "resourceUUID": "31961e27-2a2c-4beb-87c9-bfe0067088f5",
+ "artifacts": [{
+ "artifactName": "vf-license-model.xml",
+ "artifactType": "VF_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/7af6cc3b-2ba3-4164-9d7d-65b3b46a71f4",
+ "artifactDescription": "VF license file",
+ "artifactChecksum": "MWM5NDlmNjdhZTdmZTA5MzIzY2RhYjcxZmFkYzQyZDM=",
+ "artifactUUID": "7af6cc3b-2ba3-4164-9d7d-65b3b46a71f4",
+ "artifactVersion": "1",
+ "artifactLabel": "vflicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vpkg0_modules.json",
+ "artifactType": "VF_MODULES_METADATA",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/37b16173-bd54-447f-a5a2-1a5e24db8afb",
+ "artifactDescription": "Auto-generated VF Modules information artifact",
+ "artifactChecksum": "ZDA3MWQ3MTE3MTA1MzNkY2M1ODQ4YTUxN2YwMDk0MmM=",
+ "artifactUUID": "37b16173-bd54-447f-a5a2-1a5e24db8afb",
+ "artifactVersion": "1",
+ "artifactLabel": "vfModulesMetadata",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vpkg.yaml",
+ "artifactType": "HEAT",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/43184998-c107-40a7-92f6-00ba74de8539",
+ "artifactDescription": "created from csar",
+ "artifactTimeout": 60,
+ "artifactChecksum": "NDZhY2U0YTExZjllNTFmZjc4ZTE4YzU2Zjk1ZDc2MWI=",
+ "artifactUUID": "43184998-c107-40a7-92f6-00ba74de8539",
+ "artifactVersion": "4",
+ "artifactLabel": "heat1",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "vendor-license-model.xml",
+ "artifactType": "VENDOR_LICENSE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/6cd5f968-20aa-4b86-9a50-97db5e4ca806",
+ "artifactDescription": " Vendor license file",
+ "artifactChecksum": "YTNhYTc3ZGE4ZWViMmYzOThkOGQ3ZTVjZGNmNmU0ZmQ=",
+ "artifactUUID": "6cd5f968-20aa-4b86-9a50-97db5e4ca806",
+ "artifactVersion": "1",
+ "artifactLabel": "vendorlicense",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "base_vpkg.env",
+ "artifactType": "HEAT_ENV",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/resourceInstances/vpkg0/artifacts/60944038-d382-4aa6-b387-7b87c9c9df19",
+ "artifactDescription": "Auto-generated HEAT Environment deployment artifact",
+ "artifactChecksum": "OGU0OGFlZTFiZDdhYmQ0MmM0MjAyY2U5YjljYWViYTA=",
+ "artifactUUID": "60944038-d382-4aa6-b387-7b87c9c9df19",
+ "artifactVersion": "2",
+ "generatedFromUUID": "0d3918df-ea14-4fc3-a5c9-34032eaae573.heat1",
+ "artifactLabel": "heat1env",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ }
+ ],
+ "artifacts": [{
+ "artifactName": "AAI-vFW-service-2VF-based-service-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/2e6cd967-93c2-4f53-82bd-c56ab98e8df7",
+ "artifactDescription": "AAI Service Model",
+ "artifactChecksum": "ZTY5ZTJmYTY4YzE2NGUxMTQxNWNkN2QzMmI4MWIzNDU=",
+ "artifactUUID": "2e6cd967-93c2-4f53-82bd-c56ab98e8df7",
+ "artifactVersion": "1",
+ "artifactLabel": "aaiservice1603481860",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-Vpkg..base_vpkg..module-0-resource-2.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/ad600a09-edde-4356-bb0a-9e638a671d06",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "MzQyMjczOGVmYzM1OWQ1NmFhZjBhOWUxM2JjMmYxZTQ=",
+ "artifactUUID": "ad600a09-edde-4356-bb0a-9e638a671d06",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource529289386",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-vFW-vSINK-resource-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/413a631e-69c4-453b-ab68-fac09b390259",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "ZWRmMzQzYzc0MThlYjQ1YjY2ZTFkYzJmMjAyNzQ1YWU=",
+ "artifactUUID": "413a631e-69c4-453b-ab68-fac09b390259",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource1461475898",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-vPkG-resource-2.0.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/aee30754-eec4-4820-ae3a-790b80b76e81",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "OGQ4ZTdhYjkyZDRkYmFiZTBhNWU4MDc4YTM2YjY1NmI=",
+ "artifactUUID": "aee30754-eec4-4820-ae3a-790b80b76e81",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource936479495",
+ "artifactGroupType": "DEPLOYMENT"
+ },
+ {
+ "artifactName": "AAI-VfwVsink..base_vfw..module-0-resource-2.xml",
+ "artifactType": "MODEL_INVENTORY_PROFILE",
+ "artifactURL": "/sdc/v1/catalog/services/1e3feeb0-8e36-46c6-862c-236d9c626439/artifacts/ac9a3bbf-a052-4176-abff-fe2d2741194a",
+ "artifactDescription": "AAI Resource Model",
+ "artifactChecksum": "OWIzNjVhNmI2ZWYyZThlMjk1NjA2MDFhZTU3MGQ0ZDU=",
+ "artifactUUID": "ac9a3bbf-a052-4176-abff-fe2d2741194a",
+ "artifactVersion": "1",
+ "artifactLabel": "aairesource1106409880",
+ "artifactGroupType": "DEPLOYMENT"
+ }
+ ]
+ },
+ "headers": {
+ "Content-Type": "application/json"
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/so_delete_service_instance.json b/src/test/resources/mappings/so_delete_service_instance.json
new file mode 100644
index 0000000..a2e854e
--- /dev/null
+++ b/src/test/resources/mappings/so_delete_service_instance.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "DELETE",
+ "url": "/ecomp/mso/infra/serviceInstances/e4688e5f-61a0-4f8b-ae02-a2fbde623bcb"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "jsonBody": {
+ "requestReference": {
+ "instanceId": "instanceId",
+ "requestId": "requestId"
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/so_get_.json b/src/test/resources/mappings/so_get_.json
new file mode 100644
index 0000000..5d4148f
--- /dev/null
+++ b/src/test/resources/mappings/so_get_.json
@@ -0,0 +1,20 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/ecomp/mso/infra/orchestrationRequests/v4/requestId"
+ },
+ "response": {
+ "status": 200,
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "jsonBody": {
+ "request": {
+ "requestStatus": {
+ "requestState": "COMPLETE",
+ "percentProgress": 100
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/resources/mappings/so_post_create_service_instance.json b/src/test/resources/mappings/so_post_create_service_instance.json
new file mode 100644
index 0000000..4b61b2c
--- /dev/null
+++ b/src/test/resources/mappings/so_post_create_service_instance.json
@@ -0,0 +1,18 @@
+{
+ "request": {
+ "method": "POST",
+ "url": "/ecomp/mso/infra/serviceInstance/v4"
+ },
+ "response": {
+ "status": 201,
+ "headers": {
+ "Content-Type": "application/json"
+ },
+ "jsonBody": {
+ "requestReference": {
+ "instanceId": "instanceId",
+ "requestId": "requestId"
+ }
+ }
+ }
+} \ No newline at end of file