aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com>2020-08-13 13:41:42 +0530
committerMD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com>2020-08-13 13:41:42 +0530
commitd7c2eb653bb80aa7e8f0b0ec835da512af53db55 (patch)
tree8db24a4c1590ec374d9f280c5ab2122750826ad3
parentcf828b719f8124ef388ed1f72b5b80ea91728657 (diff)
Developer guide for bpmn flow understanding
Issue-ID: SO-3115 Signed-off-by: MD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com> Change-Id: I4f194bdc0c62005db94d0e8e14ab0bd98fa28d00
-rw-r--r--docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst658
-rw-r--r--docs/developer_info/developer_information.rst1
-rw-r--r--docs/images/CreateCommunicationService.pngbin0 -> 121447 bytes
3 files changed, 659 insertions, 0 deletions
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
--- /dev/null
+++ b/docs/images/CreateCommunicationService.png
Binary files differ