From d7c2eb653bb80aa7e8f0b0ec835da512af53db55 Mon Sep 17 00:00:00 2001 From: MD IRSHAD SHEIKH Date: Thu, 13 Aug 2020 13:41:42 +0530 Subject: Developer guide for bpmn flow understanding Issue-ID: SO-3115 Signed-off-by: MD IRSHAD SHEIKH Change-Id: I4f194bdc0c62005db94d0e8e14ab0bd98fa28d00 --- .../BPMN-INFRA_Workflow_Understanding.rst | 658 +++++++++++++++++++++ docs/developer_info/developer_information.rst | 1 + docs/images/CreateCommunicationService.png | Bin 0 -> 121447 bytes 3 files changed, 659 insertions(+) create mode 100644 docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst create mode 100644 docs/images/CreateCommunicationService.png diff --git a/docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst b/docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst new file mode 100644 index 0000000000..b1ef356c35 --- /dev/null +++ b/docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst @@ -0,0 +1,658 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright 2017 Huawei Technologies Co., Ltd. + +CODE FLOWS OF BPMN-INFRA +======================== + +API Handler is a SO Component. Every Rest API will first reach to the API Handler. Curl command which is mentioned below will directly hit to the E2EServiceInstances.java file of the API Handler component. + +API HANDLER ( E2EServiceInstances.java ) +---------------------------------------- + +curl -v -H "Content-Type: application/json" -X POST --data @request_body_file_name.json -u mso_admin:password1$ http://localhost:8080/onap/so/infra/e2eServiceInstances/v3 + +.. code-block:: bash + + Request Body: + + { + "service":{ + "name":"SliceService", + "description":"SliceService", + "serviceInvariantUuid":"dfcd7471-16c7-444e-8268-d4c50d90593a", + "serviceUuid":"dfcd7471-16c7-444e-8268-d4c50d90593a", + "globalSubscriberId":"test_custormer", + "serviceType":"embb", + "parameters":{ + "locationConstraints":[ + ], + "resources":[ + { + "resourceIndex":"1", + "resourceName":"allottedResource", + "resourceInvariantUuid":"eeefcd86-7b5b-41ae-9516-08acc5d59d92", + "resourceUuid":"265da937-76c7-4152-98e3-5f0d0a844b7f", + "resourceCustomizationUuid":"a4eda1d9-1af4-424b-997f-12c57b74c67a", + "parameters":{ + "locationConstraints":[ + ], + "resources":[ + ], + "requestInputs":{ + } + } + } + ], + "requestInputs":{ + "sST": "embb", + "sNSSAI": "1-10101", + "uEMobilityLevel": "stationary", + "areaTrafficCapDL": 123, + "maxNumberofUEs": 1000, + "expDataRateUL": 2000, + "plmnIdList": "39-00|39-01", + "areaTrafficCapUL": 456, + "latency": 300, + "expDataRateDL": 400, + "coverageAreaTAList": 101001, + "activityFactor": 99, + "resourceSharingLevel": "shared", + "nstar0_allottedresource0_providing_service_uuid": "4e8d930b-7483-4b9b-8c82-4708638ade4a", + "nstar0_allottedresource0_providing_service_invariant_uuid": "1899e5c1-df4e-43a8-a889-48c157dad7bc" + } + } + } + +.. code-block:: bash + + Response body: + + { + "service": { + "serviceId": "ebe2d37f-f65b-43d8-8906-f81811ed8f22", + "operationId": "ed9b4c84-17db-4874-8896-25324a0401fe" + } + } + + +Code flows: +----------- +1. It reaches to the E2EServiceInstances.java file of API-Handeler infra project and Input json is mapped to the createE2EServiceInstance method + +2. A unique request id is generated corresponding to every request and checked if request Id already exists in requestdb + InfraActiveReqest table + + a. http://request-db-adapter:8083/infraActiveRequests/requestID (GET), which will return a 404 if not exists + b. createInstance is set to the action variable + +3. Running local validations on input json. + +4. Gets the orchestration url from the recipe table + + a. Checks whether the service already exists in catalogdb http://catalog-db-adapter:8082/service/{modelNameVersionId} + (GET) + + b. Checks the service recipe table with the modelNameVersionId and the action to be perfomed http://catalog-db- + adapter:8082/serviceRecipe/search/findFirstByServiceModelUUIDAndAction?serviceModelUUID= + {modelNameVersionId}&action=createInstance . Returns a 404 if no recipe exists with the corresponding id. + + c. As recipe corresponding to this doesnt exist, we try to get with a default value. This flow comes under default flow + so the defaultvalue is UUI_DEFAULT. First we get service with this value + http://catalog-db-adapter:8082/service/search/findFirstByModelNameOrderByModelVersionDesc?modelName=UUI_DEFAULT (GET) . + It returns a service with modelUUID as dfcd7471-16c7-444e-8268-d4c50d90593a, and further can be used to get the recipe + . + + d. http://so-catalog-db-adapter.onap:8082/serviceRecipe/search/findFirstByServiceModelUUIDAndAction? + serviceModelUUID=dfcd7471-16c7-444e-8268-d4c50d90593a&action=createInstance gives a recipe which has a parameter + "orchestrationUri" as "/mso/async/services/CreateCustomE2EServiceInstance" + + + +BPMN-INFRA +---------- + +Hits CreateCustomE2EServiceInstances + +Address: http://bpmn-infra:8081/mso/async/services/CreateCustomE2EServiceInstance + +Payload will be reaching to bpmn in the form of: + +.. code-block:: bash + + { + "variables": { + "bpmnRequest": { + "value": { + "requestDetails": { + "modelInfo": { + "modelInvariantId": "699dd37d-c82f-4bd5-adec-856900fc2796", + "modelType": "service", + "modelNameVersionId": "0692e0c9-8913-41ca-893a-58626f4afff2", + "modelName": "voLTE", + "modelVersion": "1.0", + "modelVersionId": "0692e0c9-8913-41ca-893a-58626f4afff2", + "modelUuid": "0692e0c9-8913-41ca-893a-58626f4afff2", + "modelInvariantUuid": "699dd37d-c82f-4bd5-adec-856900fc2796" + }, + "requestInfo": { + "source": "UUI", + "instanceName": "SliceService", + "suppressRollback": true + }, + "subscriberInfo": { + "globalSubscriberId": "test_custormer" + }, + "requestParameters": { + "subscriptionServiceType": "MOG", + "userParams": [ + { + "ServiceInstanceName": "SliceService", + "UUIRequest": { + "service": { + "name": "SliceService", + "description": "SliceService", + "serviceInvariantUuid": "699dd37d-c82f-4bd5-adec-856900fc2796", + "serviceUuid": "0692e0c9-8913-41ca-893a-58626f4afff2", + "globalSubscriberId": "test_custormer", + "serviceType": "embb", + "parameters": { + "locationConstraints": [], + "resources": [ + { + "resourceIndex": "1", + "resourceName": "allottedResource", + "resourceInvariantUuid": "eeefcd86-7b5b-41ae-9516-08acc5d59d92", + "resourceUuid": "265da937-76c7-4152-98e3-5f0d0a844b7f", + "resourceCustomizationUuid": "a4eda1d9-1af4-424b-997f-12c57b74c67a", + "parameters": { + "locationConstraints": [], + "resources": [], + "requestInputs": {} + } + } + ], + "requestInputs": { + "sST": "embb", + "sNSSAI": "1-10101", + "uEMobilityLevel": "stationary", + "areaTrafficCapDL": 123, + "maxNumberofUEs": 1000, + "expDataRateUL": 2000, + "plmnIdList": "39-00|39-01", + "areaTrafficCapUL": 456, + "latency": 300, + "expDataRateDL": 400, + "coverageAreaTAList": 101001, + "activityFactor": 99, + "resourceSharingLevel": "shared", + "nstar0_allottedresource0_providing_service_uuid": "4e8d930b-7483-4b9b-8c82-4708638ade4a", + "nstar0_allottedresource0_providing_service_invariant_uuid": "1899e5c1-df4e-43a8-a889-48c157dad7bc" + } + } + } + } + } + ], + "aLaCarte": true, + "usePreload": true + } + }, + "serviceInstanceId": null, + "vnfInstanceId": null, + "pnfName": null, + "networkInstanceId": null, + "volumeGroupInstanceId": null, + "vfModuleInstanceId": null, + "configurationId": null, + "instanceGroupId": null + }, + "type": "String" + }, + "requestId": { + "value": "6fa42cd2-4f49-4e2c-92fb-fae133277e9e", + "type": "String" + }, + "mso-request-id": { + "value": "6fa42cd2-4f49-4e2c-92fb-fae133277e9e", + "type": "String" + }, + "isBaseVfModule": { + "value": false, + "type": "Boolean" + }, + "recipeTimeout": { + "value": 180, + "type": "Integer" + }, + "requestAction": { + "value": "createInstance", + "type": "String" + }, + "serviceInstanceId": { + "value": "", + "type": "String" + }, + "pnfCorrelationId": { + "value": "", + "type": "String" + }, + "vnfId": { + "value": "", + "type": "String" + }, + "vfModuleId": { + "value": "", + "type": "String" + }, + "volumeGroupId": { + "value": "", + "type": "String" + }, + "networkId": { + "value": "", + "type": "String" + }, + "configurationId": { + "value": "", + "type": "String" + }, + "serviceType": { + "value": "embb", + "type": "String" + }, + "vnfType": { + "value": "", + "type": "String" + }, + "vfModuleType": { + "value": "", + "type": "String" + }, + "networkType": { + "value": "", + "type": "String" + }, + "recipeParams": { + "value": null, + "type": "String" + }, + "host": { + "value": null, + "type": "String" + }, + "operationType": { + "value": "", + "type": "String" + }, + "apiVersion": { + "value": "v3", + "type": "String" + }, + "aLaCarte": { + "value": false, + "type": "Boolean" + }, + "requestUri": { + "value": "", + "type": "String" + }, + "instanceGroupId": { + "value": "", + "type": "String" + }, + "generateIdsOnly": { + "value": false, + "type": "Boolean" + } + } + } + +Based on the serviceUuid which is mentioned in the request body it will call the the CreateCommunicationService.bpmn file and This CreateCommunicationService.bpmn is taken as a example to this workflow Understanding which then call the subprocess of this flow and so on. + +.. image:: ../images/CreateCommunicationService.png + +1. CreateCommunicationService -> preProcessRequest() + + a. Get Input Request will be logged as shown above + b. Get Request ID + c. Here ServiceInstanceId is null so serviceInstanceId is generated randomly. + d. Input productFamilyId is null + e. Now it will get the user input parameter from the request json. + + +2. CreateCommunicationService--> prepareInitOperationStatus + + a. Generate a new operation based on serviceInstanceId and operationId + b. call to prepareUpdateOperationStatus() method + +3. RequestDBUtil--> prepareUpdateOperationStatus() + + a. This method will be called to update the operation status in the requestDB + b. Exit prepareUpdateOperationStatus() + c. Exit prepareInitOperationStatus() + +4. Based on the bpmn structure DecomposeService class is called + + a. This class takes input as + + - msoRequestId + - isDebugLogEnabled + - serviceInstanceId + - serviceModelInfo + - requestParameters + + b. Sent GET request to catalogdb to fetch the data based on serviceModelInvariantId and modelVersion + http://so-catalog-db-adapter.onap:8082/ecomp/mso/catalog/v2/{serviceModelUuid} + + c. Response from catalogdb will be looking like: + +.. code-block:: bash + + { + "serviceResources": { + "modelInfo": { + "modelName": "CST", + "modelUuid": "bfc2775b-64ad-41e5-95fe-d3bc57df6c73", + "modelInvariantUuid": "d4df55ca-c985-46c9-8088-f952181f553e", + "modelVersion": "1.0" + }, + "serviceType": "embb", + "serviceRole": "", + "environmentContext": "General_Revenue-Bearing", + "resourceOrder": "ServiceProfile Service Proxy", + "workloadContext": "Production", + "serviceVnfs": [], + "serviceNetworks": [], + "serviceInfo": { + "id": 11, + "serviceInput": [ + { + "default": true, + "name": "skip_post_instantiation_configuration", + "type": "boolean", + "required": false + }, + { + "default": "", + "name": "useInterval", + "type": "string", + "required": false + }, + { + "default": "SO-REF-DATA", + "name": "controller_actor", + "type": "string", + "required": false + }, + { + "default": "", + "name": "maxNumberofUEs", + "type": "integer", + "required": false + }, + { + "default": "", + "name": "latency", + "type": "integer", + "required": false + }, + { + "default": "", + "name": "cds_model_version", + "type": "string", + "required": false + }, + { + "default": "", + "name": "uEMobilityLevel", + "type": "string", + "required": false + }, + { + "default": "", + "name": "cds_model_name", + "type": "string", + "required": false + }, + { + "default": "", + "name": "expDataRateUL", + "type": "integer", + "required": false + }, + { + "default": "", + "name": "expDataRateDL", + "type": "integer", + "required": false + }, + { + "default": "", + "name": "coverageAreaList", + "type": "string", + "required": false + }, + { + "default": "", + "name": "resourceSharingLevel", + "type": "string", + "required": false + } + ], + "serviceProperties": [ + { + "default": true, + "name": "skip_post_instantiation_configuration", + "type": "boolean", + "constraints": [ + { + "valid_values": [ + true, + false + ] + } + ] + }, + { + "default": "SO-REF-DATA", + "name": "controller_actor", + "type": "string", + "constraints": [ + { + "valid_values": [ + "SO-REF-DATA", + "CDS", + "SDNC", + "APPC" + ] + } + ] + }, + { + "name": "maxNumberofUEs", + "type": "integer", + "required": false + }, + { + "name": "latency", + "type": "integer", + "required": false + }, + { + "name": "expDataRateUL", + "type": "integer", + "required": false + }, + { + "name": "sNSSAI", + "type": "string", + "required": false + }, + { + "name": "useInterval", + "type": "string", + "required": false + }, + { + "default": "39-00", + "name": "plmnIdList", + "type": "string", + "required": false + }, + { + "name": "cds_model_version", + "type": "string" + }, + { + "name": "uEMobilityLevel", + "type": "string", + "required": false + }, + { + "name": "cds_model_name", + "type": "string" + }, + { + "name": "expDataRateDL", + "type": "integer", + "required": false + }, + { + "name": "coverageAreaList", + "type": "string", + "required": false + }, + { + "name": "resourceSharingLevel", + "type": "string", + "required": false + } + ], + "serviceArtifact": [] + }, + "serviceProxy": [ + { + "modelInfo": { + "modelName": "ServiceProfile Service Proxy", + "modelUuid": "ed00301c-51ec-46a4-b766-e3af50c210d2", + "modelInvariantUuid": "071d426c-3f9b-44a9-9757-422043d80fc1", + "modelVersion": "1.0", + "modelCustomizationUuid": "81c5a468-37d3-4d8d-95f5-e72b0933d3d4", + "modelInstanceName": "serviceprofile_proxy 0" + }, + "toscaNodeType": "org.openecomp.nodes.serviceprofile_proxy", + "description": "A Proxy for Service ServiceProfile", + "sourceModelUuid": "94553b32-e075-4cb0-b309-dd318ebbf670" + } + ], + "serviceAllottedResources": [] + } + } + +5. CreateCommunicationService--> prepareDoComposeE2E() + + a. To decompose the service based on serviceModelUuid + +6. CreateCommunicationService--> parseCSParamsFromReq() + + a. To parse the CreateCommunication parameter Request from the Request json + +7. Now sending PUT request to AAI based on globalSubscriberId and serviceType + + a. https://aai.onap:8443/aai/v19/business/customers/customer/{globalSubscriberId}/service-subscriptions/service- + subscription/{seviceType}/service-instances/service-instance/{serviceInstanceId} + + b. Customer can be got by GET request with + https://aai.onap:8443/aai/v19/business/customers/customer/{globalSubscriberId} + + c. Service-Subscription can be got by GET request with + https://aai.onap:8443/aai/v19/business/customers/customer/{globalSubscriberId}/service-subscriptions/service- + subscription/{seviceType} + + d. Request body for PUT request to the AAI from bpmn: + +{ + "service-instance-name": "SliceService", + "service-role": "communication-service", + "environment-context": "01-70CAA6B", + "created-at": "2020-06-23 05:02:56", + "model-invariant-id": "d4df55ca-c985-46c9-8088-f952181f553e", + "model-version-id": "bfc2775b-64ad-41e5-95fe-d3bc57df6c73", + "orchestration-status": "processing", + "input-parameters": "{ \"service\":{ \"name\":\"SliceService\", \"description\":\"SliceService\", \"serviceInvariantUuid\":\"d4df55ca-c985-46c9-8088-f952181f553e\", \"serviceUuid\":\"bfc2775b-64ad-41e5-95fe-d3bc57df6c73\", \"globalSubscriberId\":\"5GCustomer\", \"serviceType\":\"5G\", \"parameters\":{ \"locationConstraints\":[ ], \"resources\":[ { \"resourceIndex\":\"1\", \"resourceName\":\"allottedResource\", \"resourceInvariantUuid\":\"eeefcd86-7b5b-41ae-9516-08acc5d59d92\", \"resourceUuid\":\"265da937-76c7-4152-98e3-5f0d0a844b7f\", \"resourceCustomizationUuid\":\"a4eda1d9-1af4-424b-997f-12c57b74c67a\", \"parameters\":{ \"locationConstraints\":[ ], \"resources\":[ ], \"requestInputs\":{ } } } ], \"requestInputs\":{\t\t\t \"sST\": \"embb\", \"sNSSAI\": \"1-10101\", \"uEMobilityLevel\": \"stationary\", \"areaTrafficCapDL\": 123, \"maxNumberofUEs\": 1000, \"expDataRateUL\": 2000, \"plmnIdList\": \"39-00|39-01\", \"areaTrafficCapUL\": 456, \"latency\": 300, \"expDataRateDL\": 400, \"coverageAreaTAList\": 101001, \"activityFactor\": 99, \"resourceSharingLevel\": \"shared\", \"nstar0_allottedresource0_providing_service_uuid\": \"4e8d930b-7483-4b9b-8c82-4708638ade4a\", \"nstar0_allottedresource0_providing_service_invariant_uuid\": \"1899e5c1-df4e-43a8-a889-48c157dad7bc\" } } }}" + +} + +Response: Response is returned with an empty entity + + + e. Sending PUT request to the AAI for communication service profile + +https://aai.onap:8443/aai/v19/business/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/8a95e3ac-32cd-4ffb-b9e3-5366b393a7a2/communication-service-profiles/communication-service-profile/202a5e9a-d1d7-4afd-922f-3e7a709c780c + +payload: + +{"profile-id":"202a5e9a-d1d7-4afd-922f-3e7a709c780c","max-number-of-UEs":1000,"latency":300,"exp-data-rate-UL":2000,"exp-data-rate-DL":400,"ue-mobility-level":"stationary","resource-sharing-level":"shared"} + +Response: Response is returned with an empty entity + +8. CreateCommunicationService--> sendSyncResponse() + + a. Send a response to the API-Handler + + b. Response Body: + + { + "service": + { + "serviceId":"8a95e3ac-32cd-4ffb-b9e3-5366b393a7a2", + "operationId":"a970a804-7ac5-4de9-b6db-17352afbc6fa" + + } + +9. CreateCommunicationService--> generateE2EServiceProfile() + + a. It gets the E2E service templete Id and change communication profile to E2E service profile + b. Basically it generates the E2E service profile + +10. CreateCommunicationService--> preRequestSend2NSMF() + + a. It sets the payload to send to the other bpmn file + +11. Here based on the CreateCommunicationService bpmn structure required bpmn file will be called and corresponding to + + this bpmn, groovy file will be called. For example, Here CreateSliceService.groovy is being called. + +12. CreateCommunicationService--> processNSMFResponse() + + a. It processes the NSMF response code which was returned from other groovy file + +13. CreateCommunicationService--> createCSAndSSRelationship() + + a. It will create relationship between communication service and e2e service + +14. CreateCommunicationService--> createRelationShipInAAI() + + a. Sending a PUT request to make a relationship between two services + https://aai.onap:8443/aai/v19/business/customers/customer/5GCustomer/service-subscriptions/service- + subscription/5G/service-instances/service-instance/8a95e3ac-32cd-4ffb-b9e3-5366b393a7a2/relationship- + list/relationship + +b. Request body: + + { + "related-link":"aai/v16/business/customers/customer/5GCustomer/service-subscriptions/service- + subscription/5G/service-instances/service-instance/2e6c2d7f-85c0-4b1f-b7fd-5f2364c27ea7" + + } + +15. CreateCommunicationService--> prepareUpdateOperationStatus() + + a. prepare update operation status after create relationship in aai + +16. RequestDBUtil--> prepareUpdateOperationStatus() + + a. update operation status in requestDB + + b. DB Adapter Endpoint is: http://so-request-db-adapter.onap:8083/services/RequestsDbAdapter diff --git a/docs/developer_info/developer_information.rst b/docs/developer_info/developer_information.rst index 63338de898..570861345c 100644 --- a/docs/developer_info/developer_information.rst +++ b/docs/developer_info/developer_information.rst @@ -19,5 +19,6 @@ SO Developer Information BPMN_Main_Process_Flows.rst BPMN_Subprocess_Process_Flows.rst BPMN_Project_Deployment_Strategy.rst + BPMN-INFRA_Workflow_Understanding.rst instantiate/index.rst FAQs.rst diff --git a/docs/images/CreateCommunicationService.png b/docs/images/CreateCommunicationService.png new file mode 100644 index 0000000000..eedcc6ee9a Binary files /dev/null and b/docs/images/CreateCommunicationService.png differ -- cgit 1.2.3-korg