Developer guide for bpmn flow understanding 20/111220/1
authorMD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com>
Thu, 13 Aug 2020 08:11:42 +0000 (13:41 +0530)
committerMD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com>
Thu, 13 Aug 2020 08:11:42 +0000 (13:41 +0530)
Issue-ID: SO-3115

Signed-off-by: MD IRSHAD SHEIKH <md.irshad.sheikh@huawei.com>
Change-Id: I4f194bdc0c62005db94d0e8e14ab0bd98fa28d00

docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst [new file with mode: 0644]
docs/developer_info/developer_information.rst
docs/images/CreateCommunicationService.png [new file with mode: 0644]

diff --git a/docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst b/docs/developer_info/BPMN-INFRA_Workflow_Understanding.rst
new file mode 100644 (file)
index 0000000..b1ef356
--- /dev/null
@@ -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
index 63338de..5708613 100644 (file)
@@ -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 (file)
index 0000000..eedcc6e
Binary files /dev/null and b/docs/images/CreateCommunicationService.png differ