Refactor homing flows for OOF/HPA 53/36053/10
authorMarcus G K Williams <marcus.williams@intel.com>
Wed, 14 Mar 2018 22:07:31 +0000 (15:07 -0700)
committerMarcus Williams <marcus.williams@intel.com>
Tue, 27 Mar 2018 21:34:27 +0000 (21:34 +0000)
1. Split Homing into OOF and SNIRO versions

2. Added OOF API interactions

3. Added Unit tests for OOF Homing Code

Issue-ID: SO-404
Change-Id: Ifeeeec9ea450d8b330110a565208ed89a1e18cde
Signed-off-by: Marcus G K Williams <marcus.williams@intel.com>
28 files changed:
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/Homing.groovy [deleted file]
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/SNIROUtils.groovy
bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/SniroHoming.groovy [new file with mode: 0755]
bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/Homing.bpmn
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/SniroHomingTest.java [moved from bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/HomingTest.java with 98% similarity]
bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/mock/StubResponseOof.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackPolicyException [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackServiceException [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest_infravnf [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/resources/mso.bpmn.urn.properties
bpmn/MSOCoreBPMN/src/main/java/org/openecomp/mso/bpmn/core/domain/HomingSolution.java
bpmn/MSOCoreBPMN/src/main/java/org/openecomp/mso/bpmn/core/domain/ModelInfo.java
bpmn/MSOInfrastructureBPMN/src/main/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustService.groovy
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/CreateVcpeResCustServiceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/groovy/org/openecomp/mso/bpmn/vcpe/scripts/DeleteVcpeResCustServiceTest.groovy
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/DeleteVfModuleVolumeInfraV1/deleteVfModuleVolume_VID_request_st.json
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/request.json
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/requestNoSIName.json
bpmn/MSOInfrastructureBPMN/src/test/resources/__files/VCPE/CreateVcpeResCustService/requestNoSINameNoRollback.json

diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/Homing.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/Homing.groovy
deleted file mode 100755 (executable)
index 2325e6c..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/*\r
- * ============LICENSE_START=======================================================\r
- * ONAP - SO\r
- * ================================================================================\r
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ============LICENSE_END=========================================================\r
- */\r
-package org.openecomp.mso.bpmn.common.scripts\r
-\r
-import org.camunda.bpm.engine.delegate.BpmnError\r
-import org.camunda.bpm.engine.delegate.DelegateExecution\r
-\r
-import org.openecomp.mso.bpmn.common.scripts.AaiUtil\r
-import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil\r
-import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils\r
-import org.openecomp.mso.bpmn.core.domain.InventoryType\r
-import org.openecomp.mso.bpmn.core.domain.Resource\r
-import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition\r
-import org.openecomp.mso.bpmn.core.domain.Subscriber\r
-import org.openecomp.mso.bpmn.core.domain.VnfResource\r
-import org.openecomp.mso.bpmn.core.json.JsonUtils\r
-import org.openecomp.mso.rest.APIResponse\r
-import org.openecomp.mso.rest.RESTClient\r
-import org.openecomp.mso.rest.RESTConfig\r
-import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor\r
-\r
-import org.json.JSONArray\r
-import org.json.JSONObject\r
-\r
-import static org.openecomp.mso.bpmn.common.scripts.GenericUtils.*;\r
-\r
-/**\r
- * This class is contains the scripts used\r
- * by the Homing Subflow building block. The\r
- * subflow attempts to home the provided\r
- * resources by calling sniro.\r
- *\r
- * @author cb645j\r
- *\r
- */\r
-class Homing extends AbstractServiceTaskProcessor{\r
-\r
-       ExceptionUtil exceptionUtil = new ExceptionUtil()\r
-       JsonUtils jsonUtil = new JsonUtils()\r
-       SNIROUtils sniroUtils = new SNIROUtils(this)\r
-\r
-       /**\r
-        * This method validates the incoming variables.\r
-        * The method then prepares the sniro request\r
-        * and posts it to sniro's rest api.\r
-        *\r
-        * @param execution\r
-        *\r
-        * @author cb645j\r
-        */\r
-       public void callSniro(DelegateExecution execution){\r
-               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")\r
-               execution.setVariable("prefix","HOME_")\r
-               utils.log("DEBUG", "*** Started Homing Call Sniro ***", isDebugEnabled)\r
-               try{\r
-                       execution.setVariable("rollbackData", null)\r
-                       execution.setVariable("rolledBack", false)\r
-\r
-                       String requestId = execution.getVariable("msoRequestId")\r
-                       utils.log("DEBUG", "Incoming Request Id is: "  + requestId, isDebugEnabled)\r
-                       String serviceInstanceId = execution.getVariable("serviceInstanceId")\r
-                       utils.log("DEBUG", "Incoming Service Instance Id is: "  + serviceInstanceId, isDebugEnabled)\r
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")\r
-                       utils.log("DEBUG", "Incoming Service Decomposition is: "  + serviceDecomposition, isDebugEnabled)\r
-                       String subscriberInfo = execution.getVariable("subscriberInfo")\r
-                       utils.log("DEBUG", "Incoming Subscriber Information is: "  + subscriberInfo, isDebugEnabled)\r
-\r
-                       if(isBlank(requestId) || isBlank(serviceInstanceId) || isBlank(serviceDecomposition.toString()) || isBlank(subscriberInfo)){\r
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 4000, "A required input variable is missing or null")\r
-                       }else{\r
-                               String subId = jsonUtil.getJsonValue(subscriberInfo, "globalSubscriberId")\r
-                               String subName = jsonUtil.getJsonValue(subscriberInfo, "subscriberName")\r
-                               String subCommonSiteId = ""\r
-                               if(jsonUtil.jsonElementExist(subscriberInfo, "subscriberCommonSiteId")){\r
-                                       subCommonSiteId = jsonUtil.getJsonValue(subscriberInfo, "subscriberCommonSiteId")\r
-                               }\r
-                               Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)\r
-\r
-                               String cloudConfiguration = execution.getVariable("cloudConfiguration") // TODO Currently not being used\r
-                               String homingParameters = execution.getVariable("homingParameters") // (aka. request parameters) Should be json format. TODO confirm its json format\r
-\r
-                               //Authentication\r
-                               def authHeader = ""\r
-                               String basicAuth = execution.getVariable("URN_mso_sniro_auth")\r
-                               String msokey = execution.getVariable("URN_mso_msoKey")\r
-                               String basicAuthValue = utils.encrypt(basicAuth, msokey)\r
-                               if(basicAuthValue != null){\r
-                                       utils.log("DEBUG", "Obtained BasicAuth username and password for SNIRO Adapter: " + basicAuthValue, isDebugEnabled)\r
-                                       try {\r
-                                               authHeader = utils.getBasicAuth(basicAuthValue, msokey)\r
-                                               execution.setVariable("BasicAuthHeaderValue",authHeader)\r
-                                       } catch (Exception ex) {\r
-                                               utils.log("DEBUG", "Unable to encode username and password string: " + ex, isDebugEnabled)\r
-                                               exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to encode username and password string")\r
-                                       }\r
-                               }else{\r
-                                       utils.log("DEBUG", "Unable to obtain BasicAuth - BasicAuth value null" , isDebugEnabled)\r
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth value null")\r
-                               }\r
-\r
-                               //Prepare Callback\r
-                               String timeout = execution.getVariable("timeout")\r
-                               if(isBlank(timeout)){\r
-                                       timeout = execution.getVariable("URN_mso_sniro_timeout");\r
-                                       if(isBlank(timeout)) {\r
-                                               timeout = "PT30M";\r
-                                       }\r
-                               }\r
-                               utils.log("DEBUG", "Async Callback Timeout will be: " + timeout, isDebugEnabled)\r
-\r
-                               execution.setVariable("timeout", timeout);\r
-                               execution.setVariable("correlator", requestId);\r
-                               execution.setVariable("messageType", "SNIROResponse");\r
-\r
-                               //Build Request & Call Sniro\r
-                               String sniroRequest = sniroUtils.buildRequest(execution, requestId, serviceDecomposition, subscriber, homingParameters)\r
-                               execution.setVariable("sniroRequest", sniroRequest)\r
-                               utils.log("DEBUG", "SNIRO Request is: " + sniroRequest, isDebugEnabled)\r
-\r
-                               String endpoint = execution.getVariable("URN_mso_service_agnostic_sniro_endpoint")\r
-                               String host = execution.getVariable("URN_mso_service_agnostic_sniro_host")\r
-                               String url = host + endpoint\r
-                               utils.log("DEBUG", "Posting to Sniro Url: " + url, isDebugEnabled)\r
-\r
-                               logDebug( "URL to be used is: " + url, isDebugEnabled)\r
-\r
-                               RESTConfig config = new RESTConfig(url);\r
-                               RESTClient client = new RESTClient(config).addAuthorizationHeader(authHeader).addHeader("Content-Type", "application/json")\r
-                               APIResponse response = client.httpPost(sniroRequest)\r
-\r
-                               int responseCode = response.getStatusCode()\r
-                               execution.setVariable("syncResponseCode", responseCode);\r
-                               logDebug("SNIRO sync response code is: " + responseCode, isDebugEnabled)\r
-                               String syncResponse = response.getResponseBodyAsString()\r
-                               execution.setVariable("syncResponse", syncResponse);\r
-                               logDebug("SNIRO sync response is: " + syncResponse, isDebugEnabled)\r
-\r
-                               utils.log("DEBUG", "*** Completed Homing Call Sniro ***", isDebugEnabled)\r
-                       }\r
-               }catch(BpmnError b){\r
-                       throw b\r
-               }catch(Exception e){\r
-                       utils.log("DEBUG", "Error encountered within Homing CallSniro method: " + e, isDebugEnabled)\r
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing CallSniro: " + e.getMessage())\r
-               }\r
-       }\r
-\r
-       /**\r
-        * This method processes the callback response\r
-        * and the contained homing solution. It sets\r
-        * homing solution assignment and license\r
-        * information to the corresponding resources\r
-        *\r
-        * @param execution\r
-        *\r
-        * @author cb645j\r
-        */\r
-       public void processHomingSolution(DelegateExecution execution){\r
-               def isDebugEnabled = execution.getVariable("isDebugLogEnabled")\r
-               utils.log("DEBUG", "*** Started Homing Process Homing Solution ***", isDebugEnabled)\r
-               try{\r
-                       String response = execution.getVariable("asyncCallbackResponse")\r
-                       utils.log("DEBUG", "Sniro Async Callback Response is: " + response, isDebugEnabled)\r
-                       utils.logAudit("Sniro Async Callback Response is: " + response)\r
-\r
-                       sniroUtils.validateCallbackResponse(execution, response)\r
-                       String placements = jsonUtil.getJsonValue(response, "solutionInfo.placementInfo")\r
-\r
-                       ServiceDecomposition decomposition = execution.getVariable("serviceDecomposition")\r
-                       utils.log("DEBUG", "Service Decomposition: " + decomposition, isDebugEnabled)\r
-\r
-                       List<Resource> resourceList = decomposition.getServiceResources()\r
-                       JSONArray arr = new JSONArray(placements)\r
-                       for(int i = 0; i < arr.length(); i++){\r
-                               JSONObject placement = arr.getJSONObject(i)\r
-                               String jsonServiceResourceId = placement.getString("serviceResourceId")\r
-                               for(Resource resource:resourceList){\r
-                                       String serviceResourceId = resource.getResourceId()\r
-                                       if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){\r
-                                               //match\r
-                                               String inventoryType = placement.getString("inventoryType")\r
-                                               resource.getHomingSolution().setInventoryType(InventoryType.valueOf(inventoryType))\r
-                                               resource.getHomingSolution().setCloudRegionId(placement.getString("cloudRegionId"))\r
-                                               resource.getHomingSolution().setRehome(placement.getBoolean("isRehome"))\r
-                                               JSONArray assignmentArr = placement.getJSONArray("assignmentInfo")\r
-                                               Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "variableName", "variableValue")\r
-                                               resource.getHomingSolution().setCloudOwner(assignmentMap.get("cloudOwner"))\r
-                                               resource.getHomingSolution().setAicClli(assignmentMap.get("aicClli"))\r
-                                               resource.getHomingSolution().setAicVersion(assignmentMap.get("aicVersion"))\r
-                                               if(inventoryType.equalsIgnoreCase("service")){\r
-                                                       VnfResource vnf = new VnfResource()\r
-                                                       vnf.setVnfHostname(assignmentMap.get("vnfHostName"))\r
-                                                       resource.getHomingSolution().setVnf(vnf)\r
-                                                       resource.getHomingSolution().setServiceInstanceId(placement.getString("serviceInstanceId"))\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-                       if(JsonUtils.jsonElementExist(response, "solutionInfo.licenseInfo")){\r
-                               String licenseInfo = jsonUtil.getJsonValue(response, "solutionInfo.licenseInfo")\r
-                               JSONArray licenseArr = new JSONArray(licenseInfo)\r
-                               for(int l = 0; l < licenseArr.length(); l++){\r
-                                       JSONObject license = licenseArr.getJSONObject(l)\r
-                                       String jsonServiceResourceId = license.getString("serviceResourceId")\r
-                                       for(Resource resource:resourceList){\r
-                                               String serviceResourceId = resource.getResourceId()\r
-                                               if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){\r
-                                                       //match\r
-                                                       String jsonEntitlementPoolList = jsonUtil.getJsonValue(license.toString(), "entitlementPoolList")\r
-                                                       List<String> entitlementPoolList = jsonUtil.StringArrayToList(execution, jsonEntitlementPoolList)\r
-                                                       resource.getHomingSolution().getLicense().setEntitlementPoolList(entitlementPoolList)\r
-\r
-                                                       String jsonLicenseKeyGroupList = jsonUtil.getJsonValue(license.toString(), "licenseKeyGroupList")\r
-                                                       List<String> licenseKeyGroupList = jsonUtil.StringArrayToList(execution, jsonLicenseKeyGroupList)\r
-                                                       resource.getHomingSolution().getLicense().setLicenseKeyGroupList(licenseKeyGroupList)\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-                       execution.setVariable("serviceDecomposition", decomposition)\r
-                       execution.setVariable("homingSolution", placements) //TODO - can be removed as output variable\r
-\r
-                       utils.log("DEBUG", "*** Completed Homing Process Homing Solution ***", isDebugEnabled)\r
-               }catch(BpmnError b){\r
-                       throw b\r
-               }catch(Exception e){\r
-                       utils.log("DEBUG", "Error encountered within Homing ProcessHomingSolution method: " + e, isDebugEnabled)\r
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing ProcessHomingSolution")\r
-               }\r
-       }\r
-\r
-       /**\r
-        * This method logs the start of DHVCreateService\r
-        * to make debugging easier.\r
-        *\r
-        * @param - execution\r
-        * @author cb645j\r
-        */\r
-       public String logStart(DelegateExecution execution){\r
-               def isDebugEnabled=execution.getVariable("isDebugLogEnabled")\r
-               String requestId = execution.getVariable("testReqId")\r
-               if(isBlank(requestId)){\r
-                       requestId = execution.getVariable("msoRequestId")\r
-               }\r
-               execution.setVariable("DHVCS_requestId", requestId)\r
-               utils.log("DEBUG", "***** STARTED Homing Subflow for request: "  + requestId + " *****", "true")\r
-               utils.log("DEBUG", "****** Homing Subflow Global Debug Enabled: " + isDebugEnabled  + " *****", "true")\r
-               utils.logAudit("***** STARTED Homing Subflow for request: "  + requestId + " *****")\r
-       }\r
-\r
-\r
-       /**\r
-        * Auto-generated method stub\r
-        */\r
-       public void preProcessRequest(DelegateExecution execution){}\r
-\r
-}\r
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofHoming.groovy
new file mode 100644 (file)
index 0000000..5e7ed98
--- /dev/null
@@ -0,0 +1,289 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.openecomp.mso.bpmn.common.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
+import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
+import org.openecomp.mso.bpmn.core.domain.InventoryType
+import org.openecomp.mso.bpmn.core.domain.Resource
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
+import org.openecomp.mso.bpmn.core.domain.Subscriber
+import org.openecomp.mso.bpmn.core.domain.VnfResource
+import org.openecomp.mso.bpmn.core.json.JsonUtils
+import org.openecomp.mso.rest.APIResponse
+import org.openecomp.mso.rest.RESTClient
+import org.openecomp.mso.rest.RESTConfig
+import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
+
+import org.json.JSONArray
+import org.json.JSONObject
+
+import static org.openecomp.mso.bpmn.common.scripts.GenericUtils.*
+
+/**
+ * This class contains the scripts used
+ * by the OOF Homing Subflow building block. The
+ * subflow attempts to home the provided
+ * resources by calling OOF.
+ */
+class OofHoming extends AbstractServiceTaskProcessor {
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    JsonUtils jsonUtil = new JsonUtils()
+    OofUtils oofUtils = new OofUtils(this)
+
+    /**
+     * This method validates the incoming variables.
+     * The method then prepares the OOF request
+     * and posts it to OOF's rest api.
+     *
+     * @param execution
+     */
+    public void callOof(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        execution.setVariable("prefix", "HOME_")
+        utils.log("DEBUG", "*** Started Homing Call OOF ***", isDebugEnabled)
+        try {
+            execution.setVariable("rollbackData", null)
+            execution.setVariable("rolledBack", false)
+
+            String requestId = execution.getVariable("msoRequestId")
+            utils.log("DEBUG", "Incoming Request Id is: " + requestId, isDebugEnabled)
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+            utils.log("DEBUG", "Incoming Service Instance Id is: " + serviceInstanceId, isDebugEnabled)
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+            utils.log("DEBUG", "Incoming Service Decomposition is: " + serviceDecomposition, isDebugEnabled)
+            String subscriberInfo = execution.getVariable("subscriberInfo")
+            utils.log("DEBUG", "Incoming Subscriber Information is: " + subscriberInfo, isDebugEnabled)
+            Map customerLocation = execution.getVariable("customerLocation")
+            utils.log("DEBUG", "Incoming Customer Location is: " + customerLocation.toString(), isDebugEnabled)
+            String cloudOwner = execution.getVariable("cloudOwner")
+            utils.log("DEBUG", "Incoming cloudOwner is: " + cloudOwner, isDebugEnabled)
+            String cloudRegionId = execution.getVariable("cloudRegionId")
+            utils.log("DEBUG", "Incoming cloudRegionId is: " + cloudRegionId, isDebugEnabled)
+
+            if (isBlank(requestId) ||
+                    isBlank(serviceInstanceId) ||
+                    isBlank(serviceDecomposition.toString()) ||
+                    isBlank(subscriberInfo) ||
+                    isBlank(customerLocation.toString()) ||
+                    isBlank(cloudOwner) ||
+                    isBlank(cloudRegionId)) {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 4000,
+                        "A required input variable is missing or null")
+            } else {
+                String subId = jsonUtil.getJsonValue(subscriberInfo, "globalSubscriberId")
+                String subName = jsonUtil.getJsonValue(subscriberInfo, "subscriberName")
+                String subCommonSiteId = ""
+                if (jsonUtil.jsonElementExist(subscriberInfo, "subscriberCommonSiteId")) {
+                    subCommonSiteId = jsonUtil.getJsonValue(subscriberInfo, "subscriberCommonSiteId")
+                }
+                Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)
+
+                //Authentication
+                def authHeader = ""
+                String basicAuth = execution.getVariable("URN_mso_oof_auth")
+                String msokey = execution.getVariable("URN_mso_msoKey")
+                String basicAuthValue = utils.encrypt(basicAuth, msokey)
+                if (basicAuthValue != null) {
+                    utils.log("DEBUG", "Obtained BasicAuth username and password for OOF Adapter: " + basicAuthValue,
+                            isDebugEnabled)
+                    try {
+                        authHeader = utils.getBasicAuth(basicAuthValue, msokey)
+                        execution.setVariable("BasicAuthHeaderValue", authHeader)
+                    } catch (Exception ex) {
+                        utils.log("DEBUG", "Unable to encode username and password string: " + ex, isDebugEnabled)
+                        exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to " +
+                                "encode username and password string")
+                    }
+                } else {
+                    utils.log("DEBUG", "Unable to obtain BasicAuth - BasicAuth value null", isDebugEnabled)
+                    exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth " +
+                            "value null")
+                }
+
+                //Prepare Callback
+                String timeout = execution.getVariable("timeout")
+                if (isBlank(timeout)) {
+                    timeout = execution.getVariable("URN_mso_oof_timeout");
+                    if (isBlank(timeout)) {
+                        timeout = "PT30M"
+                    }
+                }
+                utils.log("DEBUG", "Async Callback Timeout will be: " + timeout, isDebugEnabled)
+
+                execution.setVariable("timeout", timeout)
+                execution.setVariable("correlator", requestId)
+                execution.setVariable("messageType", "oofResponse")
+
+                //Build Request & Call OOF
+                String oofRequest = oofUtils.buildRequest(execution, requestId, serviceDecomposition,
+                        subscriber, customerLocation)
+                execution.setVariable("oofRequest", oofRequest)
+                utils.log("DEBUG", "OOF Request is: " + oofRequest, isDebugEnabled)
+
+                String endpoint = execution.getVariable("URN_mso_service_agnostic_oof_endpoint")
+                String host = execution.getVariable("URN_mso_service_agnostic_oof_host")
+                String url = host + endpoint
+                utils.log("DEBUG", "Posting to OOF Url: " + url, isDebugEnabled)
+
+                logDebug("URL to be used is: " + url, isDebugEnabled)
+
+                RESTConfig config = new RESTConfig(url)
+                RESTClient client = new RESTClient(config).addAuthorizationHeader(authHeader).
+                        addHeader("Content-Type", "application/json")
+                APIResponse response = client.httpPost(oofRequest)
+
+                int responseCode = response.getStatusCode()
+                execution.setVariable("syncResponseCode", responseCode)
+                logDebug("OOF sync response code is: " + responseCode, isDebugEnabled)
+                String syncResponse = response.getResponseBodyAsString()
+                execution.setVariable("syncResponse", syncResponse)
+                logDebug("OOF sync response is: " + syncResponse, isDebugEnabled)
+
+                utils.log("DEBUG", "*** Completed Homing Call OOF ***", isDebugEnabled)
+            }
+        } catch (BpmnError b) {
+            throw b
+        } catch (Exception e) {
+            utils.log("DEBUG", "Error encountered within Homing callOof method: " + e, isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500,
+                    "Internal Error - Occured in Homing callOof: " + e.getMessage())
+        }
+    }
+
+    /**
+     * This method processes the callback response
+     * and the contained homing solution. It sets
+     * homing solution assignment and license
+     * information to the corresponding resources
+     *
+     * @param execution
+     */
+    public void processHomingSolution(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        utils.log("DEBUG", "*** Started Homing Process Homing Solution ***", isDebugEnabled)
+        try {
+            String response = execution.getVariable("asyncCallbackResponse")
+            utils.log("DEBUG", "OOF Async Callback Response is: " + response, isDebugEnabled)
+            utils.logAudit("OOF Async Callback Response is: " + response)
+
+            oofUtils.validateCallbackResponse(execution, response)
+            String placements = jsonUtil.getJsonValue(response, "solutions.placementSolutions")
+            utils.log("DEBUG", "****** Solution Placements: " + placements + " *****", isDebugEnabled)
+
+            ServiceDecomposition decomposition = execution.getVariable("serviceDecomposition")
+            utils.log("DEBUG", "Service Decomposition: " + decomposition, isDebugEnabled)
+
+            List<Resource> resourceList = decomposition.getServiceResources()
+            JSONArray arr = new JSONArray(placements)
+            for (int i = 0; i < arr.length(); i++) {
+                JSONObject placement = arr.getJSONObject(i)
+                utils.log("DEBUG", "****** JSONObject is: " + placement + " *****", "true")
+                String jsonServiceResourceId = placement.getString("serviceResourceId")
+                for (Resource resource : resourceList) {
+                    String serviceResourceId = resource.getResourceId()
+                    if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)) {
+                        JSONObject solution = placement.getJSONObject("solution")
+                        String solutionType = solution.getString("identifierType")
+                        String inventoryType = ""
+                        if (solutionType.equalsIgnoreCase("serviceInstanceId")) {
+                            inventoryType = "service"
+                        } else {
+                            inventoryType = "cloud"
+
+                        }
+                        resource.getHomingSolution().setInventoryType(InventoryType.valueOf(inventoryType))
+
+                        // TODO Deal with Placement Solutions & Assignment Info here
+                        JSONArray assignmentArr = placement.getJSONArray("assignmentInfo")
+                        Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "key", "value")
+                        resource.getHomingSolution().setCloudOwner(assignmentMap.get("cloudOwner"))
+                        resource.getHomingSolution().setCloudRegionId(assignmentMap.get("cloudRegionId"))
+                        if (inventoryType.equalsIgnoreCase("service")) {
+                            resource.getHomingSolution().setRehome(assignmentMap.get("isRehome").toBoolean())
+                            VnfResource vnf = new VnfResource()
+                            vnf.setVnfHostname(assignmentMap.get("vnfHostName"))
+                            resource.getHomingSolution().setVnf(vnf)
+                            resource.getHomingSolution().setServiceInstanceId(solution.getJSONArray("identifiers")[0].toString())
+                        }
+                    }
+                }
+            }
+            if (JsonUtils.jsonElementExist(response, "solutions.licenseSolutions")) {
+                String licenseSolutions = jsonUtil.getJsonValue(response, "solutions.licenseSolutions")
+                JSONArray licenseArr = new JSONArray(licenseSolutions)
+                for (int l = 0; l < licenseArr.length(); l++) {
+                    JSONObject license = licenseArr.getJSONObject(l)
+                    String jsonServiceResourceId = license.getString("serviceResourceId")
+                    for (Resource resource : resourceList) {
+                        String serviceResourceId = resource.getResourceId()
+                        if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)) {
+                            String jsonEntitlementPoolList = jsonUtil.getJsonValue(license.toString(), "entitlementPoolUUID")
+                            List<String> entitlementPoolList = jsonUtil.StringArrayToList(execution, jsonEntitlementPoolList)
+                            resource.getHomingSolution().getLicense().setEntitlementPoolList(entitlementPoolList)
+
+                            String jsonLicenseKeyGroupList = jsonUtil.getJsonValue(license.toString(), "licenseKeyGroupUUID")
+                            List<String> licenseKeyGroupList = jsonUtil.StringArrayToList(execution, jsonLicenseKeyGroupList)
+                            resource.getHomingSolution().getLicense().setLicenseKeyGroupList(licenseKeyGroupList)
+                        }
+                    }
+                }
+            }
+            execution.setVariable("serviceDecomposition", decomposition)
+            execution.setVariable("homingSolution", placements) //TODO - can be removed as output variable
+
+            utils.log("DEBUG", "*** Completed Homing Process Homing Solution ***", isDebugEnabled)
+        } catch (BpmnError b) {
+            throw b
+        } catch (Exception e) {
+            utils.log("DEBUG", "Error encountered within Homing ProcessHomingSolution method: " + e, isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occurred in Homing ProcessHomingSolution")
+        }
+    }
+
+    /**
+     * This method logs the start of DHVCreateService
+     * to make debugging easier.
+     *
+     * @param - execution
+     */
+    public String logStart(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        String requestId = execution.getVariable("testReqId")
+        if (isBlank(requestId)) {
+            requestId = execution.getVariable("msoRequestId")
+        }
+        execution.setVariable("DHVCS_requestId", requestId)
+        utils.log("DEBUG", "***** STARTED Homing Subflow for request: " + requestId + " *****", "true")
+        utils.log("DEBUG", "****** Homing Subflow Global Debug Enabled: " + isDebugEnabled + " *****", "true")
+        utils.logAudit("***** STARTED Homing Subflow for request: " + requestId + " *****")
+    }
+
+    /**
+     * Auto-generated method stub
+     */
+    public void preProcessRequest(DelegateExecution execution) {}
+        // Not Implemented Method
+}
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/OofUtils.groovy
new file mode 100644 (file)
index 0000000..fc7c62b
--- /dev/null
@@ -0,0 +1,405 @@
+package org.openecomp.mso.bpmn.common.scripts
+
+import org.apache.commons.lang3.StringUtils
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
+import org.openecomp.mso.bpmn.common.scripts.MsoUtils
+import org.openecomp.mso.bpmn.core.domain.HomingSolution
+import org.openecomp.mso.bpmn.core.domain.ModelInfo
+import org.openecomp.mso.bpmn.core.domain.Resource
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
+import org.openecomp.mso.bpmn.core.domain.ServiceInstance
+import org.openecomp.mso.bpmn.core.domain.Subscriber
+import org.openecomp.mso.bpmn.core.domain.VnfResource
+import org.openecomp.mso.bpmn.core.json.JsonUtils
+
+import static org.openecomp.mso.bpmn.common.scripts.GenericUtils.*
+
+class OofUtils {
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    JsonUtils jsonUtil = new JsonUtils()
+
+    private AbstractServiceTaskProcessor utils
+
+    public MsoUtils msoUtils = new MsoUtils()
+
+    public OofUtils(AbstractServiceTaskProcessor taskProcessor) {
+        this.utils = taskProcessor
+    }
+
+    /**
+     * This method builds the service-agnostic
+     * OOF json request to get a homing solution
+     * and license solution
+     *
+     * @param execution
+     * @param requestId
+     * @param decomposition - ServiceDecomposition object
+     * @param customerLocation -
+     * @param existingCandidates -
+     * @param excludedCandidates -
+     * @param requiredCandidates -
+     *
+     * @return request - OOF v1 payload - https://wiki.onap.org/pages/viewpage.action?pageId=25435066
+     */
+    String buildRequest(DelegateExecution execution,
+                        String requestId,
+                        ServiceDecomposition decomposition,
+                        Subscriber subscriber,
+                        Map customerLocation,
+                        ArrayList existingCandidates = null,
+                        ArrayList excludedCandidates = null,
+                        ArrayList requiredCandidates = null) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        utils.log("DEBUG", "Started Building OOF Request", isDebugEnabled)
+        def callbackUrl = utils.createWorkflowMessageAdapterCallbackURL(execution, "oofResponse", requestId)
+        def transactionId = requestId
+        //ServiceInstance Info
+        ServiceInstance serviceInstance = decomposition.getServiceInstance()
+        def serviceInstanceId = ""
+        def serviceInstanceName = ""
+        if (serviceInstance == null) {
+            utils.log("DEBUG", "Unable to obtain Service Instance Id, ServiceInstance Object is null", isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 400, "Internal Error - Unable to " +
+                    "obtain Service Instance Id, ServiceInstance Object is null")
+        } else {
+            serviceInstanceId = serviceInstance.getInstanceId()
+            serviceInstanceName = serviceInstance.getInstanceName()
+        }
+        //Model Info
+        ModelInfo model = decomposition.getModelInfo()
+        String modelType = model.getModelType()
+        String modelInvariantId = model.getModelInvariantUuid()
+        String modelVersionId = model.getModelUuid()
+        String modelName = model.getModelName()
+        String modelVersion = model.getModelVersion()
+        //Subscriber Info
+        String subscriberId = subscriber.getGlobalId()
+        String subscriberName = subscriber.getName()
+        String commonSiteId = subscriber.getCommonSiteId()
+
+        //Determine RequestType
+        //TODO Figure out better way to determine this
+        String requestType = "create"
+        List<Resource> resources = decomposition.getServiceResources()
+        for(Resource r:resources){
+            HomingSolution currentSolution = (HomingSolution) r.getCurrentHomingSolution()
+            if(currentSolution != null){
+                requestType = "speed changed"
+            }
+        }
+
+        //Demands
+        String placementDemands = ""
+        StringBuilder sb = new StringBuilder()
+        List<Resource> resourceList = decomposition.getServiceAllottedResources()
+        List<VnfResource> vnfResourceList = decomposition.getServiceVnfs()
+
+        if (resourceList.isEmpty() || resourceList == null) {
+            utils.log("DEBUG", "Allotted Resources List is empty - will try to get service VNFs instead.",
+                    isDebugEnabled)
+            resourceList = decomposition.getServiceVnfs()
+        }
+
+        if (resourceList.isEmpty() || resourceList == null) {
+            utils.log("DEBUG", "Resources List is Empty", isDebugEnabled)
+        } else {
+            for (Resource resource : resourceList) {
+                ModelInfo resourceModelInfo = resource.getModelInfo()
+                def serviceResourceId = resource.getResourceId()
+                def resourceModuleName = resource.getResourceType()
+                def resouceModelInvariantId = resourceModelInfo.getModelInvariantUuid()
+                def resouceModelName = resourceModelInfo.getModelName()
+                def resouceModelVersion = resourceModelInfo.getModelVersion()
+                def resouceModelVersionId = resourceModelInfo.getModelUuid()
+                def resouceModelType = resourceModelInfo.getModelType()
+                def tenantId = execution.getTenantId()
+                def requiredCandidatesJson = ""
+
+                requiredCandidatesJson = createCandidateJson(
+                        existingCandidates,
+                        excludedCandidates,
+                        requiredCandidates)
+
+                String demand =
+                        "{\n" +
+                        "\"resourceModuleName\": \"${resourceModuleName}\",\n" +
+                        "\"serviceResourceId\": \"${serviceResourceId}\",\n" +
+                        "\"tenantId\": \"${tenantId}\",\n" +
+                        "\"resourceModelInfo\": {\n" +
+                        "  \"modelInvariantId\": \"${resouceModelInvariantId}\",\n" +
+                        "  \"modelVersionId\": \"${resouceModelVersionId}\",\n" +
+                        "  \"modelName\": \"${resouceModelName}\",\n" +
+                        "  \"modelType\": \"${resouceModelType}\",\n" +
+                        "  \"modelVersion\": \"${resouceModelVersion}\",\n" +
+                        "  \"modelCustomizationName\": \"\"\n" +
+                        "  }" + requiredCandidatesJson + "\n" +
+                        "},"
+
+                placementDemands = sb.append(demand)
+            }
+            placementDemands = placementDemands.substring(0, placementDemands.length() - 1)
+        }
+
+        String licenseDemands = ""
+        sb = new StringBuilder()
+        if (vnfResourceList.isEmpty() || vnfResourceList == null) {
+            utils.log("DEBUG", "Vnf Resources List is Empty", isDebugEnabled)
+        } else {
+            for (VnfResource vnfResource : vnfResourceList) {
+                ModelInfo vnfResourceModelInfo = vnfResource.getModelInfo()
+                def resourceInstanceType = vnfResource.getResourceType()
+                def serviceResourceId = vnfResource.getResourceId()
+                def resourceModuleName = vnfResource.getResourceType()
+                def resouceModelInvariantId = vnfResourceModelInfo.getModelInvariantUuid()
+                def resouceModelName = vnfResourceModelInfo.getModelName()
+                def resouceModelVersion = vnfResourceModelInfo.getModelVersion()
+                def resouceModelVersionId = vnfResourceModelInfo.getModelUuid()
+                def resouceModelType = vnfResourceModelInfo.getModelType()
+
+                // TODO Add Existing Licenses to demand
+                //"existingLicenses": {
+                //"entitlementPoolUUID": ["87257b49-9602-4ca1-9817-094e52bc873b",
+                // "43257b49-9602-4fe5-9337-094e52bc9435"],
+                //"licenseKeyGroupUUID": ["87257b49-9602-4ca1-9817-094e52bc873b",
+                // "43257b49-9602-4fe5-9337-094e52bc9435"]
+                //}
+
+                    String licenseDemand =
+                        "{\n" +
+                        "\"resourceModuleName\": \"${resourceModuleName}\",\n" +
+                        "\"serviceResourceId\": \"${serviceResourceId}\",\n" +
+                        "\"resourceInstanceType\": \"${resourceInstanceType}\",\n" +
+                        "\"resourceModelInfo\": {\n" +
+                        "  \"modelInvariantId\": \"${resouceModelInvariantId}\",\n" +
+                        "  \"modelVersionId\": \"${resouceModelVersionId}\",\n" +
+                        "  \"modelName\": \"${resouceModelName}\",\n" +
+                        "  \"modelType\": \"${resouceModelType}\",\n" +
+                        "  \"modelVersion\": \"${resouceModelVersion}\",\n" +
+                        "  \"modelCustomizationName\": \"\"\n" +
+                        "  }\n"
+                        "},"
+
+                licenseDemands = sb.append(licenseDemand)
+            }
+            licenseDemands = licenseDemands.substring(0, licenseDemands.length() - 1)
+        }
+
+        String request =
+                "{\n" +
+                "  \"requestInfo\": {\n" +
+                "    \"transactionId\": \"${transactionId}\",\n" +
+                "    \"requestId\": \"${requestId}\",\n" +
+                "    \"callbackUrl\": \"${callbackUrl}\",\n" +
+                "    \"sourceId\": \"so\",\n" +
+                "    \"requestType\": \"${requestType}\"," +
+                "    \"numSolutions\": 1,\n" +
+                "    \"optimizers\": [\"placement\"],\n" +
+                "    \"timeout\": 600\n" +
+                "    },\n" +
+                "  \"placementInfo\": {\n" +
+                "    \"requestParameters\": {\n" +
+                "      \"customerLatitude\": \"${customerLocation.customerLatitude}\",\n" +
+                "      \"customerLongitude\": \"${customerLocation.customerLongitude}\",\n" +
+                "      \"customerName\": \"${customerLocation.customerName}\"\n" +
+                "    }," +
+                "    \"subscriberInfo\": { \n" +
+                "      \"globalSubscriberId\": \"${subscriberId}\",\n" +
+                "      \"subscriberName\": \"${subscriberName}\",\n" +
+                "      \"subscriberCommonSiteId\": \"${commonSiteId}\"\n" +
+                "    },\n" +
+                "    \"placementDemands\": [\n" +
+                "      ${placementDemands}\n" +
+                "      ]\n" +
+                "    },\n" +
+                "  \"serviceInfo\": {\n" +
+                "    \"serviceInstanceId\": \"${serviceInstanceId}\",\n" +
+                "    \"serviceName\": \"${serviceInstanceName}\",\n" +
+                "    \"modelInfo\": {\n" +
+                "      \"modelType\": \"${modelType}\",\n" +
+                "      \"modelInvariantId\": \"${modelInvariantId}\",\n" +
+                "      \"modelVersionId\": \"${modelVersionId}\",\n" +
+                "      \"modelName\": \"${modelName}\",\n" +
+                "      \"modelVersion\": \"${modelVersion}\",\n" +
+                "      \"modelCustomizationName\": \"\"\n" +
+                "    }\n" +
+                "  },\n" +
+                "  \"licenseInfo\": {\n" +
+                "    \"licenseDemands\": [\n" +
+                "      ${licenseDemands}\n" +
+                "      }]\n" +
+                "    }\n" +
+                "}"
+
+
+        utils.log("DEBUG", "Completed Building OOF Request", isDebugEnabled)
+        return request
+    }
+
+    /**
+     * This method validates the callback response
+     * from OOF. If the response contains an
+     * exception the method will build and throw
+     * a workflow exception.
+     *
+     * @param execution
+     * @param response - the async callback response from oof
+     */
+    Void validateCallbackResponse(DelegateExecution execution, String response) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        String placements = ""
+        if (isBlank(response)) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 5000, "OOF Async Callback Response is Empty")
+        } else {
+            if (JsonUtils.jsonElementExist(response, "solutions.placementSolutions")) {
+                placements = jsonUtil.getJsonValue(response, "solutions.placementSolutions")
+                if (isBlank(placements) || placements.equalsIgnoreCase("[]")) {
+                    String statusMessage = jsonUtil.getJsonValue(response, "statusMessage")
+                    if (isBlank(statusMessage)) {
+                        utils.log("DEBUG", "Error Occurred in Homing: OOF Async Callback Response does " +
+                                "not contain placement solution.", isDebugEnabled)
+                        exceptionUtil.buildAndThrowWorkflowException(execution, 400,
+                                "OOF Async Callback Response does not contain placement solution.")
+                    } else {
+                        utils.log("DEBUG", "Error Occurred in Homing: " + statusMessage, isDebugEnabled)
+                        exceptionUtil.buildAndThrowWorkflowException(execution, 400, statusMessage)
+                    }
+                } else {
+                    return
+                }
+            } else if (JsonUtils.jsonElementExist(response, "requestError") == true) {
+                String errorMessage = ""
+                if (response.contains("policyException")) {
+                    String text = jsonUtil.getJsonValue(response, "requestError.policyException.text")
+                    errorMessage = "OOF Async Callback Response contains a Request Error Policy Exception: " + text
+                } else if (response.contains("serviceException")) {
+                    String text = jsonUtil.getJsonValue(response, "requestError.serviceException.text")
+                    errorMessage = "OOF Async Callback Response contains a Request Error Service Exception: " + text
+                } else {
+                    errorMessage = "OOF Async Callback Response contains a Request Error. Unable to determine the Request Error Exception."
+                }
+                utils.log("DEBUG", "Error Occurred in Homing: " + errorMessage, isDebugEnabled)
+                exceptionUtil.buildAndThrowWorkflowException(execution, 400, errorMessage)
+
+            } else {
+                utils.log("DEBUG", "Error Occurred in Homing: Received an Unknown Async Callback Response from OOF.", isDebugEnabled)
+                exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Received an Unknown Async Callback Response from OOF.")
+            }
+        }
+
+    }
+
+    /**
+     * This method creates candidates json for placement Demands.
+     *
+     * @param execution
+     * @param existingCandidates -
+     * @param excludedCandidates -
+     * @param requiredCandidates -
+     *
+     * @return candidatesJson - a JSON string with candidates
+     */
+    String createCandidateJson(ArrayList existingCandidates = null,
+                               ArrayList excludedCandidates = null,
+                               ArrayList requiredCandidates = null) {
+        def candidatesJson = ""
+        def type = ""
+        if (existingCandidates != null && existingCandidates != {}) {
+            sb = new StringBuilder()
+            sb.append(",\n" +
+                    "  \"existingCandidates\": [\n")
+            def existingCandidateJson = ""
+            existingCandidates.each {
+                type = existingCandidate.get('identifierType')
+                if (type == 'vimId') {
+                    def cloudOwner = existingCandidate.get('cloudOwner')
+                    def cloudRegionId = existingCandidate.get('identifiers')
+                    existingCandidateJson = "{\n" +
+                            "    \"identifierType\": \"vimId\",\n" +
+                            "    \"cloudOwner\": \"${cloudOwner}\",\n" +
+                            "    \"identifiers\": [\"${cloudRegionId}\"]\n" +
+                            "    },"
+                    sb.append(existingCandidateJson)
+                }
+                if (type == 'serviceInstanceId') {
+                    def serviceInstanceId = existingCandidate.get('identifiers')
+                    existingCandidateJson += "{\n" +
+                            "    \"identifierType\": \"serviceInstanceId\",\n" +
+                            "    \"identifiers\": [\"${serviceInstanceId}\"]\n" +
+                            "    },"
+                    sb.append(existingCandidateJson)
+                }
+            }
+            if (existingCandidateJson != "") {
+                sb.setLength(sb.length() - 1)
+                candidatesJson = sb.append(",\n],")
+            }
+        }
+        if (excludedCandidates != null && excludedCandidates != {}) {
+            sb = new StringBuilder()
+            sb.append(",\n" +
+                    "  \"excludedCandidates\": [\n")
+            def excludedCandidateJson = ""
+            excludedCandidates.each {
+                type = excludedCandidate.get('identifierType')
+                if (type == 'vimId') {
+                    def cloudOwner = excludedCandidate.get('cloudOwner')
+                    def cloudRegionId = excludedCandidate.get('identifiers')
+                    excludedCandidateJson = "{\n" +
+                            "    \"identifierType\": \"vimId\",\n" +
+                            "    \"cloudOwner\": \"${cloudOwner}\",\n" +
+                            "    \"identifiers\": [\"${cloudRegionId}\"]\n" +
+                            "    },"
+                    sb.append(excludedCandidateJson)
+                }
+                if (type == 'serviceInstanceId') {
+                    def serviceInstanceId = excludedCandidate.get('identifiers')
+                    excludedCandidateJson += "{\n" +
+                            "    \"identifierType\": \"serviceInstanceId\",\n" +
+                            "    \"identifiers\": [\"${serviceInstanceId}\"]\n" +
+                            "    },"
+                    sb.append(excludedCandidateJson)
+                }
+            }
+            if (excludedCandidateJson != "") {
+                sb.setLength(sb.length() - 1)
+                candidatesJson = sb.append(",\n],")
+            }
+        }
+        if (requiredCandidates != null && requiredCandidates != {}) {
+            sb = new StringBuilder()
+            sb.append(",\n" +
+                    "  \"requiredCandidates\": [\n")
+            def requiredCandidatesJson = ""
+            requiredCandidates.each {
+                type = requiredCandidate.get('identifierType')
+                if (type == 'vimId') {
+                    def cloudOwner = requiredCandidate.get('cloudOwner')
+                    def cloudRegionId = requiredCandidate.get('identifiers')
+                    requiredCandidatesJson = "{\n" +
+                            "    \"identifierType\": \"vimId\",\n" +
+                            "    \"cloudOwner\": \"${cloudOwner}\",\n" +
+                            "    \"identifiers\": [\"${cloudRegionId}\"]\n" +
+                            "    },"
+                    sb.append(requiredCandidatesJson)
+                }
+                if (type == 'serviceInstanceId') {
+                    def serviceInstanceId = requiredCandidate.get('identifiers')
+                    requiredCandidatesJson += "{\n" +
+                            "    \"identifierType\": \"serviceInstanceId\",\n" +
+                            "    \"identifiers\": [\"${serviceInstanceId}\"]\n" +
+                            "    },"
+                    sb.append(requiredCandidatesJson)
+                }
+            }
+            if (requiredCandidatesJson != "") {
+                sb.setLength(sb.length() - 1)
+                candidatesJson = sb.append(",\n],")
+            }
+        }
+        if (candidatesJson != "") {candidatesJson = candidatesJson.substring(0, candidatesJson.length() - 1)}
+        return candidatesJson
+    }
+}
\ No newline at end of file
index ab215c9..88ed9fb 100644 (file)
@@ -96,7 +96,7 @@ class SNIROUtils{
                String requestType = "initial"\r
                List<Resource> resources = decomposition.getServiceResources()\r
                for(Resource r:resources){\r
-                       HomingSolution currentSolution = r.getCurrentHomingSolution()\r
+                       HomingSolution currentSolution = (HomingSolution) r.getCurrentHomingSolution()\r
                        if(currentSolution != null){\r
                                requestType = "speed changed"\r
                        }\r
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/SniroHoming.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/openecomp/mso/bpmn/common/scripts/SniroHoming.groovy
new file mode 100755 (executable)
index 0000000..3f53437
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.openecomp.mso.bpmn.common.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+
+import org.openecomp.mso.bpmn.common.scripts.AaiUtil
+import org.openecomp.mso.bpmn.common.scripts.ExceptionUtil
+import org.openecomp.mso.bpmn.common.scripts.SDNCAdapterUtils
+import org.openecomp.mso.bpmn.core.domain.InventoryType
+import org.openecomp.mso.bpmn.core.domain.Resource
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
+import org.openecomp.mso.bpmn.core.domain.Subscriber
+import org.openecomp.mso.bpmn.core.domain.VnfResource
+import org.openecomp.mso.bpmn.core.json.JsonUtils
+import org.openecomp.mso.rest.APIResponse
+import org.openecomp.mso.rest.RESTClient
+import org.openecomp.mso.rest.RESTConfig
+import org.openecomp.mso.bpmn.common.scripts.AbstractServiceTaskProcessor
+
+import org.json.JSONArray
+import org.json.JSONObject
+
+import static org.openecomp.mso.bpmn.common.scripts.GenericUtils.*;
+
+/**
+ * This class is contains the scripts used
+ * by the Homing Subflow building block. The
+ * subflow attempts to home the provided
+ * resources by calling sniro.
+ *
+ * @author cb645j
+ *
+ */
+class SniroHoming extends AbstractServiceTaskProcessor {
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    JsonUtils jsonUtil = new JsonUtils()
+    SNIROUtils sniroUtils = new SNIROUtils(this)
+
+    /**
+     * This method validates the incoming variables.
+     * The method then prepares the sniro request
+     * and posts it to sniro's rest api.
+     *
+     * @param execution
+     *
+     * @author cb645j
+     */
+    public void callSniro(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        execution.setVariable("prefix", "HOME_")
+        utils.log("DEBUG", "*** Started Homing Call Sniro ***", isDebugEnabled)
+        try {
+            execution.setVariable("rollbackData", null)
+            execution.setVariable("rolledBack", false)
+
+            String requestId = execution.getVariable("msoRequestId")
+            utils.log("DEBUG", "Incoming Request Id is: " + requestId, isDebugEnabled)
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+            utils.log("DEBUG", "Incoming Service Instance Id is: " + serviceInstanceId, isDebugEnabled)
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+            utils.log("DEBUG", "Incoming Service Decomposition is: " + serviceDecomposition, isDebugEnabled)
+            String subscriberInfo = execution.getVariable("subscriberInfo")
+            utils.log("DEBUG", "Incoming Subscriber Information is: " + subscriberInfo, isDebugEnabled)
+
+            if (isBlank(requestId) || isBlank(serviceInstanceId) || isBlank(serviceDecomposition.toString()) || isBlank(subscriberInfo)) {
+                exceptionUtil.buildAndThrowWorkflowException(execution, 4000, "A required input variable is missing or null")
+            } else {
+                String subId = jsonUtil.getJsonValue(subscriberInfo, "globalSubscriberId")
+                String subName = jsonUtil.getJsonValue(subscriberInfo, "subscriberName")
+                String subCommonSiteId = ""
+                if (jsonUtil.jsonElementExist(subscriberInfo, "subscriberCommonSiteId")) {
+                    subCommonSiteId = jsonUtil.getJsonValue(subscriberInfo, "subscriberCommonSiteId")
+                }
+                Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)
+
+                String cloudConfiguration = execution.getVariable("cloudConfiguration") // TODO Currently not being used
+                String homingParameters = execution.getVariable("homingParameters")
+                // (aka. request parameters) Should be json format. TODO confirm its json format
+
+                //Authentication
+                def authHeader = ""
+                String basicAuth = execution.getVariable("URN_mso_sniro_auth")
+                String msokey = execution.getVariable("URN_mso_msoKey")
+                String basicAuthValue = utils.encrypt(basicAuth, msokey)
+                if (basicAuthValue != null) {
+                    utils.log("DEBUG", "Obtained BasicAuth username and password for SNIRO Adapter: " + basicAuthValue, isDebugEnabled)
+                    try {
+                        authHeader = utils.getBasicAuth(basicAuthValue, msokey)
+                        execution.setVariable("BasicAuthHeaderValue", authHeader)
+                    } catch (Exception ex) {
+                        utils.log("DEBUG", "Unable to encode username and password string: " + ex, isDebugEnabled)
+                        exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to encode username and password string")
+                    }
+                } else {
+                    utils.log("DEBUG", "Unable to obtain BasicAuth - BasicAuth value null", isDebugEnabled)
+                    exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth value null")
+                }
+
+                //Prepare Callback
+                String timeout = execution.getVariable("timeout")
+                if (isBlank(timeout)) {
+                    timeout = execution.getVariable("URN_mso_sniro_timeout");
+                    if (isBlank(timeout)) {
+                        timeout = "PT30M";
+                    }
+                }
+                utils.log("DEBUG", "Async Callback Timeout will be: " + timeout, isDebugEnabled)
+
+                execution.setVariable("timeout", timeout);
+                execution.setVariable("correlator", requestId);
+                execution.setVariable("messageType", "SNIROResponse");
+
+                //Build Request & Call Sniro
+                String sniroRequest = sniroUtils.buildRequest(execution, requestId, serviceDecomposition, subscriber, homingParameters)
+                execution.setVariable("sniroRequest", sniroRequest)
+                utils.log("DEBUG", "SNIRO Request is: " + sniroRequest, isDebugEnabled)
+
+                String endpoint = execution.getVariable("URN_mso_service_agnostic_sniro_endpoint")
+                String host = execution.getVariable("URN_mso_service_agnostic_sniro_host")
+                String url = host + endpoint
+                utils.log("DEBUG", "Posting to Sniro Url: " + url, isDebugEnabled)
+
+                logDebug("URL to be used is: " + url, isDebugEnabled)
+
+                RESTConfig config = new RESTConfig(url)
+                RESTClient client = new RESTClient(config).addAuthorizationHeader(authHeader).addHeader("Content-Type", "application/json")
+                APIResponse response = client.httpPost(sniroRequest)
+
+                int responseCode = response.getStatusCode()
+                execution.setVariable("syncResponseCode", responseCode);
+                logDebug("SNIRO sync response code is: " + responseCode, isDebugEnabled)
+                String syncResponse = response.getResponseBodyAsString()
+                execution.setVariable("syncResponse", syncResponse);
+                logDebug("SNIRO sync response is: " + syncResponse, isDebugEnabled)
+
+                utils.log("DEBUG", "*** Completed Homing Call Sniro ***", isDebugEnabled)
+            }
+        } catch (BpmnError b) {
+            throw b
+        } catch (Exception e) {
+            utils.log("DEBUG", "Error encountered within Homing CallSniro method: " + e, isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing CallSniro: " + e.getMessage())
+        }
+    }
+
+    /**
+     * This method processes the callback response
+     * and the contained homing solution. It sets
+     * homing solution assignment and license
+     * information to the corresponding resources
+     *
+     * @param execution
+     *
+     * @author cb645j
+     */
+    public void processHomingSolution(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        utils.log("DEBUG", "*** Started Homing Process Homing Solution ***", isDebugEnabled)
+        try {
+            String response = execution.getVariable("asyncCallbackResponse")
+            utils.log("DEBUG", "Sniro Async Callback Response is: " + response, isDebugEnabled)
+            utils.logAudit("Sniro Async Callback Response is: " + response)
+
+            sniroUtils.validateCallbackResponse(execution, response)
+            String placements = jsonUtil.getJsonValue(response, "solutionInfo.placementInfo")
+
+            ServiceDecomposition decomposition = execution.getVariable("serviceDecomposition")
+            utils.log("DEBUG", "Service Decomposition: " + decomposition, isDebugEnabled)
+
+            List<Resource> resourceList = decomposition.getServiceResources()
+            JSONArray arr = new JSONArray(placements)
+            for (int i = 0; i < arr.length(); i++) {
+                JSONObject placement = arr.getJSONObject(i)
+                String jsonServiceResourceId = placement.getString("serviceResourceId")
+                for (Resource resource : resourceList) {
+                    String serviceResourceId = resource.getResourceId()
+                    if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)) {
+                        //match
+                        String inventoryType = placement.getString("inventoryType")
+                        resource.getHomingSolution().setInventoryType(InventoryType.valueOf(inventoryType))
+                        resource.getHomingSolution().setCloudRegionId(placement.getString("cloudRegionId"))
+                        resource.getHomingSolution().setRehome(placement.getBoolean("isRehome"))
+                        JSONArray assignmentArr = placement.getJSONArray("assignmentInfo")
+                        Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "variableName", "variableValue")
+                        resource.getHomingSolution().setCloudOwner(assignmentMap.get("cloudOwner"))
+                        resource.getHomingSolution().setAicClli(assignmentMap.get("aicClli"))
+                        resource.getHomingSolution().setAicVersion(assignmentMap.get("aicVersion"))
+                        if (inventoryType.equalsIgnoreCase("service")) {
+                            VnfResource vnf = new VnfResource()
+                            vnf.setVnfHostname(assignmentMap.get("vnfHostName"))
+                            resource.getHomingSolution().setVnf(vnf)
+                            resource.getHomingSolution().setServiceInstanceId(placement.getString("serviceInstanceId"))
+                        }
+                    }
+                }
+            }
+            if (JsonUtils.jsonElementExist(response, "solutionInfo.licenseInfo")) {
+                String licenseInfo = jsonUtil.getJsonValue(response, "solutionInfo.licenseInfo")
+                JSONArray licenseArr = new JSONArray(licenseInfo)
+                for (int l = 0; l < licenseArr.length(); l++) {
+                    JSONObject license = licenseArr.getJSONObject(l)
+                    String jsonServiceResourceId = license.getString("serviceResourceId")
+                    for (Resource resource : resourceList) {
+                        String serviceResourceId = resource.getResourceId()
+                        if (serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)) {
+                            //match
+                            String jsonEntitlementPoolList = jsonUtil.getJsonValue(license.toString(), "entitlementPoolList")
+                            List<String> entitlementPoolList = jsonUtil.StringArrayToList(execution, jsonEntitlementPoolList)
+                            resource.getHomingSolution().getLicense().setEntitlementPoolList(entitlementPoolList)
+
+                            String jsonLicenseKeyGroupList = jsonUtil.getJsonValue(license.toString(), "licenseKeyGroupList")
+                            List<String> licenseKeyGroupList = jsonUtil.StringArrayToList(execution, jsonLicenseKeyGroupList)
+                            resource.getHomingSolution().getLicense().setLicenseKeyGroupList(licenseKeyGroupList)
+                        }
+                    }
+                }
+            }
+            execution.setVariable("serviceDecomposition", decomposition)
+            execution.setVariable("homingSolution", placements) //TODO - can be removed as output variable
+
+            utils.log("DEBUG", "*** Completed Homing Process Homing Solution ***", isDebugEnabled)
+        } catch (BpmnError b) {
+            throw b
+        } catch (Exception e) {
+            utils.log("DEBUG", "Error encountered within Homing ProcessHomingSolution method: " + e, isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing ProcessHomingSolution")
+        }
+    }
+
+    /**
+     * This method logs the start of DHVCreateService
+     * to make debugging easier.
+     *
+     * @param - execution
+     * @author cb645j
+     */
+    public String logStart(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
+        String requestId = execution.getVariable("testReqId")
+        if (isBlank(requestId)) {
+            requestId = execution.getVariable("msoRequestId")
+        }
+        execution.setVariable("DHVCS_requestId", requestId)
+        utils.log("DEBUG", "***** STARTED Homing Subflow for request: " + requestId + " *****", "true")
+        utils.log("DEBUG", "****** Homing Subflow Global Debug Enabled: " + isDebugEnabled + " *****", "true")
+        utils.logAudit("***** STARTED Homing Subflow for request: " + requestId + " *****")
+    }
+
+    /**
+     * Auto-generated method stub
+     */
+    public void preProcessRequest(DelegateExecution execution) {}
+
+}
index 481d1df..91a6546 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="_vwRmIBsREeeIQtzUKIjH4g" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.4.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">\r
-  <bpmn2:process id="Homing" name="Homing" isExecutable="true">\r
-    <bpmn2:startEvent id="StartEvent_1">\r
-      <bpmn2:outgoing>SequenceFlow_1x9usa6</bpmn2:outgoing>\r
-    </bpmn2:startEvent>\r
-    <bpmn2:scriptTask id="callSniro" name="Call Sniro" scriptFormat="groovy">\r
-      <bpmn2:incoming>SequenceFlow_1x9usa6</bpmn2:incoming>\r
-      <bpmn2:outgoing>SequenceFlow_10x3ocp</bpmn2:outgoing>\r
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*\r
-Homing sniro = new Homing()\r
-sniro.callSniro(execution)]]></bpmn2:script>\r
-    </bpmn2:scriptTask>\r
-    <bpmn2:sequenceFlow id="SequenceFlow_1x9usa6" sourceRef="StartEvent_1" targetRef="callSniro" />\r
-    <bpmn2:subProcess id="bpmnErrorSubprocess" name="Error Handling Subprocess" triggeredByEvent="true">\r
-      <bpmn2:endEvent id="EndEvent_07tjq3v">\r
-        <bpmn2:incoming>SequenceFlow_1rf4vs8</bpmn2:incoming>\r
-        <bpmn2:terminateEventDefinition />\r
-      </bpmn2:endEvent>\r
-      <bpmn2:startEvent id="StartEvent_1qiitb2">\r
-        <bpmn2:outgoing>SequenceFlow_00nlh7l</bpmn2:outgoing>\r
-        <bpmn2:errorEventDefinition />\r
-      </bpmn2:startEvent>\r
-      <bpmn2:scriptTask id="processMsoWorkflowException" name="Process Error" scriptFormat="groovy">\r
-        <bpmn2:incoming>SequenceFlow_00nlh7l</bpmn2:incoming>\r
-        <bpmn2:outgoing>SequenceFlow_1rf4vs8</bpmn2:outgoing>\r
-        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*\r
-ExceptionUtil ex = new ExceptionUtil()\r
-ex.processSubflowsBPMNException(execution)]]></bpmn2:script>\r
-      </bpmn2:scriptTask>\r
-      <bpmn2:sequenceFlow id="SequenceFlow_1rf4vs8" sourceRef="processMsoWorkflowException" targetRef="EndEvent_07tjq3v" />\r
-      <bpmn2:sequenceFlow id="SequenceFlow_00nlh7l" sourceRef="StartEvent_1qiitb2" targetRef="processMsoWorkflowException" />\r
-    </bpmn2:subProcess>\r
-    <bpmn2:subProcess id="javaExceptionSubProcess" name="Java Exception Sub Process" triggeredByEvent="true">\r
-      <bpmn2:scriptTask id="processJavaException" name="Process Error" scriptFormat="groovy">\r
-        <bpmn2:incoming>SequenceFlow_0kamg53</bpmn2:incoming>\r
-        <bpmn2:outgoing>SequenceFlow_1o7154s</bpmn2:outgoing>\r
-        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*\r
-ExceptionUtil ex = new ExceptionUtil()\r
-ex.processJavaException(execution)]]></bpmn2:script>\r
-      </bpmn2:scriptTask>\r
-      <bpmn2:startEvent id="StartEvent_1fbpeuw">\r
-        <bpmn2:outgoing>SequenceFlow_0kamg53</bpmn2:outgoing>\r
-        <bpmn2:errorEventDefinition errorRef="Error_1lwpypa" />\r
-      </bpmn2:startEvent>\r
-      <bpmn2:endEvent id="EndEvent_0jbvnr0">\r
-        <bpmn2:incoming>SequenceFlow_1o7154s</bpmn2:incoming>\r
-        <bpmn2:terminateEventDefinition />\r
-      </bpmn2:endEvent>\r
-      <bpmn2:sequenceFlow id="SequenceFlow_0kamg53" name="" sourceRef="StartEvent_1fbpeuw" targetRef="processJavaException" />\r
-      <bpmn2:sequenceFlow id="SequenceFlow_1o7154s" name="" sourceRef="processJavaException" targetRef="EndEvent_0jbvnr0" />\r
-    </bpmn2:subProcess>\r
-    <bpmn2:scriptTask id="processHomingSolution" name="Process &#10;Solution&#10;" scriptFormat="groovy">\r
-      <bpmn2:incoming>SequenceFlow_043r3j8</bpmn2:incoming>\r
-      <bpmn2:outgoing>SequenceFlow_1h9opg9</bpmn2:outgoing>\r
-      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*\r
-Homing homing = new Homing()\r
-homing.processHomingSolution(execution)]]></bpmn2:script>\r
-    </bpmn2:scriptTask>\r
-    <bpmn2:exclusiveGateway id="responseCheck" name="Response Ok?" default="badResponse">\r
-      <bpmn2:incoming>SequenceFlow_10x3ocp</bpmn2:incoming>\r
-      <bpmn2:outgoing>badResponse</bpmn2:outgoing>\r
-      <bpmn2:outgoing>goodResponse</bpmn2:outgoing>\r
-    </bpmn2:exclusiveGateway>\r
-    <bpmn2:sequenceFlow id="SequenceFlow_10x3ocp" sourceRef="callSniro" targetRef="responseCheck" />\r
-    <bpmn2:scriptTask id="assignError" name="Assign Error" scriptFormat="groovy">\r
-      <bpmn2:incoming>badResponse</bpmn2:incoming>\r
-      <bpmn2:outgoing>SequenceFlow_0clfkld</bpmn2:outgoing>\r
-      <bpmn2:script><![CDATA[int responseCode = execution.getVariable("syncResponseCode") \r
-\r
-import org.openecomp.mso.bpmn.common.scripts.*\r
-ExceptionUtil ex = new ExceptionUtil()\r
-ex.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from Sniro.")]]></bpmn2:script>\r
-    </bpmn2:scriptTask>\r
-    <bpmn2:sequenceFlow id="badResponse" name="No" sourceRef="responseCheck" targetRef="assignError" />\r
-    <bpmn2:sequenceFlow id="SequenceFlow_0clfkld" sourceRef="assignError" targetRef="throwMSOWorkflowException" />\r
-    <bpmn2:endEvent id="throwMSOWorkflowException">\r
-      <bpmn2:incoming>SequenceFlow_0clfkld</bpmn2:incoming>\r
-      <bpmn2:errorEventDefinition errorRef="Error_10hit0u" />\r
-    </bpmn2:endEvent>\r
-    <bpmn2:sequenceFlow id="goodResponse" name="Yes" sourceRef="responseCheck" targetRef="receiveAsyncCallback">\r
-      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("syncResponseCode") == 202}]]></bpmn2:conditionExpression>\r
-    </bpmn2:sequenceFlow>\r
-    <bpmn2:sequenceFlow id="SequenceFlow_043r3j8" sourceRef="receiveAsyncCallback" targetRef="processHomingSolution" />\r
-    <bpmn2:callActivity id="receiveAsyncCallback" name="Receive Async Callback" calledElement="ReceiveWorkflowMessage" camunda:modelerTemplate="receiveWorkflowMessage">\r
-      <bpmn2:extensionElements>\r
-        <camunda:in source="true" target="isDebugLogEnabled" />\r
-        <camunda:out source="WorkflowException" target="WorkflowException" />\r
-        <camunda:in source="messageType" target="RCVWFMSG_messageType" />\r
-        <camunda:in source="correlator" target="RCVWFMSG_correlator" />\r
-        <camunda:in source="timeout" target="RCVWFMSG_timeout" />\r
-        <camunda:out source="WorkflowResponse" target="asyncCallbackResponse" />\r
-      </bpmn2:extensionElements>\r
-      <bpmn2:incoming>goodResponse</bpmn2:incoming>\r
-      <bpmn2:outgoing>SequenceFlow_043r3j8</bpmn2:outgoing>\r
-    </bpmn2:callActivity>\r
-    <bpmn2:sequenceFlow id="SequenceFlow_1h9opg9" sourceRef="processHomingSolution" targetRef="EndEvent_0n56tas" />\r
-    <bpmn2:endEvent id="EndEvent_0n56tas">\r
-      <bpmn2:incoming>SequenceFlow_1h9opg9</bpmn2:incoming>\r
-      <bpmn2:terminateEventDefinition />\r
-    </bpmn2:endEvent>\r
-  </bpmn2:process>\r
-  <bpmn2:error id="Error_10hit0u" name="MSO Workflow Exception" errorCode="MSOWorkflowException" />\r
-  <bpmn2:error id="Error_1lwpypa" name="Java Lang Exception" errorCode="java.lang.Exception" />\r
-  <bpmndi:BPMNDiagram id="BPMNDiagram_1">\r
-    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Homing">\r
-      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">\r
-        <dc:Bounds x="147" y="275" width="36" height="36" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="ScriptTask_0qmfpdr_di" bpmnElement="callSniro">\r
-        <dc:Bounds x="286" y="253" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1x9usa6_di" bpmnElement="SequenceFlow_1x9usa6">\r
-        <di:waypoint xsi:type="dc:Point" x="183" y="293" />\r
-        <di:waypoint xsi:type="dc:Point" x="286" y="293" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="235" y="278" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="SubProcess_16p12qo_di" bpmnElement="bpmnErrorSubprocess" isExpanded="true">\r
-        <dc:Bounds x="254" y="496" width="409" height="168" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="SubProcess_12gjiy8_di" bpmnElement="javaExceptionSubProcess" isExpanded="true">\r
-        <dc:Bounds x="284" y="679" width="350" height="159" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="EndEvent_07tjq3v_di" bpmnElement="EndEvent_07tjq3v">\r
-        <dc:Bounds x="579" y="570" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="597" y="611" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="StartEvent_1qiitb2_di" bpmnElement="StartEvent_1qiitb2">\r
-        <dc:Bounds x="299" y="570" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="317" y="611" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="ScriptTask_03hs6s9_di" bpmnElement="processMsoWorkflowException">\r
-        <dc:Bounds x="406" y="548" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="ScriptTask_19gqykh_di" bpmnElement="processJavaException">\r
-        <dc:Bounds x="410" y="727" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="StartEvent_1fbpeuw_di" bpmnElement="StartEvent_1fbpeuw">\r
-        <dc:Bounds x="318" y="749" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="336" y="790" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="EndEvent_0jbvnr0_di" bpmnElement="EndEvent_0jbvnr0">\r
-        <dc:Bounds x="567" y="749" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="585" y="790" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1rf4vs8_di" bpmnElement="SequenceFlow_1rf4vs8">\r
-        <di:waypoint xsi:type="dc:Point" x="506" y="588" />\r
-        <di:waypoint xsi:type="dc:Point" x="579" y="588" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="543" y="573" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_00nlh7l_di" bpmnElement="SequenceFlow_00nlh7l">\r
-        <di:waypoint xsi:type="dc:Point" x="335" y="588" />\r
-        <di:waypoint xsi:type="dc:Point" x="363" y="588" />\r
-        <di:waypoint xsi:type="dc:Point" x="363" y="588" />\r
-        <di:waypoint xsi:type="dc:Point" x="406" y="588" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="378" y="588" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_0kamg53_di" bpmnElement="SequenceFlow_0kamg53">\r
-        <di:waypoint xsi:type="dc:Point" x="354" y="767" />\r
-        <di:waypoint xsi:type="dc:Point" x="410" y="767" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="382" y="752" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1o7154s_di" bpmnElement="SequenceFlow_1o7154s">\r
-        <di:waypoint xsi:type="dc:Point" x="510" y="767" />\r
-        <di:waypoint xsi:type="dc:Point" x="567" y="767" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="539" y="752" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="ScriptTask_1aapkvq_di" bpmnElement="processHomingSolution">\r
-        <dc:Bounds x="630" y="325" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNShape id="ExclusiveGateway_03gt5b8_di" bpmnElement="responseCheck" isMarkerVisible="true">\r
-        <dc:Bounds x="419" y="268" width="50" height="50" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="474" y="287" width="74" height="12" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_10x3ocp_di" bpmnElement="SequenceFlow_10x3ocp">\r
-        <di:waypoint xsi:type="dc:Point" x="386" y="293" />\r
-        <di:waypoint xsi:type="dc:Point" x="419" y="293" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="403" y="278" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="ScriptTask_0ikcqeo_di" bpmnElement="assignError">\r
-        <dc:Bounds x="490" y="176" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1m1c9nu_di" bpmnElement="badResponse">\r
-        <di:waypoint xsi:type="dc:Point" x="444" y="268" />\r
-        <di:waypoint xsi:type="dc:Point" x="444" y="216" />\r
-        <di:waypoint xsi:type="dc:Point" x="490" y="216" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="451" y="226" width="14" height="12" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_0clfkld_di" bpmnElement="SequenceFlow_0clfkld">\r
-        <di:waypoint xsi:type="dc:Point" x="590" y="216" />\r
-        <di:waypoint xsi:type="dc:Point" x="662" y="216" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="626" y="201" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="EndEvent_13ejfwp_di" bpmnElement="throwMSOWorkflowException">\r
-        <dc:Bounds x="662" y="198" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="680" y="234" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1o3br3u_di" bpmnElement="goodResponse">\r
-        <di:waypoint xsi:type="dc:Point" x="444" y="318" />\r
-        <di:waypoint xsi:type="dc:Point" x="444" y="365" />\r
-        <di:waypoint xsi:type="dc:Point" x="490" y="365" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="447" y="339.5" width="18" height="12" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_043r3j8_di" bpmnElement="SequenceFlow_043r3j8">\r
-        <di:waypoint xsi:type="dc:Point" x="590" y="365" />\r
-        <di:waypoint xsi:type="dc:Point" x="630" y="365" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="610" y="350" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="CallActivity_031b5m3_di" bpmnElement="receiveAsyncCallback">\r
-        <dc:Bounds x="490" y="325" width="100" height="80" />\r
-      </bpmndi:BPMNShape>\r
-      <bpmndi:BPMNEdge id="SequenceFlow_1h9opg9_di" bpmnElement="SequenceFlow_1h9opg9">\r
-        <di:waypoint xsi:type="dc:Point" x="730" y="365" />\r
-        <di:waypoint xsi:type="dc:Point" x="825" y="365" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="778" y="350" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNEdge>\r
-      <bpmndi:BPMNShape id="EndEvent_0ougemc_di" bpmnElement="EndEvent_0n56tas">\r
-        <dc:Bounds x="825" y="347" width="36" height="36" />\r
-        <bpmndi:BPMNLabel>\r
-          <dc:Bounds x="843" y="383" width="0" height="0" />\r
-        </bpmndi:BPMNLabel>\r
-      </bpmndi:BPMNShape>\r
-    </bpmndi:BPMNPlane>\r
-  </bpmndi:BPMNDiagram>\r
-</bpmn2:definitions>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="_vwRmIBsREeeIQtzUKIjH4g" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.11.3" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Homing" name="Homing" isExecutable="true">
+    <bpmn2:startEvent id="StartEvent_1">
+      <bpmn2:outgoing>SequenceFlow_1x9usa6</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:scriptTask id="callSniro" name="Call Sniro" scriptFormat="groovy">
+      <bpmn2:incoming>sniroCall</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0gajic6</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+SniroHoming homing = new SniroHoming()
+homing.callSniro(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_1x9usa6" sourceRef="StartEvent_1" targetRef="homingSolutionCheck" />
+    <bpmn2:subProcess id="bpmnErrorSubprocess" name="Error Handling Subprocess" triggeredByEvent="true">
+      <bpmn2:endEvent id="EndEvent_07tjq3v">
+        <bpmn2:incoming>SequenceFlow_1rf4vs8</bpmn2:incoming>
+        <bpmn2:terminateEventDefinition />
+      </bpmn2:endEvent>
+      <bpmn2:startEvent id="StartEvent_1qiitb2">
+        <bpmn2:outgoing>SequenceFlow_00nlh7l</bpmn2:outgoing>
+        <bpmn2:errorEventDefinition />
+      </bpmn2:startEvent>
+      <bpmn2:scriptTask id="processMsoWorkflowException" name="Process Error" scriptFormat="groovy">
+        <bpmn2:incoming>SequenceFlow_00nlh7l</bpmn2:incoming>
+        <bpmn2:outgoing>SequenceFlow_1rf4vs8</bpmn2:outgoing>
+        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processSubflowsBPMNException(execution)]]></bpmn2:script>
+      </bpmn2:scriptTask>
+      <bpmn2:sequenceFlow id="SequenceFlow_1rf4vs8" sourceRef="processMsoWorkflowException" targetRef="EndEvent_07tjq3v" />
+      <bpmn2:sequenceFlow id="SequenceFlow_00nlh7l" sourceRef="StartEvent_1qiitb2" targetRef="processMsoWorkflowException" />
+    </bpmn2:subProcess>
+    <bpmn2:subProcess id="javaExceptionSubProcess" name="Java Exception Sub Process" triggeredByEvent="true">
+      <bpmn2:scriptTask id="processJavaException" name="Process Error" scriptFormat="groovy">
+        <bpmn2:incoming>SequenceFlow_0kamg53</bpmn2:incoming>
+        <bpmn2:outgoing>SequenceFlow_1o7154s</bpmn2:outgoing>
+        <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.processJavaException(execution)]]></bpmn2:script>
+      </bpmn2:scriptTask>
+      <bpmn2:startEvent id="StartEvent_1fbpeuw">
+        <bpmn2:outgoing>SequenceFlow_0kamg53</bpmn2:outgoing>
+        <bpmn2:errorEventDefinition errorRef="Error_1lwpypa" />
+      </bpmn2:startEvent>
+      <bpmn2:endEvent id="EndEvent_0jbvnr0">
+        <bpmn2:incoming>SequenceFlow_1o7154s</bpmn2:incoming>
+        <bpmn2:terminateEventDefinition />
+      </bpmn2:endEvent>
+      <bpmn2:sequenceFlow id="SequenceFlow_0kamg53" name="" sourceRef="StartEvent_1fbpeuw" targetRef="processJavaException" />
+      <bpmn2:sequenceFlow id="SequenceFlow_1o7154s" name="" sourceRef="processJavaException" targetRef="EndEvent_0jbvnr0" />
+    </bpmn2:subProcess>
+    <bpmn2:scriptTask id="processSniroHomingSolution" name="Process &#10;Sniro Homing Solution&#10;" scriptFormat="groovy">
+      <bpmn2:incoming>sniroProcess</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1h9opg9</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+SniroHoming homing = new SniroHoming()
+homing.processHomingSolution(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:exclusiveGateway id="responseCheck" name="Response Ok?" default="badResponse">
+      <bpmn2:incoming>SequenceFlow_12t0lqb</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_0gajic6</bpmn2:incoming>
+      <bpmn2:outgoing>badResponse</bpmn2:outgoing>
+      <bpmn2:outgoing>goodResponse</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:scriptTask id="assignError" name="Assign Error" scriptFormat="groovy">
+      <bpmn2:incoming>badResponse</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0clfkld</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[int responseCode = execution.getVariable("syncResponseCode") 
+
+import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from Sniro/OOF.")]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="badResponse" name="No" sourceRef="responseCheck" targetRef="assignError" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0clfkld" sourceRef="assignError" targetRef="throwMSOWorkflowException2" />
+    <bpmn2:endEvent id="throwMSOWorkflowException2">
+      <bpmn2:incoming>SequenceFlow_0clfkld</bpmn2:incoming>
+      <bpmn2:errorEventDefinition errorRef="Error_10hit0u" />
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="goodResponse" name="Yes" sourceRef="responseCheck" targetRef="receiveAsyncCallback">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("syncResponseCode") == 202}]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:callActivity id="receiveAsyncCallback" name="Receive Async Callback" camunda:modelerTemplate="receiveWorkflowMessage" calledElement="ReceiveWorkflowMessage">
+      <bpmn2:extensionElements>
+        <camunda:in source="true" target="isDebugLogEnabled" />
+        <camunda:out source="WorkflowException" target="WorkflowException" />
+        <camunda:in source="messageType" target="RCVWFMSG_messageType" />
+        <camunda:in source="correlator" target="RCVWFMSG_correlator" />
+        <camunda:in source="timeout" target="RCVWFMSG_timeout" />
+        <camunda:out source="WorkflowResponse" target="asyncCallbackResponse" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>goodResponse</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1fipbmk</bpmn2:outgoing>
+    </bpmn2:callActivity>
+    <bpmn2:sequenceFlow id="SequenceFlow_1h9opg9" sourceRef="processSniroHomingSolution" targetRef="EndEvent_0n56tas" />
+    <bpmn2:endEvent id="EndEvent_0n56tas">
+      <bpmn2:incoming>SequenceFlow_1h9opg9</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_07u9d7f</bpmn2:incoming>
+      <bpmn2:terminateEventDefinition />
+    </bpmn2:endEvent>
+    <bpmn2:exclusiveGateway id="homingSolutionCheck" name="Which homing Solution?" default="SequenceFlow_02eywxz">
+      <bpmn2:incoming>SequenceFlow_1x9usa6</bpmn2:incoming>
+      <bpmn2:outgoing>sniroCall</bpmn2:outgoing>
+      <bpmn2:outgoing>oofCall</bpmn2:outgoing>
+      <bpmn2:outgoing>SequenceFlow_02eywxz</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:scriptTask id="ScriptTask_1pkjo1d" name="Call OOF" scriptFormat="groovy">
+      <bpmn2:incoming>oofCall</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_12t0lqb</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+OofHoming homing = new OofHoming()
+homing.callOof(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="sniroCall" name="Sniro" sourceRef="homingSolutionCheck" targetRef="callSniro">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("homingService") == "sniro"}]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="oofCall" name="OOF" sourceRef="homingSolutionCheck" targetRef="ScriptTask_1pkjo1d">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("homingService") == "oof"}]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="SequenceFlow_12t0lqb" sourceRef="ScriptTask_1pkjo1d" targetRef="responseCheck" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0gajic6" sourceRef="callSniro" targetRef="responseCheck" />
+    <bpmn2:exclusiveGateway id="processHomingCheck" name="Which homing Solution?">
+      <bpmn2:incoming>SequenceFlow_1fipbmk</bpmn2:incoming>
+      <bpmn2:outgoing>sniroProcess</bpmn2:outgoing>
+      <bpmn2:outgoing>oofProcess</bpmn2:outgoing>
+    </bpmn2:exclusiveGateway>
+    <bpmn2:sequenceFlow id="SequenceFlow_1fipbmk" sourceRef="receiveAsyncCallback" targetRef="processHomingCheck" />
+    <bpmn2:sequenceFlow id="sniroProcess" name="Sniro" sourceRef="processHomingCheck" targetRef="processSniroHomingSolution">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("homingService") == "sniro"}]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="oofProcess" name="OOF" sourceRef="processHomingCheck" targetRef="processOofHomingSolution">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression"><![CDATA[#{execution.getVariable("homingService") == "oof"}]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:scriptTask id="processOofHomingSolution" name="Process &#10;OOF Homing Solution&#10;" scriptFormat="groovy">
+      <bpmn2:incoming>oofProcess</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_07u9d7f</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[import org.openecomp.mso.bpmn.common.scripts.*
+OofHoming homing = new OofHoming()
+homing.processHomingSolution(execution)]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_07u9d7f" sourceRef="processOofHomingSolution" targetRef="EndEvent_0n56tas" />
+    <bpmn2:endEvent id="throwMSOWorkflowException1">
+      <bpmn2:incoming>SequenceFlow_1bub8mj</bpmn2:incoming>
+      <bpmn2:errorEventDefinition errorRef="Error_10hit0u" />
+    </bpmn2:endEvent>
+    <bpmn2:scriptTask id="ScriptTask_0t0fs4n" name="Assign Error" scriptFormat="groovy">
+      <bpmn2:incoming>SequenceFlow_02eywxz</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1bub8mj</bpmn2:outgoing>
+      <bpmn2:script><![CDATA[int responseCode = execution.getVariable("sniroHomingSolution")
+
+import org.openecomp.mso.bpmn.common.scripts.*
+ExceptionUtil ex = new ExceptionUtil()
+ex.buildAndThrowWorkflowException(execution, responseCode, "No sniroHomingSolution found for Sniro/OOF.")]]></bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_1bub8mj" sourceRef="ScriptTask_0t0fs4n" targetRef="throwMSOWorkflowException1" />
+    <bpmn2:sequenceFlow id="SequenceFlow_02eywxz" sourceRef="homingSolutionCheck" targetRef="ScriptTask_0t0fs4n" />
+  </bpmn2:process>
+  <bpmn2:error id="Error_10hit0u" name="MSO Workflow Exception" errorCode="MSOWorkflowException" />
+  <bpmn2:error id="Error_1lwpypa" name="Java Lang Exception" errorCode="java.lang.Exception" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Homing">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="147" y="275" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0qmfpdr_di" bpmnElement="callSniro">
+        <dc:Bounds x="391" y="137" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1x9usa6_di" bpmnElement="SequenceFlow_1x9usa6">
+        <di:waypoint xsi:type="dc:Point" x="183" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="274" y="293" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="183.5" y="278" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="SubProcess_16p12qo_di" bpmnElement="bpmnErrorSubprocess" isExpanded="true">
+        <dc:Bounds x="254" y="496" width="409" height="168" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_12gjiy8_di" bpmnElement="javaExceptionSubProcess" isExpanded="true">
+        <dc:Bounds x="284" y="679" width="350" height="159" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_07tjq3v_di" bpmnElement="EndEvent_07tjq3v">
+        <dc:Bounds x="579" y="570" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="597" y="611" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_1qiitb2_di" bpmnElement="StartEvent_1qiitb2">
+        <dc:Bounds x="299" y="570" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="317" y="611" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_03hs6s9_di" bpmnElement="processMsoWorkflowException">
+        <dc:Bounds x="406" y="548" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_19gqykh_di" bpmnElement="processJavaException">
+        <dc:Bounds x="410" y="727" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_1fbpeuw_di" bpmnElement="StartEvent_1fbpeuw">
+        <dc:Bounds x="318" y="749" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="336" y="790" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_0jbvnr0_di" bpmnElement="EndEvent_0jbvnr0">
+        <dc:Bounds x="567" y="749" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="585" y="790" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1rf4vs8_di" bpmnElement="SequenceFlow_1rf4vs8">
+        <di:waypoint xsi:type="dc:Point" x="506" y="588" />
+        <di:waypoint xsi:type="dc:Point" x="579" y="588" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="543" y="573" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_00nlh7l_di" bpmnElement="SequenceFlow_00nlh7l">
+        <di:waypoint xsi:type="dc:Point" x="335" y="588" />
+        <di:waypoint xsi:type="dc:Point" x="363" y="588" />
+        <di:waypoint xsi:type="dc:Point" x="363" y="588" />
+        <di:waypoint xsi:type="dc:Point" x="406" y="588" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="378" y="588" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0kamg53_di" bpmnElement="SequenceFlow_0kamg53">
+        <di:waypoint xsi:type="dc:Point" x="354" y="767" />
+        <di:waypoint xsi:type="dc:Point" x="410" y="767" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="382" y="752" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1o7154s_di" bpmnElement="SequenceFlow_1o7154s">
+        <di:waypoint xsi:type="dc:Point" x="510" y="767" />
+        <di:waypoint xsi:type="dc:Point" x="567" y="767" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="539" y="752" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1aapkvq_di" bpmnElement="processSniroHomingSolution">
+        <dc:Bounds x="1293" y="253" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_03gt5b8_di" bpmnElement="responseCheck" isMarkerVisible="true">
+        <dc:Bounds x="566" y="268" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="554" y="328" width="74" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0ikcqeo_di" bpmnElement="assignError">
+        <dc:Bounds x="777" y="184" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1m1c9nu_di" bpmnElement="badResponse">
+        <di:waypoint xsi:type="dc:Point" x="610" y="287" />
+        <di:waypoint xsi:type="dc:Point" x="777" y="239" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="665.309770337371" y="246.39875517690592" width="14" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0clfkld_di" bpmnElement="SequenceFlow_0clfkld">
+        <di:waypoint xsi:type="dc:Point" x="877" y="224" />
+        <di:waypoint xsi:type="dc:Point" x="949" y="224" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="868" y="209" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_13ejfwp_di" bpmnElement="throwMSOWorkflowException2">
+        <dc:Bounds x="949" y="206" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="922" y="242" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1o3br3u_di" bpmnElement="goodResponse">
+        <di:waypoint xsi:type="dc:Point" x="610" y="299" />
+        <di:waypoint xsi:type="dc:Point" x="777" y="356" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="667.027112499105" y="300.1275453507" width="19" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_031b5m3_di" bpmnElement="receiveAsyncCallback">
+        <dc:Bounds x="777" y="333" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1h9opg9_di" bpmnElement="SequenceFlow_1h9opg9">
+        <di:waypoint xsi:type="dc:Point" x="1393" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="1509" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="1509" y="355" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1406" y="278" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_0ougemc_di" bpmnElement="EndEvent_0n56tas">
+        <dc:Bounds x="1491" y="355" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1464" y="391" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_03vhlpt_di" bpmnElement="homingSolutionCheck" isMarkerVisible="true">
+        <dc:Bounds x="274" y="268" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="266" y="322" width="69" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1pkjo1d_di" bpmnElement="ScriptTask_1pkjo1d">
+        <dc:Bounds x="391" y="370" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1x12ld7_di" bpmnElement="sniroCall">
+        <di:waypoint xsi:type="dc:Point" x="299" y="268" />
+        <di:waypoint xsi:type="dc:Point" x="299" y="177" />
+        <di:waypoint xsi:type="dc:Point" x="391" y="177" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="329" y="192" width="25" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0iu4ms3_di" bpmnElement="oofCall">
+        <di:waypoint xsi:type="dc:Point" x="299" y="318" />
+        <di:waypoint xsi:type="dc:Point" x="299" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="391" y="410" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="333" y="378" width="25" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_12t0lqb_di" bpmnElement="SequenceFlow_12t0lqb">
+        <di:waypoint xsi:type="dc:Point" x="491" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="591" y="410" />
+        <di:waypoint xsi:type="dc:Point" x="591" y="318" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="496" y="389" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0gajic6_di" bpmnElement="SequenceFlow_0gajic6">
+        <di:waypoint xsi:type="dc:Point" x="491" y="177" />
+        <di:waypoint xsi:type="dc:Point" x="591" y="177" />
+        <di:waypoint xsi:type="dc:Point" x="591" y="268" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="496" y="156" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0dwcgfe_di" bpmnElement="processHomingCheck" isMarkerVisible="true">
+        <dc:Bounds x="942" y="348" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="934" y="402" width="69" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1fipbmk_di" bpmnElement="SequenceFlow_1fipbmk">
+        <di:waypoint xsi:type="dc:Point" x="877" y="373" />
+        <di:waypoint xsi:type="dc:Point" x="942" y="373" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="909.5" y="352" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_14jzswu_di" bpmnElement="sniroProcess">
+        <di:waypoint xsi:type="dc:Point" x="967" y="348" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="1293" y="293" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1034" y="312" width="25" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_158imry_di" bpmnElement="oofProcess">
+        <di:waypoint xsi:type="dc:Point" x="967" y="398" />
+        <di:waypoint xsi:type="dc:Point" x="967" y="469" />
+        <di:waypoint xsi:type="dc:Point" x="1293" y="469" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1039" y="432" width="25" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0ihb64o_di" bpmnElement="processOofHomingSolution">
+        <dc:Bounds x="1293" y="429" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_07u9d7f_di" bpmnElement="SequenceFlow_07u9d7f">
+        <di:waypoint xsi:type="dc:Point" x="1393" y="469" />
+        <di:waypoint xsi:type="dc:Point" x="1509" y="469" />
+        <di:waypoint xsi:type="dc:Point" x="1509" y="391" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1451" y="448" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_1rxyas7_di" bpmnElement="throwMSOWorkflowException1">
+        <dc:Bounds x="507" y="275" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="480" y="311" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0t0fs4n_di" bpmnElement="ScriptTask_0t0fs4n">
+        <dc:Bounds x="364" y="253" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bub8mj_di" bpmnElement="SequenceFlow_1bub8mj">
+        <di:waypoint xsi:type="dc:Point" x="464" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="507" y="293" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="485.5" y="272" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_02eywxz_di" bpmnElement="SequenceFlow_02eywxz">
+        <di:waypoint xsi:type="dc:Point" x="324" y="293" />
+        <di:waypoint xsi:type="dc:Point" x="364" y="293" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="344" y="272" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/common/OofHomingTest.java
new file mode 100644 (file)
index 0000000..45645be
--- /dev/null
@@ -0,0 +1,824 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+/*
+ * Â© 2014 AT&T Intellectual Property. All rights reserved. Used under license from AT&T Intellectual Property.
+ */
+package org.openecomp.mso.bpmn.common;
+
+import org.camunda.bpm.engine.test.Deployment;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.openecomp.mso.bpmn.core.WorkflowException;
+import org.openecomp.mso.bpmn.core.domain.AllottedResource;
+import org.openecomp.mso.bpmn.core.domain.HomingSolution;
+import org.openecomp.mso.bpmn.core.domain.ModelInfo;
+import org.openecomp.mso.bpmn.core.domain.NetworkResource;
+import org.openecomp.mso.bpmn.core.domain.Resource;
+import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition;
+import org.openecomp.mso.bpmn.core.domain.ServiceInstance;
+import org.openecomp.mso.bpmn.core.domain.VnfResource;
+import org.openecomp.mso.bpmn.mock.FileUtil;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.openecomp.mso.bpmn.mock.StubResponseDatabase.MockGetServiceResourcesCatalogDataByModelUuid;
+import static org.openecomp.mso.bpmn.mock.StubResponseOof.mockOof;
+import static org.openecomp.mso.bpmn.mock.StubResponseOof.mockOof_500;
+
+
+/**
+ * Test the OOF Homing subflow building block.
+ */
+public class OofHomingTest extends WorkflowTest {
+
+    ServiceDecomposition serviceDecomposition = new ServiceDecomposition();
+    String subscriber = "";
+    String subscriber2 = "";
+
+    private final CallbackSet callbacks = new CallbackSet();
+
+    public OofHomingTest() throws IOException {
+        String oofCallback = FileUtil.readResourceFile("__files/BuildingBlocks/oofCallbackInfraVnf");
+        String oofCallback2 = FileUtil.readResourceFile("__files/BuildingBlocks/oofCallback2AR1Vnf");
+        String oofCallback3 = FileUtil.readResourceFile("__files/BuildingBlocks/oofCallback2AR1Vnf2Net");
+
+        String oofCallbackNoSolution = FileUtil.
+                readResourceFile("__files/BuildingBlocks/oofCallbackNoSolutionFound");
+        String oofCallbackPolicyException = FileUtil.
+                readResourceFile("__files/BuildingBlocks/oofCallbackPolicyException");
+        String oofCallbackServiceException = FileUtil.
+                readResourceFile("__files/BuildingBlocks/oofCallbackServiceException");
+
+        callbacks.put("oof", JSON, "oofResponse", oofCallback);
+        callbacks.put("oof2", JSON, "oofResponse", oofCallback2);
+        callbacks.put("oof3", JSON, "oofResponse", oofCallback3);
+        callbacks.put("oofNoSol", JSON, "oofResponse", oofCallbackNoSolution);
+        callbacks.put("oofPolicyEx", JSON, "oofResponse", oofCallbackPolicyException);
+        callbacks.put("oofServiceEx", JSON, "oofResponse", oofCallbackServiceException);
+
+        // Service Model
+        ModelInfo sModel = new ModelInfo();
+        sModel.setModelCustomizationName("testModelCustomizationName");
+        sModel.setModelInstanceName("testModelInstanceName");
+        sModel.setModelInvariantUuid("testModelInvariantId");
+        sModel.setModelName("testModelName");
+        sModel.setModelUuid("testModelUuid");
+        sModel.setModelVersion("testModelVersion");
+        // Service Instance
+        ServiceInstance si = new ServiceInstance();
+        si.setInstanceId("testServiceInstanceId123");
+        // Allotted Resources
+        List<AllottedResource> arList = new ArrayList<AllottedResource>();
+        AllottedResource ar = new AllottedResource();
+        ar.setResourceId("testResourceIdAR");
+        ar.setResourceInstanceName("testARInstanceName");
+        ModelInfo arModel = new ModelInfo();
+        arModel.setModelCustomizationUuid("testModelCustomizationUuidAR");
+        arModel.setModelInvariantUuid("testModelInvariantIdAR");
+        arModel.setModelName("testModelNameAR");
+        arModel.setModelVersion("testModelVersionAR");
+        arModel.setModelUuid("testARModelUuid");
+        arModel.setModelType("testModelTypeAR");
+        ar.setModelInfo(arModel);
+        AllottedResource ar2 = new AllottedResource();
+        ar2.setResourceId("testResourceIdAR2");
+        ar2.setResourceInstanceName("testAR2InstanceName");
+        ModelInfo arModel2 = new ModelInfo();
+        arModel2.setModelCustomizationUuid("testModelCustomizationUuidAR2");
+        arModel2.setModelInvariantUuid("testModelInvariantIdAR2");
+        arModel2.setModelName("testModelNameAR2");
+        arModel2.setModelVersion("testModelVersionAR2");
+        arModel2.setModelUuid("testAr2ModelUuid");
+        arModel2.setModelType("testModelTypeAR2");
+        ar2.setModelInfo(arModel2);
+        arList.add(ar);
+        arList.add(ar2);
+        // Vnfs
+        List<VnfResource> vnfList = new ArrayList<VnfResource>();
+        VnfResource vnf = new VnfResource();
+        vnf.setResourceId("testResourceIdVNF");
+        vnf.setResourceInstanceName("testVnfInstanceName");
+        ModelInfo vnfModel = new ModelInfo();
+        vnfModel.setModelCustomizationUuid("testModelCustomizationUuidVNF");
+        vnfModel.setModelInvariantUuid("testModelInvariantIdVNF");
+        vnfModel.setModelName("testModelNameVNF");
+        vnfModel.setModelVersion("testModelVersionVNF");
+        vnfModel.setModelUuid("testVnfModelUuid");
+        vnfModel.setModelType("testModelTypeVNF");
+        vnf.setModelInfo(vnfModel);
+        vnfList.add(vnf);
+        System.out.println("SERVICE DECOMP: " + serviceDecomposition.getServiceResourcesJsonString());
+        serviceDecomposition.setModelInfo(sModel);
+        serviceDecomposition.setServiceAllottedResources(arList);
+        serviceDecomposition.setServiceVnfs(vnfList);
+        serviceDecomposition.setServiceInstance(si);
+
+        // Subscriber
+        subscriber = "{\"globalSubscriberId\": \"SUB12_0322_DS_1201\",\"subscriberCommonSiteId\": \"DALTX0101\",\"subscriberName\": \"SUB_12_0322_DS_1201\"}";
+        subscriber2 = "{\"globalSubscriberId\": \"SUB12_0322_DS_1201\",\"subscriberName\": \"SUB_12_0322_DS_1201\"}";
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_success_2AR1Vnf() throws Exception {
+
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "oof2");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+        ServiceDecomposition serviceDecompositionExp = (ServiceDecomposition) getVariableFromHistory(businessKey,
+                "serviceDecomposition");
+        String expectedOofRequest = (String) getVariableFromHistory(businessKey, "oofRequest");
+
+        Resource resourceAR = serviceDecompositionExp.getServiceResource("testResourceIdAR");
+        HomingSolution resourceARHoming = resourceAR.getHomingSolution();
+        Resource resourceAR2 = serviceDecompositionExp.getServiceResource("testResourceIdAR2");
+        HomingSolution resourceARHoming2 = resourceAR2.getHomingSolution();
+        Resource resourceVNF = serviceDecompositionExp.getServiceResource("testResourceIdVNF");
+        HomingSolution resourceVNFHoming = resourceVNF.getHomingSolution();
+        String resourceARHomingString = resourceARHoming.toString();
+        resourceARHomingString = resourceARHomingString.replaceAll("\\s+", " ");
+        String resourceARHoming2String = resourceARHoming2.toString();
+        resourceARHoming2String = resourceARHoming2String.replaceAll("\\s+", " ");
+        String resourceVNFHomingString = resourceVNFHoming.toString();
+        resourceVNFHomingString = resourceVNFHomingString.replaceAll("\\s+", " ");
+        expectedOofRequest = expectedOofRequest.replaceAll("\\s+", "");
+
+        assertNull(workflowException);
+        assertEquals(homingSolutionService("service", "testSIID1", "MDTNJ01",
+                resourceARHoming.getVnf().getResourceId(),"aic", "dfwtx",
+                "\"f1d563e8-e714-4393-8f99-cc480144a05e\", \"j1d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"s1d563e8-e714-4393-8f99-cc480144a05e\", \"b1d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceARHomingString);
+        assertEquals(homingSolutionService("service", "testSIID2", "testVnfHostname2",
+                resourceARHoming2.getVnf().getResourceId(),"aic", "testCloudRegionId2",
+                null, null), resourceARHoming2String);
+        assertEquals(homingSolutionCloud("cloud","aic", "testCloudRegionId3",
+                "\"91d563e8-e714-4393-8f99-cc480144a05e\", \"21d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"31d563e8-e714-4393-8f99-cc480144a05e\", \"71d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceVNFHomingString);
+        assertEquals(verifyOofRequest(), expectedOofRequest);
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_success_2AR1Vnf2Net() throws Exception {
+
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables2(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "oof3");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+        ServiceDecomposition serviceDecompositionExp = (ServiceDecomposition) getVariableFromHistory(businessKey,
+                "serviceDecomposition");
+        String expectedOofRequest = (String) getVariableFromHistory(businessKey, "oofRequest");
+
+        Resource resourceAR = serviceDecompositionExp.getServiceResource("testResourceIdAR");
+        HomingSolution resourceARHoming = resourceAR.getHomingSolution();
+        Resource resourceAR2 = serviceDecompositionExp.getServiceResource("testResourceIdAR2");
+        HomingSolution resourceARHoming2 = resourceAR2.getHomingSolution();
+        Resource resourceVNF = serviceDecompositionExp.getServiceResource("testResourceIdVNF");
+        HomingSolution resourceVNFHoming = resourceVNF.getHomingSolution();
+        Resource resourceNet = serviceDecompositionExp.getServiceResource("testResourceIdNet");
+        HomingSolution resourceNetHoming = resourceNet.getHomingSolution();
+        Resource resourceNet2 = serviceDecompositionExp.getServiceResource("testResourceIdNet2");
+        HomingSolution resourceNetHoming2 = resourceNet2.getHomingSolution();
+
+        String resourceARHomingString = resourceARHoming.toString();
+        resourceARHomingString = resourceARHomingString.replaceAll("\\s+", " ");
+        String resourceARHoming2String = resourceARHoming2.toString();
+        resourceARHoming2String = resourceARHoming2String.replaceAll("\\s+", " ");
+        String resourceVNFHomingString = resourceVNFHoming.toString();
+        resourceVNFHomingString = resourceVNFHomingString.replaceAll("\\s+", " ");
+        String resourceNetHomingString = resourceNetHoming.toString();
+        resourceNetHomingString = resourceNetHomingString.replaceAll("\\s+", " ");
+        String resourceNetHoming2String = resourceNetHoming2.toString();
+        resourceNetHoming2String = resourceNetHoming2String.replaceAll("\\s+", " ");
+        expectedOofRequest = expectedOofRequest.replaceAll("\\s+", "");
+
+
+        assertNull(workflowException);
+        assertEquals(homingSolutionService("service", "testSIID1", "MDTNJ01",
+                resourceARHoming.getVnf().getResourceId(),"aic", "dfwtx",
+                "\"f1d563e8-e714-4393-8f99-cc480144a05e\", \"j1d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"s1d563e8-e714-4393-8f99-cc480144a05e\", \"b1d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceARHomingString);
+        assertEquals(homingSolutionService("service", "testSIID2", "testVnfHostname2",
+                resourceARHoming2.getVnf().getResourceId(),
+                "aic", "testCloudRegionId2",
+                null, null), resourceARHoming2String);
+        assertEquals(homingSolutionCloud("cloud","aic",
+                "testCloudRegionId3",
+                "\"91d563e8-e714-4393-8f99-cc480144a05e\", \"21d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"31d563e8-e714-4393-8f99-cc480144a05e\", \"71d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceVNFHomingString);
+        assertEquals(homingSolutionService("service", "testServiceInstanceIdNet",
+                "testVnfHostNameNet", resourceNetHoming.getVnf().getResourceId(),"aic",
+                "testCloudRegionIdNet",
+                null, null), resourceNetHomingString);
+        assertEquals(homingSolutionCloud("cloud", "aic",
+                "testCloudRegionIdNet2",
+                "\"f1d563e8-e714-4393-8f99-cc480144a05n\", \"j1d563e8-e714-4393-8f99-cc480144a05n\"",
+                "\"s1d563e8-e714-4393-8f99-cc480144a05n\", \"b1d563e8-e714-4393-8f99-cc480144a05n\""),
+                resourceNetHoming2String);
+        assertEquals(verifyOofRequest(), expectedOofRequest);
+
+    }
+
+    @Test
+    @Ignore
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/BuildingBlock/DecomposeService.bpmn",
+            "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_success_vnfResourceList() throws Exception {
+
+        // Create a Service Decomposition
+        MockGetServiceResourcesCatalogDataByModelUuid("2f7f309d-c842-4644-a2e4-34167be5eeb4",
+                "/BuildingBlocks/oofCatalogResp.json");
+        String busKey = UUID.randomUUID().toString();
+        Map<String, Object> vars = new HashMap<>();
+        setVariablesForServiceDecomposition(vars, "testRequestId123",
+                "ff5256d2-5a33-55df-13ab-12abad84e7ff");
+        invokeSubProcess("DecomposeService", busKey, vars);
+
+        ServiceDecomposition sd = (ServiceDecomposition) getVariableFromHistory(busKey,
+                "serviceDecomposition");
+        System.out.println("In testHoming_success_vnfResourceList, ServiceDecomposition = " + sd);
+        List<VnfResource> vnfResourceList = sd.getServiceVnfs();
+//System.out.println(" vnfResourceList = " + vnfResourceList);
+        vnfResourceList.get(0).setResourceId("test-resource-id-000");
+
+        // Invoke Homing
+
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("homingService", "oof");
+        variables.put("isDebugLogEnabled", "true");
+        variables.put("msoRequestId", "testRequestId");
+        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceDecomposition", sd);
+        variables.put("subscriberInfo", subscriber2);
+        HashMap customerLocation = new HashMap<String, Object>();
+        customerLocation.put("customerLatitude", "32.89748");
+        customerLocation.put("customerLongitude", "-97.040443");
+        customerLocation.put("customerName", "xyz");
+        variables.put("customerLatitude", "32.89748");
+        variables.put("customerLongitude", "-97.040443");
+        variables.put("customerName", "xyz");
+        variables.put("customerLocation", customerLocation);
+        variables.put("cloudOwner", "amazon");
+        variables.put("cloudRegionId", "TNZED");
+
+        invokeSubProcess("Homing", businessKey, variables);
+        injectWorkflowMessages(callbacks, "oof3");
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+        ServiceDecomposition serviceDecompositionExp = (ServiceDecomposition) getVariableFromHistory(businessKey,
+                "serviceDecomposition");
+        System.out.println("serviceDecompositionExp is: " + serviceDecompositionExp);
+
+        Resource resourceVnf = serviceDecompositionExp.getServiceResource("test-resource-id-000");
+        System.out.println("resourceVnf is: " + resourceVnf);
+        HomingSolution resourceVnfHoming = resourceVnf.getHomingSolution();
+
+        String resourceVnfHomingString = resourceVnfHoming.toString();
+        System.out.println("resourceVnfHomingString is: " + resourceVnfHomingString);
+        resourceVnfHomingString = resourceVnfHomingString.replaceAll("\\s+", " ");
+        System.out.println("Now resourceVnfHomingString is: " + resourceVnfHomingString);
+
+        assertNull(workflowException);
+
+        //Verify request
+        String oofRequest = (String) getVariableFromHistory(businessKey, "oofRequest");
+        System.out.println("oofRequest is: " + oofRequest);
+        assertEquals(FileUtil.readResourceFile("__files/BuildingBlocks/oofRequest_infravnf").
+                replaceAll("\n", "").replaceAll("\r", "").
+                replaceAll("\t", ""), oofRequest.replaceAll("\n", "").
+                replaceAll("\r", "").replaceAll("\t", ""));
+
+        //System.out.println("resourceVnfHoming.getVnf().getResourceId() is: " + resourceVnfHoming.getVnf().getResourceId());
+
+        assertEquals(homingSolutionService("service", "service-instance-01234",
+                "MDTNJ01", "test-resource-id-000","att-aic",
+                "mtmnj1a",
+                "\"f1d563e8-e714-4393-8f99-cc480144a05e\"," +
+                        " \"j1d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"s1d563e8-e714-4393-8f99-cc480144a05e\"," +
+                        " \"b1d563e8-e714-4393-8f99-cc480144a05e\""), resourceVnfHomingString);
+    }
+
+    @Test
+    @Ignore // 1802 merge
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_success_existingLicense() throws Exception {
+
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<String, Object>();
+        setVariablesExistingLicense(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "sniro");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey, "WorkflowException");
+        ServiceDecomposition serviceDecompositionExp = (ServiceDecomposition) getVariableFromHistory(businessKey, "serviceDecomposition");
+        String oofRequest = (String) getVariableFromHistory(businessKey, "sniroRequest");
+
+        Resource resourceAR = serviceDecompositionExp.getServiceResource("testResourceIdAR");
+        HomingSolution resourceARHoming = (HomingSolution) resourceAR.getHomingSolution();
+        Resource resourceAR2 = serviceDecompositionExp.getServiceResource("testResourceIdAR2");
+        HomingSolution resourceARHoming2 = (HomingSolution) resourceAR2.getHomingSolution();
+        Resource resourceVNF = serviceDecompositionExp.getServiceResource("testResourceIdVNF");
+        HomingSolution resourceVNFHoming = (HomingSolution) resourceVNF.getHomingSolution();
+        String resourceARHomingString = resourceARHoming.toString();
+        resourceARHomingString = resourceARHomingString.replaceAll("\\s+", " ");
+        String resourceARHoming2String = resourceARHoming2.toString();
+        resourceARHoming2String = resourceARHoming2String.replaceAll("\\s+", " ");
+        String resourceVNFHomingString = resourceVNFHoming.toString();
+        resourceVNFHomingString = resourceVNFHomingString.replaceAll("\\s+", " ");
+        oofRequest = oofRequest.replaceAll("\\s+", "");
+
+        assertNull(workflowException);
+        assertEquals(homingSolutionService("service", "testSIID1", "MDTNJ01",
+                "aic", "dfwtx", "KDTNJ01",
+                "\"f1d563e8-e714-4393-8f99-cc480144a05e\", \"j1d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"s1d563e8-e714-4393-8f99-cc480144a05e\", \"b1d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceARHomingString);
+        assertEquals(homingSolutionService("service", "testSIID2", "testVnfHostname2",
+                resourceARHoming2.getVnf().getResourceId(),"aic", "testCloudRegionId2",
+                null, null), resourceARHoming2String);
+        assertEquals(homingSolutionCloud("cloud", "aic",
+                "testCloudRegionId3",
+                "\"91d563e8-e714-4393-8f99-cc480144a05e\", \"21d563e8-e714-4393-8f99-cc480144a05e\"",
+                "\"31d563e8-e714-4393-8f99-cc480144a05e\", \"71d563e8-e714-4393-8f99-cc480144a05e\""),
+                resourceVNFHomingString);
+        assertEquals(verifyOofRequestExistingLicense(), oofRequest);
+
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_error_inputVariable() throws Exception {
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables3(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+
+        assertEquals("WorkflowException[processKey=Homing,errorCode=4000,errorMessage=A required " +
+                "input variable is missing or null]", workflowException.toString());
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_error_badResponse() throws Exception {
+        mockOof_500();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+
+        assertEquals("WorkflowException[processKey=Homing,errorCode=500,errorMessage=Received a " +
+                "Bad Sync Response from Sniro/OOF.]", workflowException.toString());
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_error_oofNoSolution() throws Exception {
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "oofNoSol");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+
+        assertEquals("WorkflowException[processKey=Homing,errorCode=400,errorMessage=No solution found " +
+                "for plan 08e1b8cf-144a-4bac-b293-d5e2eedc97e8]", workflowException.toString());
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_error_oofPolicyException() throws Exception {
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "oofPolicyEx");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+
+        assertEquals("WorkflowException[processKey=Homing,errorCode=400,errorMessage=OOF Async Callback " +
+                "Response contains a Request Error Policy Exception: Message content size exceeds the allowable " +
+                "limit]", workflowException.toString());
+    }
+
+    @Test
+    @Deployment(resources = {"subprocess/BuildingBlock/Homing.bpmn", "subprocess/ReceiveWorkflowMessage.bpmn"})
+    public void testHoming_error_oofServiceException() throws Exception {
+        mockOof();
+
+        String businessKey = UUID.randomUUID().toString();
+        Map<String, Object> variables = new HashMap<>();
+        setVariables(variables);
+
+        invokeSubProcess("Homing", businessKey, variables);
+
+        injectWorkflowMessages(callbacks, "oofServiceEx");
+
+        waitForProcessEnd(businessKey, 10000);
+
+        //Get Variables
+        WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey,
+                "WorkflowException");
+
+        assertEquals("WorkflowException[processKey=Homing,errorCode=400,errorMessage=OOF Async Callback " +
+                        "Response contains a Request Error Service Exception: OOF PlacementError: " +
+                        "requests.exceptions.HTTPError: 404 Client Error: Not Found for " +
+                        "url: http://135.21.171.200:8091/v1/plans/97b4e303-5f75-492c-8fb2-21098281c8b8]",
+                workflowException.toString());
+    }
+
+
+    private void setVariables(Map<String, Object> variables) {
+        variables.put("homingService", "oof");
+        HashMap customerLocation = new HashMap<String, Object>();
+        customerLocation.put("customerLatitude", "32.89748");
+        customerLocation.put("customerLongitude", "-97.040443");
+        customerLocation.put("customerName", "xyz");
+        variables.put("customerLatitude", "32.89748");
+        variables.put("customerLongitude", "-97.040443");
+        variables.put("customerName", "xyz");
+        variables.put("customerLocation", customerLocation);
+        variables.put("cloudOwner", "amazon");
+        variables.put("cloudRegionId", "TNZED");
+        variables.put("isDebugLogEnabled", "true");
+        //     variables.put("mso-request-id", "testRequestId");
+        variables.put("msoRequestId", "testRequestId");
+        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceDecomposition", serviceDecomposition);
+        variables.put("subscriberInfo", subscriber2);
+    }
+
+    private void setVariables2(Map<String, Object> variables) {
+        List<NetworkResource> netList = new ArrayList<NetworkResource>();
+        NetworkResource net = new NetworkResource();
+        net.setResourceId("testResourceIdNet");
+        ModelInfo netModel = new ModelInfo();
+        netModel.setModelCustomizationUuid("testModelCustomizationUuidNet");
+        netModel.setModelInvariantUuid("testModelInvariantIdNet");
+        netModel.setModelName("testModelNameNet");
+        netModel.setModelVersion("testModelVersionNet");
+        net.setModelInfo(netModel);
+        netList.add(net);
+        NetworkResource net2 = new NetworkResource();
+        net2.setResourceId("testResourceIdNet2");
+        ModelInfo netModel2 = new ModelInfo();
+        netModel2.setModelCustomizationUuid("testModelCustomizationUuidNet2");
+        netModel2.setModelCustomizationName("testModelCustomizationNameNet2");
+        netModel2.setModelInvariantUuid("testModelInvariantIdNet2");
+        netModel2.setModelName("testModelNameNet2");
+        netModel2.setModelVersion("testModelVersionNet2");
+        net2.setModelInfo(netModel2);
+        netList.add(net2);
+        serviceDecomposition.setServiceNetworks(netList);
+
+        variables.put("homingService", "oof");
+        HashMap customerLocation = new HashMap<String, Object>();
+        customerLocation.put("customerLatitude", "32.89748");
+        customerLocation.put("customerLongitude", "-97.040443");
+        customerLocation.put("customerName", "xyz");
+        variables.put("customerLatitude", "32.89748");
+        variables.put("customerLongitude", "-97.040443");
+        variables.put("customerName", "xyz");
+        variables.put("customerLocation", customerLocation);
+        variables.put("cloudOwner", "amazon");
+        variables.put("cloudRegionId", "TNZED");
+        variables.put("isDebugLogEnabled", "true");
+        variables.put("msoRequestId", "testRequestId");
+        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceDecomposition", serviceDecomposition);
+        variables.put("subscriberInfo", subscriber2);
+    }
+
+    private void setVariables3(Map<String, Object> variables) {
+        variables.put("homingService", "oof");
+        HashMap customerLocation = new HashMap<String, Object>();
+        customerLocation.put("customerLatitude", "32.89748");
+        customerLocation.put("customerLongitude", "-97.040443");
+        customerLocation.put("customerName", "xyz");
+        variables.put("customerLatitude", "32.89748");
+        variables.put("customerLongitude", "-97.040443");
+        variables.put("customerName", "xyz");
+        variables.put("customerLocation", customerLocation);
+        variables.put("cloudOwner", "amazon");
+        variables.put("cloudRegionId", "TNZED");
+        variables.put("isDebugLogEnabled", "true");
+        //     variables.put("mso-request-id", "testRequestId");
+        variables.put("msoRequestId", "testRequestId");
+        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceDecomposition", null);
+        variables.put("subscriberInfo", subscriber2);
+    }
+
+    private void setVariablesExistingLicense(Map<String, Object> variables) {
+        HomingSolution currentHomingSolution = new HomingSolution();
+        serviceDecomposition.getServiceVnfs().get(0).setCurrentHomingSolution(currentHomingSolution);
+        serviceDecomposition.getServiceVnfs().get(0).getCurrentHomingSolution().getLicense().addEntitlementPool("testEntitlementPoolId1");
+        serviceDecomposition.getServiceVnfs().get(0).getCurrentHomingSolution().getLicense().addEntitlementPool("testEntitlementPoolId2");
+
+        serviceDecomposition.getServiceVnfs().get(0).getCurrentHomingSolution().getLicense().addLicenseKeyGroup("testLicenseKeyGroupId1");
+        serviceDecomposition.getServiceVnfs().get(0).getCurrentHomingSolution().getLicense().addLicenseKeyGroup("testLicenseKeyGroupId2");
+
+        variables.put("isDebugLogEnabled", "true");
+        variables.put("msoRequestId", "testRequestId");
+        variables.put("serviceInstanceId", "testServiceInstanceId");
+        variables.put("serviceDecomposition", serviceDecomposition);
+        variables.put("subscriberInfo", subscriber2);
+
+    }
+
+    /*private String homingSolutionService(String resourceModuleName, String serviceInstanceId, String vnfHostname, String cloudOwner,
+                                         String cloudRegionId, String licenseList) {
+        String solution = "";
+        if (licenseList == null || licenseList == "") {
+            solution = "{\n" +
+                    "  \"resourceModuleName\": \"" + resourceModuleName + "\",\n" +
+                    "  \"serviceResourceId\": \"some_resource_id\",\n" +
+                    "  \"solution\": {\n" +
+                    "  \"identifierType\": \"serviceInstanceId\",\n" +
+                    "  \"identifiers\": [\"" + serviceInstanceId + "\"]\n" +
+                    "  }\n" +
+                    "  \"assignmentInfo\": [\n" +
+                    "    { \"key\": \"cloudOwner\", \"value\": \"" + cloudOwner + "\" },\n" +
+                    "    { \"key\": \"vnfHostName\", \"value\": \"" + vnfHostname + "\" },\n" +
+                    "    { \"key\": \"isRehome\", \"value\": \"False\" },\n" +
+                    "    { \"key\": \"cloudRegionId\", \"value\": \"" + cloudRegionId + "\" }\n" +
+                    "    ]\n" +
+                    "  }";
+        } else {
+            solution = "{\n" +
+                    "  \"resourceModuleName\": \"" + resourceModuleName + "\",\n" +
+                    "  \"serviceResourceId\": \"some_resource_id\",\n" +
+                    "  \"solution\": {\n" +
+                    "    \"identifierType\": \"service_instance_id\",\n" +
+                    "    \"identifiers\": [\"" + serviceInstanceId + "\"]\n" +
+                    "  }\n" +
+                    "  \"assignmentInfo\": [\n" +
+                    "    { \"key\": \"cloudOwner\", \"value\": \"" + cloudOwner + "\" },\n" +
+                    "    { \"key\": \"vnfHostName\", \"value\": \"" + vnfHostname + "\" },\n" +
+                    "    { \"key\": \"isRehome\", \"value\": \"False\" },\n" +
+                    "    { \"key\": \"cloudRegionId\", \"value\": \"" + cloudRegionId + "\" }\n" +
+                    "    ], " +
+                    "  \"licenseSolutions\" : [ {\"licenseKeyGroupUUID\": [" + licenseList + "]} ] " +
+                    "}";
+        }
+        return solution;
+    }*/
+    private String homingSolutionService(String type, String serviceInstanceId, String vnfHostname,
+                                         String vnfResourceId, String cloudOwner,
+                                         String cloudRegionId, String enList,
+                                         String licenseList){
+
+        String solution = "";
+        if(enList == null){
+            solution = "{ \"homingSolution\" : { \"inventoryType\" : \"" + type + "\", \"serviceInstanceId\" : \"" +
+                    serviceInstanceId + "\", \"cloudOwner\" : \"" + cloudOwner + "\", \"cloudRegionId\" : \"" +
+                    cloudRegionId + "\", " + "\"vnf\" : { \"resourceId\" : \"" + vnfResourceId +
+                    "\", \"resourceType\" : \"VNF\", \"resourceInstance\" : { }, \"homingSolution\" : { \"license\" :" +
+                    " { }, \"rehome\" : false }, \"vnfHostname\" : \"" + vnfHostname + "\" }, \"license\" : { }," +
+                    " \"rehome\" : false } }";
+        }else{
+            //language=JSON
+            solution = "{ \"homingSolution\" : { \"inventoryType\" : \"" + type + "\", \"serviceInstanceId\" : \"" +
+                    serviceInstanceId + "\", \"cloudOwner\" : \"" + cloudOwner + "\", \"cloudRegionId\" : \"" +
+                    cloudRegionId + "\", \"vnf\" : { \"resourceId\" : \"" + vnfResourceId + "\", \"resourceType\" :" +
+                    " \"VNF\", \"resourceInstance\" : { }, \"homingSolution\" : { \"license\" : { }, \"rehome\" :" +
+                    " false }, \"vnfHostname\" : \"" + vnfHostname + "\" }, \"license\" : { \"entitlementPoolList\" :" +
+                    " [ " + enList + " ], \"licenseKeyGroupList\" : [ " + licenseList + " ] }, \"rehome\" : false } }";
+        }
+        return solution;
+    }
+
+    /*private String homingSolutionCloud(String resourceModuleName, String cloudOwner,
+                                       String cloudRegionId, String licenseList) {
+        String solution = "";
+        if (licenseList == null || licenseList == "") {
+            solution = "{\n" +
+                    "  \"resourceModuleName\": \"" + resourceModuleName + "\",\n" +
+                    "  \"serviceResourceId\": \"some_resource_id\",\n" +
+                    "  \"solution\": {\n" +
+                    "    \"identifierType\": \"cloudRegionId\",\n" +
+                    "    \"cloudOwner\": \"" + cloudOwner + "\",\n" +
+                    "    \"identifiers\": [\"" + cloudRegionId + "\"]\n" +
+                    "  }\n" +
+                    "  \"assignmentInfo\": [\n" +
+                    "    { \"key\": \"cloudOwner\", \"value\": \"" + cloudOwner + "\" },\n" +
+                    "    { \"key\": \"cloudRegionId\", \"value\": \"" + cloudRegionId + "\" }\n" +
+                    "    ]\n" +
+                    "}";
+        } else {
+            solution = "{\n" +
+                    "  \"resourceModuleName\": \"" + resourceModuleName + "\",\n" +
+                    "  \"serviceResourceId\": \"some_resource_id\",\n" +
+                    "  \"solution\": {\n" +
+                    "    \"identifierType\": \"cloudRegionId\",\n" +
+                    "    \"cloudOwner\": \"" + cloudOwner + "\",\n" +
+                    "    \"identifiers\": [\"" + cloudRegionId + "\"]\n" +
+                    "  }\n" +
+                    "  \"assignmentInfo\": [\n" +
+                    "    { \"key\": \"cloudOwner\", \"value\": \"" + cloudOwner + "\" },\n" +
+                    "    { \"key\": \"cloudRegionId\", \"value\": \"" + cloudRegionId + "\" }\n" +
+                    "    ]," +
+                    "  \"licenseSolutions\" : [ {\"licenseKeyGroupUUID\": [" + licenseList + "]} ] } " +
+                    "}";
+        }
+        return solution;
+    }*/
+    private String homingSolutionCloud(String type, String cloudOwner,
+                                       String cloudRegionId, String enList,
+                                       String licenseList){
+        String solution = "";
+        if(enList == null){
+            solution = "{ \"homingSolution\" : { \"inventoryType\" : \"" + type + "\", \"cloudOwner\" : \"" +
+                    cloudOwner + "\", \"cloudRegionId\" : \"" + cloudRegionId +
+                    "\", \"license\" : { }, \"rehome\" : false } }";
+        }else{
+            solution = "{ \"homingSolution\" : { \"inventoryType\" : \"" + type + "\", \"cloudOwner\" : \"" +
+                    cloudOwner + "\", \"cloudRegionId\" : \"" + cloudRegionId +
+                    "\", \"license\" : { \"entitlementPoolList\" : [ " + enList +  " ], \"licenseKeyGroupList\" : [ " +
+                    licenseList +  " ] }, \"rehome\" : false } }";
+        }
+        return solution;
+    }
+
+    private void setVariablesForServiceDecomposition(Map<String, Object> variables, String requestId, String siId) {
+        variables.put("homingService", "oof");
+        variables.put("isDebugLogEnabled", "true");
+        variables.put("mso-request-id", requestId);
+        variables.put("msoRequestId", requestId);
+        variables.put("serviceInstanceId", siId);
+        HashMap customerLocation = new HashMap<String, Object>();
+        customerLocation.put("customerLatitude", "32.89748");
+        customerLocation.put("customerLongitude", "-97.040443");
+        customerLocation.put("customerName", "xyz");
+        variables.put("customerLatitude", "32.89748");
+        variables.put("customerLongitude", "-97.040443");
+        variables.put("customerName", "xyz");
+        variables.put("customerLocation", customerLocation);
+        variables.put("cloudOwner", "amazon");
+        variables.put("cloudRegionId", "TNZED");
+
+
+        String serviceModelInfo = "{\"modelInvariantId\":\"1cc4e2e4-eb6e-404d-a66f-c8733cedcce8\",\"modelUuid\":" +
+                "\"2f7f309d-c842-4644-a2e4-34167be5eeb4\",\"modelName\":\"vCPE Service\",\"modelVersion\":\"2.0\",}";
+        variables.put("serviceModelInfo", serviceModelInfo);
+    }
+
+    private String verifyOofRequest() {
+        String request = "{\"requestInfo\":{\"transactionId\":\"testRequestId\",\"requestId\":\"testRequestId\"," +
+                "\"callbackUrl\":\"http://localhost:28090/workflows/messages/message/oofResponse/testRequestId\"," +
+                "\"sourceId\":\"so\",\"requestType\":\"create\",\"numSolutions\":1,\"optimizers\":[\"placement\"]," +
+                "\"timeout\":600},\"placementInfo\":{\"requestParameters\":{\"customerLatitude\":" +
+                "\"32.89748\",\"customerLongitude\":\"-97.040443\",\"customerName\":\"xyz\"},\"subscriberInfo\":" +
+                "{\"globalSubscriberId\":\"SUB12_0322_DS_1201\",\"subscriberName\":\"SUB_12_0322_DS_1201\"," +
+                "\"subscriberCommonSiteId\":\"\"},\"placementDemands\":[{\"resourceModuleName\":\"ALLOTTED_RESOURCE\"" +
+                ",\"serviceResourceId\":\"testResourceIdAR\",\"tenantId\":" +
+                "\"null\",\"resourceModelInfo\":{\"modelInvariantId\":\"testModelInvariantIdAR\"," +
+                "\"modelVersionId\":\"testARModelUuid\",\"modelName\":\"testModelNameAR\",\"modelType\":" +
+                "\"testModelTypeAR\",\"modelVersion\":\"testModelVersionAR\",\"modelCustomizationName\":\"\"}}," +
+                "{\"resourceModuleName\":\"ALLOTTED_RESOURCE\",\"serviceResourceId\":\"testResourceIdAR2\"," +
+                "\"tenantId\":\"null\",\"resourceModelInfo\":{\"modelInvariantId\":\"testModelInvariantIdAR2\"," +
+                "\"modelVersionId\":\"testAr2ModelUuid\",\"modelName\":\"testModelNameAR2\"," +
+                "\"modelType\":\"testModelTypeAR2\",\"modelVersion\":\"testModelVersionAR2\"," +
+                "\"modelCustomizationName\":\"\"}}]},\"serviceInfo\":" +
+                "{\"serviceInstanceId\":\"testServiceInstanceId123\"," +
+                "\"serviceName\":\"null\",\"modelInfo\":{\"modelType\":\"\",\"modelInvariantId\":" +
+                "\"testModelInvariantId\",\"modelVersionId\":\"testModelUuid\",\"modelName\":\"testModelName\"," +
+                "\"modelVersion\":\"testModelVersion\",\"modelCustomizationName\":\"" +
+                "\"}},\"licenseInfo\":{\"licenseDemands\":[{\"resourceModuleName\":\"VNF\",\"serviceResourceId\":" +
+                "\"testResourceIdVNF\",\"resourceInstanceType\":\"VNF\",\"resourceModelInfo\":{\"modelInvariantId\":" +
+                "\"testModelInvariantIdVNF\",\"modelVersionId\":\"testVnfModelUuid\",\"modelName\":" +
+                "\"testModelNameVNF\",\"modelType\":\"testModelTypeVNF\",\"modelVersion\":\"testModelVersionVNF\"," +
+                "\"modelCustomizationName\":\"\"}}]}}";
+        return request;
+    }
+
+    private String verifyOofRequestExistingLicense(){
+        String request = "{\"requestInfo\":{\"transactionId\":\"testRequestId\",\"requestId\":\"testRequestId\"," +
+                "\"callbackUrl\":\"http://localhost:28090/workflows/messages/message/SNIROResponse/testRequestId\"," +
+                "\"sourceId\":\"mso\",\"requestType\":\"speedchanged\",\"optimizer\":[\"placement\",\"license\"]," +
+                "\"numSolutions\":1,\"timeout\":1800},\"placementInfo\":{\"serviceModelInfo\":{\"modelType\":\"\"," +
+                "\"modelInvariantId\":\"testModelInvariantId\",\"modelVersionId\":\"testModelUuid\",\"modelName\":" +
+                "\"testModelName\",\"modelVersion\":\"testModelVersion\"},\"subscriberInfo\":" +
+                "{\"globalSubscriberId\":\"SUB12_0322_DS_1201\",\"subscriberName\":\"SUB_12_0322_DS_1201\"," +
+                "\"subscriberCommonSiteId\":\"\"},\"demandInfo\":{\"placementDemand\":[{\"resourceInstanceType\":" +
+                "\"ALLOTTED_RESOURCE\",\"serviceResourceId\":\"testResourceIdAR\",\"resourceModuleName\":\"\"," +
+                "\"resourceModelInfo\":{\"modelCustomizationId\":\"testModelCustomizationUuidAR\"," +
+                "\"modelInvariantId\":\"testModelInvariantIdAR\",\"modelName\":\"testModelNameAR\"," +
+                "\"modelVersion\":\"testModelVersionAR\",\"modelVersionId\":\"testARModelUuid\",\"modelType\":" +
+                "\"testModelTypeAR\"},\"tenantId\":\"\",\"tenantName\":\"\"},{\"resourceInstanceType\":" +
+                "\"ALLOTTED_RESOURCE\",\"serviceResourceId\":\"testResourceIdAR2\",\"resourceModuleName\":" +
+                "\"\",\"resourceModelInfo\":{\"modelCustomizationId\":\"testModelCustomizationUuidAR2\"," +
+                "\"modelInvariantId\":\"testModelInvariantIdAR2\",\"modelName\":\"testModelNameAR2\"," +
+                "\"modelVersion\":\"testModelVersionAR2\",\"modelVersionId\":\"testAr2ModelUuid\"," +
+                "\"modelType\":\"testModelTypeAR2\"},\"tenantId\":\"\",\"tenantName\":\"\"}],\"licenseDemand\":" +
+                "[{\"resourceInstanceType\":\"VNF\",\"serviceResourceId\":\"testResourceIdVNF\"," +
+                "\"resourceModuleName\":\"\",\"resourceModelInfo\":{\"modelCustomizationId\":" +
+                "\"testModelCustomizationUuidVNF\",\"modelInvariantId\":\"testModelInvariantIdVNF\"," +
+                "\"modelName\":\"testModelNameVNF\",\"modelVersion\":\"testModelVersionVNF\"," +
+                "\"modelVersionId\":\"testVnfModelUuid\",\"modelType\":\"testModelTypeVNF\"}," +
+                "\"existingLicense\":[{\"entitlementPoolUUID\":[\"testEntitlementPoolId1\"," +
+                "\"testEntitlementPoolId2\"],\"licenseKeyGroupUUID\":[\"testLicenseKeyGroupId1\"," +
+                "\"testLicenseKeyGroupId2\"]}]}]},\"policyId\":[],\"serviceInstanceId\":" +
+                "\"testServiceInstanceId123\",\"orderInfo\":\"{\\\"requestParameters\\\":null}\"}}";
+        return request;
+    }
+}
@@ -41,15 +41,12 @@ import org.junit.Test;
 import org.openecomp.mso.bpmn.core.WorkflowException;
 import org.openecomp.mso.bpmn.core.domain.*;
 import org.openecomp.mso.bpmn.mock.FileUtil;
-import org.openecomp.mso.bpmn.common.WorkflowTest;
 
 
 /**
- * Test the Homing subflow building block.
- *
- * @author cb645j
+ * Test the SNIRO Homing subflow building block.
  */
-public class HomingTest extends WorkflowTest {
+public class SniroHomingTest extends WorkflowTest {
 
        ServiceDecomposition serviceDecomposition = new ServiceDecomposition();
        String subscriber = "";
@@ -57,7 +54,7 @@ public class HomingTest extends WorkflowTest {
 
        private final CallbackSet callbacks = new CallbackSet();
 
-       public HomingTest() throws IOException {
+       public SniroHomingTest() throws IOException {
                String sniroCallback = FileUtil.readResourceFile("__files/BuildingBlocks/sniroCallback2AR1Vnf");
                String sniroCallback2 = FileUtil.readResourceFile("__files/BuildingBlocks/sniroCallback2AR1Vnf2Net");
                String sniroCallback3 = FileUtil.readResourceFile("__files/BuildingBlocks/sniroCallbackInfraVnf");
@@ -253,6 +250,7 @@ public class HomingTest extends WorkflowTest {
 
                String businessKey = UUID.randomUUID().toString();
                Map<String, Object> variables = new HashMap<>();
+               variables.put("homingService", "sniro");
                variables.put("isDebugLogEnabled", "true");
                variables.put("msoRequestId", "testRequestId");
                variables.put("serviceInstanceId", "testServiceInstanceId");
@@ -362,7 +360,7 @@ public class HomingTest extends WorkflowTest {
                //Get Variables
                WorkflowException workflowException = (WorkflowException) getVariableFromHistory(businessKey, "WorkflowException");
 
-               assertEquals("WorkflowException[processKey=Homing,errorCode=500,errorMessage=Received a Bad Sync Response from Sniro.]", workflowException.toString());
+               assertEquals("WorkflowException[processKey=Homing,errorCode=500,errorMessage=Received a Bad Sync Response from Sniro/OOF.]", workflowException.toString());
        }
 
        @Test
@@ -432,6 +430,7 @@ public class HomingTest extends WorkflowTest {
 
 
        private void setVariables(Map<String, Object> variables) {
+               variables.put("homingService", "sniro");
                variables.put("isDebugLogEnabled", "true");
        //      variables.put("mso-request-id", "testRequestId");
                variables.put("msoRequestId", "testRequestId");
@@ -463,6 +462,7 @@ public class HomingTest extends WorkflowTest {
                netList.add(net2);
                serviceDecomposition.setServiceNetworks(netList);
 
+               variables.put("homingService", "sniro");
                variables.put("isDebugLogEnabled", "true");
                variables.put("msoRequestId", "testRequestId");
                variables.put("serviceInstanceId", "testServiceInstanceId");
@@ -471,6 +471,7 @@ public class HomingTest extends WorkflowTest {
        }
 
        private void setVariables3(Map<String, Object> variables) {
+               variables.put("homingService", "sniro");
                variables.put("isDebugLogEnabled", "true");
        //      variables.put("mso-request-id", "testRequestId");
                variables.put("msoRequestId", "testRequestId");
@@ -519,6 +520,7 @@ public class HomingTest extends WorkflowTest {
        }
 
        private void setVariablesForServiceDecomposition(Map<String, Object> variables, String requestId, String siId) {
+               variables.put("homingService", "sniro");
                variables.put("isDebugLogEnabled", "true");
                variables.put("mso-request-id", requestId);
                variables.put("msoRequestId", requestId);
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/mock/StubResponseOof.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/bpmn/mock/StubResponseOof.java
new file mode 100644 (file)
index 0000000..b969b38
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+/*
+ * Â© 2014 AT&T Intellectual Property. All rights reserved. Used under license from AT&T Intellectual Property.
+ */
+package org.openecomp.mso.bpmn.mock;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+
+/**
+ * StubResponseOof.java class
+ */
+public class StubResponseOof {
+
+    public static void setupAllMocks() {
+
+    }
+
+    public static void mockOof() {
+        stubFor(post(urlEqualTo("/api/oof/v1/placement"))
+                .willReturn(aResponse()
+                        .withStatus(202)
+                        .withHeader("Content-Type", "application/json")));
+    }
+
+    public static void mockOof(String responseFile) {
+        stubFor(post(urlEqualTo("/api/oof/v1/placement"))
+                .willReturn(aResponse()
+                        .withStatus(202)
+                        .withHeader("Content-Type", "application/json")
+                        .withBodyFile(responseFile)));
+    }
+
+    public static void mockOof_400() {
+        stubFor(post(urlEqualTo("/api/oof/v1/placement"))
+                .willReturn(aResponse()
+                        .withStatus(400)
+                        .withHeader("Content-Type", "application/json")));
+    }
+
+    public static void mockOof_500() {
+        stubFor(post(urlEqualTo("/api/oof/v1/placement"))
+                .willReturn(aResponse()
+                        .withStatus(500)
+                        .withHeader("Content-Type", "application/json")));
+    }
+
+}
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf
new file mode 100644 (file)
index 0000000..3559708
--- /dev/null
@@ -0,0 +1,109 @@
+{
+    "transactionId": "testRequestId",
+    "requestId": "testRequestId",
+    "requestState": "complete",
+    "statusMessage": "success",
+    "solutions": {
+        "licenseSolutions": [
+            {
+                "entitlementPoolUUID": [
+                    "f1d563e8-e714-4393-8f99-cc480144a05e",
+                    "j1d563e8-e714-4393-8f99-cc480144a05e"
+                ],
+                "licenseKeyGroupUUID": [
+                    "s1d563e8-e714-4393-8f99-cc480144a05e",
+                    "b1d563e8-e714-4393-8f99-cc480144a05e"
+                ],
+                "resourceModuleName": "vHNPortalaaS_primary_1",
+                "serviceResourceId": "testResourceIdAR"
+            },
+            {
+                "entitlementPoolUUID": [
+                    "91d563e8-e714-4393-8f99-cc480144a05e",
+                    "21d563e8-e714-4393-8f99-cc480144a05e"
+                ],
+                "licenseKeyGroupUUID": [
+                    "31d563e8-e714-4393-8f99-cc480144a05e",
+                    "71d563e8-e714-4393-8f99-cc480144a05e"
+                ],
+                "resourceModuleName": "vHNPortalaaS_secondary_1",
+                "serviceResourceId": "testResourceIdVNF"
+            }
+        ],
+        "placementSolutions": [
+            {
+                "resourceModuleName": "ALLOTTED_RESOURCE",
+                "serviceInstanceId": "testSIID1",
+                "serviceResourceId": "testResourceIdAR",
+                "solution": {
+                    "identifierType": "serviceInstanceId",
+                    "identifiers": ["testSIID1"]
+                },
+                "assignmentInfo": [
+                    {
+                        "key": "cloudOwner",
+                        "value": "aic"
+                    },
+                    {
+                        "key": "vnfHostName",
+                        "value": "MDTNJ01"
+                    },
+                    {
+                        "key": "isRehome",
+                        "value": "False"
+                    },
+                    {
+                        "key": "cloudRegionId",
+                        "value": "dfwtx"
+                    }
+                ]
+            },
+            {   "resourceModuleName": "ALLOTTED_RESOURCE",
+                "serviceResourceId": "testResourceIdAR2",
+                "solution": {
+                    "identifierType": "serviceInstanceId",
+                    "identifiers": ["testSIID2"]
+                },
+                "assignmentInfo": [
+                    {
+                        "key": "cloudOwner",
+                        "value": "aic"
+                    },
+                    {
+                        "key": "vnfHostName",
+                        "value": "testVnfHostname2"
+                    },
+                    {
+                        "key": "isRehome",
+                        "value": "False"
+                    },
+                    {
+                        "key": "cloudRegionId",
+                        "value": "testCloudRegionId2"
+                    }
+                ]
+            },
+            {
+                "resourceModuleName": "VNF",
+                "serviceResourceId": "testResourceIdVNF",
+                "solution": {
+                    "identifierType": "cloudRegionId",
+                    "cloudOwner": "aic",
+                    "identifiers": [
+                        "testCloudRegionId3"
+                    ]
+                },
+                "assignmentInfo": [
+                        {
+                            "key": "cloudOwner",
+                            "value": "aic"
+                        },
+                        {
+                            "key": "cloudRegionId",
+                            "value": "testCloudRegionId3"
+                        }
+                    ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallback2AR1Vnf2Net
new file mode 100644 (file)
index 0000000..30fa09a
--- /dev/null
@@ -0,0 +1,116 @@
+{
+    "transactionId": "testRequestId",
+    "requestId": "testRequestId",
+    "requestState": "completed",
+    "statusMessage": "success",
+    "solutions": {
+        "licenseSolutions": [
+            {
+                "resourceModuleName": "vHNPortalaaS_primary_1",
+                "serviceResourceId": "testResourceIdAR",
+                "entitlementPoolUUID": ["f1d563e8-e714-4393-8f99-cc480144a05e",
+                    "j1d563e8-e714-4393-8f99-cc480144a05e"],
+                "licenseKeyGroupUUID": ["s1d563e8-e714-4393-8f99-cc480144a05e",
+                    "b1d563e8-e714-4393-8f99-cc480144a05e"],
+                "entitlementPoolInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+                "licenseKeyGroupInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"]
+            },
+            {
+                "resourceModuleName": "net",
+                "serviceResourceId": "testResourceIdNet2",
+                "entitlementPoolUUID": ["f1d563e8-e714-4393-8f99-cc480144a05n",
+                    "j1d563e8-e714-4393-8f99-cc480144a05n"],
+                "licenseKeyGroupUUID": ["s1d563e8-e714-4393-8f99-cc480144a05n",
+                    "b1d563e8-e714-4393-8f99-cc480144a05n"],
+                "entitlementPoolInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+                "licenseKeyGroupInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"]
+            },
+            {
+                "resourceModuleName": "vHNPortalaaS_secondary_1",
+                "serviceResourceId": "testResourceIdVNF",
+                "entitlementPoolUUID": ["91d563e8-e714-4393-8f99-cc480144a05e",
+                    "21d563e8-e714-4393-8f99-cc480144a05e"],
+                "licenseKeyGroupUUID": [ "31d563e8-e714-4393-8f99-cc480144a05e",
+                    "71d563e8-e714-4393-8f99-cc480144a05e"],
+                "entitlementPoolInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+                "licenseKeyGroupInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+                    "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"]
+            },
+        ],
+        "placementSolutions": [
+            {
+                "resourceModuleName": "ALLOTTED_RESOURCE",
+                "serviceResourceId": "testResourceIdAR",
+                "solution": {
+                    "identifierType": "serviceInstanceId",
+                    "identifiers": ["testSIID1"]
+                },
+                "assignmentInfo": [
+                    { "key": "cloudOwner", "value": "aic" },
+                    { "key": "vnfHostName", "value": "MDTNJ01" },
+                    { "key": "isRehome", "value": "False" },
+                    { "key": "cloudRegionId", "value": "dfwtx" }
+                ]
+            },
+            {
+                "resourceModuleName": "ALLOTTED_RESOURCE",
+                "serviceResourceId": "testResourceIdAR2",
+                "solution": {
+                    "identifierType": "serviceInstanceId",
+                    "identifiers": ["testSIID2"]
+                },
+                "assignmentInfo": [
+                    { "key": "cloudOwner", "value": "aic" },
+                    { "key": "vnfHostName", "value": "testVnfHostname2" },
+                    { "key": "isRehome", "value": "False" },
+                    { "key": "cloudRegionId", "value": "testCloudRegionId2" }
+                ]
+            },
+            {
+                "resourceModuleName": "NETWORK",
+                "serviceResourceId": "testResourceIdNet",
+                "solution": {
+                    "identifierType": "serviceInstanceId",
+                    "identifiers": ["testServiceInstanceIdNet"]
+                },
+                "assignmentInfo": [
+                    { "key": "cloudOwner", "value": "aic" },
+                    { "key": "vnfHostName", "value": "testVnfHostNameNet" },
+                    { "key": "isRehome", "value": "False" },
+                    { "key": "cloudRegionId", "value": "testCloudRegionIdNet" }
+                ]
+            },
+            {
+                "resourceModuleName": "NETWORK",
+                "serviceResourceId": "testResourceIdNet2",
+                "solution": {
+                    "identifierType": "cloudRegionId",
+                    "cloudOwner": "aic",
+                    "identifiers": ["testCloudRegionIdNet2"]
+                },
+                "assignmentInfo": [
+                    { "key": "cloudOwner", "value": "aic" },
+                    { "key": "cloudRegionId", "value": "testCloudRegionIdNet2" }
+                ]
+            },
+            {
+                "resourceModuleName": "VNF",
+                "serviceResourceId": "testResourceIdVNF",
+                "solution": {
+                    "identifierType": "cloudRegionId",
+                    "cloudOwner": "aic",
+                    "identifiers": ["testCloudRegionId3"]
+                },
+                "assignmentInfo": [
+                    { "key": "cloudOwner", "value": "aic" },
+                    { "key": "cloudRegionId", "value": "testCloudRegionId3" }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackInfraVnf
new file mode 100644 (file)
index 0000000..b4e748c
--- /dev/null
@@ -0,0 +1,47 @@
+{
+   "transactionId": "xxx-xxx-xxxx",
+   "requestId": "yyy-yyy-yyyy",
+   "requestStatus": "completed",
+   "statusMessage": "success",
+   "solutions": {
+      "placementSolutions": [
+         {
+            "resourceModuleName": "vGMuxInfra",
+            "serviceResourceId": "some_resource_id",
+            "solution": {
+               "identifierType": "serviceInstanceId",
+               "identifiers": ["gjhd-098-fhd-987"]
+            },
+            "assignmentInfo": [
+               { "key": "cloudOwner", "value": "amazon" },
+               { "key": "vnfHostName", "value": "ahr344gh" },
+               { "key": "isRehome", "value": "False" },
+               { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" }
+            ]
+         },
+         {
+            "resourceModuleName": "vG",
+            "serviceResourceId": "some_resource_id",
+            "solution": {
+               "identifierType": "cloudRegionId",
+               "cloudOwner": "amazon",
+               "identifiers": ["gjhd-098-fhd-987"]
+            },
+            "assignmentInfo": [
+               { "key": "cloudOwner", "value": "amazon" },
+               { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" }
+            ]
+         }
+      ],
+      "licenseSolutions": [
+         {
+            "resourceModuleName": "vGMuxInfra",
+            "serviceResourceId": "some_resource_id",
+            "entitlementPoolUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+            "licenseKeyGroupUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+            "entitlementPoolInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
+            "licenseKeyGroupInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"]
+         }
+      ]
+   }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackNoSolutionFound
new file mode 100644 (file)
index 0000000..8bb29f0
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "solutions": {
+    "placementSolutions": [],
+    "licenseSolutions": []
+  },
+  "transactionId": "08e1b8cf-144a-4bac-b293-d5e2eedc97e8",
+  "requestId": "02c2e322-5839-4c97-9d46-0a5fa6bb642e",
+  "requestStatus": "completed",
+  "statusMessage": "No solution found for plan 08e1b8cf-144a-4bac-b293-d5e2eedc97e8"
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackPolicyException b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackPolicyException
new file mode 100644 (file)
index 0000000..b826884
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "requestError": {
+               "policyException": {
+                 "requestId": "ae81d9a8-c949-493a-999c-f76c80503233",
+                 "text": "Message content size exceeds the allowable limit",
+                 "messageId": "SVC0001"
+               }
+       }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackServiceException b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCallbackServiceException
new file mode 100644 (file)
index 0000000..de43e82
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "requestError": {
+               "serviceException": {
+               "variables": [
+               "severity", 400
+               ],
+                "requestId": "ae81d9a8-c949-493a-999c-f76c80503233",
+                 "text": "OOF PlacementError: requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http://135.21.171.200:8091/v1/plans/97b4e303-5f75-492c-8fb2-21098281c8b8",
+                  "messageId": "SVC0001"
+               }
+       }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofCatalogResp.json
new file mode 100644 (file)
index 0000000..09026d1
--- /dev/null
@@ -0,0 +1,47 @@
+{
+   "serviceResources": {
+      "serviceType": null,
+      "serviceAllottedResources": [],
+      "modelInfo": {
+         "modelInvariantUuid": "1cc4e2e4-eb6e-404d-a66f-c8733cedcce8",
+         "modelName": "ADIOD vRouter vCE 011017 Service",
+         "modelVersion": "5.0",
+         "modelUuid": "2f7f309d-c842-4644-a2e4-34167be5eeb4"
+      },
+      "serviceRole": null,
+      "serviceVnfs": [
+         {
+            "toscaNodeType": "org.openecomp.resource.vf.AdiodVce",
+            "vfModules": [
+               {
+                  "initialCount": null,
+                  "vfModuleLabel": null,
+                  "modelInfo": {
+                     "modelInvariantUuid": "7fb428e1-8000-4800-a71a-f21b946973c5",
+                     "modelName": "AdiodVce..base_vCE..module-0",
+                     "modelVersion": "2",
+                     "modelCustomizationUuid": "1126e7e2-b377-4fd2-ad48-660a20caa829",
+                     "modelUuid": "435d57e1-93a2-4d58-aa5d-f2df2d126276"
+                  },
+                  "hasVolumeGroup": true,
+                  "isBase": true
+               }
+            ],
+            "modelInfo": {
+               "modelInvariantUuid": "fc72435b-4366-4257-a2f7-c70a3a998a7b",
+               "modelName": "ADIoD vCE",
+               "modelVersion": "2.0",
+               "modelCustomizationUuid": "bdaeed40-c964-4966-bdb8-51320dcaf587",
+               "modelInstanceName": "ADIoD vCE 0",
+               "modelUuid": "ec2bd873-5b2c-47e4-8858-f0495fa1dae1"
+            },
+            "nfRole": "",
+            "nfType": "",
+            "nfFunction": "",
+            "nfNamingCode": "",
+            "multiStageDesign": "N"
+        }
+      ],
+      "serviceNetworks": []
+   }
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest
new file mode 100644 (file)
index 0000000..42b2a0f
--- /dev/null
@@ -0,0 +1,99 @@
+{
+  "requestInfo": {
+    "transactionId": "testRequestId-xxx-xxx",
+    "requestId": "testRequestId-yyy-yyy",
+    "callbackUrl": "http://localhost:28090/workflows/messages/message/oofResponse/testRequestId",
+    "sourceId": "so",
+    "requestType": "create",
+    "numSolutions": 1,
+    "optimizers": ["placement"],
+    "timeout": 600
+  },
+  "placementInfo": {
+    "requestParameters": { "customerLatitude": 32.89748, "customerLongitude": -97.040443, "customerName": "xyz" },
+    "placementDemands": [
+      {
+        "resourceModuleName": "vGMuxInfra",
+        "serviceResourceId": "vGMuxInfra-xx",
+        "tenantId": "vGMuxInfra-tenant",
+        "resourceModelInfo": {
+          "modelInvariantId": "vGMuxInfra-modelInvariantId",
+          "modelVersionId": "vGMuxInfra-versionId",
+          "modelName": "vGMuxInfra-model",
+          "modelType": "resource",
+          "modelVersion": "1.0",
+          "modelCustomizationName": "vGMuxInfra-customeModelName"
+        }
+      },
+      {
+        "resourceModuleName": "vG",
+        "serviceResourceId": "71d563e8-e714-4393-8f99-cc480144a05e",
+        "tenantId": "vG-tenant",
+        "resourceModelInfo": {
+          "modelInvariantId": "vG-modelInvariantId",
+          "modelVersionId": "vG-versionId",
+          "modelName": "vG-model",
+          "modelType": "resource",
+          "modelVersion": "1.0",
+          "modelCustomizationName": "vG-customeModelName"
+        },
+        "existingCandidates": [
+          {
+            "identifierType": "service_instance_id",
+            "cloudOwner": "",
+            "identifiers": ["gjhd-098-fhd-987"]
+          }
+        ],
+        "excludedCandidates": [
+          {
+            "identifierType": "service_instance_id",
+            "cloudOwner": "",
+            "identifiers": ["gjhd-098-fhd-987"]
+          },
+          {
+            "identifierType": "vimId",
+            "cloudOwner": "vmware",
+            "identifiers": ["NYMDT67"]
+          }
+        ],
+        "requiredCandidates": [
+          {
+            "identifierType": "vimId",
+            "cloudOwner": "amazon",
+            "identifiers": ["TXAUS219"]
+          }
+        ]
+      }
+    ]
+  },
+  "serviceInfo": {
+    "serviceInstanceId": "d61b2543-5914-4b8f-8e81-81e38575b8ec",
+    "serviceName": "vCPE",
+    "modelInfo": {
+      "modelInvariantId": "vCPE-invariantId",
+      "modelVersionId": "vCPE-versionId",
+      "modelName": "vCPE-model",
+      "modelType": "service",
+      "modelVersion": "1.0",
+      "modelCustomizationName": ""
+    }
+  },
+  "licenseDemands": [
+    {
+      "resourceModuleName": "vGMuxInfra",
+      "serviceResourceId": "vGMuxInfra-xx",
+      "resourceModelInfo": {
+        "modelInvariantId": "vGMuxInfra-modelInvariantId",
+        "modelVersionId": "vGMuxInfra-versionId",
+        "modelName": "vGMuxInfra-model",
+        "modelType": "resource",
+        "modelVersion": "1.0",
+        "modelCustomizationName": ""
+      },
+      "existingLicenses": {
+        "entitlementPoolUUID": ["87257b49-9602-4ca1-9817-094e52bc873b", "43257b49-9602-4fe5-9337-094e52bc9435"],
+        "licenseKeyGroupUUID": ["87257b49-9602-4ca1-9817-094e52bc873b", "43257b49-9602-4fe5-9337-094e52bc9435"]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest_infravnf b/bpmn/MSOCommonBPMN/src/test/resources/__files/BuildingBlocks/oofRequest_infravnf
new file mode 100644 (file)
index 0000000..67c9fbe
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "requestInfo": {
+    "transactionId": "testRequestId",
+    "requestId": "testRequestId",
+    "callbackUrl": "http://localhost:28090/workflows/messages/message/oofResponse/testRequestId",
+    "sourceId": "so",
+    "requestType": "create",
+    "numSolutions": 1,
+    "optimizers": ["placement"],
+    "timeout": 600    },
+  "placementInfo": {
+    "requestParameters": {
+      "customerLatitude": "32.89748",
+      "customerLongitude": "-97.040443",
+      "customerName": "xyz"    },
+    "subscriberInfo": {       "globalSubscriberId": "SUB12_0322_DS_1201",
+      "subscriberName": "SUB_12_0322_DS_1201",
+      "subscriberCommonSiteId": ""    },
+    "placementDemands": [
+      {"resourceModuleName": "VNF","serviceResourceId": "test-resource-id-000","tenantId": "null","resourceModelInfo": {
+  "modelInvariantId": "fc72435b-4366-4257-a2f7-c70a3a998a7b",
+  "modelVersionId": "ec2bd873-5b2c-47e4-8858-f0495fa1dae1",
+  "modelName": "ADIoD vCE",
+  "modelType": "",
+  "modelVersion": "2.0",
+  "modelCustomizationName": ""  }}
+      ]
+    },
+  "serviceInfo": {
+    "serviceInstanceId": "ff5256d2-5a33-55df-13ab-12abad84e7ff",
+    "serviceName": "null",
+    "modelInfo": {
+      "modelType": "",
+      "modelInvariantId": "1cc4e2e4-eb6e-404d-a66f-c8733cedcce8",
+      "modelVersionId": "2f7f309d-c842-4644-a2e4-34167be5eeb4",
+      "modelName": "ADIOD vRouter vCE 011017 Service",
+      "modelVersion": "5.0",
+      "modelCustomizationName": ""
+    }
+  },
+  "licenseInfo": {
+    "licenseDemands": [
+      {
+"resourceModuleName": "VNF",
+"serviceResourceId": "test-resource-id-000",
+"resourceInstanceType": "VNF",
+"resourceModelInfo": {
+  "modelInvariantId": "fc72435b-4366-4257-a2f7-c70a3a998a7b",
+  "modelVersionId": "ec2bd873-5b2c-47e4-8858-f0495fa1dae1",
+  "modelName": "ADIoD vCE",
+  "modelType": "",
+  "modelVersion": "2.0",
+  "modelCustomizationName": ""
+  }
+      }]
+    }}
\ No newline at end of file
index 049fc7c..539d365 100644 (file)
-# Default URN Mappings for unit tests\r
-\r
-mso.rollback=true\r
-\r
-canopi.auth=757A94191D685FD2092AC1490730A4FC\r
-csi.aots.addincidentmanagement.endpoint=http://localhost:28090/AddIncidentManagementTicketRequest\r
-csi.networkstatus.endpoint=http://localhost:28090/SendManagedNetworkStatusNotification\r
-mso.csi.pwd=4EA237303511EFBBC37F17A351562131\r
-mso.csi.usrname=mso\r
-mso.msoKey=07a7159d3bf51a0e53be7a8f89699be7\r
-\r
-mso.healthcheck.log.debug=false\r
-\r
-mso.adapters.completemsoprocess.endpoint=http://localhost:28090/CompleteMsoProcess\r
-\r
-mso.adapters.db.endpoint=http://localhost:28090/dbadapters/RequestsDbAdapter\r
-mso.adapters.openecomp.db.endpoint=http://localhost:28090/dbadapters/RequestsDbAdapter\r
-mso.adapters.db.auth=757A94191D685FD2092AC1490730A4FC\r
-\r
-mso.adapters.network.endpoint=http://localhost:28090/networks/NetworkAdapter\r
-mso.adapters.network.rest.endpoint=http://localhost:28090/networks/rest/v1/networks\r
-\r
-mso.adapters.po.auth=757A94191D685FD2092AC1490730A4FC\r
-mso.adapters.po.password=3141634BF7E070AA289CF2892C986C0B\r
-mso.po.timeout=PT60S\r
-mso.default.adapter.namespace=http://org.openecomp.mso\r
-mso.adapters.workflow.message.endpoint=http://localhost:28090/workflows/messages/message\r
-\r
-aai.auth=26AFB797A6A57960D5D718491925C50F77CDC22AC394B3DBA09950D8FD1C0764\r
-\r
-policy.endpoint=https://mtanjvsgcvm02.nvp.cip.att.com:8081/pdp/api/\r
-policy.client.auth=Basic bTAzNzQzOnBvbGljeVIwY2sk\r
-policy.auth=Basic dGVzdHBkcDphbHBoYTEyMw==\r
-policy.environment=TEST\r
-\r
-appc.topic.read=APPC-TEST-AMDOCS2\r
-appc.topic.write=APPC-TEST-AMDOCS1-DEV3\r
-appc.topic.read.timeout=120000\r
-appc.client.response.timeout=120000\r
-appc.service=ueb\r
-appc.poolMembers=uebsb93kcdc.it.att.com:3904,uebsb92kcdc.it.att.com:3904,uebsb91kcdc.it.att.com:3904\r
-appc.client.key=iaEMAfjsVsZnraBP\r
-appc.client.secret=wcivUjsjXzmGFBfxMmyJu9dz\r
-\r
-mso.adapters.sdnc.endpoint=http://localhost:28090/SDNCAdapter\r
-mso.adapters.sdnc.rest.endpoint=http://localhost:28090/SDNCAdapter/v1/sdnc\r
-mso.adapters.sdnc.timeout=PT60S\r
-mso.sdnc.firewall.yang.model=http://com/openecomp/svc/mis/firewall-lite-gui\r
-mso.sdnc.firewall.yang.model.version=2015-05-15\r
-mso.sdnc.password=3141634BF7E070AA289CF2892C986C0B\r
-mso.sdnc.timeout.firewall.minutes=20\r
-mso.callbackRetryAttempts=5\r
-mso.sdnc.timeout=PT10S\r
-mso.sdnc.timeout.ucpe.async.hours=120\r
-mso.sdnc.timeout.ucpe.async.minutes=5\r
-mso.workflow.message.endpoint=http://localhost:28080/mso/WorkflowMesssage\r
-mso.workflow.sdncadapter.callback=http://localhost:28080/mso/SDNCAdapterCallbackService\r
-\r
-mso.sniro.auth=test:testpwd\r
-mso.sniro.timeout=PT30M\r
-mso.sniro.policies.dhv.2vvig=SNIRO.DistanceToLocationPolicy_vhngw,SNIRO.VNFPolicy_vhngatewayprimary1_v1,SNIRO.ResourceInstancePolicy_hngateway,SNIRO.ResourceRegionPolicy_hngateway_v1,SNIRO.VNFPolicy_vhngatewaysecondary1_v1,SNIRO.ZonePolicy_vhngw,SNIRO.PlacementOptimizationPolicy_dhv_v3,SNIRO.VNFPolicy_vhnportal_primary1_v1,SNIRO.ResourceInstancePolicy_vhnportal_v3,SNIRO.ResourceRegionPolicy_vhnportal_v1,SNIRO.VNFPolicy_vhnportalsecondary1_v1,SNIRO.ZonePolicy_vhnportal,SNIRO.DistanceToLocationPolicy_vvig,SNIRO.InventoryGroupPolicy_vvig,SNIRO.VNFPolicy_vvigprimary1_v1,SNIRO.ResourceInstancePolicy_vvig,SNIRO.VNFPolicy_vvigsecondary1_v1\r
-mso.sniro.policies.dhv.4vvig=SNIRO.DistanceToLocationPolicy_vhngw,SNIRO.VNFPolicy_vhngatewayprimary1_v1,SNIRO.ResourceInstancePolicy_hngateway,SNIRO.ResourceRegionPolicy_hngateway_v1,SNIRO.VNFPolicy_vhngatewaysecondary1_v1,SNIRO.ZonePolicy_vhngw,SNIRO.PlacementOptimizationPolicy_dhv_v3,SNIRO.VNFPolicy_vhnportal_primary1_v1,SNIRO.ResourceInstancePolicy_vhnportal_v3,SNIRO.ResourceRegionPolicy_vhnportal_v1,SNIRO.VNFPolicy_vhnportalsecondary1_v1,SNIRO.ZonePolicy_vhnportal,SNIRO.VNFPolicy_vvigprimary2_v1,SNIRO.VNFPolicy_vvigsecondary2_v1,SNIRO.DistanceToLocationPolicy_vvig,SNIRO.InventoryGroupPolicy_vvig,SNIRO.VNFPolicy_vvigprimary1_v1,SNIRO.ResourceInstancePolicy_vvig,SNIRO.VNFPolicy_vvigsecondary1_v1\r
-\r
-mso.service.agnostic.sniro.host=http://localhost:28090\r
-mso.service.agnostic.sniro.endpoint=/sniro/api/v2/placement\r
-\r
-mso.catalog.db.endpoint=http://localhost:28090/\r
-\r
-ruby.create-ticket-request.dmaap.username=m04768@mso.ecomp.att.com\r
-ruby.create-ticket-request.dmaap.password=eHQ1cUJrOUc\r
-ruby.create-ticket-request.publisher.topic=com.att.pdas.st1.msoCMFallout-v1\r
-\r
-\r
-mso.adapters.tenant.endpoint=http://localhost:28090/tenantAdapterMock\r
-mso.adapters.vnf-async.endpoint=http://localhost:28090/vnfs/VnfAdapterAsync\r
-mso.adapters.vnf.endpoint=http://localhost:28090/vnfs/VnfAdapter\r
-mso.adapters.vnf.rest.endpoint=http://localhost:28090/vnfs/rest/v1/vnfs\r
-mso.workflow.vnfadapter.create.callback=http://localhost:28080/mso/vnfAdapterNotify\r
-mso.workflow.vnfadapter.delete.callback=http://localhost:28080/mso/vnfAdapterNotify\r
-mso.workflow.vnfadapter.query.callback=http://localhost:28080/mso/services/VNFAdapterQuerCallbackV1\r
-mso.workflow.vnfadapter.rollback.callback=http://localhost:28080/mso/vnfAdapterNotify\r
-mso.workflow.createvce.delay.seconds=1\r
-mso.infra.customer.id=testCustIdInfra\r
-\r
-aai.endpoint=http://localhost:28090\r
-\r
-# AAI version mappings\r
-\r
-# Example to override default version for a resource:\r
-#mso.workflow.default.aai.vce.version=6\r
-#mso.workflow.default.aai.v6.vce.uri=/aai/v6/network/vces/vce\r
-mso.workflow.global.default.aai.namespace=http://org.openecomp.aai.inventory/\r
-mso.workflow.global.default.aai.version=8\r
-mso.workflow.default.aai.cloud-region.version=9\r
-mso.workflow.default.aai.generic-vnf.version=9\r
-\r
-mso.workflow.default.aai.v9.cloud-region.uri=/aai/v9/cloud-infrastructure/cloud-regions/cloud-region/att-aic\r
-mso.workflow.default.aai.v8.customer.uri=/aai/v8/business/customers/customer\r
-mso.workflow.default.aai.v8.generic-query.uri=/aai/v8/search/generic-query\r
-mso.workflow.default.aai.v9.generic-vnf.uri=/aai/v9/network/generic-vnfs/generic-vnf\r
-mso.workflow.default.aai.v8.l3-network.uri=/aai/v8/network/l3-networks/l3-network\r
-mso.workflow.default.aai.v8.network-policy.uri=/aai/v8/network/network-policies/network-policy\r
-mso.workflow.default.aai.v8.nodes-query.uri=/aai/v8/search/nodes-query\r
-mso.workflow.default.aai.v8.route-table-reference.uri=/aai/v8/network/route-table-references/route-table-reference\r
-mso.workflow.default.aai.v8.tenant.uri=/aai/v8/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant\r
-mso.workflow.default.aai.v8.vce.uri=/aai/v8/network/vces/vce\r
-mso.workflow.default.aai.v8.vpn-binding.uri=/aai/v8/network/vpn-bindings/vpn-binding\r
-mso.workflow.notification.name=GenericNotificationService\r
-mso.bpmn.optimisticlockingexception.retrycount=3\r
-\r
-log.debug.CompleteMsoProcess=true\r
-log.debug.CreateNetworkInstanceInfra=true\r
-log.debug.CreateServiceInstanceInfra=true\r
-log.debug.DeleteNetworkInstanceInfra=true\r
-log.debug.FalloutHandler=true\r
-log.debug.GenericGetService=true\r
-log.debug.sdncAdapter=true\r
-log.debug.UpdateNetworkInstanceInfra=true\r
-log.debug.VnfAdapterRestV1=true\r
-log.debug.GenericGetNetwork=true\r
-log.debug.GenericGetVnf=true\r
-log.debug.GenericDeleteService=true\r
-log.debug.GenericDeleteNetwork=true\r
-log.debug.GenericDeleteVnf=true\r
-log.debug.vnfAdapterCreateV1=true\r
-log.debug.vnfAdapterRestV1=true\r
-\r
-sdno.health-check.dmaap.username=m04768@mso.ecomp.att.com\r
-sdno.health-check.dmaap.password=eHQ1cUJrOUc\r
-sdno.health-check.dmaap.subscriber.topic=com.att.sdno.test-health-diagnostic-v02\r
+# Default URN Mappings for unit tests
+
+mso.rollback=true
+
+canopi.auth=757A94191D685FD2092AC1490730A4FC
+csi.aots.addincidentmanagement.endpoint=http://localhost:28090/AddIncidentManagementTicketRequest
+csi.networkstatus.endpoint=http://localhost:28090/SendManagedNetworkStatusNotification
+mso.csi.pwd=4EA237303511EFBBC37F17A351562131
+mso.csi.usrname=mso
+mso.msoKey=07a7159d3bf51a0e53be7a8f89699be7
+
+mso.healthcheck.log.debug=false
+
+mso.adapters.completemsoprocess.endpoint=http://localhost:28090/CompleteMsoProcess
+
+mso.adapters.db.endpoint=http://localhost:28090/dbadapters/RequestsDbAdapter
+mso.adapters.openecomp.db.endpoint=http://localhost:28090/dbadapters/RequestsDbAdapter
+mso.adapters.db.auth=757A94191D685FD2092AC1490730A4FC
+
+mso.adapters.network.endpoint=http://localhost:28090/networks/NetworkAdapter
+mso.adapters.network.rest.endpoint=http://localhost:28090/networks/rest/v1/networks
+
+mso.adapters.po.auth=757A94191D685FD2092AC1490730A4FC
+mso.adapters.po.password=3141634BF7E070AA289CF2892C986C0B
+mso.po.timeout=PT60S
+mso.default.adapter.namespace=http://org.openecomp.mso
+mso.adapters.workflow.message.endpoint=http://localhost:28090/workflows/messages/message
+
+aai.auth=26AFB797A6A57960D5D718491925C50F77CDC22AC394B3DBA09950D8FD1C0764
+
+policy.endpoint=https://mtanjvsgcvm02.nvp.cip.att.com:8081/pdp/api/
+policy.client.auth=Basic bTAzNzQzOnBvbGljeVIwY2sk
+policy.auth=Basic dGVzdHBkcDphbHBoYTEyMw==
+policy.environment=TEST
+
+appc.topic.read=APPC-TEST-AMDOCS2
+appc.topic.write=APPC-TEST-AMDOCS1-DEV3
+appc.topic.read.timeout=120000
+appc.client.response.timeout=120000
+appc.service=ueb
+appc.poolMembers=uebsb93kcdc.it.att.com:3904,uebsb92kcdc.it.att.com:3904,uebsb91kcdc.it.att.com:3904
+appc.client.key=iaEMAfjsVsZnraBP
+appc.client.secret=wcivUjsjXzmGFBfxMmyJu9dz
+
+mso.adapters.sdnc.endpoint=http://localhost:28090/SDNCAdapter
+mso.adapters.sdnc.rest.endpoint=http://localhost:28090/SDNCAdapter/v1/sdnc
+mso.adapters.sdnc.timeout=PT60S
+mso.sdnc.firewall.yang.model=http://com/openecomp/svc/mis/firewall-lite-gui
+mso.sdnc.firewall.yang.model.version=2015-05-15
+mso.sdnc.password=3141634BF7E070AA289CF2892C986C0B
+mso.sdnc.timeout.firewall.minutes=20
+mso.callbackRetryAttempts=5
+mso.sdnc.timeout=PT10S
+mso.sdnc.timeout.ucpe.async.hours=120
+mso.sdnc.timeout.ucpe.async.minutes=5
+mso.workflow.message.endpoint=http://localhost:28080/mso/WorkflowMesssage
+mso.workflow.sdncadapter.callback=http://localhost:28080/mso/SDNCAdapterCallbackService
+
+mso.sniro.auth=test:testpwd
+mso.sniro.timeout=PT30M
+mso.sniro.policies.dhv.2vvig=SNIRO.DistanceToLocationPolicy_vhngw,SNIRO.VNFPolicy_vhngatewayprimary1_v1,SNIRO.ResourceInstancePolicy_hngateway,SNIRO.ResourceRegionPolicy_hngateway_v1,SNIRO.VNFPolicy_vhngatewaysecondary1_v1,SNIRO.ZonePolicy_vhngw,SNIRO.PlacementOptimizationPolicy_dhv_v3,SNIRO.VNFPolicy_vhnportal_primary1_v1,SNIRO.ResourceInstancePolicy_vhnportal_v3,SNIRO.ResourceRegionPolicy_vhnportal_v1,SNIRO.VNFPolicy_vhnportalsecondary1_v1,SNIRO.ZonePolicy_vhnportal,SNIRO.DistanceToLocationPolicy_vvig,SNIRO.InventoryGroupPolicy_vvig,SNIRO.VNFPolicy_vvigprimary1_v1,SNIRO.ResourceInstancePolicy_vvig,SNIRO.VNFPolicy_vvigsecondary1_v1
+mso.sniro.policies.dhv.4vvig=SNIRO.DistanceToLocationPolicy_vhngw,SNIRO.VNFPolicy_vhngatewayprimary1_v1,SNIRO.ResourceInstancePolicy_hngateway,SNIRO.ResourceRegionPolicy_hngateway_v1,SNIRO.VNFPolicy_vhngatewaysecondary1_v1,SNIRO.ZonePolicy_vhngw,SNIRO.PlacementOptimizationPolicy_dhv_v3,SNIRO.VNFPolicy_vhnportal_primary1_v1,SNIRO.ResourceInstancePolicy_vhnportal_v3,SNIRO.ResourceRegionPolicy_vhnportal_v1,SNIRO.VNFPolicy_vhnportalsecondary1_v1,SNIRO.ZonePolicy_vhnportal,SNIRO.VNFPolicy_vvigprimary2_v1,SNIRO.VNFPolicy_vvigsecondary2_v1,SNIRO.DistanceToLocationPolicy_vvig,SNIRO.InventoryGroupPolicy_vvig,SNIRO.VNFPolicy_vvigprimary1_v1,SNIRO.ResourceInstancePolicy_vvig,SNIRO.VNFPolicy_vvigsecondary1_v1
+
+mso.service.agnostic.sniro.host=http://localhost:28090
+mso.service.agnostic.sniro.endpoint=/sniro/api/v2/placement
+
+mso.oof.auth=test:testpwd
+mso.oof.endpoint=http://localhost:28090/api/oof/v1/placement
+mso.oof.timeout=PT30M
+mso.service.agnostic.oof.host=http://localhost:28090
+mso.service.agnostic.oof.endpoint=/api/oof/v1/placement
+
+mso.catalog.db.endpoint=http://localhost:28090/
+
+ruby.create-ticket-request.dmaap.username=m04768@mso.ecomp.att.com
+ruby.create-ticket-request.dmaap.password=eHQ1cUJrOUc
+ruby.create-ticket-request.publisher.topic=com.att.pdas.st1.msoCMFallout-v1
+
+
+mso.adapters.tenant.endpoint=http://localhost:28090/tenantAdapterMock
+mso.adapters.vnf-async.endpoint=http://localhost:28090/vnfs/VnfAdapterAsync
+mso.adapters.vnf.endpoint=http://localhost:28090/vnfs/VnfAdapter
+mso.adapters.vnf.rest.endpoint=http://localhost:28090/vnfs/rest/v1/vnfs
+mso.workflow.vnfadapter.create.callback=http://localhost:28080/mso/vnfAdapterNotify
+mso.workflow.vnfadapter.delete.callback=http://localhost:28080/mso/vnfAdapterNotify
+mso.workflow.vnfadapter.query.callback=http://localhost:28080/mso/services/VNFAdapterQuerCallbackV1
+mso.workflow.vnfadapter.rollback.callback=http://localhost:28080/mso/vnfAdapterNotify
+mso.workflow.createvce.delay.seconds=1
+mso.infra.customer.id=testCustIdInfra
+
+aai.endpoint=http://localhost:28090
+
+# AAI version mappings
+
+# Example to override default version for a resource:
+#mso.workflow.default.aai.vce.version=6
+#mso.workflow.default.aai.v6.vce.uri=/aai/v6/network/vces/vce
+mso.workflow.global.default.aai.namespace=http://org.openecomp.aai.inventory/
+mso.workflow.global.default.aai.version=8
+mso.workflow.default.aai.cloud-region.version=9
+mso.workflow.default.aai.generic-vnf.version=9
+
+mso.workflow.default.aai.v9.cloud-region.uri=/aai/v9/cloud-infrastructure/cloud-regions/cloud-region/att-aic
+mso.workflow.default.aai.v8.customer.uri=/aai/v8/business/customers/customer
+mso.workflow.default.aai.v8.generic-query.uri=/aai/v8/search/generic-query
+mso.workflow.default.aai.v9.generic-vnf.uri=/aai/v9/network/generic-vnfs/generic-vnf
+mso.workflow.default.aai.v8.l3-network.uri=/aai/v8/network/l3-networks/l3-network
+mso.workflow.default.aai.v8.network-policy.uri=/aai/v8/network/network-policies/network-policy
+mso.workflow.default.aai.v8.nodes-query.uri=/aai/v8/search/nodes-query
+mso.workflow.default.aai.v8.route-table-reference.uri=/aai/v8/network/route-table-references/route-table-reference
+mso.workflow.default.aai.v8.tenant.uri=/aai/v8/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant
+mso.workflow.default.aai.v8.vce.uri=/aai/v8/network/vces/vce
+mso.workflow.default.aai.v8.vpn-binding.uri=/aai/v8/network/vpn-bindings/vpn-binding
+mso.workflow.notification.name=GenericNotificationService
+mso.bpmn.optimisticlockingexception.retrycount=3
+
+log.debug.CompleteMsoProcess=true
+log.debug.CreateNetworkInstanceInfra=true
+log.debug.CreateServiceInstanceInfra=true
+log.debug.DeleteNetworkInstanceInfra=true
+log.debug.FalloutHandler=true
+log.debug.GenericGetService=true
+log.debug.sdncAdapter=true
+log.debug.UpdateNetworkInstanceInfra=true
+log.debug.VnfAdapterRestV1=true
+log.debug.GenericGetNetwork=true
+log.debug.GenericGetVnf=true
+log.debug.GenericDeleteService=true
+log.debug.GenericDeleteNetwork=true
+log.debug.GenericDeleteVnf=true
+log.debug.vnfAdapterCreateV1=true
+log.debug.vnfAdapterRestV1=true
+
+sdno.health-check.dmaap.username=m04768@mso.ecomp.att.com
+sdno.health-check.dmaap.password=eHQ1cUJrOUc
+sdno.health-check.dmaap.subscriber.topic=com.att.sdno.test-health-diagnostic-v02
 sdno.health-check.dmaap.publisher.topic=com.att.sdno.test-health-diagnostic-v02
\ No newline at end of file
index 4050657..611c8df 100644 (file)
-/*-\r
- * ============LICENSE_START=======================================================\r
- * ONAP - SO\r
- * ================================================================================\r
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ============LICENSE_END=========================================================\r
- */\r
-\r
-package org.openecomp.mso.bpmn.core.domain;\r
-\r
-import java.io.Serializable;\r
-import java.util.List;\r
-\r
-import com.fasterxml.jackson.annotation.JsonInclude;\r
-import com.fasterxml.jackson.annotation.JsonRootName;\r
-\r
-/**\r
- * Stores resources placement and licensing information\r
- *\r
- */\r
-@JsonRootName("homingSolution")\r
-@JsonInclude(JsonInclude.Include.NON_NULL)\r
-public class HomingSolution extends JsonWrapper implements Serializable  {\r
-\r
-       private static final long serialVersionUID = 1L;\r
-\r
-       private InventoryType inventoryType;\r
-       private boolean isRehome;\r
-       private String serviceInstanceId; //TODO should start using si object instead\r
-       private String cloudOwner;\r
-       private String cloudRegionId;\r
-       private String aicClli;\r
-       private String aicVersion;\r
-       private String tenant;\r
-       private VnfResource vnf;\r
-       private License license = new License();\r
-\r
-\r
-       /**\r
-        * @return the inventoryType which indicates the solution type\r
-        */\r
-       public InventoryType getInventoryType() {\r
-               return inventoryType;\r
-       }\r
-\r
-       public void setInventoryType(InventoryType inventoryType) {\r
-               this.inventoryType = inventoryType;\r
-       }\r
-       public boolean isRehome() {\r
-               return isRehome;\r
-       }\r
-       public void setRehome(boolean isRehome) {\r
-               this.isRehome = isRehome;\r
-       }\r
-\r
-       public String getServiceInstanceId() {\r
-               return serviceInstanceId;\r
-       }\r
-\r
-       public void setServiceInstanceId(String serviceInstanceId) {\r
-               this.serviceInstanceId = serviceInstanceId;\r
-       }\r
-\r
-       public String getCloudOwner() {\r
-               return cloudOwner;\r
-       }\r
-\r
-       public void setCloudOwner(String cloudOwner) {\r
-               this.cloudOwner = cloudOwner;\r
-       }\r
-\r
-       public String getCloudRegionId() {\r
-               return cloudRegionId;\r
-       }\r
-\r
-       public void setCloudRegionId(String cloudRegionId) {\r
-               this.cloudRegionId = cloudRegionId;\r
-       }\r
-       /**\r
-        * @return the aicClli (aka aic site, physical location id)\r
-        */\r
-       public String getAicClli() {\r
-               return aicClli;\r
-       }\r
-\r
-       public void setAicClli(String aicClli) {\r
-               this.aicClli = aicClli;\r
-       }\r
-\r
-       public String getAicVersion() {\r
-               return aicVersion;\r
-       }\r
-\r
-       public void setAicVersion(String aicVersion) {\r
-               this.aicVersion = aicVersion;\r
-       }\r
-\r
-       public String getTenant() {\r
-               return tenant;\r
-       }\r
-\r
-       public void setTenant(String tenant) {\r
-               this.tenant = tenant;\r
-       }\r
-\r
-       /**\r
-        * @return the vnf that the resource was homed too.\r
-        */\r
-       public VnfResource getVnf() {\r
-               return vnf;\r
-       }\r
-\r
-       public void setVnf(VnfResource vnf) {\r
-               this.vnf = vnf;\r
-       }\r
-\r
-       public License getLicense() {\r
-               return license;\r
-       }\r
-\r
-       public void setLicense(License license) {\r
-               this.license = license;\r
-       }\r
-\r
-\r
-       public static long getSerialversionuid() {\r
-               return serialVersionUID;\r
-       }\r
-\r
-\r
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.bpmn.core.domain;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+
+/**
+ * Stores resources placement and licensing information
+ *
+ */
+@JsonRootName("homingSolution")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class HomingSolution extends JsonWrapper implements Serializable  {
+
+       private static final long serialVersionUID = 1L;
+
+       private InventoryType inventoryType;
+       private boolean isRehome;
+       private String serviceInstanceId; //TODO should start using si object instead
+       private String cloudOwner;
+       private String cloudRegionId;
+       private String aicClli;
+       private String aicVersion;
+       private String tenant;
+       private VnfResource vnf;
+       private License license = new License();
+
+
+       /**
+        * @return the inventoryType which indicates the solution type
+        */
+       public InventoryType getInventoryType() {
+               return inventoryType;
+       }
+
+       public void setInventoryType(InventoryType inventoryType) {
+               this.inventoryType = inventoryType;
+       }
+       public boolean isRehome() {
+               return isRehome;
+       }
+       public void setRehome(boolean isRehome) {
+               this.isRehome = isRehome;
+       }
+
+       public String getServiceInstanceId() {
+               return serviceInstanceId;
+       }
+
+       public void setServiceInstanceId(String serviceInstanceId) {
+               this.serviceInstanceId = serviceInstanceId;
+       }
+
+       public String getCloudOwner() {
+               return cloudOwner;
+       }
+
+       public void setCloudOwner(String cloudOwner) {
+               this.cloudOwner = cloudOwner;
+       }
+
+       public String getCloudRegionId() {
+               return cloudRegionId;
+       }
+
+       public void setCloudRegionId(String cloudRegionId) {
+               this.cloudRegionId = cloudRegionId;
+       }
+       /**
+        * @return the aicClli (aka aic site, physical location id)
+        */
+       public String getAicClli() {
+               return aicClli;
+       }
+
+       public void setAicClli(String aicClli) {
+               this.aicClli = aicClli;
+       }
+
+       public String getAicVersion() {
+               return aicVersion;
+       }
+
+       public void setAicVersion(String aicVersion) {
+               this.aicVersion = aicVersion;
+       }
+
+       public String getTenant() {
+               return tenant;
+       }
+
+       public void setTenant(String tenant) {
+               this.tenant = tenant;
+       }
+
+       /**
+        * @return the vnf that the resource was homed too.
+        */
+       public VnfResource getVnf() {
+               return vnf;
+       }
+
+       public void setVnf(VnfResource vnf) {
+               this.vnf = vnf;
+       }
+
+       public License getLicense() {
+               return license;
+       }
+
+       public void setLicense(License license) {
+               this.license = license;
+       }
+
+
+       public static long getSerialversionuid() {
+               return serialVersionUID;
+       }
+
+
 }
\ No newline at end of file
index cae5bf8..a5bb2bc 100644 (file)
@@ -39,6 +39,7 @@ public class ModelInfo  extends JsonWrapper implements Serializable {
        private String modelVersion = "";\r
        //additionally on resource level\r
        private String modelCustomizationUuid = "";\r
+       private String modelCustomizationName = "";\r
        private String modelInstanceName = "";\r
        private String modelType = "";\r
 \r
@@ -74,6 +75,12 @@ public class ModelInfo  extends JsonWrapper implements Serializable {
        public void setModelCustomizationUuid(String modelCustomizationUuid) {\r
                this.modelCustomizationUuid = modelCustomizationUuid;\r
        }\r
+       public String getModelCustomizationName() {\r
+               return modelCustomizationName;\r
+       }\r
+       public void setModelCustomizationName(String modelCustomizationName) {\r
+               this.modelCustomizationName = modelCustomizationName;\r
+       }\r
        public String getModelInstanceName() {\r
                return modelInstanceName;\r
        }\r
index 503cdfd..05c3fa2 100644 (file)
@@ -50,704 +50,728 @@ import static org.apache.commons.lang3.StringUtils.*
  */
 public class CreateVcpeResCustService extends AbstractServiceTaskProcessor {
 
-       private static final String DebugFlag = "isDebugLogEnabled"
-
-       String Prefix="CVRCS_"
-       ExceptionUtil exceptionUtil = new ExceptionUtil()
-       JsonUtils jsonUtil = new JsonUtils()
-       VidUtils vidUtils = new VidUtils()
-       CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
-
-       /**
-        * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
-        * @param execution
-        */
-       public InitializeProcessVariables(DelegateExecution execution){
-               /* Initialize all the process variables in this block */
-
-               execution.setVariable("createVcpeServiceRequest", "")
-               execution.setVariable("globalSubscriberId", "")
-               execution.setVariable("serviceInstanceName", "")
-               execution.setVariable("msoRequestId", "")
-               execution.setVariable(Prefix+"VnfsCreatedCount", 0)
-               execution.setVariable("productFamilyId", "")
-               execution.setVariable("brgWanMacAddress", "")
-
-               //TODO
-               execution.setVariable("sdncVersion", "1707")
-       }
-
-       // **************************************************
-       //     Pre or Prepare Request Section
-       // **************************************************
-       /**
-        * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
-        * @param execution
-        */
-       public void preProcessRequest (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-               execution.setVariable("prefix",Prefix)
-
-               utils.log("DEBUG", " ***** Inside preProcessRequest CreateVcpeResCustService Request ***** ", isDebugEnabled)
-
-               try {
-                       // initialize flow variables
-                       InitializeProcessVariables(execution)
-
-                       //Config Inputs
-                       String aaiDistDelay = execution.getVariable('URN_mso_workflow_aai_distribution_delay')
-                       if (isBlank(aaiDistDelay)) {
-                               msg = "URN_mso_workflow_aai_distribution_delay is null"
-                               utils.log("DEBUG", msg, isDebugEnabled)
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
-                       }
-                       execution.setVariable("aaiDistDelay", aaiDistDelay)
-                       utils.log("DEBUG","AAI distribution delay: " + aaiDistDelay, isDebugEnabled)
-
-                       // check for incoming json message/input
-                       String createVcpeServiceRequest = execution.getVariable("bpmnRequest")
-                       utils.logAudit(createVcpeServiceRequest)
-                       execution.setVariable("createVcpeServiceRequest", createVcpeServiceRequest);
-                       println 'createVcpeServiceRequest - ' + createVcpeServiceRequest
-
-                       // extract requestId
-                       String requestId = execution.getVariable("mso-request-id")
-                       execution.setVariable("msoRequestId", requestId)
-
-                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
-
-                       if ((serviceInstanceId == null) || (serviceInstanceId.isEmpty())) {
-                               serviceInstanceId = UUID.randomUUID().toString()
-                               utils.log("DEBUG", " Generated new Service Instance: " + serviceInstanceId , isDebugEnabled)
-                       } else {
-                               utils.log("DEBUG", "Using provided Service Instance ID: " + serviceInstanceId , isDebugEnabled)
-                       }
-
-                       serviceInstanceId = UriUtils.encode(serviceInstanceId,"UTF-8")
-                       execution.setVariable("serviceInstanceId", serviceInstanceId)
-
-                       String requestAction = execution.getVariable("requestAction")
-                       execution.setVariable("requestAction", requestAction)
-
-                       setBasicDBAuthHeader(execution, isDebugEnabled)
-                       
-                       String source = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.source")
-                       if ((source == null) || (source.isEmpty())) {
-                               source = "VID"
-                       }
-                       execution.setVariable("source", source)
-
-                       // extract globalSubscriberId
-                       String globalSubscriberId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.subscriberInfo.globalSubscriberId")
-
-                       // verify element global-customer-id is sent from JSON input, throw exception if missing
-                       if ((globalSubscriberId == null) || (globalSubscriberId.isEmpty())) {
-                               String dataErrorMessage = " Element 'globalSubscriberId' is missing. "
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
-
-                       } else {
-                               execution.setVariable("globalSubscriberId", globalSubscriberId)
-                               execution.setVariable("globalCustomerId", globalSubscriberId)
-                       }
-
-                       // extract subscriptionServiceType
-                       String subscriptionServiceType = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestParameters.subscriptionServiceType")
-                       execution.setVariable("subscriptionServiceType", subscriptionServiceType)
-                       utils.log("DEBUG", "Incoming subscriptionServiceType is: " + subscriptionServiceType, isDebugEnabled)
-
-                       String suppressRollback = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.suppressRollback")
-                       execution.setVariable("disableRollback", suppressRollback)
-                       utils.log("DEBUG", "Incoming Suppress/Disable Rollback is: " + suppressRollback, isDebugEnabled)
-
-                       String productFamilyId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.productFamilyId")
-                       execution.setVariable("productFamilyId", productFamilyId)
-                       utils.log("DEBUG", "Incoming productFamilyId is: " + productFamilyId, isDebugEnabled)
-                       
-                       String subscriberInfo = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.subscriberInfo")
-                       execution.setVariable("subscriberInfo", subscriberInfo)
-                       utils.log("DEBUG", "Incoming subscriberInfo is: " + subscriberInfo, isDebugEnabled)
-
-                 /*
-                 * Extracting User Parameters from incoming Request and converting into a Map
-                 */
-                 def jsonSlurper = new JsonSlurper()
-                 def jsonOutput = new JsonOutput()
-
-                 Map reqMap = jsonSlurper.parseText(createVcpeServiceRequest)
-\r  
-                 //InputParams
-                 def userParams = reqMap.requestDetails?.requestParameters?.userParams
-  
-                 Map<String, String> inputMap = [:]
-
-
-                 if (userParams) {
-                               userParams.each {
-                                                               userParam ->
-                                                               if("BRG_WAN_MAC_Address".equals(userParam?.name)) {
-                                                                                               execution.setVariable("brgWanMacAddress", userParam.value)
-                                                                                               inputMap.put("BRG_WAN_MAC_Address", userParam.value)
-                                       }
-                               }
-                 }
-
-                 utils.log("DEBUG", "User Input Parameters map: " + userParams.toString(), isDebugEnabled)
-                 execution.setVariable("serviceInputParams", inputMap)
-
-                       utils.log("DEBUG", "Incoming brgWanMacAddress is: " + execution.getVariable('brgWanMacAddress'), isDebugEnabled)
-
-                       //For Completion Handler & Fallout Handler
-                       String requestInfo =
-                       """<request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
-                                       <request-id>${requestId}</request-id>
-                                       <action>CREATE</action>
-                                       <source>${source}</source>
-                                  </request-info>"""
-
-                       execution.setVariable(Prefix+"requestInfo", requestInfo)
-
-                       utils.log("DEBUG", " ***** Completed preProcessRequest CreateVcpeResCustService Request ***** ", isDebugEnabled)
-
-               } catch (BpmnError e) {
-                       throw e;
-
-               } catch (Exception ex){
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected from method preProcessRequest() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-       }
-
-       public void sendSyncResponse(DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               utils.log("DEBUG", " ***** Inside sendSyncResponse of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-               try {
-                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
-                       String requestId = execution.getVariable("mso-request-id")
-
-                       // RESTResponse (for API Handler (APIH) Reply Task)
-                       String syncResponse ="""{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${requestId}"}}""".trim()
-
-                       utils.log("DEBUG", " sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse, isDebugEnabled)
-                       sendWorkflowResponse(execution, 202, syncResponse)
-
-               } catch (Exception ex) {
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected from method sendSyncResponse() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-       }
-
-       // *******************************
-       //
-       // *******************************
-       public void prepareDecomposeService(DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside prepareDecomposeService of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
-
-                       //serviceModelInfo JSON string will be used as-is for DoCreateServiceInstance BB
-                       String serviceModelInfo = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.modelInfo")
-                       execution.setVariable("serviceModelInfo", serviceModelInfo)
-
-                       utils.log("DEBUG", " ***** Completed prepareDecomposeService of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareDecomposeService() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-
-       // *******************************
-       //
-       // *******************************
-       public void prepareCreateServiceInstance(DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside prepareCreateServiceInstance of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       /*
-                        * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
-                        *              ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-                        *              ModelInfo modelInfo = serviceDecomposition.getModelInfo()
-                        *
-                        */
-                       String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
-//                     String serviceInputParams = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestParameters")
-//                     execution.setVariable("serviceInputParams", serviceInputParams)
-
-
-                       String serviceInstanceName = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.instanceName")
-                       execution.setVariable("serviceInstanceName", serviceInstanceName)
-
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-                       execution.setVariable("serviceDecompositionString", serviceDecomposition.toJsonStringNoRootName())
-
-                       utils.log("DEBUG", " ***** Completed prepareCreateServiceInstance of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-
-       public void postProcessServiceInstanceCreate (DelegateExecution execution){
-               def method = getClass().getSimpleName() + '.postProcessServiceInstanceCreate(' +'execution=' + execution.getId() +')'
-               def isDebugLogEnabled = execution.getVariable(DebugFlag)
-               logDebug('Entered ' + method, isDebugLogEnabled)
-
-               String requestId = execution.getVariable("mso-request-id")
-               String serviceInstanceId = execution.getVariable("serviceInstanceId")
-               String serviceInstanceName = execution.getVariable("serviceInstanceName")
-
-               try {
-
-                       String payload = """
-                       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://org.openecomp.mso/requestsdb">
-                       <soapenv:Header/>
-                       <soapenv:Body>
-                       <req:updateInfraRequest>
-                               <requestId>${requestId}</requestId>
-                               <lastModifiedBy>BPEL</lastModifiedBy>
-                               <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
-                               <serviceInstanceName>${serviceInstanceName}</serviceInstanceName>
-                       </req:updateInfraRequest>
-                       </soapenv:Body>
-                       </soapenv:Envelope>
-                       """
-                       execution.setVariable(Prefix+"setUpdateDbInstancePayload", payload)
-                       utils.logAudit(Prefix+"setUpdateDbInstancePayload: " + payload)
-                       logDebug('Exited ' + method, isDebugLogEnabled)
-
-               } catch (BpmnError e) {
-                       throw e;
-               } catch (Exception e) {
-                       logError('Caught exception in ' + method, e)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error - Occured in" + method)
-               }
-       }
-
-
-       public void processDecomposition (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               utils.log("DEBUG", " ***** Inside processDecomposition() of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-               try {
-
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-
-                       // VNFs
-                       List<VnfResource> vnfList = serviceDecomposition.getServiceVnfs()
-                       filterVnfs(vnfList)
-                       serviceDecomposition.setServiceVnfs(vnfList)
-                       
-                       execution.setVariable("vnfList", vnfList)
-                       execution.setVariable("vnfListString", vnfList.toString())
-
-                       String vnfModelInfoString = ""
-                       if (vnfList != null && vnfList.size() > 0) {
-                               execution.setVariable(Prefix+"VNFsCount", vnfList.size())
-                               utils.log("DEBUG", "vnfs to create: "+ vnfList.size(), isDebugEnabled)
-                               ModelInfo vnfModelInfo = vnfList[0].getModelInfo()
-
-                               vnfModelInfoString = vnfModelInfo.toString()
-                               String vnfModelInfoWithRoot = vnfModelInfo.toString()
-                               vnfModelInfoString = jsonUtil.getJsonValue(vnfModelInfoWithRoot, "modelInfo")
-                       } else {
-                                       execution.setVariable(Prefix+"VNFsCount", 0)
-                                       utils.log("DEBUG", "no vnfs to create based upon serviceDecomposition content", isDebugEnabled)
-                       }
-
-                       execution.setVariable("vnfModelInfo", vnfModelInfoString)
-                       execution.setVariable("vnfModelInfoString", vnfModelInfoString)
-                       utils.log("DEBUG", " vnfModelInfoString :" + vnfModelInfoString, isDebugEnabled)
-
-                       utils.log("DEBUG", " ***** Completed processDecomposition() of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       sendSyncError(execution)
-                  String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. processDecomposition() - " + ex.getMessage()
-                  utils.log("DEBUG", exceptionMessage, isDebugEnabled)
-                  exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-       }
-       
-       private void filterVnfs(List<VnfResource> vnfList) {
-               if(vnfList == null) {
-                       return
-               }
-               
-               // remove BRG & TXC from VNF list
-               
-               Iterator<VnfResource> it = vnfList.iterator()
-               while(it.hasNext()) {
-                       VnfResource vr = it.next()
-                       
-                       String role = vr.getNfRole()
-                       if(role == "BRG" || role == "TunnelXConn") {
-                               it.remove()
-                       }
-               }
-       }
-
-
-       public void prepareCreateAllottedResourceTXC(DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside prepareCreateAllottedResourceTXC of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       /*
-                        * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
-                        *              ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-                        *              ModelInfo modelInfo = serviceDecomposition.getModelInfo()
-                        *
-                        */
-                       String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-
-                       //allottedResourceModelInfo
-                       //allottedResourceRole
-                       //The model Info parameters are a JSON structure as defined in the Service Instantiation API.
-                       //It would be sufficient to only include the service model UUID (i.e. the modelVersionId), since this BB will query the full model from the Catalog DB.
-                       List<AllottedResource> allottedResources = serviceDecomposition.getServiceAllottedResources()
-                       if (allottedResources != null) {
-                               Iterator iter = allottedResources.iterator();
-                               while (iter.hasNext()){
-                                       AllottedResource allottedResource = (AllottedResource)iter.next();
-
-                                       utils.log("DEBUG", " getting model info for AllottedResource # :" + allottedResource.toJsonStringNoRootName(), isDebugEnabled)
-                                       utils.log("DEBUG", " allottedResource.getAllottedResourceType() :" + allottedResource.getAllottedResourceType(), isDebugEnabled)
-                                       if("TunnelXConn".equalsIgnoreCase(allottedResource.getAllottedResourceType())){
-                                               //set create flag to true
-                                               execution.setVariable("createTXCAR", true)
-                                               ModelInfo allottedResourceModelInfo = allottedResource.getModelInfo()
-                                               execution.setVariable("allottedResourceModelInfoTXC", allottedResourceModelInfo.toJsonStringNoRootName())
-                                               execution.setVariable("allottedResourceRoleTXC", allottedResource.getAllottedResourceRole())
-                                               execution.setVariable("allottedResourceTypeTXC", allottedResource.getAllottedResourceType())
-                                               //After decomposition and homing BBs, there should be an allotted resource object in the decomposition that represents the TXC,
-                                               //and in its homingSolution section should be found the infraServiceInstanceId (i.e. infraServiceInstanceId in TXC Allotted Resource structure) (which the Homing BB would have populated).
-                                               execution.setVariable("parentServiceInstanceIdTXC", allottedResource.getHomingSolution().getServiceInstanceId())
-                                       }
-                               }
-                       }
-
-                       //unit test only
-                       String allottedResourceId = execution.getVariable("allottedResourceId")
-                       execution.setVariable("allottedResourceIdTXC", allottedResourceId)
-                       utils.log("DEBUG", "setting allottedResourceId CreateVcpeResCustService "+allottedResourceId, isDebugEnabled)
-                       
-                       utils.log("DEBUG", " ***** Completed prepareCreateAllottedResourceTXC of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in prepareCreateAllottedResourceTXC flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-       public void prepareCreateAllottedResourceBRG(DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside prepareCreateAllottedResourceBRG of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       /*
-                        * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
-                        *              ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-                        *              ModelInfo modelInfo = serviceDecomposition.getModelInfo()
-                        *
-                        */
-                       String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-
-                       //allottedResourceModelInfo
-                       //allottedResourceRole
-                       //The model Info parameters are a JSON structure as defined in the Service Instantiation API.
-                       //It would be sufficient to only include the service model UUID (i.e. the modelVersionId), since this BB will query the full model from the Catalog DB.
-                       List<AllottedResource> allottedResources = serviceDecomposition.getServiceAllottedResources()
-                       if (allottedResources != null) {
-                               Iterator iter = allottedResources.iterator();
-                               while (iter.hasNext()){
-                                       AllottedResource allottedResource = (AllottedResource)iter.next();
-
-                                       utils.log("DEBUG", " getting model info for AllottedResource # :" + allottedResource.toJsonStringNoRootName(), isDebugEnabled)
-                                       utils.log("DEBUG", " allottedResource.getAllottedResourceType() :" + allottedResource.getAllottedResourceType(), isDebugEnabled)
-                                       if("BRG".equalsIgnoreCase(allottedResource.getAllottedResourceType())){
-                                               //set create flag to true
-                                               execution.setVariable("createBRGAR", true)
-                                               ModelInfo allottedResourceModelInfo = allottedResource.getModelInfo()
-                                               execution.setVariable("allottedResourceModelInfoBRG", allottedResourceModelInfo.toJsonStringNoRootName())
-                                               execution.setVariable("allottedResourceRoleBRG", allottedResource.getAllottedResourceRole())
-                                               execution.setVariable("allottedResourceTypeBRG", allottedResource.getAllottedResourceType())
-                                               //After decomposition and homing BBs, there should be an allotted resource object in the decomposition that represents the BRG,
-                                               //and in its homingSolution section should be found the infraServiceInstanceId (i.e. infraServiceInstanceId in BRG Allotted Resource structure) (which the Homing BB would have populated).
-                                               execution.setVariable("parentServiceInstanceIdBRG", allottedResource.getHomingSolution().getServiceInstanceId())
-                                       }
-                               }
-                       }
-
-                       //unit test only
-                       String allottedResourceId = execution.getVariable("allottedResourceId")
-                       execution.setVariable("allottedResourceIdBRG", allottedResourceId)
-                       utils.log("DEBUG", "setting allottedResourceId CreateVcpeResCustService "+allottedResourceId, isDebugEnabled)
-                       
-                       utils.log("DEBUG", " ***** Completed prepareCreateAllottedResourceBRG of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in prepareCreateAllottedResourceBRG flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-
-
-
-       // *******************************
-       //     Generate Network request Section
-       // *******************************
-       public void prepareVnfAndModulesCreate (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside prepareVnfAndModulesCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       //                      String disableRollback = execution.getVariable("disableRollback")
-                       //                      def backoutOnFailure = ""
-                       //                      if(disableRollback != null){
-                       //                              if ( disableRollback == true) {
-                       //                                      backoutOnFailure = "false"
-                       //                              } else if ( disableRollback == false) {
-                       //                                      backoutOnFailure = "true"
-                       //                              }
-                       //                      }
-                                               //failIfExists - optional
-
-                       String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
-                       String productFamilyId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.productFamilyId")
-                       execution.setVariable("productFamilyId", productFamilyId)
-                       utils.log("DEBUG","productFamilyId: "+ productFamilyId, isDebugEnabled)
-
-                       List<VnfResource> vnfList = execution.getVariable("vnfList")
-
-                       Integer vnfsCreatedCount = execution.getVariable(Prefix+"VnfsCreatedCount")
-                       String vnfModelInfoString = null;
-
-                       if (vnfList != null && vnfList.size() > 0 ) {
-                               utils.log("DEBUG", "getting model info for vnf # " + vnfsCreatedCount, isDebugEnabled)
-                               ModelInfo vnfModelInfo1 = vnfList[0].getModelInfo()
-                               utils.log("DEBUG", "got 0 ", isDebugEnabled)
-                               ModelInfo vnfModelInfo = vnfList[vnfsCreatedCount.intValue()].getModelInfo()
-                               vnfModelInfoString = vnfModelInfo.toString()
-                       } else {
-                               //TODO: vnfList does not contain data. Need to investigate why ... . Fro VCPE use model stored
-                               vnfModelInfoString = execution.getVariable("vnfModelInfo")
-                       }
-
-                       utils.log("DEBUG", " vnfModelInfoString :" + vnfModelInfoString, isDebugEnabled)
-
-                       // extract cloud configuration
-                       String lcpCloudRegionId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.cloudConfiguration.lcpCloudRegionId")
-                       execution.setVariable("lcpCloudRegionId", lcpCloudRegionId)
-                       utils.log("DEBUG","lcpCloudRegionId: "+ lcpCloudRegionId, isDebugEnabled)
-                       String tenantId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.cloudConfiguration.tenantId")
-                       execution.setVariable("tenantId", tenantId)
-                       utils.log("DEBUG","tenantId: "+ tenantId, isDebugEnabled)
-
-                       String sdncVersion = execution.getVariable("sdncVersion")
-                       utils.log("DEBUG","sdncVersion: "+ sdncVersion, isDebugEnabled)
-
-                       utils.log("DEBUG", " ***** Completed prepareVnfAndModulesCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareVnfAndModulesCreate() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-
-       // *******************************
-       //     Validate Vnf request Section -> increment count
-       // *******************************
-       public void validateVnfCreate (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               try {
-                       utils.log("DEBUG", " ***** Inside validateVnfCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-                       Integer vnfsCreatedCount = execution.getVariable(Prefix+"VnfsCreatedCount")
-                       vnfsCreatedCount++
-
-                       execution.setVariable(Prefix+"VnfsCreatedCount", vnfsCreatedCount)
-
-                       utils.log("DEBUG", " ***** Completed validateVnfCreate of CreateVcpeResCustService ***** "+" vnf # "+vnfsCreatedCount, isDebugEnabled)
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method validateVnfCreate() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-        }
-
-       // *****************************************
-       //     Prepare Completion request Section
-       // *****************************************
-       public void postProcessResponse (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               utils.log("DEBUG", " ***** Inside postProcessResponse of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-               try {
-                       String source = execution.getVariable("source")
-                       String requestId = execution.getVariable("mso-request-id")
-                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
-
-                       String msoCompletionRequest =
-                                       """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
-                                                                       xmlns:ns="http://org.openecomp/mso/request/types/v1">
-                                                       <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
-                                                               <request-id>${requestId}</request-id>
-                                                               <action>CREATE</action>
-                                                               <source>${source}</source>
-                                                       </request-info>
-                                                       <status-message>Service Instance has been created successfully via macro orchestration</status-message>
-                                                       <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
-                                                       <mso-bpel-name>BPMN macro create</mso-bpel-name>
-                                               </aetgt:MsoCompletionRequest>"""
-
-                       // Format Response
-                       String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
-
-                       utils.logAudit(xmlMsoCompletionRequest)
-                       execution.setVariable(Prefix+"Success", true)
-                       execution.setVariable(Prefix+"CompleteMsoProcessRequest", xmlMsoCompletionRequest)
-                       utils.log("DEBUG", " SUCCESS flow, going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
-               } catch (BpmnError e) {
-                       throw e;
-               } catch (Exception ex) {
-                       // try error in method block
-                       String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method postProcessResponse() - " + ex.getMessage()
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
-               }
-       }
-
-       public void preProcessRollback (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-               utils.log("DEBUG"," ***** preProcessRollback of CreateVcpeResCustService ***** ", isDebugEnabled)
-               try {
-
-                       Object workflowException = execution.getVariable("WorkflowException");
-
-                       if (workflowException instanceof WorkflowException) {
-                               utils.log("DEBUG", "Prev workflowException: " + workflowException.getErrorMessage(), isDebugEnabled)
-                               execution.setVariable("prevWorkflowException", workflowException);
-                               //execution.setVariable("WorkflowException", null);
-                       }
-               } catch (BpmnError e) {
-                       utils.log("DEBUG", "BPMN Error during preProcessRollback", isDebugEnabled)
-               } catch(Exception ex) {
-                       String msg = "Exception in preProcessRollback. " + ex.getMessage()
-                       utils.log("DEBUG", msg, isDebugEnabled)
-               }
-               utils.log("DEBUG"," *** Exit preProcessRollback of CreateVcpeResCustService *** ", isDebugEnabled)
-       }
-
-       public void postProcessRollback (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-               utils.log("DEBUG"," ***** postProcessRollback of CreateVcpeResCustService ***** ", isDebugEnabled)
-               String msg = ""
-               try {
-                       Object workflowException = execution.getVariable("prevWorkflowException");
-                       if (workflowException instanceof WorkflowException) {
-                               utils.log("DEBUG", "Setting prevException to WorkflowException: ", isDebugEnabled)
-                               execution.setVariable("WorkflowException", workflowException);
-                       }
-               } catch (BpmnError b) {
-                       utils.log("DEBUG", "BPMN Error during postProcessRollback", isDebugEnabled)
-                       throw b;
-               } catch(Exception ex) {
-                       msg = "Exception in postProcessRollback. " + ex.getMessage()
-                       utils.log("DEBUG", msg, isDebugEnabled)
-               }
-               utils.log("DEBUG"," *** Exit postProcessRollback of CreateVcpeResCustService *** ", isDebugEnabled)
-       }
-
-       public void prepareFalloutRequest(DelegateExecution execution){
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-
-               utils.log("DEBUG", " *** STARTED CreateVcpeResCustService prepareFalloutRequest Process *** ", isDebugEnabled)
-
-               try {
-                       WorkflowException wfex = execution.getVariable("WorkflowException")
-                       utils.log("DEBUG", " Incoming Workflow Exception: " + wfex.toString(), isDebugEnabled)
-                       String requestInfo = execution.getVariable(Prefix+"requestInfo")
-                       utils.log("DEBUG", " Incoming Request Info: " + requestInfo, isDebugEnabled)
-
-                       //TODO. hmmm. there is no way to UPDATE error message.
-//                     String errorMessage = wfex.getErrorMessage()
-//                     boolean successIndicator = execution.getVariable("DCRESI_rolledBack")
-//                     if (successIndicator){
-//                             errorMessage = errorMessage + ". Rollback successful."
-//                     } else {
-//                             errorMessage = errorMessage + ". Rollback not completed."
-//                     }
-
-                       String falloutRequest = exceptionUtil.processMainflowsBPMNException(execution, requestInfo)
-
-                       execution.setVariable(Prefix+"falloutRequest", falloutRequest)
-
-               } catch (Exception ex) {
-                       utils.log("DEBUG", "Error Occured in CreateVcpeResCustService prepareFalloutRequest Process " + ex.getMessage(), isDebugEnabled)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in CreateVcpeResCustService prepareFalloutRequest Process")
-               }
-               utils.log("DEBUG", "*** COMPLETED CreateVcpeResCustService prepareFalloutRequest Process ***", isDebugEnabled)
-       }
-
-
-       public void sendSyncError (DelegateExecution execution) {
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-               execution.setVariable("prefix", Prefix)
-
-               utils.log("DEBUG", " ***** Inside sendSyncError() of CreateVcpeResCustService ***** ", isDebugEnabled)
-
-               try {
-                       String errorMessage = ""
-                       def wfe = execution.getVariable("WorkflowException")
-                       if (wfe instanceof WorkflowException) {
-                               errorMessage = wfe.getErrorMessage()
-                       } else {
-                               errorMessage = "Sending Sync Error."
-                       }
-
-                       String buildworkflowException =
-                               """<aetgt:WorkflowException xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1">
-                                       <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>
-                                       <aetgt:ErrorCode>7000</aetgt:ErrorCode>
-                                  </aetgt:WorkflowException>"""
-
-                       utils.logAudit(buildworkflowException)
-                       sendWorkflowResponse(execution, 500, buildworkflowException)
-               } catch (Exception ex) {
-                       utils.log("DEBUG", " Sending Sync Error Activity Failed. " + "\n" + ex.getMessage(), isDebugEnabled)
-               }
-       }
-
-       public void processJavaException(DelegateExecution execution){
-               def isDebugEnabled=execution.getVariable(DebugFlag)
-               execution.setVariable("prefix",Prefix)
-               try{
-                       utils.log("DEBUG", "Caught a Java Exception", isDebugEnabled)
-                       utils.log("DEBUG", "Started processJavaException Method", isDebugEnabled)
-                       utils.log("DEBUG", "Variables List: " + execution.getVariables(), isDebugEnabled)
-                       execution.setVariable(Prefix+"unexpectedError", "Caught a Java Lang Exception")  // Adding this line temporarily until this flows error handling gets updated
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Caught a Java Lang Exception")
-               }catch(BpmnError b){
-                       utils.log("ERROR", "Rethrowing MSOWorkflowException", isDebugEnabled)
-                       throw b
-               }catch(Exception e){
-                       utils.log("DEBUG", "Caught Exception during processJavaException Method: " + e, isDebugEnabled)
-                       execution.setVariable(Prefix+"unexpectedError", "Exception in processJavaException method")  // Adding this line temporarily until this flows error handling gets updated
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception in processJavaException method")
-               }
-               utils.log("DEBUG", "Completed processJavaException Method", isDebugEnabled)
-       }
+    private static final String DebugFlag = "isDebugLogEnabled"
+
+    String Prefix = "CVRCS_"
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    JsonUtils jsonUtil = new JsonUtils()
+    VidUtils vidUtils = new VidUtils()
+    CatalogDbUtils catalogDbUtils = new CatalogDbUtils()
+
+    /**
+     * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
+     * @param execution
+     */
+    public InitializeProcessVariables(DelegateExecution execution) {
+        /* Initialize all the process variables in this block */
+
+        execution.setVariable("createVcpeServiceRequest", "")
+        execution.setVariable("globalSubscriberId", "")
+        execution.setVariable("serviceInstanceName", "")
+        execution.setVariable("msoRequestId", "")
+        execution.setVariable(Prefix + "VnfsCreatedCount", 0)
+        execution.setVariable("productFamilyId", "")
+        execution.setVariable("brgWanMacAddress", "")
+        execution.setVariable("customerLocation", "")
+        execution.setVariable("homingService", "")
+
+        //TODO
+        execution.setVariable("sdncVersion", "1707")
+    }
+
+    // **************************************************
+    //     Pre or Prepare Request Section
+    // **************************************************
+    /**
+     * This method is executed during the preProcessRequest task of the <class>CreateServiceInstance.bpmn</class> process.
+     * @param execution
+     */
+    public void preProcessRequest(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+        execution.setVariable("prefix", Prefix)
+
+        utils.log("DEBUG", " ***** Inside preProcessRequest CreateVcpeResCustService Request ***** ", isDebugEnabled)
+
+        try {
+            // initialize flow variables
+            InitializeProcessVariables(execution)
+
+            //Config Inputs
+            String aaiDistDelay = execution.getVariable('URN_mso_workflow_aai_distribution_delay')
+            if (isBlank(aaiDistDelay)) {
+                msg = "URN_mso_workflow_aai_distribution_delay is null"
+                utils.log("DEBUG", msg, isDebugEnabled)
+                exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+            }
+            execution.setVariable("aaiDistDelay", aaiDistDelay)
+            utils.log("DEBUG", "AAI distribution delay: " + aaiDistDelay, isDebugEnabled)
+
+            // check for incoming json message/input
+            String createVcpeServiceRequest = execution.getVariable("bpmnRequest")
+            utils.logAudit(createVcpeServiceRequest)
+            execution.setVariable("createVcpeServiceRequest", createVcpeServiceRequest);
+            println 'createVcpeServiceRequest - ' + createVcpeServiceRequest
+
+            // extract requestId
+            String requestId = execution.getVariable("mso-request-id")
+            execution.setVariable("msoRequestId", requestId)
+
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+
+            if ((serviceInstanceId == null) || (serviceInstanceId.isEmpty())) {
+                serviceInstanceId = UUID.randomUUID().toString()
+                utils.log("DEBUG", " Generated new Service Instance: " + serviceInstanceId, isDebugEnabled)
+            } else {
+                utils.log("DEBUG", "Using provided Service Instance ID: " + serviceInstanceId, isDebugEnabled)
+            }
+
+            serviceInstanceId = UriUtils.encode(serviceInstanceId, "UTF-8")
+            execution.setVariable("serviceInstanceId", serviceInstanceId)
+
+            String requestAction = execution.getVariable("requestAction")
+            execution.setVariable("requestAction", requestAction)
+
+            setBasicDBAuthHeader(execution, isDebugEnabled)
+
+            String source = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.source")
+            if ((source == null) || (source.isEmpty())) {
+                source = "VID"
+            }
+            execution.setVariable("source", source)
+
+            // extract globalSubscriberId
+            String globalSubscriberId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.subscriberInfo.globalSubscriberId")
+
+            // verify element global-customer-id is sent from JSON input, throw exception if missing
+            if ((globalSubscriberId == null) || (globalSubscriberId.isEmpty())) {
+                String dataErrorMessage = " Element 'globalSubscriberId' is missing. "
+                exceptionUtil.buildAndThrowWorkflowException(execution, 2500, dataErrorMessage)
+
+            } else {
+                execution.setVariable("globalSubscriberId", globalSubscriberId)
+                execution.setVariable("globalCustomerId", globalSubscriberId)
+            }
+
+            // extract subscriptionServiceType
+            String subscriptionServiceType = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestParameters.subscriptionServiceType")
+            execution.setVariable("subscriptionServiceType", subscriptionServiceType)
+            utils.log("DEBUG", "Incoming subscriptionServiceType is: " + subscriptionServiceType, isDebugEnabled)
+
+            String suppressRollback = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.suppressRollback")
+            execution.setVariable("disableRollback", suppressRollback)
+            utils.log("DEBUG", "Incoming Suppress/Disable Rollback is: " + suppressRollback, isDebugEnabled)
+
+            String productFamilyId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.productFamilyId")
+            execution.setVariable("productFamilyId", productFamilyId)
+            utils.log("DEBUG", "Incoming productFamilyId is: " + productFamilyId, isDebugEnabled)
+
+            String subscriberInfo = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.subscriberInfo")
+            execution.setVariable("subscriberInfo", subscriberInfo)
+            utils.log("DEBUG", "Incoming subscriberInfo is: " + subscriberInfo, isDebugEnabled)
+
+            /*
+            * Extracting User Parameters from incoming Request and converting into a Map
+            */
+            def jsonSlurper = new JsonSlurper()
+            def jsonOutput = new JsonOutput()
+
+            Map reqMap = jsonSlurper.parseText(createVcpeServiceRequest)
+
+            //InputParams
+            def userParams = reqMap.requestDetails?.requestParameters?.userParams
+
+            Map<String, String> inputMap = [:]
+
+          if (userParams) {
+                userParams.each {
+                                userParam ->
+                                if("BRG_WAN_MAC_Address".equals(userParam?.name)) {
+                                                execution.setVariable("brgWanMacAddress", userParam.value)
+                                                inputMap.put("BRG_WAN_MAC_Address", userParam.value)
+                                }
+                                if("Customer_Location".equals(userParam?.name)) {
+                                    execution.setVariable("customerLocation", userParam.value)
+                                    userParam.value.each {
+                                        customerLocParam ->
+                                        inputMap.put(customerLocParam.key, customerLocParam.value)
+                                    }
+                                }
+                                if("Homing_Solution".equals(userParam?.name)) {
+                                    execution.setVariable("homingService", userParam.value)
+                                    inputMap.put("Homing_Solution", userParam.value)
+                                } else {
+                                    execution.setVariable("homingService", "oof")
+                                }
+                }
+            }
+
+            utils.log("DEBUG", "User Input Parameters map: " + userParams.toString(), isDebugEnabled)
+            execution.setVariable("serviceInputParams", inputMap)
+
+            utils.log("DEBUG", "Incoming brgWanMacAddress is: " + execution.getVariable('brgWanMacAddress'), isDebugEnabled)
+
+            //For Completion Handler & Fallout Handler
+            String requestInfo =
+                    """<request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
+                    <request-id>${requestId}</request-id>
+                    <action>CREATE</action>
+                    <source>${source}</source>
+                   </request-info>"""
+
+            execution.setVariable(Prefix + "requestInfo", requestInfo)
+
+            utils.log("DEBUG", " ***** Completed preProcessRequest CreateVcpeResCustService Request ***** ", isDebugEnabled)
+
+        } catch (BpmnError e) {
+            throw e;
+
+        } catch (Exception ex) {
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected from method preProcessRequest() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    public void sendSyncResponse(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        utils.log("DEBUG", " ***** Inside sendSyncResponse of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+        try {
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+            String requestId = execution.getVariable("mso-request-id")
+
+            // RESTResponse (for API Handler (APIH) Reply Task)
+            String syncResponse = """{"requestReferences":{"instanceId":"${serviceInstanceId}","requestId":"${
+                requestId
+            }"}}""".trim()
+
+            utils.log("DEBUG", " sendSynchResponse: xmlSyncResponse - " + "\n" + syncResponse, isDebugEnabled)
+            sendWorkflowResponse(execution, 202, syncResponse)
+
+        } catch (Exception ex) {
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected from method sendSyncResponse() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    // *******************************
+    //
+    // *******************************
+    public void prepareDecomposeService(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside prepareDecomposeService of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
+
+            //serviceModelInfo JSON string will be used as-is for DoCreateServiceInstance BB
+            String serviceModelInfo = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.modelInfo")
+            execution.setVariable("serviceModelInfo", serviceModelInfo)
+
+            utils.log("DEBUG", " ***** Completed prepareDecomposeService of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareDecomposeService() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    // *******************************
+    //
+    // *******************************
+    public void prepareCreateServiceInstance(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside prepareCreateServiceInstance of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            /*
+             * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
+             *      ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+             *      ModelInfo modelInfo = serviceDecomposition.getModelInfo()
+             *
+             */
+            String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
+//          String serviceInputParams = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestParameters")
+//          execution.setVariable("serviceInputParams", serviceInputParams)
+
+
+            String serviceInstanceName = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.instanceName")
+            execution.setVariable("serviceInstanceName", serviceInstanceName)
+
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+            execution.setVariable("serviceDecompositionString", serviceDecomposition.toJsonStringNoRootName())
+
+            utils.log("DEBUG", " ***** Completed prepareCreateServiceInstance of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    public void postProcessServiceInstanceCreate(DelegateExecution execution) {
+        def method = getClass().getSimpleName() + '.postProcessServiceInstanceCreate(' + 'execution=' + execution.getId() + ')'
+        def isDebugLogEnabled = execution.getVariable(DebugFlag)
+        logDebug('Entered ' + method, isDebugLogEnabled)
+
+        String requestId = execution.getVariable("mso-request-id")
+        String serviceInstanceId = execution.getVariable("serviceInstanceId")
+        String serviceInstanceName = execution.getVariable("serviceInstanceName")
+
+        try {
+
+            String payload = """
+            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://org.openecomp.mso/requestsdb">
+            <soapenv:Header/>
+            <soapenv:Body>
+            <req:updateInfraRequest>
+                <requestId>${requestId}</requestId>
+                <lastModifiedBy>BPEL</lastModifiedBy>
+                <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
+                <serviceInstanceName>${serviceInstanceName}</serviceInstanceName>
+            </req:updateInfraRequest>
+            </soapenv:Body>
+            </soapenv:Envelope>
+            """
+            execution.setVariable(Prefix + "setUpdateDbInstancePayload", payload)
+            utils.logAudit(Prefix + "setUpdateDbInstancePayload: " + payload)
+            logDebug('Exited ' + method, isDebugLogEnabled)
+
+        } catch (BpmnError e) {
+            throw e;
+        } catch (Exception e) {
+            logError('Caught exception in ' + method, e)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, "Internal Error - Occured in" + method)
+        }
+    }
+
+
+    public void processDecomposition(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        utils.log("DEBUG", " ***** Inside processDecomposition() of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+        try {
+
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+
+            // VNFs
+            List<VnfResource> vnfList = serviceDecomposition.getServiceVnfs()
+            filterVnfs(vnfList)
+            serviceDecomposition.setServiceVnfs(vnfList)
+
+            execution.setVariable("vnfList", vnfList)
+            execution.setVariable("vnfListString", vnfList.toString())
+
+            String vnfModelInfoString = ""
+            if (vnfList != null && vnfList.size() > 0) {
+                execution.setVariable(Prefix + "VNFsCount", vnfList.size())
+                utils.log("DEBUG", "vnfs to create: " + vnfList.size(), isDebugEnabled)
+                ModelInfo vnfModelInfo = vnfList[0].getModelInfo()
+
+                vnfModelInfoString = vnfModelInfo.toString()
+                String vnfModelInfoWithRoot = vnfModelInfo.toString()
+                vnfModelInfoString = jsonUtil.getJsonValue(vnfModelInfoWithRoot, "modelInfo")
+            } else {
+                execution.setVariable(Prefix + "VNFsCount", 0)
+                utils.log("DEBUG", "no vnfs to create based upon serviceDecomposition content", isDebugEnabled)
+            }
+
+            execution.setVariable("vnfModelInfo", vnfModelInfoString)
+            execution.setVariable("vnfModelInfoString", vnfModelInfoString)
+            utils.log("DEBUG", " vnfModelInfoString :" + vnfModelInfoString, isDebugEnabled)
+
+            utils.log("DEBUG", " ***** Completed processDecomposition() of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            sendSyncError(execution)
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. processDecomposition() - " + ex.getMessage()
+            utils.log("DEBUG", exceptionMessage, isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    private void filterVnfs(List<VnfResource> vnfList) {
+        if (vnfList == null) {
+            return
+        }
+
+        // remove BRG & TXC from VNF list
+
+        Iterator<VnfResource> it = vnfList.iterator()
+        while (it.hasNext()) {
+            VnfResource vr = it.next()
+
+            String role = vr.getNfRole()
+            if (role == "BRG" || role == "TunnelXConn") {
+                it.remove()
+            }
+        }
+    }
+
+
+    public void prepareCreateAllottedResourceTXC(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside prepareCreateAllottedResourceTXC of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            /*
+             * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
+             *      ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+             *      ModelInfo modelInfo = serviceDecomposition.getModelInfo()
+             *
+             */
+            String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+
+            //allottedResourceModelInfo
+            //allottedResourceRole
+            //The model Info parameters are a JSON structure as defined in the Service Instantiation API.
+            //It would be sufficient to only include the service model UUID (i.e. the modelVersionId), since this BB will query the full model from the Catalog DB.
+            List<AllottedResource> allottedResources = serviceDecomposition.getServiceAllottedResources()
+            if (allottedResources != null) {
+                Iterator iter = allottedResources.iterator();
+                while (iter.hasNext()) {
+                    AllottedResource allottedResource = (AllottedResource) iter.next();
+
+                    utils.log("DEBUG", " getting model info for AllottedResource # :" + allottedResource.toJsonStringNoRootName(), isDebugEnabled)
+                    utils.log("DEBUG", " allottedResource.getAllottedResourceType() :" + allottedResource.getAllottedResourceType(), isDebugEnabled)
+                    if ("TunnelXConn".equalsIgnoreCase(allottedResource.getAllottedResourceType())) {
+                        //set create flag to true
+                        execution.setVariable("createTXCAR", true)
+                        ModelInfo allottedResourceModelInfo = allottedResource.getModelInfo()
+                        execution.setVariable("allottedResourceModelInfoTXC", allottedResourceModelInfo.toJsonStringNoRootName())
+                        execution.setVariable("allottedResourceRoleTXC", allottedResource.getAllottedResourceRole())
+                        execution.setVariable("allottedResourceTypeTXC", allottedResource.getAllottedResourceType())
+                        //After decomposition and homing BBs, there should be an allotted resource object in the decomposition that represents the TXC,
+                        //and in its homingSolution section should be found the infraServiceInstanceId (i.e. infraServiceInstanceId in TXC Allotted Resource structure) (which the Homing BB would have populated).
+                        execution.setVariable("parentServiceInstanceIdTXC", allottedResource.getHomingSolution().getServiceInstanceId())
+                    }
+                }
+            }
+
+            //unit test only
+            String allottedResourceId = execution.getVariable("allottedResourceId")
+            execution.setVariable("allottedResourceIdTXC", allottedResourceId)
+            utils.log("DEBUG", "setting allottedResourceId CreateVcpeResCustService " + allottedResourceId, isDebugEnabled)
+
+            utils.log("DEBUG", " ***** Completed prepareCreateAllottedResourceTXC of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in prepareCreateAllottedResourceTXC flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    public void prepareCreateAllottedResourceBRG(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside prepareCreateAllottedResourceBRG of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            /*
+             * Service modelInfo is created in earlier step. This flow can use it as-is ... or, extract from DecompositionObject
+             *      ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+             *      ModelInfo modelInfo = serviceDecomposition.getModelInfo()
+             *
+             */
+            String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+
+            //allottedResourceModelInfo
+            //allottedResourceRole
+            //The model Info parameters are a JSON structure as defined in the Service Instantiation API.
+            //It would be sufficient to only include the service model UUID (i.e. the modelVersionId), since this BB will query the full model from the Catalog DB.
+            List<AllottedResource> allottedResources = serviceDecomposition.getServiceAllottedResources()
+            if (allottedResources != null) {
+                Iterator iter = allottedResources.iterator();
+                while (iter.hasNext()) {
+                    AllottedResource allottedResource = (AllottedResource) iter.next();
+
+                    utils.log("DEBUG", " getting model info for AllottedResource # :" + allottedResource.toJsonStringNoRootName(), isDebugEnabled)
+                    utils.log("DEBUG", " allottedResource.getAllottedResourceType() :" + allottedResource.getAllottedResourceType(), isDebugEnabled)
+                    if ("BRG".equalsIgnoreCase(allottedResource.getAllottedResourceType())) {
+                        //set create flag to true
+                        execution.setVariable("createBRGAR", true)
+                        ModelInfo allottedResourceModelInfo = allottedResource.getModelInfo()
+                        execution.setVariable("allottedResourceModelInfoBRG", allottedResourceModelInfo.toJsonStringNoRootName())
+                        execution.setVariable("allottedResourceRoleBRG", allottedResource.getAllottedResourceRole())
+                        execution.setVariable("allottedResourceTypeBRG", allottedResource.getAllottedResourceType())
+                        //After decomposition and homing BBs, there should be an allotted resource object in the decomposition that represents the BRG,
+                        //and in its homingSolution section should be found the infraServiceInstanceId (i.e. infraServiceInstanceId in BRG Allotted Resource structure) (which the Homing BB would have populated).
+                        execution.setVariable("parentServiceInstanceIdBRG", allottedResource.getHomingSolution().getServiceInstanceId())
+                    }
+                }
+            }
+
+            //unit test only
+            String allottedResourceId = execution.getVariable("allottedResourceId")
+            execution.setVariable("allottedResourceIdBRG", allottedResourceId)
+            utils.log("DEBUG", "setting allottedResourceId CreateVcpeResCustService " + allottedResourceId, isDebugEnabled)
+
+            utils.log("DEBUG", " ***** Completed prepareCreateAllottedResourceBRG of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in prepareCreateAllottedResourceBRG flow. Unexpected Error from method prepareCreateServiceInstance() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    // *******************************
+    //     Generate Network request Section
+    // *******************************
+    public void prepareVnfAndModulesCreate(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside prepareVnfAndModulesCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            //          String disableRollback = execution.getVariable("disableRollback")
+            //          def backoutOnFailure = ""
+            //          if(disableRollback != null){
+            //              if ( disableRollback == true) {
+            //                  backoutOnFailure = "false"
+            //              } else if ( disableRollback == false) {
+            //                  backoutOnFailure = "true"
+            //              }
+            //          }
+            //failIfExists - optional
+
+            String createVcpeServiceRequest = execution.getVariable("createVcpeServiceRequest")
+            String productFamilyId = jsonUtil.getJsonValue(createVcpeServiceRequest, "requestDetails.requestInfo.productFamilyId")
+            execution.setVariable("productFamilyId", productFamilyId)
+            utils.log("DEBUG", "productFamilyId: " + productFamilyId, isDebugEnabled)
+
+            List<VnfResource> vnfList = execution.getVariable("vnfList")
+
+            Integer vnfsCreatedCount = execution.getVariable(Prefix + "VnfsCreatedCount")
+            String vnfModelInfoString = null;
+
+            if (vnfList != null && vnfList.size() > 0) {
+                utils.log("DEBUG", "getting model info for vnf # " + vnfsCreatedCount, isDebugEnabled)
+                ModelInfo vnfModelInfo1 = vnfList[0].getModelInfo()
+                utils.log("DEBUG", "got 0 ", isDebugEnabled)
+                ModelInfo vnfModelInfo = vnfList[vnfsCreatedCount.intValue()].getModelInfo()
+                vnfModelInfoString = vnfModelInfo.toString()
+            } else {
+                //TODO: vnfList does not contain data. Need to investigate why ... . Fro VCPE use model stored
+                vnfModelInfoString = execution.getVariable("vnfModelInfo")
+            }
+
+            utils.log("DEBUG", " vnfModelInfoString :" + vnfModelInfoString, isDebugEnabled)
+
+            // extract cloud configuration
+            String vimId = jsonUtil.getJsonValue(createVcpeServiceRequest,
+                    "requestDetails.cloudConfiguration.lcpCloudRegionId")
+            def cloudRegion = vimId.split("_")
+            execution.setVariable("cloudOwner", cloudRegion[0])
+            utils.log("DEBUG","cloudOwner: "+ cloudRegion[0], isDebugEnabled)
+            execution.setVariable("cloudRegionId", cloudRegion[1])
+            utils.log("DEBUG","cloudRegionId: "+ cloudRegion[1], isDebugEnabled)
+            execution.setVariable("lcpCloudRegionId", cloudRegion[1])
+            utils.log("DEBUG","lcpCloudRegionId: "+ cloudRegion[1], isDebugEnabled)
+            String tenantId = jsonUtil.getJsonValue(createVcpeServiceRequest,
+                    "requestDetails.cloudConfiguration.tenantId")
+            execution.setVariable("tenantId", tenantId)
+            utils.log("DEBUG", "tenantId: " + tenantId, isDebugEnabled)
+
+            String sdncVersion = execution.getVariable("sdncVersion")
+            utils.log("DEBUG", "sdncVersion: " + sdncVersion, isDebugEnabled)
+
+            utils.log("DEBUG", " ***** Completed prepareVnfAndModulesCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method prepareVnfAndModulesCreate() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    // *******************************
+    //     Validate Vnf request Section -> increment count
+    // *******************************
+    public void validateVnfCreate(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        try {
+            utils.log("DEBUG", " ***** Inside validateVnfCreate of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+            Integer vnfsCreatedCount = execution.getVariable(Prefix + "VnfsCreatedCount")
+            vnfsCreatedCount++
+
+            execution.setVariable(Prefix + "VnfsCreatedCount", vnfsCreatedCount)
+
+            utils.log("DEBUG", " ***** Completed validateVnfCreate of CreateVcpeResCustService ***** " + " vnf # " + vnfsCreatedCount, isDebugEnabled)
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method validateVnfCreate() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    // *****************************************
+    //     Prepare Completion request Section
+    // *****************************************
+    public void postProcessResponse(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        utils.log("DEBUG", " ***** Inside postProcessResponse of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+        try {
+            String source = execution.getVariable("source")
+            String requestId = execution.getVariable("mso-request-id")
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+
+            String msoCompletionRequest =
+                    """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1"
+                                    xmlns:ns="http://org.openecomp/mso/request/types/v1">
+                            <request-info xmlns="http://org.openecomp/mso/infra/vnf-request/v1">
+                                <request-id>${requestId}</request-id>
+                                <action>CREATE</action>
+                                <source>${source}</source>
+                            </request-info>
+                            <status-message>Service Instance has been created successfully via macro orchestration</status-message>
+                            <serviceInstanceId>${serviceInstanceId}</serviceInstanceId>
+                            <mso-bpel-name>BPMN macro create</mso-bpel-name>
+                        </aetgt:MsoCompletionRequest>"""
+
+            // Format Response
+            String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
+
+            utils.logAudit(xmlMsoCompletionRequest)
+            execution.setVariable(Prefix + "Success", true)
+            execution.setVariable(Prefix + "CompleteMsoProcessRequest", xmlMsoCompletionRequest)
+            utils.log("DEBUG", " SUCCESS flow, going to CompleteMsoProcess - " + "\n" + xmlMsoCompletionRequest, isDebugEnabled)
+        } catch (BpmnError e) {
+            throw e;
+        } catch (Exception ex) {
+            // try error in method block
+            String exceptionMessage = "Bpmn error encountered in CreateVcpeResCustService flow. Unexpected Error from method postProcessResponse() - " + ex.getMessage()
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
+        }
+    }
+
+    public void preProcessRollback(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+        utils.log("DEBUG", " ***** preProcessRollback of CreateVcpeResCustService ***** ", isDebugEnabled)
+        try {
+
+            Object workflowException = execution.getVariable("WorkflowException");
+
+            if (workflowException instanceof WorkflowException) {
+                utils.log("DEBUG", "Prev workflowException: " + workflowException.getErrorMessage(), isDebugEnabled)
+                execution.setVariable("prevWorkflowException", workflowException);
+                //execution.setVariable("WorkflowException", null);
+            }
+        } catch (BpmnError e) {
+            utils.log("DEBUG", "BPMN Error during preProcessRollback", isDebugEnabled)
+        } catch (Exception ex) {
+            String msg = "Exception in preProcessRollback. " + ex.getMessage()
+            utils.log("DEBUG", msg, isDebugEnabled)
+        }
+        utils.log("DEBUG", " *** Exit preProcessRollback of CreateVcpeResCustService *** ", isDebugEnabled)
+    }
+
+    public void postProcessRollback(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+        utils.log("DEBUG", " ***** postProcessRollback of CreateVcpeResCustService ***** ", isDebugEnabled)
+        String msg = ""
+        try {
+            Object workflowException = execution.getVariable("prevWorkflowException");
+            if (workflowException instanceof WorkflowException) {
+                utils.log("DEBUG", "Setting prevException to WorkflowException: ", isDebugEnabled)
+                execution.setVariable("WorkflowException", workflowException);
+            }
+        } catch (BpmnError b) {
+            utils.log("DEBUG", "BPMN Error during postProcessRollback", isDebugEnabled)
+            throw b;
+        } catch (Exception ex) {
+            msg = "Exception in postProcessRollback. " + ex.getMessage()
+            utils.log("DEBUG", msg, isDebugEnabled)
+        }
+        utils.log("DEBUG", " *** Exit postProcessRollback of CreateVcpeResCustService *** ", isDebugEnabled)
+    }
+
+    public void prepareFalloutRequest(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+
+        utils.log("DEBUG", " *** STARTED CreateVcpeResCustService prepareFalloutRequest Process *** ", isDebugEnabled)
+
+        try {
+            WorkflowException wfex = execution.getVariable("WorkflowException")
+            utils.log("DEBUG", " Incoming Workflow Exception: " + wfex.toString(), isDebugEnabled)
+            String requestInfo = execution.getVariable(Prefix + "requestInfo")
+            utils.log("DEBUG", " Incoming Request Info: " + requestInfo, isDebugEnabled)
+
+            //TODO. hmmm. there is no way to UPDATE error message.
+//          String errorMessage = wfex.getErrorMessage()
+//          boolean successIndicator = execution.getVariable("DCRESI_rolledBack")
+//          if (successIndicator){
+//              errorMessage = errorMessage + ". Rollback successful."
+//          } else {
+//              errorMessage = errorMessage + ". Rollback not completed."
+//          }
+
+            String falloutRequest = exceptionUtil.processMainflowsBPMNException(execution, requestInfo)
+
+            execution.setVariable(Prefix + "falloutRequest", falloutRequest)
+
+        } catch (Exception ex) {
+            utils.log("DEBUG", "Error Occured in CreateVcpeResCustService prepareFalloutRequest Process " + ex.getMessage(), isDebugEnabled)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in CreateVcpeResCustService prepareFalloutRequest Process")
+        }
+        utils.log("DEBUG", "*** COMPLETED CreateVcpeResCustService prepareFalloutRequest Process ***", isDebugEnabled)
+    }
+
+
+    public void sendSyncError(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+        execution.setVariable("prefix", Prefix)
+
+        utils.log("DEBUG", " ***** Inside sendSyncError() of CreateVcpeResCustService ***** ", isDebugEnabled)
+
+        try {
+            String errorMessage = ""
+            def wfe = execution.getVariable("WorkflowException")
+            if (wfe instanceof WorkflowException) {
+                errorMessage = wfe.getErrorMessage()
+            } else {
+                errorMessage = "Sending Sync Error."
+            }
+
+            String buildworkflowException =
+                    """<aetgt:WorkflowException xmlns:aetgt="http://org.openecomp/mso/workflow/schema/v1">
+                    <aetgt:ErrorMessage>${errorMessage}</aetgt:ErrorMessage>
+                    <aetgt:ErrorCode>7000</aetgt:ErrorCode>
+                    </aetgt:WorkflowException>"""
+
+            utils.logAudit(buildworkflowException)
+            sendWorkflowResponse(execution, 500, buildworkflowException)
+        } catch (Exception ex) {
+            utils.log("DEBUG", " Sending Sync Error Activity Failed. " + "\n" + ex.getMessage(), isDebugEnabled)
+        }
+    }
+
+    public void processJavaException(DelegateExecution execution) {
+        def isDebugEnabled = execution.getVariable(DebugFlag)
+        execution.setVariable("prefix", Prefix)
+        try {
+            utils.log("DEBUG", "Caught a Java Exception", isDebugEnabled)
+            utils.log("DEBUG", "Started processJavaException Method", isDebugEnabled)
+            utils.log("DEBUG", "Variables List: " + execution.getVariables(), isDebugEnabled)
+            execution.setVariable(Prefix + "unexpectedError", "Caught a Java Lang Exception")
+            // Adding this line temporarily until this flows error handling gets updated
+            exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Caught a Java Lang Exception")
+        } catch (BpmnError b) {
+            utils.log("ERROR", "Rethrowing MSOWorkflowException", isDebugEnabled)
+            throw b
+        } catch (Exception e) {
+            utils.log("DEBUG", "Caught Exception during processJavaException Method: " + e, isDebugEnabled)
+            execution.setVariable(Prefix + "unexpectedError", "Exception in processJavaException method")
+            // Adding this line temporarily until this flows error handling gets updated
+            exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Exception in processJavaException method")
+        }
+        utils.log("DEBUG", "Completed processJavaException Method", isDebugEnabled)
+    }
 }
index 2c9d591..a735121 100644 (file)
@@ -32,6 +32,7 @@ import org.junit.Ignore
 import org.mockito.MockitoAnnotations
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.openecomp.mso.bpmn.core.WorkflowException
+import org.openecomp.mso.bpmn.core.domain.HomingSolution
 import org.openecomp.mso.bpmn.mock.FileUtil
 
 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse
@@ -109,6 +110,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                
                verify(mex).setVariable("brgWanMacAddress", "brgmac")
                verify(mex).setVariable("customerLocation", ["customerLatitude":"32.897480", "customerLongitude":"-97.040443", "customerName":"some_company"])
+               verify(mex).setVariable("homingService", "sniro")
                assertTrue(map.containsKey("serviceInputParams"))
                assertTrue(map.containsKey(Prefix+"requestInfo"))
                
@@ -166,6 +168,7 @@ class CreateVcpeResCustServiceTest extends GroovyTestBase {
                
                assertEquals("", map.get("brgWanMacAddress"))
                assertEquals("", map.get("customerLocation"))
+               assertEquals("oof", map.get("homingService"))
                assertTrue(map.containsKey("serviceInputParams"))
                assertTrue(map.containsKey(Prefix+"requestInfo"))
                
index fdc470f..b904a3f 100644 (file)
@@ -47,7 +47,7 @@ import org.openecomp.mso.bpmn.core.domain.ServiceDecomposition
 import org.openecomp.mso.bpmn.core.domain.VnfResource
 import org.openecomp.mso.bpmn.core.domain.AllottedResource
 import org.openecomp.mso.bpmn.core.domain.ModelInfo
-import org.openecomp.mso.bpmn.core.domain.HomingSolution
+
 import org.openecomp.mso.bpmn.core.RollbackData
 import org.openecomp.mso.bpmn.vcpe.scripts.MapGetter
 import org.openecomp.mso.bpmn.vcpe.scripts.MapSetter
index c6cc1ca..52ead5f 100644 (file)
@@ -7,7 +7,7 @@
                        "modelVersion": "1.0"
                },
                "cloudConfiguration": {
-                       "lcpCloudRegionId": "MDTWNJ21",
+                       "lcpCloudRegionId": "cloudowner_MDTWNJ21",
                        "tenantId": "fba1bd1e195a404cacb9ce17a9b2b421"
                },
                "requestInfo": {
index 3e05ba0..bc0a1ef 100644 (file)
@@ -23,7 +23,7 @@
                                },
                        "cloudConfiguration":
                                {
-                                       "lcpCloudRegionId":"mdt1",
+                                       "lcpCloudRegionId":"cloudowner_mdt1",
                                        "tenantId":"8b1df54faa3b49078e3416e21370a3ba"
                                },
                        "requestParameters":
                                                                        "customerLongitude": "-97.040443",
                                                                        "customerName": "some_company"
                                                                }
+                                                       },
+                                                       {
+                                                               "name":"Homing_Solution",
+                                                               "value":"sniro"
                                                        }
                                                ]
                                }
index cf02444..4100ec7 100644 (file)
@@ -22,7 +22,7 @@
                                },
                        "cloudConfiguration":
                                {
-                                       "lcpCloudRegionId":"mdt1",
+                                       "lcpCloudRegionId":"cloudowner_mdt1",
                                        "tenantId":"8b1df54faa3b49078e3416e21370a3ba"
                                },
                        "requestParameters":
                                                                        "customerLongitude": "-97.040443",
                                                                        "customerName": "some_company"
                                                                }
+                                                       },
+                                                       {
+                                                               "name":"Homing_Solution",
+                                                               "value":"sniro"
                                                        }
                                                ]
                                }
index 39be40a..5fc0b04 100644 (file)
@@ -22,7 +22,7 @@
                                },
                        "cloudConfiguration":
                                {
-                                       "lcpCloudRegionId":"mdt1",
+                                       "lcpCloudRegionId":"cloudowner_mdt1",
                                        "tenantId":"8b1df54faa3b49078e3416e21370a3ba"
                                },
                        "requestParameters":
                                                                        "customerLongitude": "-97.040443",
                                                                        "customerName": "some_company"
                                                                }
-                                                       }
+                                                       },
+                                                       {
+                                                               "name":"Homing_Solution",
+                                                               "value":"sniro"
+                                                  }
                                                ]
                                }
                }